// name: clix2.ck // desc: typing-based instrument, quantized, multi-channel // author: Ge Wang and Perry Cook // computer keyboard input via terminal KBHit kb; // time 4096::samp => dur T; // patch Impulse i => BiQuad f => Envelope e => JCRev r; // set the filter's pole radius .99 => f.prad; // set equal gain zeros 1 => f.eqzs; // envelope rise/fall time 1::ms => e.duration; // reverb mix .01 => r.mix; // strengths [ 1.0, 0.2, 0.3, 0.2, 0.4, 0.1, 0.2, 0.1, 0.5, 0.1, 0.3, 0.2, 0.4, 0.1, 0.2, 0.1, 0.8, 0.1, 0.3, 0.2, 0.5, 0.1, 0.2, 0.1, 0.4, 0.1, 0.3, 0.2, 0.3, 0.1, 0.2, 0.1 ] @=> float mygains[]; // capacity mygains.size() => int N; // period duration N * T => dur period; // last unen UGen @ last; // total number of channels dac.channels() => int C; // keep track of which int which; // time-loop while( true ) { // wait on event kb => now; // synch T - (now%T) => now; // loop through 1 or more keys while( kb.more() ) { // figure out period (now % period / period * N) $ int => int index; // generate impulse mygains[index] => i.next; // set filtre freq kb.getchar() => int c => Std.mtof => f.pfreq; // print int value <<< "ascii:", c, "velocity:", mygains[index], "channel:", which >>>; // disconnect from previous if( last != NULL ) r =< last; // the dac channel to connect dac.chan(which) @=> last; // the next channel (which + 1) % C => which; // connect revert to dac channel r => last; // open e.keyOn(); // advance time T-2::ms => now; // close e.keyOff(); 2::ms => now; } }