128 lines · 2.5 KB · Text
RawDownload
// 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();        }    }}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t