// 0 1 // 2 3 dac.chan(0) => Gain g0 => WvOut2 w1 => blackhole; dac.chan(1) => Gain g1 => WvOut2 w2 => blackhole; dac.chan(2) => Gain g2 => WvOut2 w3 => blackhole; dac.chan(3) => Gain g3 => WvOut2 w4 => blackhole; 0.5 => g0.gain; 0.5 => g1.gain; 0.5 => g2.gain; 0.5 => g3.gain; me.sourceDir() +"chan0.wav" => w1.wavFilename; me.sourceDir() +"chan1.wav" => w2.wavFilename; me.sourceDir() +"chan2.wav" => w3.wavFilename; me.sourceDir() +"chan3.wav" => w4.wavFilename; // set a global value 0 => int LINEAR; 1 => int EQUALPOWER; 0 => int TIMER; // "wood, fan, and flush" SndBuf fan; SndBuf wood; SndBuf flush; // linear panning, expect pan=[0,1] fun void panLinear( float pan, UGen left, UGen right ) { // clamp to bounds if( pan < 0 ) 0 => pan; else if( pan > 1 ) 1 => pan; // set gains 1-pan => left.gain; pan => right.gain; } // constant power panning, expect pan=[0,1] fun void panPower( float pan, UGen left, UGen right ) { // clamp to bounds if( pan < 0 ) 0 => pan; else if( pan > 1 ) 1 => pan; // set gains Math.cos( pan * pi / 2 ) => left.gain; Math.sin( pan * pi / 2 ) => right.gain; } // pan, which=0:linear|1:constantpower fun void panning( int which, float pan, UGen left, UGen right ) { if( which == LINEAR ) panLinear( pan, left, right); else if( which == EQUALPOWER ) panPower( pan, left, right ); else <<< "[pan]: ERROR specifying which pan type!", "" >>>; } // read me.dir() + "fan_cond.wav" => fan.read; me.dir() + "wood_floor.wav" => wood.read; me.dir() + "toilet.wav" => flush.read; // left and right nodes for panning wood => Gain woodL => NRev wL => dac.chan(0); wood => Gain woodR => NRev wR => dac.chan(1); 0.4 => wood.gain; .9 => wood.rate; // set reverb mix .05 => wL.mix => wR.mix; spork ~ soundClip( wood, woodL, woodR, 0, 1, EQUALPOWER, 1); wood.length() => now; 36::second => now; me.yield(); // determines spatial position of sound file and plays it fun void soundClip( SndBuf theSound, UGen left, UGen right, float startLoc, float endLoc, int whichPan, int toSpork ) { // get length of sound file theSound.length() => dur len; // start sound from the beginning 0 => theSound.pos; // the initial pan value (starting point) startLoc => float pan; // end time now + len => time endTime; // start time now => time startTime; // go while( now < endTime ) { // pan it panning( whichPan, pan, left, right ); // update where the sound should be startLoc + (endLoc-startLoc)*(now-startTime) / (endTime-startTime) => pan; //print <<< "pan:", pan >>>; // update rate 1::ms => now; TIMER++; if(TIMER == 8000 && toSpork == 1) { // left and right nodes for panning <<< "-- timer reached --", TIMER >>>; // "fan" fan => Gain fanL => NRev rL => dac.chan(1); fan => Gain fanR => NRev rR => dac.chan(3); 0.9 => fan.gain; .2 => rL.mix => rR.mix; spork ~ soundClip( fan, fanL, fanR, 1, 0.8, EQUALPOWER, 0); fan.length() => now; me.yield(); } } if(toSpork == 1) { flush => Gain flushL => NRev fL => dac.chan(1); flush => Gain flushR => NRev fR => dac.chan(3); .08 => fL.mix => fR.mix; 0.2 => flush.gain; spork ~ soundClip( flush, flushL, flushR, 0.8, 1, EQUALPOWER, 0); flush.length() => now; me.yield(); } // optioal tail 300::ms => now; } // last item in this program is this print statement <<<"program end at",now/second,"seconds">>>; w1.closeFile(); w2.closeFile(); w3.closeFile(); w4.closeFile(); // and with nothing left to do this program exits