I built a looper as a first Norns script for my own purposes. All buttons / commands are midi mappable so this thing can be operated with midi foot controller with both hands on instrument. It’s useful to me so maybe it’s useful for someone else too.
There are 6 loops. Loops are mono. Input is read from left input of norns.
Master loops are cut to length when pressing play or stop after recording.
Secondary loops are multiples (1-8) of master loops.
Loops are synced to master loops when playing is started.
There can be multiple master loops within a loop group which are then asynchronous.
Rate can be adjusted for loops and they will get async but will be synced again when stopped and started.
There is a one step undo so it’s possible to revert to previous loop state and cancel current recording.
white dot - selected loop
number - loop number, suffixed by c when there is content in the loop
status - status of loop (rec/ovr/play/stop)
arc - loop progress bar
vertical bar - loop level
horizontal bar - loop pan
m(number) - number of master loop e.g. m1
x(number) - number of loop multiples
g(number) - number of loop group
G - group play enabled when visible
E1 select loop - Selects active loop.
K2 rec/ovr/play - 1st press will start rec for empty master loops and overdub for secondary loops. 2nd press will play loop. Next press will again overdub.
E3 stop - Stops selected loop.
K1+K2 enable group play - Group play will toggle group play on/off when on there is a “G” in upper right hand corner visible. In group play mode all loops within group start when one loop is started and all loops within group stop when one loop is stopped.
K1+K3 clear loop - Clears loop contents.
E2 loop level - Adjusts loop level.
K1+E2 loop pan - Adjusts loop pan.
E3 loop group rate - Adjusts rate for the whole loop group at once.
K1+E3 loop rate - Adjusts rate for selected loop.
master loop - it’s possible to assign secondary loop to follow another loop by selecting corresponding loop number for master
loop group - loops can be grouped to loop/choke groups so that starting a loop from another group will stop currently playing group
loop multiple - loop can be a multiple of 1-8 to it’s master loop. Note: if master loop length * multiples > maximum loop length - multiples will be reduced accordingly
level - loop level
pan - loop pan
rate - loop rate (-2x,-1x,-0.5x,0.5x,1x,2x)
There are toggles for all the buttons so that they can be mapped to e.g. midi foot controller.
If loops have contents when saving a pset loops will be saved to /audio/giro/. Having content in loops 1,2 & 5 will result in 3 wav files
Loop wav files are named pset_name_loop e.g. "preset1_loop3.wav.
As the naming is based on the pset name the loop files will be overwritten if the name for 2 psets are the same.
This way it’s possible to save e.g. 2 different sets of parameters with same loop content if pset names are the same. If you wish to only save parameters without loops, clear loops before this.
Stuff to do next
Test & fix bugs
Maybe grid UI for more hands on performance and less menu tweaking
Norns studies and all who have participated in building those
Softcut and all who have participated in building it
@infinitedigits for oooooo and rc505 scripts I have been reading thru and trying to learn something
@kbra for a couple of useful suggestions for a looper
@dan_derks for helping me replace board with fishy encoders
@bereenondo for advising me on terminology (getting rid of master/slave, sorry about that)
If I understand it correctly, “there can be multiple master loops within a loop group which are then asynchronous” explains that: you can have both synced loops that follow a certain master loop as a multiple of its length - and several master loops that are independent (asynchronous) from each other.
Heyp & thanks! The save loops functionality was created with the idea of being able to take Norns out to a cabin, record stuff and then dump the interesting bits to DAW back at home. I hadn’t thought of the use case of loading recorded loops back. So sounds like a feature request in that sense I could look into this when I have time. How would you use this? Load some prerecorded loops & then creating new stuff on top of that?
I was thinking of when you’ve got a set of loops recorded and you have to end the session for whatever reason. Would be great to be able to save as a preset and be able to come back, reload, and have your loops repopulate so you can keep working/playing.
Cool! I think I’ll do this next. I might add a switch whether loop wav files are saved with preset. I think that I might save presets for live settings to preset parameters but would not want to save the loop files every time. Have to think about it a bit.
wow, @JulesV , this feels like such a lovely example of functional programming – seeing how all of the LOOPING LOGIC FUNCTIONS feed into the clock_tick is really really inspiring. i think this also captures a lot of musical gestures that folks have been seeking. what a wonderful contribution, thank you for sharing giro with us all!
Thanks! Norns is becoming an integral thing in my playing and the whole community effort in addition to the masterminds behind it is unbelievable. So, nice if something I create is of use to someone.
I think I copied with pride the idea from rc505 by @infinitedigits, so hats off to that direction. In that script it is used to sync to Norns clock but I used it because it felt logical and helps extend to clock syncing in the future if so happens. I think it helped with keeping loops in sync when starting multiple loops at once. I’m not a developer by trade so I’m just stumbling about and trying to learn and build on what others have created.
wow, I’ve been away from norns for a bit and it’s really amazing to come back and find this looper!
Also I’s really great that RC-505 was some inspiration!
Let me say a big thank you for finally making a synced looper, which is pretty straightforward and playable and can be anychronous if one wants and needs it.
We have a lot of experimental, asynchronous loopers on norns, some are really amazing ones too, but very little ones that work well in sync.
Do you have plans regarding external sync intergration?