// name: polyphony.ck// desc: demo of Faust chugin in action! // device to open (see: chuck --probe)1 => int device;// get from command lineif( me.args() ) me.arg(0) => Std.atoi => device; Hid hi;HidMsg msg; // try to open MIDI port (see chuck --probe for available devices)if( !hi.openKeyboard( device ) ) me.exit(); // make our own eventclass NoteEvent extends Event{ int note; int velocity;} // the eventNoteEvent on;// array of ugen's handling each noteEvent @ us[128]; // handler for a single voicefun void handler(){ // don't connect to dac until we need it Faust fck; fck.eval(` process = pm.elecGuitar_ui_MIDI <: _,_; `); Event off; int note; while( true ) { on => now; on.note => note; // dynamically repatch fck => dac; fck.v("/elecGuitar/midi/freq",Std.mtof( note )); fck.v("/elecGuitar/midi/gain",( on.velocity / 128.0 )); fck.v("/elecGuitar/gate",1); off @=> us[note]; off => now; fck.v("/elecGuitar/gate",0); null @=> us[note]; fck =< dac; }} // spork handlers, one for each voicefor( 0 => int i; i < 20; i++ ) spork ~ handler(); fun int keybToMidi(int keybKey){ 60 => int midiNote; if(keybKey == 44){ 60 => midiNote; } else if(keybKey == 31){ 61 => midiNote; } else if(keybKey == 45){ 62 => midiNote; } else if(keybKey == 32){ 63 => midiNote; } else if(keybKey == 46){ 64 => midiNote; } else if(keybKey == 47){ 65 => midiNote; } else if(keybKey == 34){ 66 => midiNote; } else if(keybKey == 48){ 67 => midiNote; } else if(keybKey == 35){ 68 => midiNote; } else if(keybKey == 49){ 69 => midiNote; } else if(keybKey == 36){ 70 => midiNote; } else if(keybKey == 50){ 71 => midiNote; } else if(keybKey == 51){ 72 => midiNote; } return midiNote;} // infinite time-loopwhile( true ){ // wait on midi event hi => now; // get the midimsg while( hi.recv( msg ) ) { keybToMidi(msg.which) => int currentNote; // catch only noteon if( msg.isButtonDown() ){ // store midi note number currentNote => on.note; // store velocity 100 => on.velocity; // signal the event on.signal(); // yield without advancing time to allow shred to run me.yield(); } else { us[currentNote].signal(); } }}
// name: polyphony.ck
// desc: demo of Faust chugin in action!
// device to open (see: chuck --probe)
1 => int device;
// get from command line
if( me.args() ) me.arg(0) => Std.atoi => device;
Hid hi;
HidMsg msg;
// try to open MIDI port (see chuck --probe for available devices)
if( !hi.openKeyboard( device ) ) me.exit();
// make our own event
class NoteEvent extends Event
{
int note;
int velocity;
}
// the event
NoteEvent on;
// array of ugen's handling each note
Event @ us[128];
// handler for a single voice
fun void handler()
{
// don't connect to dac until we need it
Faust fck;
fck.eval(`
process = pm.elecGuitar_ui_MIDI <: _,_;
`);
Event off;
int note;
while( true )
{
on => now;
on.note => note;
// dynamically repatch
fck => dac;
fck.v("/elecGuitar/midi/freq",Std.mtof( note ));
fck.v("/elecGuitar/midi/gain",( on.velocity / 128.0 ));
fck.v("/elecGuitar/gate",1);
off @=> us[note];
off => now;
fck.v("/elecGuitar/gate",0);
null @=> us[note];
fck =< dac;
}
}
// spork handlers, one for each voice
for( 0 => int i; i < 20; i++ ) spork ~ handler();
fun int keybToMidi(int keybKey){
60 => int midiNote;
if(keybKey == 44){
60 => midiNote;
}
else if(keybKey == 31){
61 => midiNote;
}
else if(keybKey == 45){
62 => midiNote;
}
else if(keybKey == 32){
63 => midiNote;
}
else if(keybKey == 46){
64 => midiNote;
}
else if(keybKey == 47){
65 => midiNote;
}
else if(keybKey == 34){
66 => midiNote;
}
else if(keybKey == 48){
67 => midiNote;
}
else if(keybKey == 35){
68 => midiNote;
}
else if(keybKey == 49){
69 => midiNote;
}
else if(keybKey == 36){
70 => midiNote;
}
else if(keybKey == 50){
71 => midiNote;
}
else if(keybKey == 51){
72 => midiNote;
}
return midiNote;
}
// infinite time-loop
while( true )
{
// wait on midi event
hi => now;
// get the midimsg
while( hi.recv( msg ) )
{
keybToMidi(msg.which) => int currentNote;
// catch only noteon
if( msg.isButtonDown() ){
// store midi note number
currentNote => on.note;
// store velocity
100 => on.velocity;
// signal the event
on.signal();
// yield without advancing time to allow shred to run
me.yield();
}
else {
us[currentNote].signal();
}
}
}