Norns: crone/supercollider



ok. i’m just saying that it’s trivial to change the recorder to add inputs and produce a quad file. (code change above.) splitting the resulting file is also pretty trivial, either in SC:|i| Buffer.readChannel(server, foo, i).write(...) })

or as sox commands

sox foo remix 0 &&
sox foo remix 1 &&
sox foo foo.out.l remix 2 &&
sox foo foo.out.r remix 3

and if anyone cares about sync, it’s already solved. (fwiw, i care about it and so does the OP - recording live instrument input with live synth/proc output is a great use case.)

it also doesn’t affect playback within norns because everywhere we do playback, we explicitly ask for channels we want.

so that’s just how i’d implement it with minimal code and without adding extra synth nodes and streaming buffers. regardless of the user-facing output.

obvs this is just my thought, NBD, and any solution anyone wants to implement is totally fine.


spent some time poking around the engines yesterday and didn’t seem to see what i was looking for but maybe i missed it:

is there an engine that’s useful for creating custom audio processing scripts? specifically looking for one that exposes a variety of filter and delay ugens that you could instantiate however you’d like in a script on the lua side.


perhaps the R engine by @jah?


i will look at this one more carefully! thanks.

yep, this looks like the one i should start with… and if i can’t get the functionality i need out of the provided modules i might try to extend it by adding a ugen.


thanks for mentioning this.

i’ll get together a new simple tutorial engine like TestSine that does input processing


third times the charm :slight_smile:


thanks. i’m new to a lot of this so parsing all of the existing information can be tricky, especially when i’m not entirely confident in the correct words or phrases that might help me locate what i’m looking for better.


oh oh sorry, no problem. i was just messing with tehn. the evident difficulty of discovering the passthrough engine demo is definitely a documentation / publishing failure on our end (it is just a random gist with a couple links buried in this thread.)

i don’t have much to add - R is the modular engine on norns. it is, inevitably, opinionated in its design and you could cook up something different if you’ve a mind.


Any idea how I could make an engine with an external analog effects send using one of the input/output channels? Essentially I’d like to route audio out within my engine to an effect and then bring it back into my engine before sending it out into the norns reverb and aux effects. I’d then want the audio after the interval reverb effect to come out one of the main audio outputs.


not sure i totally understand… norns has 2 ins and 2 outs of course. so i think you’re saying you want, say, all Crone output (reverb, monitor &c) to be silent on the Left output channel. so your engine can have it all to itself.

off the top of my head, the easiest hack would be to add something like this in your engine:

silencer = {, }.play(target: context.out_s, addAction: \addBefore)

which will overwrite the first channel of the main output bus with silence, right before it is sent to the hardware output.

then your engine can write to the hardware output directly without interference.

you could do something similar with the input side i guess, or just don’t use the monitor route (and make one in your engine instead.)


Thanks for this @zebra, yes so the signal path would be something like this

           Analog Effect
            ⬆︎       ⬇︎
            Out 2  In 2
   In 1 -> Crone Engine  -> Out 1

So the signal would go out of the crone engine at Output 2 without the built-in reverb/aux effects and then come back into the engine at Input 2 for further processing if needed. Then it would be passed on to Output 1 with the built-in reverb effects. So instead of a stereo in/dual mono in and stereo out, it would essentially be mono in/mono out, with a mono effects loop. I’ll look into ReplaceOut and something for the monitoring as well.


I have added some file to my norns which is causing the library to not compile. Is there any way I can read what the log of SuperCollider says when it tries to compile so I can figure out what the error is? The REPL in maiden doesn’t show anything when I reset the audio.


shut everything down with ./ then run sclang?


Got it! Thanks @okyeron! I forgot about good old terminal.


ok, i have been trying to wrap my head around around supercollider. watched a lot of tutorials and have gotten the hang of the desktop version but having trouble applying it creatively.

i want to make a couple of changes to my local version of (

basically, i find myself wanting to hear slight variation between the envelopes of each voice of the synth. i was hoping i could get away with something stupid like changing the noteOn envelopes, ie “env2Attack”, to something like “(env2Attack * rrand(0.9,1.1)” but this doesn’t seem to work.

i am thinking one or both of these things are going wrong:

–rrand is only evaluating when the synth is loaded and not each time lua calls noteOn.

this is almost definitely happening, so i need to put in some kind of function that is called on noteOn to get a new random number? is that the most sensical way of dealing with this?

–all the voices must share the same parameter states because it’s a polyphonic synth. the noteOns are stored in a ParGroup (voiceGroup) which also looks like it contains the envelope values.

hopefully this is not happening, but if it is, maybe what i actually need to do is set up a different supercollider engine that is actually 16 mono synths? and hope i don’t crash into the cpu overhead? i have a very poor grasp on what ParGroups actually do.

i should probably put in more time figuring out supercollider before asking for help on this, but posting anyway in case other novices are sneaking ahead of the studies and have thought of this stuff already


A new SynthDef should be being created for each new note so you should be good. Where are you making the change?


i’ve tried a couple of spots, within the noteOn command (line 287) and after that didn’t work i tried messing with the first time envelope2 is defined (line 105).

but thanks, that’s good to know! i’m wondering if i’m just not thoroughly resetting sclang enough for it to see the new version (read someone else having that issue on here but thought i had it worked out).


Yep line 105 inside the synthdef is a good place to mess around. You’re probably already aware, but just in case, you need to run the stop/start scripts to see any changes on norns. You can see postln in maiden to easily confirm if changes are showing up.


What would be the best approach to extracting a pitch in Hz from a sample? I’m probably going for an average pitch over a short period of time. I tried creating a new poll within crone, but couldn’t get it to work. I also tried doing it directly in supercollider, but I’m not sure how to get the information out of a signal data type.


you mean non-realtime? supercollider isn’t a great fit.

what i’d suggest depends a little on exactly what you want to do, what are the problem constraints, and it could be simple or complicated. but it would be some kind of asynchronous utility and likely a separate command line program callable from lua.

for example, you could see if the aubio python-based toolkit can be made to work on norns.

if your needs and constraints are simple (e.g., you know each sample is periodic with a pretty constant fundamental, you only care about a relatively coarse estimation to map to MIDI notes) then it’s certainly not too hard to roll a small utility from scratch. details are a little beyond my bandwidth ATM but could sketch it out given a free hour or two.

on the other hand, if you do mean realtime pitch analysis, the autocorrelation Ugen used in the CroneAudioContext pitch polls is very simple to use - just send it audio and get control-rate pitch and clarity measure. there is also a SynthDef already loaded in the Crone environment: