Try it


zxcvbn is a tracker for norns. zxcvbn is best used with a keyboard. The keyboard is used to create musical expressions in the tli syntax for sequences on up to ten different tracks that can control eleven different clades. Clades are sound systems which include multiple samplers, and over a dozen internal synth engines.


Installation is a multi-step progress. Make sure you have an internet connection, at least 150 MB of free space, and at least 10 minutes.

  1. Download zxcvbn from the maiden catalog, or enter the install command into the maiden repl:

;install https://github.com/schollz/zxcvbn

After installing, you will need to restart your norns.

  1. Start zxvcbn. You will see loading... and it might take a few minutes. Just wait. After it finishes, restart the norns.

  2. Start zxcvbn again. This time it'll say to "Press K3 to install". When you have a stable internet connection, you can press K3 and wait. Installation may take up to 10 minutes.

  3. Play! After step 3, zxcvbn will automatically load with a demo program. Use ctrl + p to play a track and ctrl + 0-9 to select a track. The first time you start you will see a demo song (which you can load back up through the PSET menu). Read further to learn other invocations.


Its inevitable that you may experience bugs. Please report bugs back to me through the lines forum or through github.

When sharing a bug, its vital to include the system log and a specification of what kind of norns you are using (physical device, shield, fates, desktop, etc). Follow these instructions for gathering system logs.


I am wholly open to any and all contributions. The repository is entirely open-source on Github. No special rules, make a PR for something you need and I will accept it. Don't hesitate to get in touch if you need help getting an idea off the ground.

If you'd like to edit this document as well, there is a "" you can click around this document to edit pieces.


zxcvbn is heavily inspired by its predecessor, yggdrasil. The inner workings also combine together several previously written scripts - amen, internorns, tmi (now revisioned as "tli"), paracosms, mx.samples, and mx.synths.

Many of the pieces in this script wouldn't be possible without help from others who I am infinitely grateful. The initial ideas for this script were formulated two years ago by the Northern Information personnel (@tyleretters, and @license). The mx.samples clade was helped by the digital ghost @zebra (in fact a great deal of every facet of the norns system is due to their ingenuity along with @dndrks and @tehn). The mx.synths clade has contributions from @alanza, @timriot, @sixolet and @chrislo. The drum clade and the infinite pad started off as an exercise in understanding @nathan's SuperCollider videos. The reverb comes from @jpcima. The whole thing is based off the wonderful tool from @monome. Suffice to say - I've had a lot of inspiration from the norns community that helped me grow as a musician and coder from all those previously mentioned that contributed pieces to this project and also many, many others.


The best place to get started with zxcvbn is to learn about the basic syntax, TLI.

TLI means "text-limited interface". It is the syntax used to enter commands, or add collections of commands (called a "pattern"), or collections of patterns (called a "chain"). The commands are often notes, but they can also be modifiers that augment the way that a note is played.

TLI also means "too little information". It is a style of syntax developed for producing oblique rhythms without music theory. TLI at its core is a single line of letters or numbers separated by spaces. The tracker allocates time to each line, and subdivides the time equally among each entity on the line.

Lets start with some simple examples.

Example 1 (quarter notes)

c d e f

You can type this out into the norns and then press ctrl+s to parse it/save it. Then to play it just do ctrl+p. In this example there are four notes so each is given 1/4 of the time allotted to the line. If the line is given one measure, then each note will be a quarter note.

Notice that the notes are supplied without octave information. In this case zxcvbn will try to guess the octave (using the last known octave or defaulting to octave 4).

Example 2 (triplets)

c4 e g c4 e g c4 e g c4 e g

In this example there are twelve notes so each is given 1/12 of the time allocated to the line. If the line is given one measure, then this will sound as four triplets. In this example, the octave is specified to the "C" note. The octave is simply supplied as a number after the note.

Example 3 (rests)

Rests are important, as they also are an entity given time. If you want a rest between notes you put a .. In the example here there are quarter notes played on the first and the fourth beat.

c4 . . g4

If instead you want the two notes to be eighth notes, you have to add in more rests to make the line have eight entities.

c4 . . . . . . . . g4

Now the two notes play on the first and last eighth note of the series.

Example 4 (ties)

Ties are equally important as rests. If you use a tie, you can length the preceding note. So in Example 3, if we want a half note, followed by a rest and then a quarter-note you can use a tie signified by -. For example:

c4 - . g4

Ties are special too, because they can continue onto the next line. If you want to play out a note for two measures, then you can simply use two lines to express it:


Example 5 (subdivisions)

Parentheses can be used to define subdivisions which can save space instead of entering many rests. Each enclosed set of parentheses is considered a single entity for the purposes of dividing by the number of entities per line. For example, consider the following:

(c d) e

In this example, there are three notes, but two of the notes (c and d) are enclosed in a parentheses so they are considered a single entity. This means there are only two entities on that line ((c d) and e), and each is given half of the pulses (48 pulses). The parenthetical entity is then compiled with the remaining pulses, so that the remaining pulses are redivided, so the 48 pulses is split into 24 pulses for both the c and d notes.

The above incantation can be written using a tie:

c d e -

In this case it might be simpler to use ties. But as you add more subdivisions, things become more complicated. For example:

((c d e f) g) a

This is the same as:

c d e f g - - - a - - - - - -

The latter requires a lot more ties to get the same invocation.

Allocating time in pulses

In zxcvbn, time is discrete and allocated in pulses. The number of pulses per quarter-note is immutable - it is defined as 24 pulses per quarter note (24 ppqn).

Everything in zxcvbn is defined by pulses. The TLI syntax lets you split time, but the amount of time to split is given by the definition of the number of pulses per line. This is under your control.

You can define the number of pulses anywhere. If you want each line to be "one measure", with 4 quarter notes per measure, then you can define the number of pulses to be 96 (24 * 4) using the pulse (p) command:


You can also change the number of pulses per line. So if you want the number of pulses to change from 4 beats per line to 3 beats per line, you can do that:

c4 d4 e4 f4 p96
 c4 d4 e4 p72

The "shortcodes" like the pulse command (p) are ignored for the purposes of counting subdivisions - only notes, rests, ties or parentheses-enclosed sections are counted. So in this case the first line has four notes with 96 pulses and the second line has three notes with 72 pulses, so this essentially is a 7/4 time signature.

There is nothing stopping you from defining prime numbers of pulses to get oblique rhythms.

Imperfections in division

Since the number of pulses is discrete, there can be times where the number of pulses will not evenly divide between notes. In these cases, an euclidean system is used to allocate the notes across the pulses.

For example, if you define only 8 pulses, but have 3 notes, then the pulses will not evenly divide.

c4 d4 e4 p8

In this case, an euclidean generator is used to allocate three items across eight slots. The result would look like this in TLI syntax:

c4 . . d4 . . e4 . p8

There is a special offset command (o) which can be used to offset the result. So if you include o1 you can offset by 1. For example, this line:

c4 d4 e4 p8 o1

Would convert into this:

. c4 . . d4 . . e4 p8

Traditional-music pulses

In traditional music we mostly define note lengths as power-of-2 fractions of a measure - with a measure being four notes. There is shorthand for this in the pulse syntax. You can write m, h, q, s, e for measures, half-notes, quarter-notes, sixteenth-notes respectively. The measure is defined as 96 pulses and everything is a division from that.

You can also use mathematical expressions with pulses. So if you want a line to be one quarter-note less than two measures you can write:

c4 d4 e4 f4 p2*m-q

The p2*m-q is evaluated as 2*96-24 which is 168 pulses. Its important not to put any spaces when using this syntax.


"Clades" are the sound engines for zxcvbn.

There are thirteen different kinds of clades - each with its own sound characteristics and eccentricities.

The first 5 clades are synth and drum engines:

  1. mx.synths is an engine that lets you manipulate over a dozen hand-crafted SuperCollider patches, each with four available mods and individual filter.
  2. DX7 is an engine based on the Yamaha DX7 which lets you choose between over 15,000 patches.
  3. infinite pad is a engine based around a pad-like sound with a swell parameter and filter.
  4. zassersby is an engine based on a West-coast like Norns engine that has an LPG and Sustain mode alongside wavefolding and FM.
  5. oilcan is a drum engine that boasts 7 drum sounds that can be configured and saved.

The next four clades are sample-based engines:

  1. mx-samples is a sample-based engine that can load and interpolate between many layers of samples.
  2. melodic is a sample-based engine that you can load any single sample and play it across the musical keyboard.
  3. drum is an engine for splicing samples and playback of small intervals.
  4. softcut is a sample-based engine that is similar to the drum engine but lets you sample live input in real-time.

The last four clades are engines mainly sequence external gear:

  1. crow sequences two channels (pitch+envelope for each)
  2. midi sequences any attached midi device
  3. w/syn controls w/ over i2c
  4. just friends controls just friends over i2c.


The drum is designed to easily slice and truncate audio. This clade is special in that it does note use note or chord syntax, but it uses hex syntax which defines the position of the slice (0-f).

The slices can be moved around in the sample screen which can be accessed by pressing tab. In this screen you can select slices with shift + left/right and adjust them with left or right. After adjusting slices you can save them by using the ctrl + s combination. You can zoom in with up or down. You can easily import samples. Samples are added simply by using the ctrl + o combination. Slices can be deleted with the delete key. See all the invocations in the sample invocations.

The drum clade also features a additive synthesizer kick drum that can be integrated into the slices. The kick drum parameters are in PARAMS > KICK. This drum synth can be activated on any slice by going to a slice in the sample view mode and turning E1 to change the volume of the kick to something > -48 dB.


The melodic clade loads a single sample into memory and transposes it for each note that is being tracked. Samples are loaded in the parameters menu or by using the sample selector. This clade uses the note syntax for sequencing.

You can visualize the sample by going to the sample screen with tab. Here, you can use the sample invocations to modify the positions of each marker. There are four markers. The first marker is the play position and the last marker is the stop position. After reaching the stop position, the sound will ping-pong between the middle two markers indefinitely (to emulate a sustain in case the note is not long enough).


To use this clade you should first install the norns mx.samples script. Using that script you can individually install instruments. Each of the instruments will install into the dust/audio/mx.samples directory. Each instrument installs a selection of .wav files in varying pitches and volumes that can then be interpolated by the mx.samples engine.

Back in zxcvbn, you will be able to select those instruments in the PARAMS > select instrument. The engine will automatically utilize the samples for each instrument and interpolate between volumes and use round-robin samples (if available).


This clade is basically a port of Aziz Ege Gonul's incredible DX7 SuperCollider code which aims to be a "super-exact clone" of the original Yamaha DX7. The individual patches are not currently editable, but there are 16,384 presets that can be explored using the j command. A list of all presets can be found here. Please note that some presets are monophonic only.


This clade includes 13 different internal synth engines to choose from. Basically, all the synths that you can find in the mx.synths script are included here. Once you select the mx.synths clade, you have an option to select with synth engine. Engine engine its own set of internal parameters that are modulated using the mod[1-4] parameters.

Note: If you only need monophony (one note, like for a bass or arpeggio), there is a parameter PARAMS > mono release which you can set to non-zero to make sure that each new note releases the last note with the specified release. This will save a lot of CPU if you have many notes playing fast.


This clade is an integration of zjb-s's awesome Oilcan Percussion Co. drum synth! The only thing that is different from the original is that the Macro controls are not included(except Release) and there is an additional [Decimate] parameter for it with its relevant shortcode.

It has 7 timbres which are really 7 different drum sounds that you can configure and trigger. This clade uses hex syntax which defines the position of the slice (0-f). Since the clade has 7 sounds the range of (0-f) hex numbers are mapped to (0-6) in a loop.

You can also load oilcan kits which are presets that you can save and move between devices, or import old ones you made using the original mod.


This triggers Timbres 1 through 7

0 1 2 3 4 5 6

This also triggers Timbres 1 through 7

7 8 9 a b c d

This triggers Timbres 1 and 2

e f

Note: If you only need monophony, there is a parameter PARAMS > mono release which you can set to non-zero to make sure that each new note releases the last note with the specified release. This will save a lot of CPU if you have many notes playing fast.


This clade is a modified version of the awesome Passersby by markeats. LFO features and waveshape selection was omitted for CPU usage reasons. But a routable auxiliary envelope was added. Once you select the zassersby clade, you have an option to select LPG or sustain envelope.

Note: If you only need monophony (one note, like for a bass or arpeggio), there is a parameter PARAMS > mono release which you can set to non-zero to make sure that each new note releases the last note with the specified release. This will save a lot of CPU if you have many notes playing fast.

infinite pad

The infinite pad is a special synth engine that was designed in the process of creating zxcvbn. It is heavily based off Nathan Ho's work on pads created in SuperCollider. Using the ZEVERB with shimmer is highly recommended with this pad.


This clade is a lot like the drum clade, but it uses norn's softcut as the backend. Like drum, this clade uses hex syntax which defines the position of the slice (0-f). There are three voices available - each with their own buffer space and each with their own record head. This clade is unique among all the clades as it allows you to record via an always rotating record head that slides through the sample. The record head can be modulated by the command just-for (j) as well.

It is possible to calculate onsets manually, like what is done automatically for the drum clade. You can either press K1+K3 on the norns to detect offsets, or by going to the parameter find offset you click to find offsets.

When in the sample viewing screen you can also change the record level with E1.

just friends

This clade allows you to manipulate Just Friends modules if using i2c with crow.


If using crow, this clade allows you to send pitch information to two outputs and envelopes or gates to the other two outputs. This clade either can be set to outputs 1+2 or outputs 3+4. Outputs 1 and 3 are pitch and outputs 2 and 4 are envelopes or gates. Gates are dependant on the hold parameter. There is additionally a slew parameter for the pitch outputs that can be set via the TLI with shortcode 'N' or in the parameters menu.


If using crow, this clade allows you to manipulate the w/syn module over i2c.


Midi devices can also be controlled. Midi devices accept pitch information. You can select the midi clade, and then below that you can select the device and the channel output. (Note the volume still appears as dB but it is automatically scaled as midi values). There is additionally a cc parameter that sends midi cc value every note that can be set via the TLI with shortcode 'j' or in the parameters menu. MIDI start/stop messages are also sent to the current MIDI device in the clade when CTRL+SPACE is used to start and stop all the clades.


The routing of audio in zxcvbn is slightly different than traditional routing in norns. There are additional options in the ROUTING parameters. While you still have access to the norns compressor and reverb, there is also an additional compressor that does sidechaining, and an additional reverb that does shimmering. The audio input is also routed in a way that lets you filter / pan the two input channels independently.

Audio In

Audio input is routed through the norns in a way that bypasses the normal monitor and is instead routed through the internal engine directly. The internal engine allows you to manipulate both channels independently and apply filters, panning, reverb, delay and modulate compression.

The audio in option determines whether both channels are manipulated in tandem, or independently. By switching it to stereo it behaves as it does traditionally - the channels are left and right and can be hard-panned. If changed to mono+mono you can pan each channel independently and modulate the volume of each independently. This is useful if you have two different instruments coming in on the two channels.

Audio Out

The AUDIO OUT contains several parameters that had extra features to the norns audio out. Namely - there is a EQ stage, a tape slow feature, and a compressor that is capable of sidechaining different routings or clades. There is only one sidechain channel.

In the AUDIO OUT parameters there are options to adjust the sidechaining. The main parameter to change will be sidechain amt which is essentially the multiplying factor for the audio input. The higher the value, the more sidechaining. The rest of the values are standard compressor parameters.

In the PARAMS menu of each clade, you can set an audio source to be the sidechaining source by setting compressing to yes. You can then set the source to be sidechained/compressed by setting compressible to yes. Any number of sources can be sidechaining/sidechained, but they all happen through a single bus.


There is a high level way to manage levels of various parameters by using the mixer page. You can open this page at any time by pressing ctrl + L. The screen that appears will display a particular parameter (labeled at the top), for each of the 10 tracks. Next to this bar will be two grayed bars that show the current audio output for that given track (effects are not taken to account here though).

To use this page you can use E2 to change the parameter modulated and E3 to change the amount of modulation when changing it. Then you can use the keybard to modulate parameters - 0-9 will increase and Q-P will decrease the parameter respectively for each track. For example, you can hold 1 to increase the parameter for track 1, or hold Q to decrease it.


Any clade can route its output through the "Zeverb" reverb effect. This is a reverb specific to zxcvbn. The majority of this reverb is written by Jean Pierre Cimalando, based on the reverbator by Jon Dattorro. The reverb has been amended with a shimmer.

In each clade you can define the send to the reverb with PARAMS > send reverb, from 0 to 100%. The send for the zeverb exists as a command (z).

The reverb itself can be adjusted by setting the parameters in the PARAMS > ZEVERB menu.



Core commands are available for any type of clade. Commands are followed by values which can be characters or numbers. If a number follows a command it should always be a whole number (negative or positive), no decimals.


Notes are written in two ways - either as individual notes, or specified via a chord name and color.

Individual notes are specified using lowercase scale letters (“a” through “g”), with an optional number to indicate the octave. If there is no space between notes then the notes will be played together.

Chords are specified by starting with an uppercase letter ("A" through "G") and then defining the chord flavor. The octave can be specified by including a ;<octave> to the end of the command.

Notes are only applicable on clades that can be specified by musical notes (rather than positions). See Hex for specifying positions.

Notes example

This will play three notes, individually.

c4 e4 g4

The octave is optional, if it is omitted then it will use the octave closest to the last note. So the previous line is identical to this:

c4 e g

Chords example

This will play a C major chord.


This will play a C major-seventh chord transposed over a E, on the 2nd octave.


You can also write chords using the notes (lowercase letters), by putting them in without spaces. So this is identical to the previous:



mx.samples mx.synths melodic zassersby infinite pad midi crow


Patterns can be chained together using this command. This command must precede all patterns.

You can use ( or * operators to indicate groupings or multiplicative operations on the pattern chain.

Example 1

In this simple example, the patterns loop between a, b, and c. Each of the patterns only plays a single note, but each pattern can hold as many notes as needed.

chain a b c

pattern a

pattern b

pattern c 

Example 2

In this example, the patterns loop between a,a, b - which is repeated twice, followed by c. Instead of writing a a b a a b c it can be compressed using the mathematical operators.

chain (a*2 b)*2 c

pattern a

pattern b

pattern c 


Hex is used instead of Note for clades that involve positions - namely drum, softcut and oilcan. In [drum] and [softcute], there are up to 16 available positions. For [oilcan] there are only 7. The commands to playback at a certain position is simply a hex value, 0-9a-f where 0 is position 1 and f is position 16.

The usage of Hex commands is similar to Note in that you can use them with arps, you remove spaces in between to play things together, etc.

Example 1

In this example, play position 1, 2, 3, 4 in order.

0 1 2 3

Example 2

In this example, position 1 and 16 are played together.


Example 3

This is the same as Example 1. The commands do not have spaces in between them, but they do not play together and are instead modified by the Arp command which plays them up once.

0123 ru


drum softcut oilcan


Patterns are useful to group musical expressions. They are most useful when combined with chains. Essentially any pattern is created when you have pattern <name> where <name> can be anything you want.

Example 1

In this example there is a pattern that plays chords and a pattern that arpeggios the chords. However, there is nothing linking the patterns so it will only play the first. To link the patterns you should use chain.

pattern foo

pattern bar
c4 eb4 g4 c5
a4 c4 e4 a5

Gate (h, 0 to 100)

The gate determine how long a note is held. Each note is given a time according to how it is parsed by tli, but the time allotted can be further truncated using the gate and defining a value less than 100.

For zassersby this will only be applicable for sustain mode, not lpg mode.

Example 1

In this example, c4 plays for a quarter note, while d4 plays for a half note.

c4 h50 d4


drum melodic mx.samples mx.synths infinite pad midi crow oilcan zassersby


Filter (i, 1 to 127)

The filter will apply a low-pass filter to the emitted notes. This filter is defined in notes, i.e. 72 is the frequency of c5 (523 Hz).

Example 1

Play a chord filtered at 440 hz (A4).

C;4 i69


drum melodic mx.samples mx.synths infinite pad softcut oilcan


fm low (i, 0 to 100)

Adjusts the FM amount for lower frequency FM modulator.


c3 d#4 i10 e4 i0 g4




Just For (j, varies)

This command is just for each individual clade - it works differently depending on which clade you are using.

For softcut this command will activate recording, and the range is 0 to 100 (0% record level to 100% record level).

The drum this command will change the amount of decimation between 0 and 100%.

For mx.synths this command will change the four mods. Each mod has a range of 100 (which is mapped to -1 to 1). So for mod1, the values are 0-100, for mod2 the values are 101-200, etc.

For infinite pad this command will change the swell. The range is 0 to 100%.

For MIDI this command will send a CC message to the relative MIDI device and channel. The range is 0 to 127.

For zassersby this command will adjust the wavefolding amount. The range is 0 to 100.


drum softcut infinite pad mx.synths zassersby


Attack (k, 0 to 10000 ms)

The attack determines the time the envelope takes to open up when starting a new note.

Example 1

In this example, c4 opens in 50 ms and d4 opens in 200 ms.

c4 k50 d4 k200


drum melodic mx.samples mx.synths infinite pad crow


fm high (k, 0 to 100)

Adjusts the FM amount for higher frequency FM modulator.


c3 d#4 k10 e4 k0 g4




Release (l, 0 to 10000 ms)

The release determines the time the envelope takes to close when releasing a note.

Example 1

In this example, c4 releases in 50 ms and d4 releases in 2 seconds.

c4 l50 d4 l2000


drum melodic mx.samples mx.synths infinite pad crow zassersby oilcan


Mover (m, <mod><per>[,<min>][,<max>])

Mover is a special command that enacts a LFO on almost any of the other commands. Its syntax is different than all the other commands. It requires specifying the one-letter character of the command that is to be modified and a period (in beats). Then, optionallyl, a minimum and maximum can be specified.

The mover LFO is only implemented until the command that is being modified is coded in another cell. LFO shape can also be changed to 'sine', 'saw', 'square' or 'random' at the bottom of the settings page.

Example 1

In this example the volume of the "c4" note is oscillating the volume (v) between -10 and 0 dB at 10 beats/cycle for the first measure and set to -5 db for the second measure.

c4 mv10,-10,0
c4 v-5

Note that the minimum and the maximum pertain to that particular command (in this example it is the volume).


drum melodic mx.samples mx.synths infinite pad softcut crow midi


Pitch (n, -48 to 48)

This command is similar to rate, but changes the rate in a way according to note scales.

Example 1

In this example the note plays c4 but pitched down two semites, so it actually plays bb3.

c4 n-2


drum melodic mx.samples mx.synths infinite pad softcut crow midi zassersby oilcan


Slew (N, 0 to 1000 ms)

Slew command for notes

Slew example

This will play four notes, with the transition between c4 and d#4 having a slew time of 10 milliseconds

c3 d#4 N10 e4 N0 g4


crow mx.synths zassersby


Offset (o)

Offsets are used to shift the notes across the pulses allocated for each line when it is parsed by the TLI parser. Its useful to create off-beats.

Example 1

In this example, the notes will be offset from the first pulse by eight pulses:

c4 e4 g4 a4 o8


drum melodic mx.samples mx.synths infinite pad softcut crow midi oilcan zassersby


Pulse (p)

Pulse is used to redefine the number of pulses allocated to a given line. There is an immutable number of 24 pulses per quarter note, but you can define any number of pulses per line. If no pulses are defined then it will be defined as 96 pulses per line by default (4 quarter notes per line). You can use mathematical expressions with pulses, as long as there are no spaces.

Example 1

In this example, the first line will have 24 pulses (1 whole quarter note), while the second line will have 96 pulses (4 whole quarter notes).

c4 p24
c4 p24*2+48

When played together, this whole pattern is 96 pulses, or five beats.

Traditional note lengths

In traditional music note lengths are usually defined as power-of-2 fractions of a measure - with a measure being four notes. There is shorthand for this in the pulse syntax. You can write m, h, q, s, e for measures, half-notes, quarter-notes, sixteenth-notes respectively. The measure is defined as 96 pulses and everything is a division from that.

You can also use mathematical expressions with pulses. So if you want a line to be one quarter-note less than two measures you can write:

c4 d4 e4 f4 p2*m-q

The p2*m-q is evaluated as 2*96-24 which is 168 pulses. Its important not to put any spaces when using this syntax.


drum melodic mx.samples mx.synths infinite pad softcut crow midi zassersby oilcan


Probability (q, 0 to 100)

This command determines the probability that the note will be emitted each time it is encountered.

Example 1

In this example, c4 plays 50% of the time.

c4 q50 d4


drum melodic mx.samples mx.synths infinite pad midi crow zassersby oilcan


Arp type (r, various)

Arpeggio lets you create arpeggios. You can use arpeggio with a collection of notes (or hex), or a chord. The arpeggio will last as long as defined by tli. These are the available arpeggio options and their shortcodes:

  • up (u)
  • down (d)
  • up-down (ud)
  • down-up (du)
  • convergent (co)
  • divergent (di)
  • convergent-divergent (codi)
  • divergent-convergent (dico)
  • pinky-up (pu)
  • pinky-up-down (pud)
  • thumb-up (tu)
  • thumb-up-down (tud)
  • random (r)

By default, the arp will equally divide the number of notes according to the defined number of pulses. This can be changed by utilizing this command along with steps to change the number of steps or time to change the length of each note in the arpeggio.

Example 1

This example does an up-down arpeggio on a Cm7 chord.

Cm7 rud

Example 2

This example plays a pinky-based arpeggio on the first four slices (in hex notation).

0123 rpu


drum melodic mx.samples mx.synths infinite pad softcut crow midi


Arp steps (s, 1 to inf)

Steps defines the maximum number of steps in a given arpeggio. For every step that is not in the original chord, the note is increased by one octave. If time is not defined, then the pulses per step will be equally divided among the available number of pulses.

Example 1

In this example the arpeggio goes up to c4, e4, g4, c5 because there are four steps.

C;4 ru s4

Example 2

In this example with hex syntax, the arpeggio goes up and down: 0, 1, 12, 13, 12, 2, 1, 2. This is because only four steps are defined but each is given 12 pulses out of 96, for 8 total.

01 rud s4 t12


drum melodic mx.samples mx.synths infinite pad softcut crow midi zassersby oilcan


Arp time (t, 1 to inf)

Time defines how long each note in an arpeggio will play for. The time is defined in pulses.

Example 1

In this example the arpeggio goes up to c4, e4, g4, c5, with each note getting 12 pulses (1/8th note).

C;4 ru s4 t12

Example 2

In this example with hex syntax, the arpeggio goes up to 0, 1, 12, 13.

01 rud s4 t8


drum melodic mx.samples mx.synths infinite pad softcut crow midi


Rate (u, -200% to 200%)

Rate defines the rate of play for a given note, given in percent from unison.

Example 1

In this example the volume of the 1st slice (0) plays backwards, and then forwards at 50% rate.

0 u-100 0 u50


drum softcut


Volume (v, -48 to 12)

Volume allows you to quickly change the impact of a note. This volume is added in dB, to the main volume that can be controlled in the parameters menu.

Example 1

In this example the volume of the "c4" note is increased by +8 dB.

c4 v8


mx.samples mx.synths infinite pad melodic zassersby oilcan


Pan (w, -100% to 100%)

Pan will pan between the left (-100%) and the right (100%) of the stereo field. You can randomize this by including multiple numbers.

Example 1

In this example the note randomized between +/-50%.

c4 w-50,50


drum melodic mx.samples mx.synths infinite pad softcut zassersby oilcan


Retrigger (x, 1 to 32)

This command will further subdivide the current note as many times as it is retriggered. For example if you retrigger a quarter note twice it will play as two eighth notes.

Retrigger works in conjunction with volume and pitch in a special way - upon each retrigger it applies the change to volume or pitch again. This way you can create escalating or descalating patterns, or even pseudo-echos.

Example 1

In this example the note plays c4 as four sixteenth notes instead of a quarter note.

c4 x4 d4 e4 f5

Example 2

In this example the hex plays the first slice and it echoes 15 times, decreasing in volume each time by 1 dB and increasing one semitone each trigger.

0 x16 v-1 n1


drum melodic mx.samples mx.synths infinite pad softcut crow midi zassersby oilcan


Transpose (y, -127 to 127)

Transpose will modify the note before it is latched to the current scale. This is useful for transposing keys and staying in the scale, but can also be used to create melodies when using random or ordered command values.

Scales can be modified in the PARAMS > scale mode. By default it will be a chromatic scale.

Example 1

In this example, the C is followed by a C# if in the chromatic scale, or is followed by a D if it is in a major scale.

c4 c y1

Example 2

This example uses ordered command values so the first time the note plays C, and then D (assuming a chromatic scale).

c4 y0.2


drum melodic mx.samples mx.synths infinite pad softcut crow midi


Zelay (Z, 0% to 100%)

Zelay defines the send for the delay. The delay parameters to modify are in the PARAMS > AUDIO OUT menu.

Example 1

In this example, 1/3 notes are output with 5% delay send.

c4 z0,0,5


drum dx7 melodic mx.samples mx.synths infinite pad softcut


Zeverb (z, 0% to 100%)

Zeverb defines the send for the reverb. The reverb parameters to modify are in the PARAMS > ZEVERB menu.

Example 1

In this example, 1/3 notes are output with 5% reverb send.

c4 z0,0,5


drum melodic mx.samples mx.synths infinite pad softcut


The monome grid holds sequences of notes that are synchronized, but separate, from all the tracks. Each track can be sequenced. Each sequence has up to 14 steps. Each step can be controlled with its own meter (pulses per measure), the number of iterations (multiplies the pulses per measure), polyphony/monophony, and order of notes.


On the norns there a few ways to control. You can use E1, E2, and E3 to control three parameters of the current clade. You can use K2 and K3 to change track and use K1 + K2 or K1 + K3 to mute or play the track, respectively.

The main controls from the keyboard invocations. There are "Main" invocations that are used from the main TLI interface. There are also a different set of invocations when you are in a Menu (which is the same across all norns scripts) and another small set of invocations when in the sample view.

Main invocations

Move /// Pressing the arrow keys will move the cursor to new positions.
Save/parse ctrl + s Saves the current text to history and parses.
Play track ctrl + p Plays or stops the current track.
Jump to track ctrl + 0-9 Jumps to the track of that number.
Change track ctrl + / Move to the next or previous track.
Change octave ctrl + / Changes the octave of the current line.
Change track clade shift + / Switch between the clades using this combo.
Change mode type shift + / Some clades have different modes.
Change view tab For clades with samples, this will switch to sample view.
Copy ctrl + c Copies the current line into a buffer.
Paste ctrl + v Pastes the current line.
Copy all ctrl + shift + c Copies all lines into a buffer.
Paste all ctrl + shift + p Pastes all lines.
Undo ctrl + z Undoes the last parsed entry.
Redo ctrl + y Redoes the next entry in history (only once undone).
Mute track ctrl + m Mutes or unmutes the current track.
Mute group atl + 0-9 Mutes the specified group (set groups in `PARAMS`).
Play/stop all ctrl + space Toggles playing of **all** tracks.
Record tape ctrl + r Records a tape of the current chain.
Toggle tape ctrl + t Toggles the playing of a recorded tape.
Remote control meta + 0-9 When another norns is on LAN, send commands to it.
Activate tuner ctrl + i Activates stereo tuner that display notes and cents away.
Activate levels/mixer ctrl + l Activates a [mixer](#mixer) that lets you change levels.
Home Home Pressing the home key will move cursor to start of line.
End End Pressing the end key will move cursor to end of line.
Page Up Page Up Pressing the Page up key will move cursor up by 4 lines.
Page Down Page Down Pressing the Page Down key will move cursor down by 4 lines.
Toggle menu F1-5 Opens menu page (mixer, tape, parameters, or system). F5 toggles.
Move /// Pressing the arrow keys move around menu system.
Modify parameter + or - Increase or decrease a parameter.

Sample view invocations

These invocations are only applicable to the clades that utilize samples: drum, softcut, and melodic.

Exit view tab This will toggle in/out of sample view.
Audition splice space Plays the splice at current position.
Select slice shift + / Selects a slice across the range.
Zoom / Zooms into or out of the current position.
Jog position / Changes the position of the current slice.
Save slice positions ctrl + s Saves current positions of slices/onsets to cursor file
Re-detect onsets ctrl + d Re-detects onsets if no cursor file exist, otherwise loads cursor file again


In addition to PSET saves, there is an additional way to save your data in the META menu. The first option in this menu allows you to toggle to load the last saved PSET when starting. This is useful to avoid having to PSET > load constantly when working on a piece.

The other two options are for creating or opening "archives". An "archive" is a zip-file that stores a self-contained version of the current patch - samples included. These archives can be shared between norns and they recapitulate 100% of the current state of zxcvbn without having to worry about having sample files in the right places. To share archives, you can just copy an archive from the data/zxcvbn/archives folder into someone else's folder. Then you can load it with load archive option. After loading an archive, you should save it as a PSET if you want to later open it from the PSET menu.


The intuition behind zxcvbn becomes more familiar the more you use it. There are several tips and tricks below that may help in navigating the interface and creating more complex patches or utilization.

CPU usage

Audio dropouts will occur if the CPU usage gets to high. Onboard synths like mx.synths, infinite pad) can incur a lot of CPU usage, especially when used with long release times and with lots of polyphony.

In zxcvbn there are no hard limits on CPU usage, polyphony, or maximum number of simultaneous tracks. Therefore, if you experience audio dropouts the best solution is usually to reduce the release time to decrease overlaps between notes, reduce polyphony of notes, try to off-board instruments with midi or cv, or (last resort) use multiple norns devices synced together.

If you are using the mx.synths clade, then there is an option to set mono release to a nonzero value, which will enable monophonic playback and overlap will not exceed that value. This will often help with CPU usage when using arpeggios or if a long release time is set.

Using a different editor

The norns itself is the basic editor and controller for creating tracks. However, you can use any editor you want by directly editing a file that is stored on the norns disk in dust/data/pages/[1-10].

Editing any of these files while zxcvbn is running will automatically reload that track (numbered 1-10) and parse it. Conversely - if you edit any track on the norns, the changes will be reflected in these files.

Random or ordered command values

Ordered command values can be applied by separating values by . (no spaces). For example if you want to pan alternating between left and right you can do w-50,50 which will select -50% and then 50%.

Random command values can be applied by separating values by , (no spaces). For example, if you want to pan randomly between the left and right side you can do w-50,50 which will select either -50% or 50%. You can also randomize with whole sequential arrays by using the :. You can randomize a note between the first twelve semitones using the command n1:12. You can also combine these two, so you can select several numbers or within a range. For example, if you want to decimate sometimes between 50% and 75%, or sometimes not at all you can do j0,0,0,50:75. There are multiple 0 here, so that those values have more weight when selected randomly.

Ordered (using .) and random (using , or :) commands cannot be mixed together, doing so will likely result in an error.

Applicable to: drum melodic mx.samples mx.synths softcut midi crow

Selecting samples

Files can be selected by using ctrl + o to open a file browser. This file browser only shows .wav and .flac files. You can navigate the file browser using the /// keys. Press enter to preview a sound. To load a sound, hold enter for 3 seconds. Press tab to exit this menu.

Applicable to: drum softcut melodic

Syncing multiple norns

If you have 2+ norns, they will automatically sync together if connected onto the same LAN. Each norns will automatically detect the other norns. The norns clock can be set to any setting (internal, crow, link, etc) and any change in tempo will be reflected in the other norns.

In addition, you can have a keyboard on one norns control the others. Simply use meta+0-9 to toggle the keyboard to transmit to another norns. (The meta key is sometimes the "Windows" key).

Track tapes

Each track has its own tape that can be used to record. Currently the tape only records audio input. This feature can be used to sequence an external synth while simultaneously recording it to the internal digital tape.

The tape can be recorded at any time by invoking ctrl + r on the keyboard. This will "arm" a recording which will start recording the next time the chain starts at the beginning of the first beat. The bottom bar blinks while it is armed, and then turns solid when it begins to record. The bar will grow from the left to the right to indicate the position of the recording. The recording duration is set by the total time for the entire chain.

Once the tape is done recording it will beginning playback. The playback is visualized by a bright line that tracks the position across the gray line. The tape automatically is crossfaded so it seamessly converges back to the beginning. To toggle playback of the digital tape once it is recorded use ctrl + t.


You can tune incoming audio by pressing ctrl+i while in the main view. Audio through the inputs will cause text onscreen to appear - each side is each channel (they are measured indepednetly). You will see the name of the closest note (e.g. "C3" in this case) and you will see a number indicating the number of semitones away from the note (e.g. +1 in the image).


  • NEW added slew/glide for mx_synths and zassersby with shortcode "N" (except for mx_synths Triangles, it produces weird distortions)
  • NEW added midi note receive per track(midi channel), device selection in the "PARAMS > MIDI"
  • UX Copy all and paste all are now available via ctrl+shift+c and ctrl+shift+v (overwrites all text on track)
  • UX home, end, page up and page down buttons all work for navigating TLI
  • NEW added zassersby clade
  • NEW added oilcan clade
  • NEW added reverb and delay send for "Audio In"
  • NEW name of current pset is now appended to "archive" filename
  • NEW added button that reloads current sample, useful when changing slice count for sample
  • NEW added mid start/stop receiving, device selection in the "PARAMS > MIDI"
  • UX added menu seperators for parameter menu
  • FIX fixed nbout mod breaking midi start/stop
  • FIX fixed possible midi cc issue(clamped value to 0-127)
  • FIX lfo now resets upon loading a new pset
  • FIX fix bug with drum and melodic clade voice freeze if gate hold parameter was very low
  • FIX fix bug if entering hex values higher than slice count for drum clade would crash script
  • NEW added "crow_gate" parameter to change between gate and envelope (thank you hallmar!)
  • NEW added grid sequencer
  • FIX mx.synths supersaw is 20-30% more efficient
  • FIX bug in tape slow
  • FIX bug in updating parameters through header
  • FIX octave change with CTRL+UP/DOWN works
  • FIX syncing uses Christian's algorithm (measuring round-trip time)
  • FIX bug in mixer
  • NEW DX7 clade added (this cause incompatability with previous saves but migration is easy)
  • NEW delay send per track (PARAMS > delay send or Z command)
  • NEW mixer page (ctrl+L to toggle)
  • NEW tli syntax supports parentheses for subdivisions
  • NEW ctrl+space to toggle play/stop all
  • NEW amp/pan/filter works better in realtime for most clades (still somewhat wip)
  • NEW some performance controls for drum retrigs (in menu)
  • NEW added cpu usage to the main screen
  • FIX spaces in filenames are okay
  • FIX melodic has reverb send
  • FIX panning in PolyPerc works
  • FIX bug in parsing short ordered commands fixed
  • NEW file support for .aif
  • NEW OP-1/OP-Z drum patch support (so op1.fun samples load with sample points)
  • NEW add clade for just Friends i2c
  • NEW added clade for mannequins w/ module
  • NEW tuner mode added with ctrl+i
  • FIX fix bug with archives
  • FIX fix bug with matrix mod
  • FIX installation process (untaring aubio)
  • NEW add all file to edit externally from a single file (data/zxcvbn/all)
  • NEW allow setting by name in header
  • NEW add retrig to mx_synths
  • NEW change octave of line with ctrl+up/down
  • NEW allow ordering of command values using "." instead of ","
  • NEW acrostic mode (ctrl+a) will explode the current patterns across the tracks.
  • NEW transpose notes and lock to a scale
  • FIX archives now save correctly with external samples
  • FIX ignore comments on any line after "#"
  • NEW create synchronized live digital tapes of incoming audio (see lesson) using ctrl+r and ctrl+l
  • FIX allow last slice to be triggered
  • UX slight improvements
  • NEW self-contained archives (PARAMS > META)
  • NEW added a supersaw to the mx.synths, from audionerd's sc patch which is based on Adam Szabo's thesis that reverse engineers some of the characteristics of the Roland JP-8000.
  • IMPROVE ux around selecting slices
  • IMPROVE ux around modifying attack/release
  • FIX installation on fates (hopefully)
  • NEW first release.

Back to top