lorenzo's drums

lorenzo’s drums

an electroacoustic drumset.


this is a norns script that allows you to manipulate a high-quality drumset composed of many meticulously captured samples from Lorenzo Wood (shared through www.pianobook.co.uk). each drum hit is composed of ~6 samples which are mixed according to the current mic positions (up to three positions) and velocity (interpolated between two velocities of up to eight layers).


  • norns
  • 128 grid or midigrid (optional)
  • at least 200 MB of disk space (for downloaded samples)



the first time you start you will have to wait for samples to download. once done you can goto PARAMS > choose pattern and choose a pattern. then hit PARAMS> load pattern. then goto the main screen and press K1+K3 to start the pattern.


  • E1 selects drum
  • K1+E1 selects parameter
  • E2/E3 changes position in grid
  • K2/K3 decreases/increases value
  • K1+K2 sets length of sequence
  • K1+K3 toggles playing



at the heart of lorenzo’s drums are nine drum pieces (kick, snare, cross-stick, closed hat, open hat, ride, low tom, mid tom, and high tom). each drum set piece has parameters that can be modulated by individual step sequences - including velocity, pan, rate, reverse, probability. each of these parameters are modulated by increasing the value of a step in its step sequencer. each parameter has its own sequencer. each instrument has its own clock division and its own swing.


for now - please refer to this tutorial video:

(if anyone wants to supply a grid layout I would be exceedingly happy)


midi output and input is supported. midi output is sent per channel, each instrument on its own channel (1-9). midi input by default is note based but can be changed in the settings. instrument triggers can also be midi-mapped so you can use a midi controller instead of a keyboard.


you can record quantized notes onto any track. enter recording mode by toggling PARAMS > record, or by going into “ERASE/REC” mode on the grid by making the last two buttons dim.

writing patterns

you can actually compose patterns in a text editor instead of using the grid/norns. simply edit this file in maiden or your favorite editor. follow the patterns in that file for naming/syntax. those patterns will be available to select and load from the PARAMS menu.

pattern chaining


this isn’t the final script I envisioned. but its fun to use, and I thought I’d share this iterations so that you might have some fun using it too. in the future I’d like to…

  • add the ability for the drums to “evolve” (maybe similar to the acid test script). there’s something very solid about patterning in this way and I’d like to liquidate it somehow.
  • add more fx and make the current fx better (the current fx leave a lot to be desired)
  • allow chaining patterns (in the nomenclature of this script it would be to chain loading of banks. I think this would be cool especially since banks are instrument-specific) add in v0.2
  • fix bugs (including one where the UI doesn’t show open-hat well)

ideas are welcome. code changes are especially welcome. if you want to send a PR for something you’d like to add (or implement one of the ideas above), please don’t hesitate. if you need help with a making a code change, please don’t hesitate to ask.

is it possible to use other samples?

it is possible, but you’d have to make this change yourself in the engine code. the filenames for each sample of each instrument are hard-coded. the files exist in folders according to their mic position (“hat”, “snare”, and “kick” microphones), where each sample has the same name for each mic position. then the code has a matrix for each instrument, where the round-robin sample is specified in each column and each velocity layer in the row of the matrices in the engine - for example see the assignment of kick samples.


install using with

;install https://github.com/schollz/lorenzos-drums

once you run for the first time it will automatically download the samples (requires 200 MB of disk space).


ughhhh what a prince, what a wizard. i love how openly you’ve given hooks for expansion, and i love how as a self-contained unit you’ve found yet another way to bring the ‘outside world’ into this ecosystem — such a rad mindset and execution :black_heart::sparkles:


Impetuous! Homeric!

Well done!


Again! You are incredible!


Looks amazing! Keep getting load fail on my norns shield tho. Any others? EDIT: fixed now! all is well


Can you open maiden while you load and see if it says anything? Also did you restart after installing?

EDIT: my bad - I put the name in the maiden library as “lorenzo’s drums” (with the apostrophe) which the file system didn’t like. if you installed from library viewer in maiden it won’t work. I just sent a PR to update the library, until then it should work if you instead install from REPL in maiden. click the “matron” tab and type this in and press enter:

;install https://github.com/schollz/lorenzos-drums

1 Like

Re-downloaded from library, works perfectly now! Thanks! such a fun script!


Looks so amazing. Unfortunately I’m getting behavior where the playhead isn’t moving. Everything else seems to be working but when I hit K1 + K3 I get one hit but nothing else.

1 Like

is there any output in maiden when this happens?

1 Like

hey ya!

got the script loaded and it ran the auto load for the samples.
it will make sounds but…it will not play the sequences.
ooop…i just saw someone has the same issue above.

using MIDI clock…here is what maiden says:


script clear

script load: /home/we/dust/code/lorenzos-drums/lorenzos-drums.lua

including /home/we/dust/code/lorenzos-drums/lib/instrument.lua

including /home/we/dust/code/lorenzos-drums/lib/slist.lua

including /home/we/dust/code/lorenzos-drums/lib/ggrid.lua

including /home/we/dust/code/lorenzos-drums/lib/patterns.lua

calling: oblique setup

script run

loading engine: LorenzosDrums

reading PMAP /home/we/dust/data/lorenzos-drums/lorenzos-drums.pmap

m.read: /home/we/dust/data/lorenzos-drums/lorenzos-drums.pmap not read.

Engine.register_commands; count: 29

___ engine commands ___

bd ffffffff

bd_amp f

bd_mix fff

ch ffffffff

ch_amp f

ch_mix ff

cs ffffffff

cs_amp f

cs_mix fff

fx sf

ht ffffffff

ht_amp f

ht_mix ff


lt ffffffff

lt_amp f

lt_mix ff

mt ffffffff

mt_amp f

mt_mix ff

oh ffffffff

oh_amp f

oh_mix ff

rc ffffffff

rc_amp f

rc_mix fff

sd ffffffff

sd_amp f

sd_mix fff

___ polls ___









script init

grid columns: 16


/home/we/norns/lua/core/clock.lua:65: /home/we/dust/code/lorenzos-drums/lorenzos-drums.lua:349: attempt to call a nil value (method ‘set_swing’)

stack traceback:

[C]: in function ‘error’

/home/we/norns/lua/core/clock.lua:65: in function ‘core/clock.resume’

/home/we/norns/lua/core/clock.lua:24: in function ‘core/clock.run’

/home/we/norns/lua/lib/lattice.lua:33: in function ‘lattice.start’

/home/we/norns/lua/lib/lattice.lua:55: in function ‘lattice.hard_restart’

/home/we/dust/code/lorenzos-drums/lorenzos-drums.lua:445: in global ‘toggle_playing’

/home/we/dust/code/lorenzos-drums/lorenzos-drums.lua:365: in function ‘core/osc.event’

/home/we/norns/lua/core/osc.lua:102: in function </home/we/norns/lua/core/osc.lua:100>

triggering 1

triggering 2

triggering 3

triggering 1

triggering 2

transport start


/home/we/norns/lua/core/clock.lua:65: /home/we/dust/code/lorenzos-drums/lorenzos-drums.lua:349: attempt to call a nil value (method ‘set_swing’)

stack traceback:

[C]: in function ‘error’

/home/we/norns/lua/core/clock.lua:65: in function ‘core/clock.resume’

/home/we/norns/lua/core/clock.lua:24: in function ‘core/clock.run’

/home/we/norns/lua/lib/lattice.lua:33: in function ‘lattice.start’

/home/we/norns/lua/lib/lattice.lua:55: in function ‘lattice.hard_restart’

/home/we/dust/code/lorenzos-drums/lorenzos-drums.lua:433: in global ‘toggle_playing’

/home/we/dust/code/lorenzos-drums/lorenzos-drums.lua:414: in field ‘start’

/home/we/norns/lua/core/clock.lua:168: in function </home/we/norns/lua/core/clock.lua:166>

transport stop

as usual it is on MIDI clock but i tried using internal clock as well.

i’m still on the previous OS due to trying to avoid all the script issues and waiting a bit before updating.

was wondering…
small feature request…it’s something that the Deluge does…could you add a Alt click of some sort for the grid that allows the user to select an instrument and it doesn’t trigger it’s sample?
this way one could switch sounds while its playing.

1 Like

This would be very much appreciated too.

Such a great script!


This is amazing! Thank you so much!

1 Like

Latest OS is working great now! Haven’t had any errors. Updated yesterday and ran cheat codes, flora, etc.

1 Like

v0.2.0 - added pattern chaining

  • you can now chain patterns (refer to video at top post for how to do it - basically set record mode and then touch banks)
  • touching the drum mode (row 8) doesn’t trigger drums anymore unless you are in “record mode” or “length mode” (i.e. the second-to-last button is dimly lit)
  • fixed some bugs

yep I just fixed it - I bundled the new version of lattice so you don’t need to upgrade.

I just modified it so the drum triggers are only applied when you are in a certain mode


That was quick - nice one!

1 Like

Sooo fun. Congrats for the awesome script!

This was made only with the mutes on board nothing fancy, nice to see it doesn’t cut the audio for a sample already triggered.

Edit: got lucky that the last sample was reversed, the chances were 1/11 chef kiss


its astounding! the whole piece really makes me smile, such a good sounding beat.

thanks Dan for the continually kind and inspiring notes. :heart: and yessss…I have a percussion section in my mind coming to norns (next up should be marimba)


Could you possibly elaborate further on the process for midi input mapping?
I’m trying to use my drumkat midi controller to play the individual samples and am sending note values 36-45 all on channel 10. I’ve confirmed the midi is getting to the norns using the midi monitor script.

Thank you for yet another awesome script!

1 Like

Lorenzo’s Drums v0.2.0.pdf (443.4 KB)
Another cheat sheet for this most excellent script, thanks Zack, again let me know if
there are errors or omissions.


hey ya!
very nice cheat sheet!

i would suggest RSYMB be labelled as RIDE.