a tracker for norns.




  • norns
  • keyboard
  • crow (optional)
  • midi (optional)



zxcvbn is heavily inspired by its predecessor, yggdrasil, released two years ago almost to the date. this particular version has been in the works for at least a quarter of that time.

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 @dan_derks and @tehn. The mx.synths clade has contributions from @alanza, @timriot, @sixolet and @chrisl. The drum clade and the infinite pad started off as an exercise in understanding @nathan’s SuperCollider videos. The reverb comes from @jpcima. there are so many more people here that I’m infinitely grateful to have learned from and continue to grow as a music maker and a maker of music making. :pray: :heavy_multiplication_x: :infinity:



Wow, this is incredible; I’m blown away that this is a single script. It looks and sounds beautiful!


that demo!! :exploding_head::exploding_head::exploding_head:

thanks for sharing. i can’t wait to give it a go!


:pray: thanks :pray: that demo is part of the script, you can load it from the PSET menu. I thought it might be a nice callback in choice of tune :evergreen_tree:


what is love?

zxcvbn is love.

what is the name?

it reminds me of psilocybin.


Now I want a green oled!
Looking so good. Reading through the very nice docs now.

1 Like

Definitely interested, although 2am here in London - on a school night! :scream: - might be pushing it a bit!

Vid on YT later, perhaps?


:heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart:
:heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart:
twenty characters of love

1 Like

Is there any easy way to change the expected keyboard layout?
At first glance it looks like the script uses keyboard.code() and not .char(), so the Keyboard Layout sete in devices are not applied.

I might give it a go and try write a fix, but just want to check that I’m not missing anything obvious. (which I hope I did :slight_smile: )


:infinity: :heart:!

cool! yeah the video itself will be archived so if you can’t make it no problem.

yes, it can be added, I think. .char() can’t be used because that function doesn’t capture ctl, enter, etc etc. so I’m not sure because I don’t have a sete keyboard, but I think all that is needed is an array of conversions for the language of the board. for example, if your board inputs an è, then it will have to be converted to a e. so if there is a table keyboard_sete["è"]="e" it can be converted right before this line and all should work. this might already exist somewhere, but its only 26 characters so it seems a pretty easy way…if that way will work. I’m not sure it will since I’m not familiar with non-english boards unfortunately.

there were three choices for the name: qwerty, asdfgh, or zxcvbn. I felt the third one doesn’t get enough use as the first one and is easier to pronounce than the second one :grin:


Got it. I’ll take a look.

And who know that a marimba version of What Is Love with a crunchy breakbeat was what the world needed in these trying times!


After about 30 minutes on step 3 with no feedback, I hit K1 to reawaken the screen and find I’m back out at the credits screen. I hit K3 to hopefully rejoin the script wherever it left off, and:

lua: /home/we/norns/lua/core/clock.lua:58: bad argument #1 to 'resume' (thread expected)
stack traceback:
	[C]: in function 'coroutine.resume'
	/home/we/norns/lua/core/clock.lua:58: in function 'core/clock.resume'

I’m on a first gen shield, rpi 3b. I don’t seem to get the log file the docs claim I will, I get two files instead, is there one that would be more helpful than the other?

1 Like

can you grab the system log? also, what kind of norns (shield / blackorgray / fates)?

that error itself is sometimes benign. does it not start or anything anymore?


I must have done my edit while you were replying - I’m on a first gen shield with a 3b, and in dust.data after picking SYSTEM > LOG I have a file called system.favorites and a file called system.state. I don’t know if those are analogous to system.log or not but here they are:

return {
-- Table: {1}
-- norns system state
norns.state.clean_shutdown = false
norns.state.script = '/home/we/dust/code/zxcvbn/zxcvbn.lua'
norns.state.name = 'zxcvbn'
norns.state.shortname = 'zxcvbn'
norns.state.path = '/home/we/dust/code/zxcvbn/'
norns.state.data = '/home/we/dust/data/zxcvbn/'
norns.state.mix.output = -6.0411998265593
norns.state.mix.input = 0.050333948763006
norns.state.mix.monitor = -inf
norns.state.mix.engine = 4.5126812681756
norns.state.mix.cut = -0.44603637050978
norns.state.mix.tape = -0.44603637050978
norns.state.mix.aux = 1
norns.state.mix.ins = 1
norns.state.mix.monitor_mode = 1
norns.state.mix.headphone_gain = 40
norns.state.mix.rev_eng_input = -9.0
norns.state.mix.rev_cut_input = -9.0
norns.state.mix.rev_monitor_input = -inf
norns.state.mix.rev_tape_input = -inf
norns.state.mix.rev_return_level = -9.6432746655329e-16
norns.state.mix.rev_pre_delay = 60.0
norns.state.mix.rev_lf_fc = 200.0
norns.state.mix.rev_low_time = 6.0
norns.state.mix.rev_mid_time = 6.0
norns.state.mix.rev_hf_damping = 6000.0
norns.state.mix.comp_mix = 1
norns.state.mix.comp_ratio = 4.0
norns.state.mix.comp_threshold = -18.0
norns.state.mix.comp_attack = 5.0
norns.state.mix.comp_release = 50.0
norns.state.mix.comp_pre_gain = 0.0
norns.state.mix.comp_post_gain = 9.0
norns.state.mix.cut_input_adc = -9.6432746655329e-16
norns.state.mix.cut_input_eng = -9.6432746655329e-16
norns.state.mix.cut_input_tape = -inf
norns.state.clock.source = 3
norns.state.clock.tempo = 120
norns.state.clock.link_quantum = 4
norns.state.clock.link_start_stop_sync = 1
norns.state.clock.midi_out = 1
norns.state.clock.crow_out = 1
norns.state.clock.crow_out_div = 4
norns.state.clock.crow_in_div = 4
midi.vports[1].name = 'none'
midi.vports[2].name = 'none'
midi.vports[3].name = 'none'
midi.vports[4].name = 'none'
midi.vports[5].name = 'none'
midi.vports[6].name = 'none'
midi.vports[7].name = 'none'
midi.vports[8].name = 'none'
midi.vports[9].name = 'none'
midi.vports[10].name = 'none'
midi.vports[11].name = 'none'
midi.vports[12].name = 'none'
midi.vports[13].name = 'none'
midi.vports[14].name = 'none'
midi.vports[15].name = 'none'
midi.vports[16].name = 'none'
grid.vports[1].name = 'monome 128 m0001739'
grid.vports[2].name = 'none'
grid.vports[3].name = 'none'
grid.vports[4].name = 'none'
arc.vports[1].name = 'none'
arc.vports[2].name = 'none'
arc.vports[3].name = 'none'
arc.vports[4].name = 'none'
hid.vports[1].name = 'none'
hid.vports[2].name = 'none'
hid.vports[3].name = 'none'
hid.vports[4].name = 'none'
1 Like

I think these are not sufficient. if you choose SYSTEM > LOG again, does it create a system.log file?

1 Like

It doesn’t show up in maiden the way the docs say it will, but it’s here - I’ve generated it a time or two from the menu, but the most recent entries in it are from when I ran goldeneye a couple weeks ago. Gonna delete it then try again

EDIT: same deal on the retry

1 Like

After reading the docs I can’t quite figure out how to enter notes having sharps and flats. Especially for notes singing together, how would you specify the cluster having Ab, B and C#, for instance? It seems like that might be “abbdb”. But then how would you specify the cluster having A, Bb and C#?

1 Like

sorry about that ! it hasn’t been merged quite yet into the main list. so yeah, the docs for the maiden installation aren’t correct currently, but hopefully will in the future. for the present, installation is possible with the ;install invocation in the docs.

good catch, the flat is of course unfortunately customarily written as a “b”. so if you want to write out a chord or an arpeggio with a flat then you need to make sure to utilize the octave notation, e.g.:




the flat is the greedy part of the parser, so you can actually shorten it to just




since those flats will automatically be determined. but the “a” will be flattened since a “b” follows it, unless you include the octave (I arbitrarily chose “3”, you could choose any octave you want).

if there is a more intuitive way to go about this, lmk. I thought about using additional flat denoter (e.g. “*”) but thats noncanonical which is also a barrier to think about…

1 Like

I installed it with the ;install invocation.

If I delete it to try again are there any hidden spots I should delete too? I can dig this out of the code but if you know it offhand twbg

1 Like

yeah, you should just need to delete the code folder to try again! if you can open maiden while it installs and see if it says anything when it stalls, that would be good to know. hopefully it works this time though!