[chuck-users] Interesting stereo widening effect

Rich Caloggero rjc at MIT.EDU
Thu May 29 00:34:13 EDT 2008


This "algorithm" such as it is came from an old amplifier. I think it was a 
Carver amp circa 1978. It used all analog circuitry to do the following 
(never actually heard the beast, but always wanted to implement this to see 
what it sounded like). Now, thanx to chuck, I have. I'm sure the original 
implementation didn't have randomly varying delay line lengths! <smile>

The idea is that you feed the right channel back to the left inverted and 
with delay. Do the same to the left.  Its supposed to cancel out the 
"crosstalk" between the channels thus subjectively "widening" the image.

Try it with headphones. If you crank up the gain, then you'll hear it better 
through speakers.

Thanx to the person who helped me with the inversion (sorry I forget your 
name, but you know who you are <smile>).

Here's the code:

// gain (higher produces more noticable effect)
0.4 => float gain;

// whether to invert
1 => int invert;

// delay time range
1.0 => float minDelay;
10.0 => float maxDelay;

// sound file
"music.wav" => string sourceFile;
if (me.args()) me.arg(0) => sourceFile;

// the patch
SndBuf l, r;
Step lInverted,rInverted;
DelayL dl, dr;
l => dac.left;
if (invert)
l => lInverted => dl => dac.right;
else
l => dl => dac.right;

r => dac.right;
if (invert)
r => rInverted => dr => dac.left;
else
r =>  dr => dac.left;

// set initial delay length, gain, and max delay times
.2::second => dl.max => dr.max;
4::ms => dur lDelayTime => dur rDelayTime => dl.delay => dr.delay;
gain => dl.gain => dr.gain;

// load the file
sourceFile => l.read;
sourceFile => r.read;
1 => r.channel;

// start the inverters
if (invert) spork ~ inverter(l, lInverted);
spork ~ inverter(r, rInverted);

// time loop
0 => float whichDelay;
while( true )
{
    .4::second => now;
Math.rand2f(0,1) => whichDelay;
//<<<whichDelay>>>;
if (whichDelay > .5) {
Math.rand2f(minDelay,maxDelay) * 1::ms => dl.delay;
//<<<"left">>>;
} else {
Math.rand2f(minDelay,maxDelay) * 1::ms => dr.delay;
//<<<"right">>>;
} // which channel to affect
} // main loop


fun void inverter(UGen in, Step out){
     while(true){
         - in.last() => out.next;
         1::samp => now;
     }
}



More information about the chuck-users mailing list