tambla
tambla is a semi-generative rhythmic arpeggiator with bendable playheads
requirements:
- norns (201029 or later)
- midi keyboard - for note input, preferably with velocity sensitivity
- midi controller (encouraged) - for mapping performance parameters to dedicated controls
optional:
- grid - note input
- arc - various performance controls
pairs well with:
- multi-channel MIDI-CV converters
- (one or more) velocity sensitive polyphonic MIDI sound sources
- delays
- clock synchronized setups
overview
tambla affords exploration of polyrhythms and syncopation. patterns consist of four rows. rows have 2-16 triggers with velocity, duration, and chance values per step. holding down a key generates notes at the given pitch with the trigger pattern in the first (top most) row. each subsequent key held, begins generation based on the trigger pattern in next lower row. note generation starts from the current playhead position instead of the beginning of the row ensuring the overall rhythmic structure is maintained unless note based sync it chosen.
the four playheads scanning each row are synchronized to a common clock. individual rows can divide down the clock for linear phasing effects or bending the clock or both. bend values < 1.0 result in the playhead progressing in a logarithmic fashion (fast then slowing down) where as bend values > 1.0 result in exponential progression (slow then speeding up).
interface
the tambla ui consists of three pages in addition to a number of mappable parameters exposed in the norns menu.
the play page is displayed when the script first starts. conceptually the pages are laid out horizontally. several controls have a common theme across all pages:
| control | purpose |
|---|---|
K1 + K2 |
move left through the pages |
K1 + K3 |
move right through the pages |
ENC1 |
horizontal selection within the page |
K1 + ENC1 |
vertical selection within the page |
play page
the play page, designated by the P in the lower right corner, shows the
four rows of the pattern in the currently selected slot. parameters which
affect an entire row can be manipulated on this page.
| control | purpose |
|---|---|
ENC1 |
select the active pattern slot |
K1 + ENC1 |
select the row to adjust parameters for |
K3 + K2 |
randomize all rows (key press order is important) |
ENC2 |
select the row parameter to edit |
ENC3 |
adjust parameter value |
below each row is a horizontal bar which shows the current playhead position for that row.
the currently selected row is indicated by the small square box to the left of the row's playhead indicator.
the currently selected slot is indicated by the large number in the middle
right of the display (slot 1 is selected in the image above).
the upper right corner shows the currently selected/editable row parameter.
| code | parameter | purpose |
|---|---|---|
b |
bend | playhead time bending. values < 1.0 result in logarithmic progressing, values > 1.0 result in exponential progression |
o |
offset | step offset for playhead (not currently visualized) |
r |
rate/divisor | divide down the clock, 4 is the minimum and default. 8 is half speed, 16 quarter speed |
n |
length | number of steps in the row |
edit page
the edit page, designated by the E in the lower right corner, allows per
step editing of the triggers in the current pattern.
triggers are visualized as vertical bars above the playhead indicator. the
height of the bar indicates the trigger velocity (v), the width the trigger
duration (d), and the brightness the trigger chance (%).
just as with the play page the currently selected row is indicated by the small box to the left of the row playhead.
the currently selected step is indicated by the small open rectangle on top of the playhead bar.
| control | purpose |
|---|---|
ENC1 |
select step within the row |
K1 + ENC1 |
select the row |
K3 + K2 |
randomize the selected row (key press order is important) |
K2 + K3 |
clear the selected row (key press order is important) |
ENC2 |
adjust step velocity |
ENC3 |
adjust step duration |
K2 + ENC2 |
adjust step chance |
note: the trigger at a given step is consider off if either the velocity or the chance values are zero.
macro page
the macro page, designated by the M in the lower right corner, provides
slot level pattern operations (and more in the future).
| control | purpose |
|---|---|
ENC1 |
slot select |
ENC2 |
select operation |
ENC3 |
select operation target (only used for some operations) |
K3 |
perform operation |
| operations | details |
|---|---|
copy |
copies the selected slot (pattern) into a buffer |
paste |
pastes the previously copied pattern into selected slot. the paste operation can be used repeatedly to copy one pattern into multiple slots |
pattern load: |
load the pattern selected via ENC3 into the current slot by pressing KEY3. if the ... name is selected the standard norns file select ui is shown allowing patterns in other directories to be loaded |
save pattern: |
save the selected slot pattern out to the name selected by ENC3. pressing KEY3 will overwrite the named pattern. to save a pattern with a new name select ... as the name and the standard norns text entry ui is shown for specifying the name |
note: there is currently no visible indication that the operation was performed nor any error displayed if a pattern could not be loaded. future versions of the script will hopefully improve this area.
structure
tambla's model consists of several structures, specifically:
- scene - current only one scene is supported, its existence is not
currently exposed
- slot - scenes have 4 slots, each containing a pattern
- pattern - a pattern has 4 rows of triggers
- row - 2-16 triggers with playhead parameters
- pattern - a pattern has 4 rows of triggers
- slot - scenes have 4 slots, each containing a pattern
it is important to note that while the playhead parameters get saved and loaded
as part of a pattern all other input, output, and note generation settings
live at the scene level. scene level parameters can be saved as a PSET.
the following diagram provides a high level view of how midi events flow through the various stages. incoming midi notes event will be completely consumed by the generation and transformation stages. other midi events such as pitch bend and cc will be passed through to the main output with their channel set to the main (output) channel.
parameters
additional parameters not shown as part of the main interface can be accessed in the PARAMETERS section of the norns menu.
the tabla parameters are split into three sections
tambla
the initial set of parameters control the note generation and transformation logic
| name | details |
|---|---|
| active pattern | the currently selected/playing slot |
| chance | when on chance is considered when determining if a trigger should fire (defaults to off) |
| chance boost | added to trigger chance values when determining if a trigger will fire. chance boost of 1.0 has the same effect as turning chance off |
| velocity scale | multiplys outgoing note velocity by this value |
| velocity mod | when on trigger velocity is scaled by incoming note velocity |
| length mod | when on trigger duration with affect generated note duration |
| input hold | when on incoming notes are held after release, additional notes accumulate as long as at least one key is held down continuously. after all keys have been released the next key press will start another accumulation |
| transpose | shift notes post generation up or down by semitones |
| sync | synchronize all rows to the same clock phase or reset a given row playhead when a note is played |
random >
| name | details |
|---|---|
| randomize pitch | when on a randomized offset is added to the pitch of generated notes |
| choice | TODO |
| scale | TODO |
| sign | whether to add, subtract, or randomly choose the direction of pitch offset |
| chance | likelihood of pitch being randomly offset |
scale >
| name | details |
|---|---|
| constrain to scale | whether to map transposed and randomized notes into a specific scale |
| scale | name of the scale |
| root | lowest (midi) note/root of the scale. notes below the root are mapped to the root note |
| octaves | number of octaves above root to allow. notes above the highest note are mapped to the highest note in the allow range |
tambla: rows
several parameters for each of the four rows are exposed to allow mapping as performance controls. the parameters affect rows of the currently selected slot.
| name | details |
|---|---|
| bend | playhead bend value |
| n | row length |
res (aka r) |
the rate/divisor of the clock for this row |
| offset | the step offset for the row |
| destination | selects whether generated notes from this row flow out the main output or the alternate midi row output |
| midi output | midi device number; see SYSTEM > DEVICES > MIDI |
| midi output channel | channel number for notes generated by this row |
tambla: i/o
parameters in the third section control the main midi inputs, outputs, and output destination.
| name | details |
|---|---|
| midi input | midi input device number; see SYSTEM > DEVICES > MIDI |
| midi output (main) | main midi output device number; see SYSTEM > DEVICES > MIDI |
| midi output channel | channel number for notes passing through the main output |
| output | polyperc or midi |
| output logging | turn on debug logging for generated notes visible in the maiden REPL. may cause problems with fast clocks and dense trigger patterns |
grid
experimental, subject to change
a varibright grid (assigned to the first slot in the SYSTEM > DEVICES > GRID menu) can be used for live note input. notes generated via the grid have velocity values of 127. notes are laid out on the grid similar to a linnstrument via an adaptation of a library originally written by neauoire.
arc
experimental, subject to change
arc4 connected to the first arc device slot provides direct access to a few parameters
| n | details |
|---|---|
| 1 | row select in play and edit pages, equivalent to using K1 + ENC1 |
| 2 | drives the pw parameter for polyperc with fixed 20 second slew time |
| 3 | drives the velocity scale parameter with a fixed 8 second slew time |
| 4 | drives the chance boost parameter with a fixed 1/2 second slew time |




