A probabilistic bitwise-logic-based sequencer for live play.


This app started as something quite different: I wanted to explore a sequencer that sequenced mutations instead of values, passing a simple single-byte bitwise sequence from one step to the next. I wound up stripping all the sequencing out and focusing on making a UI for working with bit-based sequences. I then added some simple probabilistic aspects to mitigate the repetitiveness of the 8-bit phrasing, and it started to show some nice sweet spots.


Just norns.


UI is split into two pages: GATES and NOTES

GATES for each step are generated by combining two bytes with the chosen bitwise operator.

NOTES for each step are calculated by constructing a 4 bit value out of the current bit for each of 4 bytes (by default one for each power of 2, configurable in params).

All controls can have randomness, set with K1+E2. By default, randomness uses the “stability” more - for any byte, the randomness level is the likelihood that bit will flip when it is the current one. No randomness means no change, half randomness means equal likelihood it will flip or not, full randomness actually means it will ALWAYS flip (so, not really random…sorry…). You can also choose the legacy “trigger” probability mode in params, in which randomness is the likelihood a “1” bit won’t actually trigger when current. For the operator the probability chooses between the op and its logical inverse in both modes.

Randomness can be “locked” (disabled) globally by rotating E1 clockwise while holding K1. Unlock by rotating counter-clockwise.


  • k1: exit
  • e1: select page
  • [+ k1]: Lock random
  • e2: select control
  • [+ k1]: Set randomness

GATES PAGE controls

    • k2 [+ k1]: and [nand]
    • k3 [+ k1]: or [xor]
    • e3: l/r rotate both
    • [+ k1]:[oposite directions]
    • k3 [+ k1]: not [reflect TODO]
    • e3: l/r rotate
    • [+ k1]: l/r shift
    • [+ k2]: +/- value
    • [+ k1 k2]: +/- upper nibble

NOTES PAGE controls

    • k2 [+ k1]: not [momentary]
    • k3 [ + k1]: reflect [momentary]
    • e3: l/r rotate
    • [+ k1]: l/r shift
    • [+ k2]: +/- value
    • [+ k1 k2]: +/- upper nibble


from maiden type

Demos / Examples

Full demo to come, but here’s a quick video of some (recent) features:

TODO / Roadmap

  • Confirm the note names displayed are accurate

First of all, happy birthday! :slight_smile: Thank you very much for sharing this beautiful script us.

A really interesting and different approach to the idea of 8-bit music; preserving a chiptune rule but with another perspective.

Great! Can’t wait to try iit.


Happy Birthday! Great idea :bulb:


Happy Birthday! Will try it later :slight_smile:


Thanks for the kind birthday wishes! I just pushed an update to the script that cleans the code up a little, adds a few parameters, and changes the default way probability works. The default is now an ASR-like probability: the likelihood a given bit is to flip when it’s encountered. The UI may be a little counterintuitive at first - it shows the “randomness” of any given byte (shown as a low alpha “water level” to use @SPIKE’s term).

By default, randomness is 0, and you increase randomness to make it more likely that bits will flip in that byte as the clock ticks. At 50% you basically have total chance, greater than 50% bits tend toward flipping (100% they will always invert). At 0 the byte is in essence “locked”.

I’ll update the docs and try to get to a first tutorial sometime in the near future (may be about a week or so…work…)

Ps. also added a div parameter to increase or decrease pulse divisions relative to the clock.


really cool concept! looking forward to play around with it.

I love the sound of this. I look forward to giving it a go. Well done


very cool looking script!

took me a few mins to understand the randomness control.
so…each row on each page can have a kinda “water level” of randomness by holding K1 and turning K2.
very cool!

i might have found a :bug:
under Parameters/Notes
if you change the base note it jumps to 0 and 127 unless you hold K3.
also…it just stops making noiz at that point.
and…i just discovered the main screen of the script just goes blank.
i was able to recover just by clearing the script so it wasn’t a hard crash.

here is what maiden displayed:


metro_stop(): pthread_cancel() failed; error:

specified thread does not exist


/home/we/norns/lua/core/clock.lua:65: /home/we/norns/lua/lib/musicutil.lua:565: attempt to perform arithmetic on a nil value (local ‘note_num’)

stack traceback:

[C]: in function ‘error’

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

a few requests. :stuck_out_tongue:

  • can you have the Base Note display as a MIDI Note?
    (as in C1 or A#2 or the like)

  • can we get MIDI Start / Stop?

  • is there any plan to add MIDI out?

1 Like

Thanks for the detailed feedback, @SPIKE ! I’m actually planning to work on MIDI next, so will check out that bug asap, work on adding midi note display, and midi out right away. Start/stop might take a little longer but are definitely also on my to-do list.

I just pushed some updates addressing some of your items:

  • the crash when updating base_note should be fixed
  • the base note param now shows note name and octave BUT the octave appears off (note num 24 is shown as C0)
  • I added a really rudimentary MIDI out. It just uses device 1 on channel 1, but seems to basically work.
  • I also added a param for “lock current state” that does the same thing as the enc1+k1 combo, so one can map the lock action to a MIDI controller (stopgap till we’ve got full grid support…)

Let me know if you’re still seeing any of those issues or those features don’t work as expected!


There was an issue with the MIDI notes used in the MIDI out implementation. I just pushed a quick fix to the branch and tested it, seems like it’s working as expected now. MIDI start/stop implementation in the works.