Sempra 1.0.6


a continuous dynamic melody sequencer for grid+16n


  • grid
  • 16n or other controller


  • crow
  • midi voice
  • just friends
  • w/


  • crow envelope outs
  • copy and paste sequences
  • clock multiplication
  • slides
  • save sequences
  • arc support
  • an engine
  • visual representation of gate length


dynamic melody sequencer

sempra 2

what is this?

a dynamic melody sequencer for norns, 16n and a varibright grid 128. there is no engine built in - to hear sound, connect norns to midi, crow, w/syn and/or just friends.

two sequencers run in parallel, each with up to 8 steps. swap out phrases from a shared bank on the fly, edit durations and repeats per step, combine sequences together in modular for awake-style phasing.

how do i use this?

sempra contains a bank of 16 phrases. the 2 identical tracks run in parallel, each one pulling data from one of the 16 available phrases. you can switch out which phrase is routed to which track on the fly with simple key presses.

grid and 16n

Untitled_Artwork 2

  • place your 16n directly above the grid, so each fader lines up with a grid column.
  • the top half of the grid controls step duration, from 1 to 4 ticks per step.
  • the bottom half of the grid controls step trigger behavior. from the bottom up:
    • off: bypass the step.
    • single trigger: trigger only when the sequencer advances to this step.
    • multiple trigger: trigger every time the sequencer ticks while on this step.
    • hold: holds / ties the gate for the duration of the step.
  • the 16n fader above sets the pitch for that step.

keys and encoders

Untitled_Artwork 6

  • k1: shift key
  • k2: enter selection mode for track 1
  • k3: enter selection mode for track 2
  • enc1: gate length for track 1
  • enc2: change phrase length for track 1
  • enc3: change phrase lenth for track 2
  • enc4 (fates only): gate length for track 2

shift functions

Untitled_Artwork 5

  • enc1: gate length for track 2 (for 3-encoder norns)
  • enc2: time division for track 1
  • enc3: time division for track 2

selecting phrases

Untitled_Artwork 3

pressing k2 or k3 opens the selector pane for tracks 1 and 2 respectively. in this mode, the opposite track is covered up by a 4x4 grid of phrases to choose from. pressing any phrase assigns it to the track. when you do, the selector pane will disappear again.

  • to latch the selector pane, hold shift while selecting a phrase. press k2/k3 to unlatch.
  • to exit the selector pane without selecting anything, press k2/k3 again, or press the currently selected phrase (much brighter than the others)

phrase are selected immediately when you press them. all changes to the previous phrase are automatically saved and can be returned to instantly at any time.


each track has a few params in the norns menu that you can’t access from the main interface.

  • transpose: transpose the track (not phrase) by x semitones.
  • output: sets the track output. sempra currently supports crow, w/syn, just friends and midi gear. you can also route a track to transpose another. (not implemented)


v1.0.6 - ;install

this is my first fully-documented, full-release norns script! woohoo! let me know if anything is broken and i’ll fix it asap. PRs and feature requests are more than welcome.


Very excited to try this sometime soon! And congrats on the release :slight_smile:


oof, super gorgeous demo + docs – i’m always struck by the playfulness of your performances and it’s absolutely wonderful to recognize it as the foundational energy of sempra. also, such an imaginative and attuned way to pair 16n and grid!! :sparkles:

congratulations on the release, can’t wait to dig in!!


congrats on your first script! looks rad.


yowza! looks & sounds awesome.

…how have i not yet picked up on this? brilliant!


When you save/ load a sequence, does it save/ load only the rhythmic phrasing or also the pitches?

1 Like

Owww! This looks super dope.

1 Like

this looks great, excited to try it!

1 Like

The 16 phrases include all the grid and fader information , the only thing they don’t include is transpose, scale, time division, that kind of thing. Though it would be pretty easy to add that as an option!

Unfortunately my 16n isn’t motorized (yet :smiling_imp:) but until then, you can see the fader values on the screen, they’re only overwritten when you move a physical fader


That’s exactly as I hoped. And, well, someday maybe we can make a motorized 16n.

1 Like

Not working with JF for me. Nothing when I select any of the JF outs. I loaded Awake to make sure crow|JF ii was working and it was. Afterwards Sempra would not load at all (see Matron output). Also, install path does not work. I had to remove everything after sempra/ to get it to install. Looking forward to playing with this more, really looks like a great tool!

# script load: /home/we/dust/code/sempra/sempra.lua
including /home/we/dust/code/sempra/lib/params.lua
### SCRIPT ERROR: load fail
/home/we/norns/lua/core/paramset.lua:423: invalid paramset index: 60
stack traceback:
	/home/we/norns/lua/core/norns.lua:146: in function </home/we/norns/lua/core/norns.lua:146>
	[C]: in function 'error'
	/home/we/norns/lua/core/paramset.lua:423: in function 'core/paramset.lookup_param'
	/home/we/norns/lua/core/paramset.lua:327: in function 'core/paramset.get'
	/home/we/norns/lua/core/menu/params.lua:62: in upvalue 'build_sub'
	/home/we/norns/lua/core/menu/params.lua:649: in field 'rebuild_params'
	/home/we/dust/code/sempra/lib/params.lua:169: in main chunk
	[C]: in function 'dofile'
	/home/we/norns/lua/core/startup.lua:42: in function 'include'
	/home/we/dust/code/sempra/sempra.lua:2: in main chunk
	[C]: in function 'dofile'
	/home/we/norns/lua/core/script.lua:192: in function </home/we/norns/lua/core/script.lua:192>
	[C]: in function 'xpcall'
	/home/we/norns/lua/core/norns.lua:147: in field 'try'
	/home/we/norns/lua/core/script.lua:192: in function 'core/script.load'
	/home/we/norns/lua/core/menu/preview.lua:23: in function 'core/menu/preview.key'
	/home/we/norns/lua/core/menu.lua:143: in function </home/we/norns/lua/core/menu.lua:120>
# script clear
calling: gridkeys-script-post-cleanup
mod - gridkeys - script post cleanup
mod - gridkeys - TOGGLE_GRID_KEY = false
mod - gridkeys - TOGGLE_GRID_KEY -> NO CHANGE
mod - gridkeys - clear at script stop / pre-start
/home/we/norns/lua/core/clock.lua:59: bad argument #1 to 'resume' (thread expected)
stack traceback:
	[C]: in function 'coroutine.resume'
	/home/we/norns/lua/core/clock.lua:59: in function 'core/clock.resume'
1 Like

Thanks for the reports, that’s weird about the JF behavior, I’ll look into that. Lmk the matron output if you get any.

And good catch on the install path, I just pasted the wrong thing. Whoops lol

1 Like

Seems to be anytime try and load Sempra after using another script with JF, this time after TVIBURAR. I added the Matron output to my original post. Thanks

1 Like

amazing script
watched the vid several times and realize i forgot to comment

well done


!! congrats

I love how bringing in the 16n on top frees up UI on the grid and supports playability. this is honestly the last push I needed to build a 16n between the panels I cut for myself like 3 years ago. it looks like such a joy to play : )

it has exactly the right amount of features too, imo


thank you so much @andrew , @glia and all others for your kind words, it warms my heart to hear them!

really looking forward to hearing what people do with it

@yobink , i think i found the issue, working on it now.


Awesome, @zbs. Out of town for the holiday but really, really looking forward to playing with this when I’m back.



  • added automatic 16n fader mapping, thanks @eigen for implementing that and writing the library!
  • fixed ii voices
  • fixed gate length controls

@yobink , I can’t reproduce that error, but let me know if you’re still having issues - it’s now working on my end. i made a silly mistake and put TT syntax in my lua without thinking about it :slight_smile: (jf.vox vs jf.play_voice)




you can load the same phrase on both tracks, then run them at different speeds and transpositions:


Had a lot of fun last night with the crow outputs. The 16n implementation is ace. Really easy to get off and running quickly. I was wondering if there could be a way to toggle repeats with ratchets? A division of the rhythm unit instead of a mult of it? Haven’t tried JF again will try it today.