// patch SinOsc s => ADSR e => NRev r => dac; // set e.set( 5::ms, 2::ms, .5, 20::ms ); // set mix .05 => r.mix; // another patch SndBuf buffy => dac; "special:ahh" => buffy.read; 0 => buffy.gain; // reference dur 150::ms => dur Q; // pitch table [0, 2, 4, 7, 8, 11, 12 ] @=> int pit[]; // play fun void play( float pitch, float velocity, dur T, int n ) { // set freq pitch => Std.mtof => s.freq; // set gain velocity => s.gain; // envelope e.keyOn(); T-e.releaseTime() => now; e.keyOff(); e.releaseTime() => now; } // slay fun void slay( float rate, float velocity, dur T ) { rate => buffy.rate; velocity => buffy.gain; 0 => buffy.pos; T => now; } fun void A( int n ) { if( n < 0 ) return; <<< "A:", n >>>; play( 72 + pit[n%pit.size()], .2+1.0/(n+1), Q, n ); C( n - 1 ); } fun void B( int n ) { if( n < 0 ) return; <<< "B:", n >>>; // Q => now; slay( 1.0/(n+1), 4.0, Q ); Q/2 => now; repeat( Std.rand2(2,4)*2 ) slay( 4.0/(n+1), 3, Q/2 ); A(n-1); repeat( Std.rand2(2,6)*4 ) slay( 2.0/(n+1), 3, Q/4 ); Q/2 => now; slay( 1.0/(n+1), 4.0, Q ); A( n - 1 ); } fun void C( int n ) { if( n < 0 ) return; <<< "C:", n >>>; play( 60 + pit[n%pit.size()], .7, Q, n ); B( n - 1 ); C( n - 1 ); A( n - 1 ); } fun void other() { while( true ) { slay( 1, .5, Q ); 3::Q => now; } } // spork ~ other(); A( 6 );