//--------------------------------------|
// Dyno demo 3: "Ducker? She didn't even throw a punch!"
// Shows how to make one sound fade out when another comes up. This is 
// probably more often used by radio DJs than electronic musicians, but
// what the hey.
//
// authors: Matt Hoffman (mdhoffma at cs.princeton.edu)
//--------------------------------------|

// A kick drum that will get quieter when the SinOsc swells.
SndBuf buf => Gain g1 => Dyno dy => JCRev r => dac;
me.sourceDir() + "/../data/kick.wav" => buf.read;
.05 => r.mix;

// A SinOsc that, when its volume swells, will make the kick drum get quieter.
SinOsc s => Gain g2 => r;
220 => s.freq;

// Make dy go into ducker mode
dy.duck();

// spork the shred that makes the kick kick.
spork ~ playKick();

// th is the phase of the low-freq sine that modulates the SinOsc's gain
0 => float th;
// make the SinOsc a bit less annoying
0.5 => g2.gain;

// loop
while( true )
{
	// modulate the SinOsc's gain
	Math.sin(th) + 1.0 => s.gain;
	// send the SinOsc's last sample to dy (manually. yes, this is a pain.)
	s.last() => dy.sideInput;
	// advance the modulating sine's phase a tiny bit
	th + 0.00003 => th;
	// advance time by one sample.
	1::samp => now;
}

// retriggers the kick drum over and over and over and over and over.
fun void playKick()
{
	while(true)
    {
		0 => buf.pos;
		500::ms => now;
	}
}
