Slide notes?

I probably missed something in the videos or docs, but what would be the way to get a "sliding" note, e.g. lowering 2 semitones as it's played? (let me know if my wording is confusing and I'll find an example.)

1 Like

I was poking around in the SuperDirt Synthdef file earlier. It's got very useful explanations, parameter keywords and what they do, descriptions of presets etc. of most of the synths - I regret not having looked at it earlier.

Anyway, a bunch of the synths (superzow was the one I played with) have an accelerate parameter that seems to be used for pitch glide stuff. And of course, it can takes patterns, which is fun.

1 Like

Hey, thanks! I also noticed that superchip also has the slide and accelerate parameters, which are indeed handy. But those options are limited to specific synths, no?

I was thinking in the sense of applying a linear progression between one note and the other, much like a MIDI pitch slider does in a conventional keyboard (but hopefully with more flexibility). Or having notes slide into each other instead of jumping, like a theremin. I was in the hope that there'd be a generic operator to specify this kind of effect. Does this make any sense?

I would also look into the interpolate transition, even though I always found it a bit confusing to use (since it seems to be interpolating all parameters that can be interpolated).

2 Likes

i've also been curious about patterning pitch glide. i use accelerate frequently but i'm not sure if this works just on samples or on midi, as well. i suppose i could always try to automate it with a ccv param.

I guess sliding/gliding notes imply a monophonic instrument. SuperDirt's architecture is polyphonic, and doesn't fit too well to monophonic synths. It's possible to hack around by using global effects and things though, I know @bgold has played with this in the past.

I think many of the tricks I know of have been covered. accelerate should work for most things, and some of the synths support slide specifically to try to emulate classic monophonic-style synths.

Another option to get a more truly "monophonic" kind of synth is a bit more involved and requires a bit of SuperCollider coding, but essentially you set up a "voice" synth and a "controller" synth:

(
var dronebus = Bus.control(s,5);

SynthDef(\dronec, {|n=0, gain=1, pan=0.5, speed, sustain|
	Out.kr(dronebus, [n, gain, pan, speed, sustain]);
}).add;

SynthDef(\drone, {|out, pan, freq, sustain|
	var sound, env, fenv, lfreq, lgain, lpan, lag, locals;
	env = EnvGen.ar(Env.linen(0.005, 0.99, 0.005), timeScale:sustain, doneAction:2);
	locals = In.kr(dronebus, 5);
	fenv = EnvGen.ar(Env.perc(0.02, 2, 1, [1,-1]), gate:Changed.kr(locals[0]), timeScale:locals[4]);
	lag = 0.5 * locals[4] / locals[3];
	lfreq = freq * Lag.kr(2.0 ** (locals[0]/12), lag);
	lgain = 1.0 * Lag.kr(locals[1], lag);
	lpan = pan + Lag.kr(locals[2], lag);
	sound = Splay.ar(VarSaw.ar(lfreq*[0.99,1.01], [0,0.2], 0.98), 0.4, levelComp:false);
	sound = LPF.ar(sound, freq*10*fenv+800);
	OffsetOut.ar(out, DirtPan.ar(sound, ~dirt.numChannels, lpan, env*lgain));
}).add;
)

This lets you control it from Tidal like this:

d1 $ n "c" # s "drone"

d2 $ n "c e f a" # s "dronec"

where there's now an automatic portomento pitch glide between the "c e f a" notes, and then the envelope resets every cycle because the "drone" is playing "c".

I should add that this isn't a perfect solution either - weird things will happen if you have multiple notes going to "drone" simultaneously, or if you play a chord on the "controller", etc.

8 Likes

Wow, thank you all for your insights! I'm still green so it's probably a good idea for me to keep this challenge shelved until I learn more about the workings of the program. I'll report back if I figure out anything interesting.

Right, so after some source code digging, I got somewhere closer to what I wanted.

I was looking for a way to pitch-shift while having some control over the range, using accelerate. I had tried some random values and they definitely didn't correspond to semitones: accelerate 1 slides over an octave, accelerate 0.5 did a perfect fifth interval, accelerate -0.5 goes down an octave. But it wasn't clear how to reach other notes by trying random decimal values.

The synth sources made it clear that accelerate is operating on the frequency of the generated sound, so I eventually found a handy resource that helped figure out the necessary values for accelerate to slide towards a specific semitone (I'm referring to semitones in the TidalCycles notation sense)

Semitones Accelerate value (frequency ratio)
-12 -0.5
-11 -0.470
-10 -0.439
-9 -0.405
-8 -0.370
-7 -0.333
-6 -0.293
-5 -0.251
-4 -0.206
-3 -0.159
-2 -0.109
-1 -0.056
0 0
1 0.059
2 0.122
3 0.189
4 0.260
5 0.335
6 0.414
7 0.498
8 0.587
9 0.682
10 0.782
11 0.888
12 1

The formula to convert semitones to Hz is 2^(semitone/12), which gives us the frequency ratio/multiplier. We then subtract 1 because accelerate doesn't set the frequency ratio but adds to it using SC's line or sweep functions (at least in the synths that I looked).

Ping me for more if this doesn't make a lot of sense -- I've done a spreadsheet that makes the calculations simple if you want to go beyond an octave.

[I'm not sure whether all this is already documented somewhere that I missed! Let me know]

7 Likes

Using that formula, couldn't you do something like this?

slide x = accelerate (2*(x/12))

d1 $ s "9c 9c 9c" # cut 1 # slide "0 12 3"
2 Likes

The formula only needs to be modified a little bit, but then it works:

slide x = accelerate (2**(x/12))

Note: * is the multiplication operator and ** is one of three raise-to-the-power operators.

5 Likes

Exciting stuff! A slight tweak:

Untested, but I think without this, you might get extra notes on cycle boundaries.

4 Likes

Oh boy, beautiful! I was holding off from posting the feature request to have accelerate use the semitone values so that you could pattern them, but this already does the trick! Thank you for your precious contributions everyone.

...with one final tweak, however: this formula is for semitone->freqratio conversion, but we need to subtract 1 from the result to match what accelerate expects (e.g. the unison ratio is 1, but in accelerate it's 0). Just tested this one and confirm it works as expected:

slide x = accelerate (2 **| (x |/ 12) - 1)

I love how this effect plays with chords:

d1 $ n "[0,3,7,10,14]" # sound "superchip" # voice 0.3  # gain 0.6
  |+ n "<0 0 7 7>"
  # slide "<0 7 0 -7>" -- 2nd bar slides to 7 (fifth), 4th bar goes from 7 to 0

I'm trying to figure out how to remove the tiny gaps between notes so that the slide effect can land neatly into the next note. Does anyone have a clue?

3 Likes

legato 1.1 ?

2 Likes

legato 1.1 ?

Thank you! This is what I was doing at the moment, but I always seem to catch some audible overlap between both notes, and I wondered if there was a cleaner way to have notes fit correctly into each other.

great discussion folks, I ran into this slide-to-note issue the other night - what a neat/concise way to solve :+1: