// um, by philipd // (what is it?) // base Player class class Player { UGen @ base; fun void connect( UGen target ) { base => target; } fun void noteOn ( float note, float vel ) {} fun void noteOff ( float vel ) {} } class Note { float note; float vel; dur length; fun void set ( float nt, float vl, dur ln ) { nt => note; vl => vel; ln => length; } fun void playOn ( Player p) { if ( note > 0 ) { p.noteOn( note , vel ); } } fun void playOnAlt( Player p, float noff, float vmul ) { p.noteOn( note+noff, vel*vmul ); } } class MandPlayer extends Player { Mandolin m @=> base; fun void noteOn ( float note, float vel ) { Std.mtof ( note ) => m.freq; vel => m.pluck; } } class FlutePlayer extends Player { PercFlut f @=> base; fun void noteOn ( float note, float vel ) { Std.mtof ( note ) => f.freq; vel => f.noteOn; } } class ClarPlayer extends Player { Clarinet c @=> base; fun void noteOn ( float note, float vel ) { Std.mtof ( note ) => c.freq; vel => c.startBlowing; } fun void noteOff ( float vel ) { vel => c.stopBlowing; } } // length of sequence 12 => int seqn; // a sequence Note sequence[seqn]; // order int order[seqn]; // scale [0, 2, 4, 7, 9, 12, 14, 16, 19, 21] @=> int scale[]; // durations [0.25::second, 0.125::second, 0.125::second, 0.375::second] @=> dur times[]; // new sequence fun void newsequence() { for( 0 => int i; i < seqn; i++ ) { i => order[i]; 55 + scale[Math.random2(0, scale.size() - 1)] => int note; times[Math.random2(0, times.size() - 1)] => dur mydur; Math.random2f( 0.75, 0.9 ) => float vel; sequence[i].set( note, vel, mydur ); } } fun void swap( ) { Math.random2(0,seqn-1) => int a; ( a + Math.random2(1,seqn-1) ) % seqn => int b; order[a] => int tmp; order[b] => order[a]; tmp => order[a]; } // instantiate a mandolin player MandPlayer mand; // instantiate a clarinet player ClarPlayer clar; // effects Gain g => JCRev j => Echo e => dac; 0.95 => j.gain; 0.1 => j.mix; // set echo amount 1.15::second => e.max; 1.0::second => e.delay; 0.3 => e.mix; // connect to effects mand.connect(g); // connect to effects clar.connect(g); // set gain 0.6 => g.gain; // new sequence! newsequence(); // infinite time-loop while( true ) { for( 0 => int j; j < seqn; j++ ) { sequence[order[j]] @=> Note cur; cur.playOn ( mand ); cur.playOnAlt ( clar, 12 , 0.7 ); 2.0 * cur.length => now; cur.playOnAlt( mand, 7, 0.33); cur.length => now; } for ( Math.random2(0,2) => int j ; j > 0 ; j-- ) swap(); if ( Math.random2(0, 10) > 8 ) newsequence(); }