SuperCollider CLASSES (extension)

SwitchDelay
ExtensionExtension

feedback delay line implementing switch-and-ramp buffer jumping
Inherits from: UGen : AbstractFunction : Object

Description

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.

Class Methods

*ar (in, drylevel: 1, wetlevel: 1, delaytime: 1, delayfactor: 0.7, maxdelaytime: 20, mul: 1, add: 0)

Arguments:

in

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)

Inherited class methods

Instance Methods

Inherited instance methods

Examples

// 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;