Hello everyone
Something I have always struggled with in any DSP work is the design of nice sounding delay effects.
I would like to see and hear your delay / echo designs for inspiration - so please share it here if you feel like it!
Below is one of mine which is a stereo (actually multichannel, but with “stereo” effects) delay with feedback, lpf in the feedback loop and modulation among other things. All parameters are normalized to 0.0-1.0.
(
~numchans = 2;
~delay = {|in, delay=0.1, delayfb=0.33, decaytime=0.5, delaywidth=0.1, modFreq=0.1, modAmount=0.25, fblowcut=0.5|
var localIn = LocalIn.ar(numChannels: ~numchans, default: 0.0);
var output = Array.fill(~numchans, {|cNum|
var sig, fb;
// Random scalar to add variation
var randScale = Rand(0.95,1.0);
// Every other channel, scale the delay value according to the delaywidth arg
var delayScale = if(cNum.even, { delaywidth.linlin(0.0,1.0,0.5,1.5) }, { 1.0 });
// The final, scaled delayVal to be fed to the modulator
var delayVal = lag3(delayScale * randScale * delay.linlin(0.0,1.0,0.0001,2.0));
// Delaytime modulator
var phase = cNum.linlin(0,~numchans-1,-8pi, 8pi);
var lfofreq = (randScale * modFreq.linexp(0.0,1.0,0.0001,10.0)).lag3;
var minModamount = modAmount.linlin(0.0,1.0,1.0,0.001).lag * delayVal;
var maxModamount = delayVal;
delayVal = LFTri.kr(
Rand(0.99,1.0) * lfofreq,
phase
).linlin(-1.0,1.0, minModamount, maxModamount);
// Feedback
// goes from 0 to 110%
fb = (delayfb * 1.1 * localIn[cNum]).tanh; // tanh for "limiting"
fb = DelayL.ar(fb, 0.2, delaytime: Rand(0.1,0.2)); // Avoid phase problems that sound "flat"
fb = LPF.ar(fb, Rand(0.99,1.0)*fblowcut.linexp(0.0,1.0,40.0,12000.0));
// The final delay
sig = AllpassC.ar(
in[cNum] + fb,
2,
delayVal,
decaytime.linlin(0.0,1.0, 0.1,3.0).lag3
);
// Filter out potential dc
LeakDC.ar(sig)
});
LocalOut.ar(output);
output
};
// Play some bullshit testsounds
Pdef(\testy, Pbind(\dur, 0.125, \pan, Pwhite(-1.0,1.0), \degree, Pwhite((-7),7), \amp, 0.75));
Ndef(\testoutput).source = Pdef(\testy);
Ndef(\testoutput).mold(2, 'audio').play;
Ndef(\testoutput)[1] = \filter -> ~delay;
// Normalize all parameters in gui (a hack)
Ndef(\testoutput).controlKeys.do{|k|
Spec.add(k, [0.0,1.0]);
};
Ndef(\testoutput).gui;
Ndef(\testoutput).play;
)