Norns: softcut studies

Note that if you want to use the whole available range of a softcut buffer (or just refer to the end point) you can use softcut.BUFFER_SIZE. Actually it’s possible that this won’t ever loop smoothly since it doesn’t leave room for any post-roll to crossfade, never mind me. Or use softcut.BUFFER_SIZE - 0.1 (or whatever your fade_time is set to if not the default 0.1 seconds).

1 Like

Hi all,

I’m going through the softcut studies on my new norns shield, and I nearly lost my mind over what I thought was a bug with loop length in 4-recdub. As it usually does, it turns out I was just missing something that i suppose should have been evident, but I figure I should summarize it here incase it helps anyone else:

softcut.rate(1,1.0) is not explicitly defined in the init() function, so if you reload the script from maiden with cmd-P, the old value will persist even though the display is reset to say 1.00. Perhaps the powers that be could update the init() function so this doesn’t trip up others…? UPDATE: I created a pull request with the change…

I hope this saves someone else some time!

I’ve been looking through the studies/5-filters source and have a question about the filter_rq. From what I understand that values closer to 0 are more resonant and in the study a value of 10 is described as flattish. What is the range of values for filter_rq? and is there a resource that has examples of what different rq curves look like with different values? thanks

– set voice 1 filter rq (flattish)

it is reciprocal of Q-factor. therefore RQ = bandwidth / cutoff. (bandwidth defined at -3db.)

the topology and response are similar to this SVF described by andy simper / cytomic:

some transfer functions are plotted on p.13

1 Like

cool, thanks. I’ll keep reading up on state variable filters.

Is there some sample rate or bit rate reduction going on with softcut? I’m just starting my journey and on the fourth study, I’m listening to the input signal and then the “echo” and the recorded signal sounds markedly different (even at a playback rate of 1).

Hmmmmm ….


what i’m seeing in study 4 is that the gain staging is not ideal for all setups.

here, it is summing both ADC channels at unity gain to softcut voice 1 input:

so there will be clipping if you are taking a dual-mono source with less than 6db headroom. i would change the scaling to 1/2 or make it an option (for mono/stereo input, i think otis does this for example.)

there are two other things affecting the input signal path that you may be noticing:

    1. at each voice’s input, there is a multimode filter that by default is in lowpass mode and modulated by the rate (it is at 12khz when rate=1 and is reduced proportionately as abs(rate) goes towards zero.) this can be disabled by adding the following lines:
  softcut.pre_filter_dry(1, 1)
  softcut.pre_filter_lp(1, 0)
    1. at the input, after the filter, there is a soft clipper that kicks in around -3.34dBu. presently there’s no option to disable this. (sorry, maybe in next version.) so you want to leave that much headroom if you don’t want harmonic distortion artifacts.


It was the pre filter that did the trick. I was listening back to a snare sample that was losing top end and it was driving me nuts.

1 Like

thanks ezra for spotting this! cc @dan_derks (to discuss… we should be more explicit about input gain/mixing…)


Is it possible to change engines while softcut keeps running?

Use case:
I’m currently learning SC with the goal to build my own synthesizer engines to run on norns.
I understand I can only run one engine at a time on norns,
I would like to play it in realtime via connected MIDI keyboard,
record its output in softcut (using it as a looper),
change to a different engine and repeat.

While I am changing the engine, is it possible for softcut to continue playback of my looped recording without audbile glitches?

What would I have to watch out for when writing according scripts for norns in order to allow glitchless softcut loop playback while switching scripts?

Thanks much in advance!

  • when changing scripts, softcut state and parameters are reset to a default configuration. this behavior is defined at the system level and could only be changed there. so without introducing a mod it’s not possible to continue a softcut “session” across script launches.

  • it is possible to change engines within a script, but it is a little fiddly. here’s a very old example that AFAIK should still work:
    norns engine switching test · GitHub
    i seem to recall some script using the method in a more serious way, but have forgotten which one it was.

  • however, the most idiomatic solution if you are making your own engine class would be to just make your various voice types or synth architectures controllable from a single engine class. mx.synths is an example where multiple synth types are “isomorphic” w/r/t parameters and voice handling, so they are implemented as interchangeable synthdefs. it would also be possible to make a more heterogenous collection and/or use a deeper class structure.


Thank you, I will have a close look at both the engine switching test and the mx.synths. I am glad to hear that engine switching within a script is possible, I always thought it would make something terrible happen like crash or glitches. But I am really a noob, so this is just my naive interpretation. Guess I’m guilty of taking the second step (learn about engine switching) before getting the first one done (learn how to make my own SynthDef run on norns).

@wolfgangschaltung Orca allows for the changing of engines. My implementation is rooted in @zebra gist above, but a bit more convoluted.

  1. User selects engine in PARAMS menu

  2. This triggers the change of hidden engine_name_index param

  3. load_engine_ method is called and loads engine (if installed)

Maybe that’s helpful.

1 Like

Thank you, I will try to understand it!

1 Like

Sorry, noob here, but i’m having an issue running softcut study #6 on my norns. i’m able to load it up, but when i try to run my audio thru it nothing happens, I have both the feed and preserve encoders turned all the way up. can anyone tell me what I am doing wrong? thank you in advance

there’s a good chance the input level isn’t getting explicitly set in the script. check your param menu for input to softcut level.

it’d be good for the script to do a sane default