stereo varispeed looper / delay / timeline-smoosher

this version of cranes builds on the “one buffer, two voices” approach of its predecessor in pursuit of a more flexible on-the-fly-sampling instrument. though the paper crane (initial record) allows original behavior, the pair of birds (overwrite) allows the artist to specify a buffer – in combination with the 1/10th second adjustable loop points, this brings new performative options to the table.


norns 2.0+
(128 vari-bright grid optional, but v fun)


quick start:

  • plug a stereo signal or two mono signals into the inputs on norns.
  • head over to the params page.
  • nb: when the buffer is completely cleared (at startup and after KEY 3 + KEY 1 are held), cranes will record incoming audio at 1x speed into both buffers and will immediately play back at the rates specified in the params page.
  • nb: left input will write to voice 1, right input will write to voice 2.
  • for the most immediate fun, I suggest setting speed voice 1 to 0.5 and speed voice 2 to -1.
  • head back to the performance interface.
  • tap KEY 2 to record into the buffers. also, make some sounds!
  • to loop, tap KEY 2 again. this sets the loop points (s1/e1 and s2/e2) to the length of the recording. you should hear your material played at half-speed on the left and reversed on the right. you should see the one / two counters counting in the same direction and at the same speed as your audio.
  • hold KEY 1 until you see s1 and e1 change to s2 and e2. this switches which buffer you want to control with the buttons and encoders.
  • use ENC 2 and ENC 3 to adjust the start and end points of the selected buffer’s loop, with 1/10th second resolution. you should see the counter for the buffer lock to the new start and end points.
  • tap KEY 2 to toggle overdub / overwrite for the selected buffer. you will see some friendly birds flying alongside your loop when overdub / overwrite is engaged.
  • nb: to retain continuous audio, overdub / overwrite write to the selected buffer at the rate specified in the params page.
  • adjust ENC 1 to crawl the spectrum of overdub / overwrite. over: 0 is full overdub, adding incoming audio to the pre-existing audio in the selected buffer. over: 1 is full overwrite, replacing pre-existing audio in the selected buffer with incoming audio.
  • fun thing to try: adjust start and end points past the existing audio and write into a new section of the selected buffer, then slowly re-introduce the prior section.
  • tap KEY 3 to perform a speed bump on voice 1. hold KEY 3 to produce a more dramatic change. KEY 3’s influence is selectable in the params, under KEY3. ~~ is a small pitch deviation, 0.5 is half-speed, etc.
  • hold KEY3 + KEY 1 to completely erase all buffers. if you hit KEY 2 again after this, you’ll get back to the paper crane.

grid stuff:

  • plug in a grid and re-boot cranes
  • use the following legend:

  • speed + direction: -4x to 4x, 0 in the middle (unlit) functions as ‘pause’
  • sync playhead to other: sync the voice’s playhead to the location of the other’s
  • re-size loop to other: dynamically adjusts the voice’s current loop points to the other’s
  • reset playhead to start: trigger voice to playback from currently defined start point
  • create snapshot: collect speed + direction, playhead position, start and end points and assign it to a button on the far left (similar to less concepts)
  • erase all: erase all of the voice’s snapshots (similar to less concepts)
  • snapshot recall: recall a saved snapshot’s parameters
  • start point adjustment + end point adjustment: add or subtract time from the voice’s start and end points, in 0.01 second or 0.1 second increments
  • window adjustment: adjust voice’s loop window by 0.01 second increments or by the distance between the start and end points


v 2.12 -



  • exposed param for input levels (good call, @mlogger!). there’s L and R values for both voices.
  • created param to switch which buffer voice 2 references (buffer 1 or buffer 2). default (2) is “new cranes”, where both buffers are only written simultaneously during paper crane. switch this param (2 -> 1) to unlock “old cranes”, where voice 2 references buffer 1 for pitched delays and all kind of cool things. (thx for idea and testing, @Olivier + @yobink!)
  • KEY 3 can do momentary reverse, independent of speed (great call @Ithacus!)
  • generic code optimization

Hello, getting an error here on 2.0: CODE/CRANES (error:init)
Other scripts are loading OK…

ugh, bummer. investigating, thanks for the report / patience.

edit: @Molotov, fixed! try again, please and thank you!

fwiw, syntax changed a bit and line 44 needed updated from audio.level_ext_cut(0) to audio.level_eng_cut(0)

1 Like

:slight_smile: thank you!..

1 Like

loading up and looking good

1 Like

I am loving this new cranes - panning, separate buffers, reverse! (was that always there and I just missed it?). hands down one of my favorite loopers ever, great job Dan.


one of my favorite apps. seems to be working rather well on my end- except occasionally when recording (even when on a brand new instance) i get phantom little echos of whatever im recording that appear WHILE i’m recording, not sure what’s going on there.

1 Like

grateful to hear things are up and running for folks!!

there was a 1.5-ish version that introduced reverse, but wasn’t pushed to dust, so it’s very likely folks could have been running the older iteration. library ruuuuules.

i’m so glad that the changes are bringing joy!

ah. while updating this script, i found that the order of softcut’s buffer-clearing and reset commands seem to matter, but i’m still not entirely sure what order is best. i landed on this version after extensive command juggling and while it has not exhibited this behavior on my machine since then, i think i know what you’re describing. it’s like the playhead somehow gets engaged just a few ms behind the write head, yeah?

does this happen on a fresh boot (not just fresh script load)?
if so, can you head to params and jiggle the playbeads away and back to 1x forward and does it still happen?
if so, does executing clear_all() in maiden help?

glad it’s only occasional and while things function fully around and past it, I would love to nail this down.

hm. i’ll open a GH issue for this. some ideas but i need to look at your script.

eep, i feel bad having you investigate what might just be weirdly chained code on my side — info about any preferred order would help, but if you do peek the code and can confirm that the clear_all() function in cranes looks ok, then that might be enough.

my goal is to avoid script authors having to worry about execution time or order for buffer-manipulation commands (or any others.)

[ ]

(OT: there is some inevitable timing slop in the short term due to the OSC layer, (and some decisions around our use of it, like prioritizing latency reduction over jitter reduction.) some day (3.0?) i want to tighten this up at least for matron->crone.)


ok yeah, you shouldn’t need to repeat the clear commands here

and here

buffer_clear() already zeros both channels in their entirety. if you only need to clear a region then just do that b/c it is faster. (i will also try some ways to make this less of an issue as mentioned on GH.)

(of course that’s assuming everything is working correctly. do lmk if there are further indications to the contrary.)

when using buffer_clear_region, remember to account for post-roll. (when a voice loops or changes position, it continues to play after the loop endpoint / cut point, for [fade time], with envelope.)


dope, thanks e. i’ll push those changes when i’m back at my machine and continue testing.

notice to all who land here: don’t get spooked! this is a minor thing that does not affect core functionality. plz feel free to report any reproducible issues here, but also plz feel assured that you can load cranes, use it fully and have fun!


2.0.1 posted!

  • took @zebra’s kind advice and removed superfluous buffer clearing.
  • to avoid weirdo behaviors while recording in paper crane mode, I’ve built in automatic playback muting. nb: this does not affect the overdub / overwrite bird buddies. @n-So, should take care of that unwanted blippy stuff.
  • small tweaks to overdub / overwrite bird buddy behavior

enjoy + plz share what you make + report any unwanted weirdness!


oh my god i can finally start working on my reich norns cover album this is amazing!


Cranes is wonderful. Thanks so much, it pretty much exactly what I was hoping for.
I have one request, OK, two… could stop/play and reset be added? Creating phasing offsets is great but it might be nice to be able to start a track/performance with two loops tightly synced, so that they can then gradually fall out of phase… or pull them back into line, suddenly.

Here’s a little sketch from my first day, with Lorre Mill Keyed Mosstone providing the audio.


co-sign! trying to recreate “it’s gonna rain” with someone from the the conservative talk radio station that’s clearest on my op-1 actually turned out to be super hard.

alternative framing of the above— “creative limitations spare word from horrible noise”

1 Like

Mosstone is the perfect instrument for Cranes! Makes me miss mine! Very nice @lloydcole

1 Like

re: delay in cranes, you could definitely load up a third softcut voice per @tehn’s halfsecond script and route voice 1 and 2 into it!

or as @swhic mentions, you can use softcut as a delay for the input as well. softcut is able to pull in from adc and dac, you just need to specify which (input channel and/or another cut buffer) goes into which voice at what volume. see, but these commands will do the trick:
softcut.level_input_cut(ch, voice, value)
softcut.level_cut_cut(src, dst, value)

by specifying routing and arguments, you could chain either of these:
input -> delay -> cranes
input -> cranes -> delay
or just input -> delay -> out while cranes does its normal thing


Would you have any interest, given I don’t script, in investigating this avenue as standard for Cranes, or maybe ‘Many Cranes’? What would be perfect would be if the echo could choose its source - ie change from ADC to DAC… but if it had to be just one, I’d vote for DAC.
This request/suggestion should probably be over at the Cranes thread…

1 Like