Carter’s Delay: norns
a norns version of Carter’s Delay

This script started its life as a toy I made in SuperCollider for my (then) 6-year-old cousin. I found myself having a lot of fun with it, so I baked it into SuperLied, which was the script I was using for live performance at that time. And I used it a lot!
A few months ago, @Laen asked me whether it would be possible to make something like Carter’s Delay for norns. I said I thought it would be, but at the time, I wasn’t interested in doing it. I was, however, pretty interested in developing things for seamstress, so I did that and shared it here as a starting place for a possible Carter’s Delay script for norns. Eventually, I found myself wanting a norns version to exist and, with some help from @jaseknighter, was able to make that happen. Here it is.
[audio demonstration]
Requirements
Documentation
e1: input passthrough level
k1: input passthrough on/off
e2: delay input level
k2: delay input on/off
e3: control input passthrough level and delay input level simultaneously
k3: delay output on/off
all of these controls are also available in params for midi mapping
Download
v0.1.1 - Github
45 Likes
Sorry my ignorance, what is Carter´s Delay in schematic:
a multitap delay - how many taps and delaytime?
2 Likes
there are 16 taps, and each one is randomly selecting a delay time at script launch. The times are all multiples of 16 beats at 120 bpm, with 32 being the shortest, so they’re pretty long. They’re also playing at various rates — 1/4, 1/2, 1, 3/2, and 2 — and getting some filter and panning modulation from one of 48 LFOs whose frequency is randomized at script launch
15 Likes
Woah! Amazing, I remember having fun with this in SC 
2 Likes
yeah! This one’s a little different in that it has fewer playback rates to choose from. I find that makes things a little less chaotic and lends itself more easily to, e.g., free playing a keyboard-based synth or acoustic instrument into it, which I thought might be a more common use case on norns than it was with the sc version. I hope you like it!
5 Likes
Thanks a lot for the info!
1 Like
swhic
7
possible to have the more “chaotic” version in norns? thanks!
1 Like
this is definitely possible, yeah! All you’d need to do to accomplish this is edit 3 lines of Engine_CartersDelay.sc:
- line 109:
rates = [1/4,1/2,1,3/2,2].scramble;
change the values inside the square brackets to give the script more playback rates to choose from. For example, the standalone supercollider version of carter’s delay has this in place of that line: ~rates = [1/4,2/6,3/8,4/10,1/2,2/3,3/4,4/5,1,5/4,4/3,3/2,2/1,10/4,8/3,6/2].scramble; (you don’t need the tilde before rates in the norns version; that’s just a little syntactic difference that has to do with how the variables in the scripts are organized)
- line 122:
\dens, 1/(durs[n]*rates[n%5]),
change 5 to the number of values you’ve put between the square brackets in line 109 (so in the example above from the standalone supercollider version, it would be 16)
- line 125:
\rate, rates[n%5],
same thing; just change 5 to 16 or to whatever number of values you’ve got between the square brackets in line 109
After changing these lines, saving the file, and restarting norns, it should “just work.” Making this editable from params could be a fun experiment too!
9 Likes
swhic
9
thanks, such a lovely script!
1 Like
Higaru
10
thanks @WilliamHazard
very cool delay.
hope you’ll continue implementing features in “params”
and make it even more fun and playable and crazy:)
4 Likes
awesome, this is so much more than a delay!! love it.
Just one question, it is possible to have a variable feedback? and… how much feedback it is right now? It seems than have some repetitions for the taps and then it goes out, would be great having SOS
1 Like
this is an interesting thought! Right now, I’m calling the script a “delay,” but the way it’s set up is based on a GrainBuf – I’m using some techniques borrowed from this Eli Fieldsteel tutorial. I’m not sure how I’d go about introducing variable feedback, but if anyone has ideas, I’m open to them! @graymazes, do you have any thoughts on this? This script also definitely owes a great deal to your z-elements workshop at Luck Dragon.
3 Likes
here’s adding two types of signal persistence:
1, the equivalent of RecordBuf(...preLevel: xx) from the original script: carters-delay-norns/lib/Engine_CartersDelay.sc at add-feedbacks · catfact/carters-delay-norns · GitHub
(it seems too stupid to work, but yes you can just read samples with BufRd on the same phasor, and mix that with BufWr input)
this just keeps stuff in the buffer, unmodified except for level on each recording pass.
2, feedback loop from the main outputs to the mic bus. i added a bunch of nonsense to this for fun: carters-delay-norns/lib/Engine_CartersDelay.sc at add-feedbacks · catfact/carters-delay-norns · GitHub
this of course ends up writing rate changes, granulation envelopes and filter sweeps back into the buffer. (with parameter change zippering, extreme rate changes saturation etc - this can easily become quite gritty.)
NB that feedback path is independent of “delay input” setting (but not “delay output”)
added some parameters to control preserve, feedback and nonsense.
various other polishings are possible. (e.g. a threshold control for saturation would be nice, param smoothing etc etc)
11 Likes
wow, I’m looking forward to exploring some of these suggestions, but also, this sounds extremely lovely as is. I’m looking forward to playing around with it with a midi controller connected, but it’s a great experience just with norns too. Thanks for taking a crack at it and spending some time, @graymazes. I’ve merged the changes!
5 Likes
Exploring the feedback and madness, lovely!!! It works awesome without an external input too, just playing the noise and sine tone 
Just one question: what does the feedback balance??
1 Like
input bus is mono, output is stereo, so the balance control does equal-power blend between L/R output for the feedback. (not a very important or considered parameter, but didn’t feel correct with either a single channel selection (too arbitrary) or a straight L+R mix (too dense))
2 Likes
I just noticed that PSETs aren’t working for me with this script, which is weird – they’re working for other scripts on my norns (including other scripts I’ve written). Is anyone else experiencing this? I’m wondering if it could have something to do with the way I’m handling OSC stuff in params
1 Like
hm, that’s odd. i didn’t try it and don’t have a norns with me atm. at a quick glance i’m not sure why the OSC setup would be an issue - if the parameter actions work as expected, then calling them from PSET load should not present differently.
that said, i agree that this seems like the most likely source of the issue, and would generally recommend using the system-defined APIs (engine addCommand etc) instead of bypassing them with explicit OSC messages. this would avoid some potential problems - for example the receiving port number being repeatedly hardcoded to 57120 when sclang may potentially be listening on a different port. (if it is, then matron should know about it - and if it doesn’t, that’s something we can diagnose/fix at a single point of failure.)
2 Likes
pwenzel
19
I have been loving this script and using it a lot lately. It’s been a source of so many surprises!
Here’s a nice little exploration that used only an OP-Z and Carter’s Delay.
6 Likes