// same as before, except a SinOsc is used here as an // LFO (low frequency oscillator) to control the filter sweep // patch SqrOsc s => LPF f => ADSR e => JCRev r => dac; // not heard SinOsc lfo => blackhole; // set env params e.set( 5::ms, 5::ms, .5, 10::ms ); // close the env e.keyOff(); // ketchup .025 => r.mix; .5 => r.gain; // quarter note 200::ms => dur quarter; // spork sweep spork ~ sweep(); // go while( true ) { // play play( 60, .8, quarter ); play( 74, .3, quarter ); play( 67, .4, quarter ); play( 65, .2, quarter ); play( 64, .5, quarter*2 ); // rest quarter => now; play( 76, .7, quarter ); play( 72, .4, quarter ); play( 71, .3, quarter ); } // play fun void play( float pitch, float velocity, dur T ) { // open the env pitch => Std.mtof => s.freq; // start the attack e.keyOn(); // reset lfo 0 => lfo.phase; // wait T-e.releaseTime() => now; // close the env e.keyOff(); // let it release e.releaseTime() => now; } // sweep fun void sweep() { 10 => f.Q; .2 => lfo.freq; // go! while( true ) { // sweep 500 + (lfo.last()+1)/2*2000 => f.freq; // advance time 10::ms => now; } }