«Doppler Pitch Shift» by kennethflak
on 05 Nov'20 09:09 inA first attempt to port a doppler pitch shifter following this tutorial: https://www.youtube.com/watch?v=uyzY_ZP54pA to SuperCollider from Max.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
// made for circular speakers. Change number of speakers to match your setup.
~numSpeakers = 2;
(
SynthDef(\dopplerPithchShift, {
var sig, env, phasor, buf, hanning, window, phasorfreq, phase, iphase, ratio, numDelays=8, delaywindow=0.1;
hanning = Signal.hanningWindow(512).asWavetable;
buf = LocalBuf.newFrom(hanning);
phasorfreq = ((\ratio.kr(1) - 1 ) * -1) / delaywindow;
window = numDelays.collect{|i|
phase = i.linlin(0, numDelays+1, 0, 2pi);
Osc.kr(buf, phasorfreq, phase) ;
};
env = EnvGen.kr(Env.asr(\attack.kr(0.01), 1, \release.kr(0.01)), gate: \gate.kr(1), doneAction: \da.kr(2));
phasor = numDelays.collect {|i|
iphase = i.linlin(0, numDelays+1, 1, 3).mod(2);
LFSaw.ar(phasorfreq, iphase).range(0, 1) * delaywindow;
};
sig = In.ar(\in.kr(2));
sig = numDelays.collect{|i| DelayC.ar(sig, 0.4, delaytime: phasor[i]) * window[i]};
sig = sig.sum;
sig = sig * \amp.kr(1, 0.1) * env;
sig = PanAz.ar(~numSpeakers, sig, \pan.kr(0), width: \width.kr(2));
Out.ar(\out.kr(0), sig);
}).add;
)
// test
d = Synth(\dopplerPithchShift, [\in, 2, \amp, 4, \ratio, -12.midiratio]);
d.set(\ratio, 12.midiratio);
d.free;
reception
comments