1 => int device; MidiIn min; MidiOut mout; MidiMsg msg; OscSend xmit; xmit.setHost( "localhost", 4000 ); 4000 => int baseport; // open the device if( !min.open( device ) ) me.exit(); if( !mout.open( device ) ) me.exit(); [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] @=> float val[]; [[0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0]] @=> int bval[][]; [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] @=> int bsel[]; ["option","volume","pan","trackinfo","generator","effect1","effect2","eq","up","down","rec","start","left","play","right","loop"] @=> string bname[]; while ( true ) { min => now; // get the message(s) while( min.recv(msg) ) { if ( msg.data1 == 176 && msg.data2 >= 64 && msg.data2 < 72 && msg.data3 == 127 ) { osc_button( msg, "rec", 64 ); } else if ( msg.data1 == 176 && msg.data2 >= 72 && msg.data2 < 80 && msg.data3 == 127 ) { osc_button( msg, "headphone", 72 ); } else if ( msg.data1 == 176 && msg.data2 >= 80 && msg.data2 < 88 && msg.data3 == 127 ) { osc_button( msg, "speaker", 80); } else if ( msg.data1 == 176 && msg.data2 >= 88 && msg.data2 < 96 && msg.data3 == 127 ) { osc_button( msg, "sel", 88 ); } else if ( msg.data1 == 176 && msg.data2 >= 96 && msg.data2 < 112 && msg.data3 == 127 ) { osc_buttons( msg ); } else if ( msg.data1 == 176 && msg.data2 >= 16 && msg.data2 < 24 ) { osc_knob( msg ); } else if ( msg.data1 == 176 && msg.data2 == 24 ) { osc_wheel( msg ); } else if ( msg.data1 == 176 && msg.data2 == 7 ) { osc_slider( msg ); } // <<< msg.data1, msg.data2, msg.data3 >>>; } } fun void sendOn( int chan, int base ) { send( 176, base + chan , 127 ); } fun void sendOff( int chan, int base ) { send( 176, base + chan, 0 ); } fun void send( int d1, int d2, int d3 ) { MidiMsg msg; d1 => msg.data1; d2 => msg.data2; d3 => msg.data3; mout.send( msg ); } fun void osc_button( MidiMsg msg, string name, int base ) { msg.data2 - base => int chan; (base - 64)/8 => int v; if ( bval[v][chan] == 1 ) { 0 => bval[v][chan]; sendOff( chan, base ); } else { 1 => bval[v][chan]; sendOn( chan, base ); } <<< "/icontrol/"+chan+"/"+name, bval[v][chan] >>>; xmit.startMsg( "/icontrol/"+chan+"/"+name, "i" ); bval[v][chan] => xmit.addInt; } fun void osc_buttons( MidiMsg msg ) { msg.data2 - 96 => int bid; if ( bsel[bid] == 1 ) { 0 => bsel[bid]; sendOff( bid, 96 ); } else { 1 => bsel[bid]; sendOn( bid, 96 ); } <<< "/icontrol/" + bname[bid], bsel[bid] >>>; xmit.startMsg( "/icontrol/"+bname[bid], "i" ); bsel[bid] => xmit.addInt; } fun void osc_knob( MidiMsg msg ) { msg.data2 - 16 => int chan; val[chan] => float tmp; if ( msg.data3 > 0 && msg.data3 < 64 ) { tmp + msg.data3 / 64.0 => tmp; } else { tmp + ( msg.data3 - 128 ) / 64.0 => tmp; } if ( tmp < 0 ) { 0 => tmp; } else if ( tmp > 1 ) { 1 => tmp; } tmp => val[chan]; <<< "/icontrol/"+chan+"/knob", tmp >>>; xmit.startMsg( "/icontrol/"+chan+"/knob", "f" ); val[chan] => xmit.addFloat; } fun void osc_wheel( MidiMsg msg ) { 0 => int tmp; if ( msg.data3 > 0 && msg.data3 < 64 ) { msg.data3 => tmp; } else { ( msg.data3 - 128 ) => tmp; } <<< "/icontrol/wheel", tmp >>>; xmit.startMsg( "/icontrol/wheel", "i" ); tmp => xmit.addInt; } fun void osc_slider( MidiMsg msg ) { 0 => int tmp; msg.data3 => tmp; <<< "/icontrol/slider", tmp >>>; xmit.startMsg( "/icontrol/slider", "i" ); tmp => xmit.addInt; }