SwitchDelay feedback delay line implementing switch-and-ramp buffer jumping


SwitchDelay.ar(input, drylevel, wetlevel, delaytime, delayfactor, maxdelaytime, mul, add)


A feedback delay line which allows moving the buffer read position using the switch-and-ramp technique

as described by Miller S. Puckette in his Theory and Techniques of Electronic Music book.

http://crca.ucsd.edu/~msp/techniques/latest/book.pdf (chapter 4)


Altering the buffer read position, in order to affect the perceived delay speed/timing, creates a 

discontinuity in the signal, typically causing unwanted audible artefacts. The switch-and-ramp technique seeks to neutralise these artefacts and allow switching with minimal clicks. See examples.


input - a signal to be filtered

drylevel - level of dry signal (default: 1.0)

wetlevel - level of delayed signal (default: 1.0)

delaytime - seconds to delay signal (default: 1.0)

delayfactor - multiplier for feedback level, affects the length of the feedback tail (default 0.7)

   limited slightly below 1.0 to avoid speaker damaging mistakes

maxdelaytime - buffer size (default 20.0)


  See also: CombN etc



// before anything else

s = Server.local.boot;

b = Buffer.read(s, "sounds/a11wlk01.wav");


// simple feedback delay

(

SynthDef('help-switchdelay-1', { arg out=0, bufnum;

Out.ar(out,

Pan2.ar(

SwitchDelay.ar(

PlayBuf.ar(numChannels: 1, bufnum: bufnum, loop: 0) * 0.5,

delaytime: 0.4,

delayfactor: 0.6,

wetlevel: 0.7

)

)

);

}).send(s);

)


x = Synth('help-switchdelay-1', [\bufnum, b]);

x.free;



// this time, change the buffer read pointer periodically.

(

SynthDef('help-switchdelay-2', { arg out=0, bufnum, delaytime;

Out.ar(out,

Pan2.ar(

SwitchDelay.ar(

PlayBuf.ar(numChannels: 1, bufnum: bufnum, loop: 0) * 0.5,

wetlevel: 0.6,

delaytime: Select.kr(

Stepper.kr(Impulse.kr(0.5), 0, 0, 3),

#[ 0.02, 0.1, 0.725, 0.25 ] 

)

)

)

);

}).send(s);

)


x = Synth('help-switchdelay-2', [\bufnum, b, \loop, 0, \delaytime, 2.0]);

x.free;