The other night I ripped through a number of Ethan Hein’s YouTube videos. His model of using concentric circles for mapping beats clicked with me. So, I pulled together this sequencer, because I’ve been struggling to find a more intuitive way (to me) to create and string together drum beats for Midi and crow* devices.

I humbly present…



Beat sequencing rund um den Kreis inspired very heavily by Pocket Operators and the work of Ethan Hein.

Kreislauf screenshot animation


Norns or Fates.


Kreislauf can be installed via Maiden’s project manager.



Each pattern consists of 4 concentric sequencer rings:

  • channel 1 - kick (outermost),
  • channel 2 - snare
  • channel 3 - closed hi-hat
  • channel 4 - open hi-hat (innermost).


When a beat is added to a ring, it fires off a Midi* note when active (60 by default) to the corresponding channel. While, this script is designed with intent to create drum patterns; each beat can have its note value adjusted allowing for melody/harmony constructs as well. Go wild…

*I’ve blindly implemented crow, but I have no idea if it works. Any crow users please let me know what bugs you find and I’ll adjust.


I also like the way Pocket Operators accommodate for chaining of beats so I incorporated the ability for multiple patterns with individual loop counts to be strung together. For single pattern beats be sure to keep loop count as Inf. if you want endless looping. If multiple patterns are create, the entire sequence will always loop.

Saving and Loading Sequences

Patterns can be saved and later recalled (along with accompanying PSET). A number of demo patterns of some staple beats is installed within ~/dust/data/kreislauf/patterns. LOAD and SAVE patterns from the params menu.

Controls and Params

Controller Page Values Description
E1 Global 1 – 3 Change page
K2 Global Play/stop Plays or stops sequence
E2 P1 1 – x Cycle through patterns
E3 P1 20 – 300 Set BPM
E3+K1 or E4 P1 1 – 16 Step divider
K3 P1 Add pattern
K3+K1 P1 Remove pattern
E2 P2 1 – 4 Cycle through rings
E3 P2 0 – 16 Set channel for active ring
E3+K1 or E4 P2 Inf, 1 – 32 Loop count for active pattern
K3 P2 Load pattern
E2 P3 1 – 16 Cycle through steps
E3 P3 0 – 127 Set note value for active step
E3+K1 or E4 P3 0 – 127 Set velocity value for active step
K3 P3 Add beat/note to active step

@Ethan_Hein is here!

Looks super cool, can’t wait to try it out !! :slight_smile:

PS It looks like your video demo link didn’t work/embed properly


This is super cool! I dig it.


makes me think of the approach of the Future Retro ORB.


When I add one beat with this script it sends the note to the external synth but never sends a note off, I’m at a loss as to what’s going on. Other sequencer scripts work normally. Anyone have an idea what’s happening?

There’s also a weird issue, when I stop the sequencer it seems to keep sending notes, but I have a feeling that’s related to the first issue.

Odd, I hadn’t encountered that issue before. However, looking through the code, I see I omitted the note_off from my my stop function. 🤦

@wakyct I just patched a fix it will be v0.3.2 (commit hash c5bf12f). I wasn’t having an issue before, but I did a limited test and it should hopefully work as intended. FWIW, I blatantly cribbed the way Awake handles note_off as it relates to note length.


Thanks so much, that appears to have fixed it. I wonder if it was some peculiarity of the synth I have? Anyway, I appreciate it!

:man_shrugging: but… there was def an error in my code which I fixed. Glad it’s working!

1 Like

I’m only seeing a lot of note off messages when I monitor the midi messages, I cant seem to see any note on messages.

Also, to make it a bit clearer in the manual, the button combo to remove a pattern should be K1 + K3 instead of K3 + K1

Are you having an issue with receiving midi notes? Or just monitoring them? If there is an issue, If you have any relevant maiden output that will help.

If you have the Midi Monitor App on Mac OSX the Midi messages sent from the Kreislauf can be seen from the below log file.

Basically lots of unnecessary Note Off messages …

13:50:25.499 From DIN 1 Note Off 2 C-2 100
13:50:25.500 From DIN 1 Note Off 2 C-2 100
13:50:25.501 From DIN 1 Note Off 2 C-2 100
13:50:25.502 From DIN 1 Note Off 2 C-2 100
13:50:25.503 From DIN 1 Note Off 2 C-2 100
13:50:25.504 From DIN 1 Note Off 2 C-2 100
13:50:25.505 From DIN 1 Note Off 1 C-2 100
13:50:25.506 From DIN 1 Note Off 1 C-2 100
13:50:25.507 From DIN 1 Note Off 1 C-2 100
13:50:25.508 From DIN 1 Note Off 1 C-2 100
13:50:25.509 From DIN 1 Note Off 1 C-2 100
13:50:25.510 From DIN 1 Note Off 1 C-2 100
13:50:25.511 From DIN 1 Note Off 1 C-2 100
13:50:25.512 From DIN 1 Note Off 1 C-2 100
13:50:25.513 From DIN 1 Note Off 1 C-2 100
13:50:25.514 From DIN 1 Note Off 1 C-2 100
13:50:25.515 From DIN 1 Note Off 1 C-2 100
13:50:25.516 From DIN 1 Note Off 1 C-2 100
13:50:25.517 From DIN 1 Note Off 1 C-2 100
13:50:25.518 From DIN 1 Note Off 1 C-2 100
13:50:25.519 From DIN 1 Note Off 1 C-2 100
13:50:25.520 From DIN 1 Note Off 1 C-2 100

Out of curiosity do you get the same result when you use the Awake script? I’ll dig into this issue over the weekend

UPDATE: @djd_oz I just tweaked the way I’m handling note_off so it shouldn’t be as aggressive as before. It’s live as v0.3.3 (commit hash 5bd60ba).

1 Like