//--------------------------------------|
// Dyno demo 2: "Compressor? I didn't even touch 'er!"
// Takes a silly little plucked string demo and runs it through a 
// compressor to enhance sustain. (Ostensibly.) Note that there 
// are many other (better) reasons to use compressors.
//
// authors: Matt Hoffman (mdhoffma at cs.princeton.edu)
//--------------------------------------|

// plucked string, dynamics processor, reverb, dac.
StifKarp m => Dyno d => JCRev r => dac;

// set reverb params
0.75 => r.gain;
0.01 => r.mix;

// set dyno to default compress mode
d.compress();
// set release time to be quite long to enhance sustain
2000::ms => d.releaseTime;
// set threshold to be a bit lower for more pronounced effect.
0.2 => d.thresh;
// set slope (in dB) above the threshold to 1/3 of what it would naturally be
0.33 => d.slopeAbove;
// compensate for the gain reduction
2 => d.gain;

// set plucked string params
0.1 => m.pickupPosition;
0.0 => m.sustain;
0.0 => m.stretch;

// go
while(true)
{
	// play a random note
	Std.mtof( Math.random2(60, 90) ) => m.freq;

    // twice
    repeat( 2 )
    {
        // say whether this pluck is compressed or not
        if(d.op() < 0)
            <<< "uncompressed" >>>;
        else
            <<< "compressed" >>>;
        
        0.5 => m.pluck;
        2000::ms => now;
        
        // make the next note compressed if this one wasn't, or vice versa
        -d.op() => d.op;
    }
}
