I’d be happy to take a look! can you make sure you are on version v1.9.1 and do a save and send me the files from your ~/dust/data/oooooo folder? one thing that might be important is to take advantage of the gapless playback is to make sure your audio continues a few hundred milliseconds after the loop completes (I doubt this is the problem as its hard not to do this…)

1 Like

Thx. I’ll update to newest as I have the previous one.

@infinitedigits I found myself looking for a way to clear the curent tape directly from the grid instead of pressing K1+K2, and had a crack at it over the weekend.
Screenshot 2021-09-19 at 17.27.24

A long press on the last 2 buttons of the last row will clear and reset the tape, just like K1+K2 would. I’m really enjoying it so far and submitted it as a humble PR if that’s okay :slight_smile:



Is there any chance that you could implement the multitrack recording option that you’ve just put into 0-0-0 into oooooo?

I’ve often wanted to play with these Eno/Fripp like Frippertronics, manipulating the outcome in a DAW.

If it’s at all possible, could you add it to the roadmap?

Thanks in advance

1 Like

I believe its not possible (but I’ve been wrong). softcut outputs through jack only a mixed stereo output, not a mix of the six stereo panned signals for each voice. the closest thing there is would be the save files - when you save oooooo it will save each loop individually. not really amenable to doing things live though…

however, if you have something really specific in mind it may be possible to cobble together SuperCollider code to get there! it won’t be as sophisiticated as softcut, but you can record loops in SuperCollider and then you can have each loop output to disk. (here’s an example of playing with recording/playback of loops in supercollider: looping.scd). (though by using SuperCollider you would lose the killer apps of softcut - namely the excellent interpolation during recording with changing rates and the super cool endpoint fades).


Thanks for the detailed response @infinitedigits glad to better understand the dynamics of how it’s all put together with the various “layers”, like an onion (a quote from the animated movie “Shrek”).

Yes, in this case saving the loops as a PSET won’t get to my end goal, but I have another system to do that.

In and of itself oooooo is AMAZING and I’ll continue to use it the way I have, which forces/focuses one on being comital.

just speaking from my own experience, i have indeed found that the stereo recording limitation is, counterintuitively, really helpful !

i started off doing asyc looping in max where multitracking is pretty easy - but i found myself rarely using it. whenever i did try to go back to a recording & edit the layers i’d end up with too many directions to take for the final piece & just sort of tweak endlessly - to the extent of watering down the intent of the original session

a trick i’ve learned since is to make long recordings of the mixed down layers & use crossfades, EQ, compression, filters, panning & pitch shifting to mix between my favorite parts & remove mistakes – there’s a *surprising * amount of ways to shape a master track into an organized piece


this is everything


Hey everyone, long time reader, first time poster :partying_face:

Just got a Norns yesterday and im loving oooooo, amazing work! Brilliantly implemented and totally addictive.

I have a minor suggestion - it’d be great to be able to toggle the warble from the grid (unless you already can and im missing it?)

And likely a more difficult suggestion, being able to change the filter type per layer would be very cool. having a high pass tool in busy soundscapes is very helpful.

I have no real understanding of how difficult these suggestions are to implement, but thought i’d throw them out there.

thanks for the fantastic work so far!


+1 for warble via the grid! Would be a wonderful addition to one of my fave scripts.


just diving into this script - it’s a whole universe! - bravo!

particularly enjoying feeding it material manipulated by hand on a morphagene and having a layers of mutating tape material accumulate.

one thing I’m thinking of exploring is a slight alternative to the destroy loops feature: more of a degrade loops.

In the destroy loop function, instead of setting the rec level to 0 and recording silence (while retaining a random amount of pre-recorded material), does anyone one know if it would be possible to load up a buffer (maybe of some kind of gentle noise sample) and use that as the source for what is recorded on the loop? I had a look through softcut tutorials - it almost seems possible, but I’m not sure - I suspect it would clash with global settings in the script which I’m guessing set the source for the softcut.rec function to be the adc or tape or both.

anyway, the goal to have loops gradually degrade to noise or hiss rather than silence - I’m happy to just run with the script as is but it would be fun to play with different kinds of loop degradation.


I may be misunderstanding here - but you can load up a audio buffer into any loop via the parameters loop X > load audio.

hm one path towards this goal is to have an input source of noise and then randomly turn on and off the recording on different loops that you want to degrade to noise. you can also set the “pre” amount so that so that the audio on the loops slowly dissipates instead of getting replaced entirely. if you don’t have an input source of noise, you could also modify the engine to output noise and then edit the script to record that over the loops randomly.

thanks for joining in! sorry for the much belated welcome :slight_smile:

are you intersted in a tempoary warble or more of a permananet toggled warble? I just realized I implemented a permanent tape warble (oooooo/oooooo.lua at main · schollz/oooooo · GitHub) but its currently not available to activate anywhere…

the temporary warble from the button is easy - it could be put into its own function that is activated by a button on the grid.

this is possible! softcut supports lots of filters and I only exploded the one (low pass). its moderately easy to do - here’s how it could be done:

  1. the voice level of all the fliters (hp, lp, bp, br) should be initialized here: oooooo/oooooo.lua at main · schollz/oooooo · GitHub
  2. a parameter with different options for filters (hp, lp, bp, br) should be added here: oooooo/oooooo.lua at main · schollz/oooooo · GitHub that parameter should have an action that sets the voice levels of the respective filters depending on which is selected.

thanks @infinitedigits - yes, I’d picked up on being able to load existing files into specific loops, but I’ll look into your suggestion of including a noise source within the engine as way of gradually degrading.

FWIW, I explored a bit more with the exisiting destroy loops feature and it’s getting me pretty close to where I want to go, but if I find some good alternatives via tweaking the engine I’ll be sure to share.

Every time I feel tempted by some specialist guitar pedal effect or other euro FX module, I’m increasingly finding that there is already a script in Norns that either does something similar or takes me in a related but different direction - thanks so much for all your contributions to this ecosystem - your work is truly inspiring.


Tried to “activate the permanent tape warble changing the value for warblepercent but no luck… That’s one of my most wanted features, is there an easy way to activate it? Thanks!

1 Like

I think you can drop these lines
over right here and add a true or to the end of this line
so it always triggers the rate check.

permanent wobbling would be pretty cool. I can see about making a more systematic addition next time I tinker with oooooo.


thanks!! trying it today!! what a lovely scripts u make!

EDIT: no luck, I got all kind of errors. Will wait for your inmpementation! :pray: :star_struck:


oooooo fork :fork_and_knife:

been playing with a fork of oooooo lately and was asked to share so here it is -

what it is

this fork will make your monophonic synth into a polyphonic synth by layering notes onto the six loops of oooooo. the only input you need to give it is the chord progression (there is one line in the script where you can edit the chords), and then the rest is done for you. the way the notes are layered is described here, but basically this script will find the minimal inversions from the first chord and then rearrange the columns of each row so that there are minimal changes between chords. then it will go up/down in octaves each line to make sure the chord is padded out (and sometimes gives melodic things). this is a random process (there isn’t one best answer for each chord progression) so each time you run the script it is a little different. after the chords are layered, it plays random notes at random intervals and sounds melodic. its fun to add lots of texture in each layer (modulating filters, volume, etc).


oooooo + strega into reverb

oooooo + nts-1 + po-32 drums into reverb


old instructions used to be here: v1.10.0 now contains the chord sequencer!


  1. plug in a midi synth or crow (with crow out1 going to 1v/oct)
  2. put sound out from synth into norns input
  3. run oooooo
  4. play with filters on synth while it runs!

Oh! This might be a fun thing to pair my shiny new Wing Drum with…

Thank you!


That’s christmas sorted.



Trying to get up and running from the description above, but keep getting errors.

error: init


script clear

script load: /home/we/dust/code/oooooo/oooooo.lua

including /home/we/dust/code/oooooo/lib/grido.lua

including /home/we/dust/code/oooooo/lib/json.lua

including /home/we/dust/code/oooooo/lib/glyphs.lua

including /home/we/dust/code/oooooo/lib/json.lua

script run

loading engine: SimpleDelay

reading PMAP /home/we/dust/data/oooooo/oooooo.pmap /home/we/dust/data/oooooo/oooooo.pmap not read.

Engine.register_commands; count: 1

___ engine commands ___

threshold f

___ polls ___









script init

including /home/we/dust/code/

including /home/we/dust/code/

ls: cannot access ‘/home/we/dust/data/oooooo/names/’

: No such file or directory

DATA_DIR /home/we/dust/data/oooooo/

name_folder: /home/we/dust/data/oooooo/names/

ls: cannot access ‘/home/we/dust/data/oooooo/names/’

: No such file or directory

initializing 1

initializing 2

initializing 3

initializing 4

initializing 5

initializing 6

initializing 7

grid columns: 0

grid width: 16

pset >> write: /home/we/dust/data/oooooo/oooooo.pset

including /home/we/dust/code/oooooo/lib/monosong.lua

including /home/we/dust/code/oooooo/lib/table_addons.lua

including /home/we/dust/code/oooooo/lib/lattice.lua

in oooooo

connected to virtual

chord changes before:


/home/we/dust/code/oooooo/lib/monosong.lua:44: attempt to call a nil value (field ‘generate_chord_roman’)

stack traceback:

/home/we/norns/lua/core/norns.lua:145: in field ‘generate_chord_roman’

/home/we/dust/code/oooooo/lib/monosong.lua:44: in method ‘play’

/home/we/dust/code/oooooo/oooooo.lua:492: in global ‘init’

/home/we/norns/lua/core/script.lua:126: in function ‘core/script.init’

[C]: in function ‘xpcall’

/home/we/norns/lua/core/norns.lua:146: in field ‘try’

/home/we/norns/lua/core/engine.lua:91: in function </home/we/norns/lua/core/engine.lua:89>

Any thoughts? Can’t wait to give it a bash!



1 Like