Mash up of REPL and Looper/Sequencer (Updated 2022-01-08)


The idea here starts with building a code-analogy to a guitar looper pedal. Start recording, execute commands, and those commands get recorded along a loop timeline. Each row of the grid is one loop (aliased to single-letter variables ‘a’-‘h’). The medium lends itself to further exploration around generating sequences, commands stopping/starting other loops, loop lengths dynamically changing, merging/splitting loops, local ui visualizations, etc.

One of the biggest next-changes is refining the engine, which is currently a mash up of Timber, Molly The Poly, and Goldeneye. The next-gen engine will likely be all of that AND have some loop-level controls for volume, pan, and high/lowpass filter.

I developed this to perform at FlashCrash, which went smashingly and will go even better in February. I put this out to share ideas. The README lists a lot of inspirations and ideas. I’ll record a walk-through soon.

Tech – VueJS, Websockets, Lua, Lattice, Grid, Norns,


Assumes norns+grid and a paired laptop to use the web UI – similar to Maiden. The UI is served from the norns.

Documentation & Download


Under active experimentation as of 2022-01-08. You can follow along and try running through the README at GitHub - awwaiid/repl-looper: Anagogically integrated UI for Norns / Matron / Grid


I made a bunch of updates to the README and setup so it will prooobbbbabbbbllyyyy work for people who are not-me now. Installation should work using


I’ll do a video walk through soon!



The biggest change is that the three sub-engines (Timber, Molly, Goldeneye) now route to per-loop mixers. So if you have a loop d with a variety of events you can do d:amp(0, 10) to fade them all out over 10 seconds.

The second biggest, and related, thing is that now you can have several Molly instances (8 are predefined). You can do molly:note('c') and then molly2:note('d') and they are completely independent.

I recorded a video walk-through!



More loop utils, timing fixes, bug fixes

  • Generate key-off events
  • Fix Timber slicing
  • loop:pan(-0.5) to pan the whole loop
  • loop:noLoop() to stop looping
  • loop:once() to play once
  • loop:align(other_loop) to slide events into alignment
  • loop:slice(s1) now takes sample-variable instead of sample-variable-name
  • Fix loop:split(other_loop) to work more reliably and take a base-command
  • Fix loop:merge(other_loop) to keep relative timings (using the new loop:align)
  • Embedded Goldeneye - add pan, lowpass; fix rate
  • Lay out long loops on the grid by zooming-out (more steps-per-button)
  • Rename ALL to all

Next thing I’ll probably work on is to live record into samples that then get sliced so you can use this as like … a normal audio looper. Then I’ll hook it up to a midi pedal to start/stop recording.