Superparticular samchillian: Difference between revisions

Wikispaces>xenjacob
**Imported revision 343680102 - Original comment: **
BudjarnLambeth (talk | contribs)
mNo edit summary
 
(4 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<h2>IMPORTED REVISION FROM WIKISPACES</h2>
{{todo|link}}
This is an imported revision from Wikispaces. The revision metadata is included below for reference:<br>
<pre>
: This revision was by author [[User:xenjacob|xenjacob]] and made on <tt>2012-06-07 19:38:40 UTC</tt>.<br>
: The original revision id was <tt>343680102</tt>.<br>
: The revision comment was: <tt></tt><br>
The revision contents are below, presented both in the original Wikispaces Wikitext format, and in HTML exactly as Wikispaces rendered it.<br>
<h4>Original Wikitext content:</h4>
<div style="width:100%; max-height:400pt; overflow:auto; background-color:#f8f9fa; border: 1px solid #eaecf0; padding:0em"><pre style="margin:0px;border:none;background:none;word-wrap:break-word;white-space: pre-wrap ! important" class="old-revision-html">[[code format="java"]]
 
//ChucK code for Superparticular Samchillian
//ChucK code for Superparticular Samchillian
//Samchillian idea by Leon Gruenbaum
//Samchillian idea by Leon Gruenbaum
Line 15: Line 8:


//change these to match your input/output device
//change these to match your input/output device
0 =&gt; int inDeviceNum;
0 => int inDeviceNum;
1 =&gt; int outDeviceNum;
1 => int outDeviceNum;


class MicroRobinMidiIO
class MicroRobinMidiIO
Line 23: Line 16:
     MidiOut mouse;
     MidiOut mouse;
     MidiMsg inmsg, outmsg;
     MidiMsg inmsg, outmsg;
     0 =&gt; int ctr;
     0 => int ctr;
   
 
     //int rr[128][3]; don't think we need this now.
     //int rr[128][3]; don't think we need this now.
     // index = note number?
     // index = note number?
Line 31: Line 24:
     int chans[14]; // list of channels used
     int chans[14]; // list of channels used
     float holds[16];    // pitches of on notes, zero if off.
     float holds[16];    // pitches of on notes, zero if off.
     [0,1,2,3,4,5,6,7,8,10,11,12,13,14] @=&gt; chans; //exclude channel 10 (drums) &amp; 16 (send channel)
     [0,1,2,3,4,5,6,7,8,10,11,12,13,14] @=> chans; //exclude channel 10 (drums) & 16 (send channel)
   
 
     //microtuning stuff
     //microtuning stuff
   
 
     // PitchBend
     // PitchBend
     // input: pitch (midi note number float) &amp; velocity of desired note
     // input: pitch (midi note number float) & velocity of desired note
     // action: sends appropriate pitchbend message
     // action: sends appropriate pitchbend message
     //        (assuming pitchbend range = +/- 2 semitones)
     //        (assuming pitchbend range = +/- 2 semitones)
Line 45: Line 38:
     {
     {
         //send pitchbend
         //send pitchbend
         224 + chans[ctr] =&gt; outmsg.data1;
         224 + chans[ctr] => outmsg.data1;
         0 =&gt; outmsg.data2;
         0 => outmsg.data2;
         Math.round((pitch % 1.0) * 32.0 + 64.0) $ int =&gt; outmsg.data3;
         Math.round((pitch % 1.0) * 32.0 + 64.0) $ int => outmsg.data3;
         mouse.send(outmsg);
         mouse.send(outmsg);
         return Math.floor(pitch) $ int;
         return Math.floor(pitch) $ int;
     }
     }
   
 
     // StartRelay
     // StartRelay
     // input: number of MIDI device, MidiTransform to be used
     // input: number of MIDI device, MidiTransform to be used
Line 57: Line 50:
     fun void StartRelay(int deviceNum, MidiTransform mt)
     fun void StartRelay(int deviceNum, MidiTransform mt)
     {
     {
       
 
         if( !min.open(inDeviceNum)) me.exit();
         if( !min.open(inDeviceNum)) me.exit();
         if( !mouse.open(outDeviceNum)) me.exit();
         if( !mouse.open(outDeviceNum)) me.exit();
       
 
         // print out device that was opened
         // print out device that was opened
         &lt;&lt;&lt; min.num(), " -&gt; ", min.name() &gt;&gt;&gt;;
         <<< min.num(), " -> ", min.name() >>>;
         &lt;&lt;&lt; mouse.num(), " -&gt; ", mouse.name() &gt;&gt;&gt;;
         <<< mouse.num(), " -> ", mouse.name() >>>;
       
 
         while ( true)
         while ( true)
         {
         {
             min =&gt; now;
             min => now;
           
 
             while( min.recv(inmsg))
             while( min.recv(inmsg))
             {    
             {
                 if( inmsg.data1 % 16 == 0) // only receive on channel 1
                 if( inmsg.data1 % 16 == 0) // only receive on channel 1
                 {
                 {
                     &lt;&lt;&lt; "r ", inmsg.data1 / 16, inmsg.data1 % 16, inmsg.data2, inmsg.data3&gt;&gt;&gt;;
                     <<< "r ", inmsg.data1 / 16, inmsg.data1 % 16, inmsg.data2, inmsg.data3>>>;
                   
 
                     if( inmsg.data1 / 16 == 9)
                     if( inmsg.data1 / 16 == 9)
                     {  
                     {
                         mt.NoteOn(inmsg.data2, inmsg.data3);
                         mt.NoteOn(inmsg.data2, inmsg.data3);
                     }
                     }
Line 87: Line 80:
                         //prog change apply to channels 1-16
                         //prog change apply to channels 1-16
                         //works!
                         //works!
                         inmsg.data1 - (inmsg.data1 % 16) =&gt; int base;
                         inmsg.data1 - (inmsg.data1 % 16) => int base;
                         for(0=&gt;int i; i&lt;15; i++)
                         for(0=>int i; i<15; i++)
                         {
                         {
                             base + chans[i] =&gt; outmsg.data1;
                             base + chans[i] => outmsg.data1;
                             inmsg.data2 =&gt; outmsg.data2;
                             inmsg.data2 => outmsg.data2;
                             i++;
                             i++;
                             if( i == 15)
                             if( i == 15)
                             {  
                             {
                                 0 =&gt; outmsg.data3;
                                 0 => outmsg.data3;
                                 mouse.send(outmsg);
                                 mouse.send(outmsg);
                                 break;  
                                 break;
                             }
                             }
                           
 
                             base + chans[i] =&gt; outmsg.data3;
                             base + chans[i] => outmsg.data3;
                             mouse.send(outmsg);
                             mouse.send(outmsg);
                             inmsg.data2 =&gt; outmsg.data1;
                             inmsg.data2 => outmsg.data1;
                             i++;
                             i++;
                             if( i == 15)
                             if( i == 15)
                             {
                             {
                                 0 =&gt; outmsg.data2 =&gt; outmsg.data3;
                                 0 => outmsg.data2 => outmsg.data3;
                                 mouse.send(outmsg);
                                 mouse.send(outmsg);
                                 break;
                                 break;
                             }
                             }
                             base + chans[i] =&gt; outmsg.data2;
                             base + chans[i] => outmsg.data2;
                             inmsg.data2 =&gt; outmsg.data3;
                             inmsg.data2 => outmsg.data3;
                             mouse.send(outmsg);
                             mouse.send(outmsg);
                         }
                         }
                     }
                     }
                   
 
                     if( inmsg.data1 / 16 == 11)
                     if( inmsg.data1 / 16 == 11)
                     {
                     {
                         //apply any controller data to channels 1-16
                         //apply any controller data to channels 1-16
                         inmsg.data1 - (inmsg.data1 % 16) =&gt; int base;
                         inmsg.data1 - (inmsg.data1 % 16) => int base;
                         inmsg.data2 =&gt; outmsg.data2;
                         inmsg.data2 => outmsg.data2;
                         inmsg.data3 =&gt; outmsg.data3;
                         inmsg.data3 => outmsg.data3;
                         for(0=&gt;int i; i&lt;16; i++)
                         for(0=>int i; i<16; i++)
                         {
                         {
                             base + i =&gt; outmsg.data1;
                             base + i => outmsg.data1;
                             mouse.send(outmsg);
                             mouse.send(outmsg);
                         }
                         }
Line 139: Line 132:
     {
     {
         IncrementCtr();
         IncrementCtr();
         nn =&gt; holds[chans[ctr%14]];
         nn => holds[chans[ctr%14]];
         PitchBend(nn, velocity) =&gt; outmsg.data2;
         PitchBend(nn, velocity) => outmsg.data2;
         // note on, right channel
         // note on, right channel
         144 + chans[ctr%14] =&gt; outmsg.data1;  
         144 + chans[ctr%14] => outmsg.data1;
       
 
         velocity =&gt; outmsg.data3;
         velocity => outmsg.data3;
         mouse.send(outmsg);
         mouse.send(outmsg);
         //&lt;&lt;&lt; "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&gt;&gt;&gt;;
         //<<< "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3>>>;
     }
     }
   
 
     // increments mod-14 counter, skipping over channels with
     // increments mod-14 counter, skipping over channels with
     // notes already on them, if possible.
     // notes already on them, if possible.
Line 154: Line 147:
     {
     {
         ctr;
         ctr;
         0 =&gt; int i;
         0 => int i;
         for( i; i&lt;14; i++)
         for( i; i<14; i++)
         {
         {
             if ( holds[chans[(ctr+i) % 14]] == 0.0)
             if ( holds[chans[(ctr+i) % 14]] == 0.0)
             {    (ctr + i) % 14 =&gt; ctr; return; }
             {    (ctr + i) % 14 => ctr; return; }
         }
         }
         (ctr + 1) % 14 =&gt; ctr;
         (ctr + 1) % 14 => ctr;
     }
     }
   
 
     // NoteOff
     // NoteOff
     // input: pitch &amp; note-off velocity
     // input: pitch & note-off velocity
     // action: finds the pitch &amp; offs it.
     // action: finds the pitch & offs it.
     fun void NoteOff(float nn, int velocity)
     fun void NoteOff(float nn, int velocity)
     {
     {
         0 =&gt; int c;
         0 => int c;
         for(c; c&lt;16; c++)
         for(c; c<16; c++)
         {
         {
             if(holds[c] == nn) // we found the pitch!
             if(holds[c] == nn) // we found the pitch!
             {
             {
                 128 + c =&gt; outmsg.data1;
                 128 + c => outmsg.data1;
                 Math.floor(nn) $ int =&gt; outmsg.data2;
                 Math.floor(nn) $ int => outmsg.data2;
                 velocity =&gt; outmsg.data3;
                 velocity => outmsg.data3;
                 mouse.send(outmsg);
                 mouse.send(outmsg);
                 //&lt;&lt;&lt; "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&gt;&gt;&gt;;
                 //<<< "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3>>>;
                 0.0 =&gt; holds[c];
                 0.0 => holds[c];
                 return;
                 return;
             }
             }
         }
         }
         &lt;&lt;&lt;"MISS", nn&gt;&gt;&gt;;
         <<<"MISS", nn>>>;
         // we couldn't find the pitch!
         // we couldn't find the pitch!
         // don't do anything.          
         // don't do anything.
     }
     }
   
 
     fun void ControlChange(int channel, int prognum, int val)
     fun void ControlChange(int channel, int prognum, int val)
     {
     {
         128 + channel =&gt; outmsg.data1;
         128 + channel => outmsg.data1;
         prognum =&gt; outmsg.data2;
         prognum => outmsg.data2;
         val =&gt; outmsg.data3;
         val => outmsg.data3;
     }
     }
   
 
}
}


Line 202: Line 195:
     fun void LinkToIO(MicroRobinMidiIO io)
     fun void LinkToIO(MicroRobinMidiIO io)
     {
     {
         io @=&gt; myIO;
         io @=> myIO;
     }
     }
     fun void NoteOn( int nn, int vel)
     fun void NoteOn( int nn, int vel)
Line 216: Line 209:
class SuperparticularSamchillian extends MidiTransform
class SuperparticularSamchillian extends MidiTransform
{
{
     57. =&gt; float resentFreq;
     57. => float resentFreq;
     57. =&gt; float prevFreq;
     57. => float prevFreq;
   
 
     62 =&gt; int keyboardCenterNN;
     62 => int keyboardCenterNN;
   
 
     float prevFreqsByKey[128];
     float prevFreqsByKey[128];
     
 
     //set pans funky
     //set pans funky
     //for(0=&gt;int f; f&lt;16; f++)
     //for(0=>int f; f<16; f++)
     //{
     //{
     //    myIO.ControlChange(f, 9, f*8);
     //    myIO.ControlChange(f, 9, f*8);
     //}
     //}
   
 
     fun void NoteOn( int nn, int vel)
     fun void NoteOn( int nn, int vel)
     {
     {
Line 235: Line 228:
             myIO.NoteOn( Std.ftom(prevFreq), vel);
             myIO.NoteOn( Std.ftom(prevFreq), vel);
         }
         }
         else  
         else
         {
         {
             if(nn &lt; keyboardCenterNN)
             if(nn < keyboardCenterNN)
             {
             {
                 // superparticular!
                 // superparticular!
                 1. + 1./(keyboardCenterNN - nn) /=&gt; prevFreq;
                 1. + 1./(keyboardCenterNN - nn) /=> prevFreq;
                 myIO.NoteOn( Std.ftom(prevFreq), vel);
                 myIO.NoteOn( Std.ftom(prevFreq), vel);
             }
             }
             else
             else
             {  
             {
                 if(nn &gt; keyboardCenterNN)
                 if(nn > keyboardCenterNN)
                 {
                 {
                     1. + 1./(nn - keyboardCenterNN) *=&gt; prevFreq;
                     1. + 1./(nn - keyboardCenterNN) *=> prevFreq;
                     myIO.NoteOn( Std.ftom(prevFreq), vel);
                     myIO.NoteOn( Std.ftom(prevFreq), vel);
                 }
                 }
             }
             }
         }
         }
         Std.ftom(prevFreq) =&gt; prevFreqsByKey[nn];
         Std.ftom(prevFreq) => prevFreqsByKey[nn];
     }
     }
           
 
       
 
     fun void NoteOff( int nn, int vel)
     fun void NoteOff( int nn, int vel)
     {
     {
         myIO.NoteOff( prevFreqsByKey[nn], vel);
         myIO.NoteOff( prevFreqsByKey[nn], vel);
     }
     }
   
 
}
}


Line 268: Line 261:
spork ~ mrmio.StartRelay( 1, easy);
spork ~ mrmio.StartRelay( 1, easy);


1::second =&gt; now;
1::second => now;


KBHit kb;  
KBHit kb;


while(true)
while(true)
{
{
     kb =&gt; now;
     kb => now;
   
 
     while( kb.more() )
     while( kb.more() )
     {
     {
         kb.getchar() =&gt; int c;
         kb.getchar() => int c;
         &lt;&lt;&lt; "ascii:", c&gt;&gt;&gt;;
         <<< "ascii:", c>>>;
         easy.NoteOn(c, 88);
         easy.NoteOn(c, 88);
     }
     }
}
}
</pre>
== See also ==
* [[Jacob Barton]]
* [[Software]]


[[code]]</pre></div>
[[Category:chuck]]
<h4>Original HTML content:</h4>
[[Category:code]]
<div style="width:100%; max-height:400pt; overflow:auto; background-color:#f8f9fa; border: 1px solid #eaecf0; padding:0em"><pre style="margin:0px;border:none;background:none;word-wrap:break-word;width:200%;white-space: pre-wrap ! important" class="old-revision-html">&lt;html&gt;&lt;head&gt;&lt;title&gt;superparticular samchillian&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;!-- ws:start:WikiTextCodeRule:0:
[[Category:todo:link]]
&amp;lt;pre class=&amp;quot;java&amp;quot;&amp;gt;//ChucK code for Superparticular Samchillian&amp;lt;br/&amp;gt;//Samchillian idea by Leon Gruenbaum&amp;lt;br/&amp;gt;//superparticular-ratio implementation by Jacob Barton&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;//paste these lines into a new document in miniAudicle, or save text as a .ck to run in command-line&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;//change these to match your input/output device&amp;lt;br/&amp;gt;0 =&amp;amp;gt; int inDeviceNum;&amp;lt;br/&amp;gt;1 =&amp;amp;gt; int outDeviceNum;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;class MicroRobinMidiIO&amp;lt;br/&amp;gt;{&amp;lt;br/&amp;gt;    MidiIn min;&amp;lt;br/&amp;gt;    MidiOut mouse;&amp;lt;br/&amp;gt;    MidiMsg inmsg, outmsg;&amp;lt;br/&amp;gt;    0 =&amp;amp;gt; int ctr;&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    //int rr[128][3]; don't think we need this now.&amp;lt;br/&amp;gt;    // index = note number?&amp;lt;br/&amp;gt;    // column 0 = channel sent to&amp;lt;br/&amp;gt;    // column 1 = note number sent&amp;lt;br/&amp;gt;    int chans[14]; // list of channels used&amp;lt;br/&amp;gt;    float holds[16];    // pitches of on notes, zero if off.&amp;lt;br/&amp;gt;    [0,1,2,3,4,5,6,7,8,10,11,12,13,14] @=&amp;amp;gt; chans; //exclude channel 10 (drums) &amp;amp;amp; 16 (send channel)&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    //microtuning stuff&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    // PitchBend&amp;lt;br/&amp;gt;    // input: pitch (midi note number float) &amp;amp;amp; velocity of desired note&amp;lt;br/&amp;gt;    // action: sends appropriate pitchbend message&amp;lt;br/&amp;gt;    //        (assuming pitchbend range = +/- 2 semitones)&amp;lt;br/&amp;gt;    // output: note number required for correct frequency to be realized&amp;lt;br/&amp;gt;    // sends pitchbend, assuming +/- wholestep pitchbend range&amp;lt;br/&amp;gt;    // returns note number required for correct frequency&amp;lt;br/&amp;gt;    fun int PitchBend(float pitch, int velocity)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        //send pitchbend&amp;lt;br/&amp;gt;        224 + chans[ctr] =&amp;amp;gt; outmsg.data1;&amp;lt;br/&amp;gt;        0 =&amp;amp;gt; outmsg.data2;&amp;lt;br/&amp;gt;        Math.round((pitch % 1.0) * 32.0 + 64.0) $ int =&amp;amp;gt; outmsg.data3;&amp;lt;br/&amp;gt;        mouse.send(outmsg);&amp;lt;br/&amp;gt;        return Math.floor(pitch) $ int;&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    // StartRelay&amp;lt;br/&amp;gt;    // input: number of MIDI device, MidiTransform to be used&amp;lt;br/&amp;gt;    // creates a loop ~ should be sporked&amp;lt;br/&amp;gt;    fun void StartRelay(int deviceNum, MidiTransform mt)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        &amp;lt;br/&amp;gt;        if( !min.open(inDeviceNum)) me.exit();&amp;lt;br/&amp;gt;        if( !mouse.open(outDeviceNum)) me.exit();&amp;lt;br/&amp;gt;        &amp;lt;br/&amp;gt;        // print out device that was opened&amp;lt;br/&amp;gt;        &amp;amp;lt;&amp;amp;lt;&amp;amp;lt; min.num(), &amp;amp;quot; -&amp;amp;gt; &amp;amp;quot;, min.name() &amp;amp;gt;&amp;amp;gt;&amp;amp;gt;;&amp;lt;br/&amp;gt;        &amp;amp;lt;&amp;amp;lt;&amp;amp;lt; mouse.num(), &amp;amp;quot; -&amp;amp;gt; &amp;amp;quot;, mouse.name() &amp;amp;gt;&amp;amp;gt;&amp;amp;gt;;&amp;lt;br/&amp;gt;        &amp;lt;br/&amp;gt;        while ( true)&amp;lt;br/&amp;gt;        {&amp;lt;br/&amp;gt;            min =&amp;amp;gt; now;&amp;lt;br/&amp;gt;            &amp;lt;br/&amp;gt;            while( min.recv(inmsg))&amp;lt;br/&amp;gt;            {      &amp;lt;br/&amp;gt;                if( inmsg.data1 % 16 == 0) // only receive on channel 1&amp;lt;br/&amp;gt;                {&amp;lt;br/&amp;gt;                    &amp;amp;lt;&amp;amp;lt;&amp;amp;lt; &amp;amp;quot;r &amp;amp;quot;, inmsg.data1 / 16, inmsg.data1 % 16, inmsg.data2, inmsg.data3&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;;&amp;lt;br/&amp;gt;                    &amp;lt;br/&amp;gt;                    if( inmsg.data1 / 16 == 9)&amp;lt;br/&amp;gt;                    {  &amp;lt;br/&amp;gt;                        mt.NoteOn(inmsg.data2, inmsg.data3);&amp;lt;br/&amp;gt;                    }&amp;lt;br/&amp;gt;                    if( inmsg.data1 / 16 == 8)&amp;lt;br/&amp;gt;                    {&amp;lt;br/&amp;gt;                        mt.NoteOff(inmsg.data2, inmsg.data3);&amp;lt;br/&amp;gt;                    }&amp;lt;br/&amp;gt;                    if( inmsg.data1 / 16 == 12)&amp;lt;br/&amp;gt;                    {&amp;lt;br/&amp;gt;                        //prog change apply to channels 1-16&amp;lt;br/&amp;gt;                        //works!&amp;lt;br/&amp;gt;                        inmsg.data1 - (inmsg.data1 % 16) =&amp;amp;gt; int base;&amp;lt;br/&amp;gt;                        for(0=&amp;amp;gt;int i; i&amp;amp;lt;15; i++)&amp;lt;br/&amp;gt;                        {&amp;lt;br/&amp;gt;                            base + chans[i] =&amp;amp;gt; outmsg.data1;&amp;lt;br/&amp;gt;                            inmsg.data2 =&amp;amp;gt; outmsg.data2;&amp;lt;br/&amp;gt;                            i++;&amp;lt;br/&amp;gt;                            if( i == 15)  &amp;lt;br/&amp;gt;                            { &amp;lt;br/&amp;gt;                                0 =&amp;amp;gt; outmsg.data3;&amp;lt;br/&amp;gt;                                mouse.send(outmsg);&amp;lt;br/&amp;gt;                                break; &amp;lt;br/&amp;gt;                            }&amp;lt;br/&amp;gt;                            &amp;lt;br/&amp;gt;                            base + chans[i] =&amp;amp;gt; outmsg.data3;&amp;lt;br/&amp;gt;                            mouse.send(outmsg);&amp;lt;br/&amp;gt;                            inmsg.data2 =&amp;amp;gt; outmsg.data1;&amp;lt;br/&amp;gt;                            i++;&amp;lt;br/&amp;gt;                            if( i == 15)&amp;lt;br/&amp;gt;                            {&amp;lt;br/&amp;gt;                                0 =&amp;amp;gt; outmsg.data2 =&amp;amp;gt; outmsg.data3;&amp;lt;br/&amp;gt;                                mouse.send(outmsg);&amp;lt;br/&amp;gt;                                break;&amp;lt;br/&amp;gt;                            }&amp;lt;br/&amp;gt;                            base + chans[i] =&amp;amp;gt; outmsg.data2;&amp;lt;br/&amp;gt;                            inmsg.data2 =&amp;amp;gt; outmsg.data3;&amp;lt;br/&amp;gt;                            mouse.send(outmsg);&amp;lt;br/&amp;gt;                        }&amp;lt;br/&amp;gt;                    }&amp;lt;br/&amp;gt;                    &amp;lt;br/&amp;gt;                    if( inmsg.data1 / 16 == 11)&amp;lt;br/&amp;gt;                    {&amp;lt;br/&amp;gt;                        //apply any controller data to channels 1-16&amp;lt;br/&amp;gt;                        inmsg.data1 - (inmsg.data1 % 16) =&amp;amp;gt; int base;&amp;lt;br/&amp;gt;                        inmsg.data2 =&amp;amp;gt; outmsg.data2;&amp;lt;br/&amp;gt;                        inmsg.data3 =&amp;amp;gt; outmsg.data3;&amp;lt;br/&amp;gt;                        for(0=&amp;amp;gt;int i; i&amp;amp;lt;16; i++)&amp;lt;br/&amp;gt;                        {&amp;lt;br/&amp;gt;                            base + i =&amp;amp;gt; outmsg.data1;&amp;lt;br/&amp;gt;                            mouse.send(outmsg);&amp;lt;br/&amp;gt;                        }&amp;lt;br/&amp;gt;                    }&amp;lt;br/&amp;gt;                }&amp;lt;br/&amp;gt;            }&amp;lt;br/&amp;gt;        }&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;    // NoteOn&amp;lt;br/&amp;gt;    // input: pitch in midi note-number extended, velocity&amp;lt;br/&amp;gt;    // action: sends a MIDI pitchbend + note-on message to mouse on the current channel&amp;lt;br/&amp;gt;    //    keeping track of holds&amp;lt;br/&amp;gt;    fun void NoteOn(float nn, int velocity)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        IncrementCtr();&amp;lt;br/&amp;gt;        nn =&amp;amp;gt; holds[chans[ctr%14]];&amp;lt;br/&amp;gt;        PitchBend(nn, velocity) =&amp;amp;gt; outmsg.data2;&amp;lt;br/&amp;gt;        // note on, right channel&amp;lt;br/&amp;gt;        144 + chans[ctr%14] =&amp;amp;gt; outmsg.data1; &amp;lt;br/&amp;gt;        &amp;lt;br/&amp;gt;        velocity =&amp;amp;gt; outmsg.data3;&amp;lt;br/&amp;gt;        mouse.send(outmsg);&amp;lt;br/&amp;gt;        //&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; &amp;amp;quot;s &amp;amp;quot;, outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;;&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    // increments mod-14 counter, skipping over channels with&amp;lt;br/&amp;gt;    // notes already on them, if possible.&amp;lt;br/&amp;gt;    fun void IncrementCtr()&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        ctr;&amp;lt;br/&amp;gt;        0 =&amp;amp;gt; int i;&amp;lt;br/&amp;gt;        for( i; i&amp;amp;lt;14; i++)&amp;lt;br/&amp;gt;        {&amp;lt;br/&amp;gt;            if ( holds[chans[(ctr+i) % 14]] == 0.0)&amp;lt;br/&amp;gt;            {    (ctr + i) % 14 =&amp;amp;gt; ctr; return; }&amp;lt;br/&amp;gt;        }&amp;lt;br/&amp;gt;        (ctr + 1) % 14 =&amp;amp;gt; ctr;&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    // NoteOff&amp;lt;br/&amp;gt;    // input: pitch &amp;amp;amp; note-off velocity&amp;lt;br/&amp;gt;    // action: finds the pitch &amp;amp;amp; offs it.&amp;lt;br/&amp;gt;    fun void NoteOff(float nn, int velocity)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        0 =&amp;amp;gt; int c;&amp;lt;br/&amp;gt;        for(c; c&amp;amp;lt;16; c++)&amp;lt;br/&amp;gt;        {&amp;lt;br/&amp;gt;            if(holds[c] == nn) // we found the pitch!&amp;lt;br/&amp;gt;            {&amp;lt;br/&amp;gt;                128 + c =&amp;amp;gt; outmsg.data1;&amp;lt;br/&amp;gt;                Math.floor(nn) $ int =&amp;amp;gt; outmsg.data2;&amp;lt;br/&amp;gt;                velocity =&amp;amp;gt; outmsg.data3;&amp;lt;br/&amp;gt;                mouse.send(outmsg);&amp;lt;br/&amp;gt;                //&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; &amp;amp;quot;s &amp;amp;quot;, outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;;&amp;lt;br/&amp;gt;                0.0 =&amp;amp;gt; holds[c];&amp;lt;br/&amp;gt;                return;&amp;lt;br/&amp;gt;            }&amp;lt;br/&amp;gt;        }&amp;lt;br/&amp;gt;        &amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;quot;MISS&amp;amp;quot;, nn&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;;&amp;lt;br/&amp;gt;        // we couldn't find the pitch!&amp;lt;br/&amp;gt;        // don't do anything.            &amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    fun void ControlChange(int channel, int prognum, int val)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        128 + channel =&amp;amp;gt; outmsg.data1;&amp;lt;br/&amp;gt;        prognum =&amp;amp;gt; outmsg.data2;&amp;lt;br/&amp;gt;        val =&amp;amp;gt; outmsg.data3;&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;class MidiTransform&amp;lt;br/&amp;gt;{&amp;lt;br/&amp;gt;    // superclass for MIDI transformers to be used by MicroRobinMidiIO&amp;lt;br/&amp;gt;    MicroRobinMidiIO myIO;&amp;lt;br/&amp;gt;    fun void LinkToIO(MicroRobinMidiIO io)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        io @=&amp;amp;gt; myIO;&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;    fun void NoteOn( int nn, int vel)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        return;&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;    fun void NoteOff( int nn, int vel)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        return;&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;class SuperparticularSamchillian extends MidiTransform&amp;lt;br/&amp;gt;{&amp;lt;br/&amp;gt;    57. =&amp;amp;gt; float resentFreq;&amp;lt;br/&amp;gt;    57. =&amp;amp;gt; float prevFreq;  &amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    62 =&amp;amp;gt; int keyboardCenterNN;&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    float prevFreqsByKey[128];&amp;lt;br/&amp;gt;      &amp;lt;br/&amp;gt;    //set pans funky&amp;lt;br/&amp;gt;    //for(0=&amp;amp;gt;int f; f&amp;amp;lt;16; f++)&amp;lt;br/&amp;gt;    //{&amp;lt;br/&amp;gt;    //    myIO.ControlChange(f, 9, f*8);&amp;lt;br/&amp;gt;    //}&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    fun void NoteOn( int nn, int vel)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        if(nn == keyboardCenterNN)&amp;lt;br/&amp;gt;        {&amp;lt;br/&amp;gt;            myIO.NoteOn( Std.ftom(prevFreq), vel);&amp;lt;br/&amp;gt;        }&amp;lt;br/&amp;gt;        else &amp;lt;br/&amp;gt;        {&amp;lt;br/&amp;gt;            if(nn &amp;amp;lt; keyboardCenterNN)&amp;lt;br/&amp;gt;            {&amp;lt;br/&amp;gt;                // superparticular!&amp;lt;br/&amp;gt;                1. + 1./(keyboardCenterNN - nn) /=&amp;amp;gt; prevFreq;&amp;lt;br/&amp;gt;                myIO.NoteOn( Std.ftom(prevFreq), vel);&amp;lt;br/&amp;gt;            }&amp;lt;br/&amp;gt;            else&amp;lt;br/&amp;gt;            { &amp;lt;br/&amp;gt;                if(nn &amp;amp;gt; keyboardCenterNN)&amp;lt;br/&amp;gt;                {&amp;lt;br/&amp;gt;                    1. + 1./(nn - keyboardCenterNN) *=&amp;amp;gt; prevFreq;&amp;lt;br/&amp;gt;                    myIO.NoteOn( Std.ftom(prevFreq), vel);&amp;lt;br/&amp;gt;                }&amp;lt;br/&amp;gt;            }&amp;lt;br/&amp;gt;        }&amp;lt;br/&amp;gt;        Std.ftom(prevFreq) =&amp;amp;gt; prevFreqsByKey[nn];&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;            &amp;lt;br/&amp;gt;        &amp;lt;br/&amp;gt;    fun void NoteOff( int nn, int vel)&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        myIO.NoteOff( prevFreqsByKey[nn], vel);&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;MicroRobinMidiIO mrmio;&amp;lt;br/&amp;gt;SuperparticularSamchillian easy;&amp;lt;br/&amp;gt;easy.LinkToIO(mrmio);&amp;lt;br/&amp;gt;spork ~ mrmio.StartRelay( 1, easy);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;1::second =&amp;amp;gt; now;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;KBHit kb; &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;while(true)&amp;lt;br/&amp;gt;{&amp;lt;br/&amp;gt;    kb =&amp;amp;gt; now;&amp;lt;br/&amp;gt;    &amp;lt;br/&amp;gt;    while( kb.more() )&amp;lt;br/&amp;gt;    {&amp;lt;br/&amp;gt;        kb.getchar() =&amp;amp;gt; int c;&amp;lt;br/&amp;gt;        &amp;amp;lt;&amp;amp;lt;&amp;amp;lt; &amp;amp;quot;ascii:&amp;amp;quot;, c&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;;&amp;lt;br/&amp;gt;        easy.NoteOn(c, 88);&amp;lt;br/&amp;gt;    }&amp;lt;br/&amp;gt;}&amp;lt;br/&amp;gt;&amp;lt;/pre&amp;gt;
--&gt;
&lt;style type="text/css"&gt;&lt;!--
/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.java  {font-family:monospace;}
.java .imp {font-weight: bold; color: red;}
.java .kw1 {color: #000000; font-weight: bold;}
.java .kw2 {color: #000066; font-weight: bold;}
.java .kw3 {color: #003399;}
.java .kw4 {color: #000066; font-weight: bold;}
.java .co1 {color: #666666; font-style: italic;}
.java .co2 {color: #006699;}
.java .co3 {color: #008000; font-style: italic; font-weight: bold;}
.java .coMULTI {color: #666666; font-style: italic;}
.java .es0 {color: #000099; font-weight: bold;}
.java .br0 {color: #009900;}
.java .sy0 {color: #339933;}
.java .st0 {color: #0000ff;}
.java .nu0 {color: #cc66cc;}
.java .me1 {color: #006633;}
.java .me2 {color: #006633;}
.java span.xtra { display:block; }
 
--&gt;
&lt;/style&gt;&lt;pre class="java"&gt;&amp;nbsp;
&lt;span class="co1"&gt;//ChucK code for Superparticular Samchillian&lt;/span&gt;
&lt;span class="co1"&gt;//Samchillian idea by Leon Gruenbaum&lt;/span&gt;
&lt;span class="co1"&gt;//superparticular-ratio implementation by Jacob Barton&lt;/span&gt;
&amp;nbsp;
&lt;span class="co1"&gt;//paste these lines into a new document in miniAudicle, or save text as a .ck to run in command-line&lt;/span&gt;
&amp;nbsp;
&lt;span class="co1"&gt;//change these to match your input/output device&lt;/span&gt;
&lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; inDeviceNum&lt;span class="sy0"&gt;;&lt;/span&gt;
&lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; outDeviceNum&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span class="kw1"&gt;class&lt;/span&gt; MicroRobinMidiIO
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
    MidiIn min&lt;span class="sy0"&gt;;&lt;/span&gt;
    MidiOut mouse&lt;span class="sy0"&gt;;&lt;/span&gt;
    MidiMsg inmsg, outmsg&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; ctr&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span class="co1"&gt;//int rr[128][3]; don't think we need this now.&lt;/span&gt;
    &lt;span class="co1"&gt;// index = note number?&lt;/span&gt;
    &lt;span class="co1"&gt;// column 0 = channel sent to&lt;/span&gt;
    &lt;span class="co1"&gt;// column 1 = note number sent&lt;/span&gt;
    &lt;span class="kw4"&gt;int&lt;/span&gt; chans&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="nu0"&gt;14&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;// list of channels used&lt;/span&gt;
    &lt;span class="kw4"&gt;float&lt;/span&gt; holds&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="nu0"&gt;16&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;    &lt;span class="co1"&gt;// pitches of on notes, zero if off.&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;2&lt;/span&gt;,&lt;span class="nu0"&gt;3&lt;/span&gt;,&lt;span class="nu0"&gt;4&lt;/span&gt;,&lt;span class="nu0"&gt;5&lt;/span&gt;,&lt;span class="nu0"&gt;6&lt;/span&gt;,&lt;span class="nu0"&gt;7&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;,&lt;span class="nu0"&gt;10&lt;/span&gt;,&lt;span class="nu0"&gt;11&lt;/span&gt;,&lt;span class="nu0"&gt;12&lt;/span&gt;,&lt;span class="nu0"&gt;13&lt;/span&gt;,&lt;span class="nu0"&gt;14&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; @&lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; chans&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;//exclude channel 10 (drums) &amp;amp; 16 (send channel)&lt;/span&gt;
&amp;nbsp;
    &lt;span class="co1"&gt;//microtuning stuff&lt;/span&gt;
&amp;nbsp;
    &lt;span class="co1"&gt;// PitchBend&lt;/span&gt;
    &lt;span class="co1"&gt;// input: pitch (midi note number float) &amp;amp; velocity of desired note&lt;/span&gt;
    &lt;span class="co1"&gt;// action: sends appropriate pitchbend message&lt;/span&gt;
    &lt;span class="co1"&gt;//        (assuming pitchbend range = +/- 2 semitones)&lt;/span&gt;
    &lt;span class="co1"&gt;// output: note number required for correct frequency to be realized&lt;/span&gt;
    &lt;span class="co1"&gt;// sends pitchbend, assuming +/- wholestep pitchbend range&lt;/span&gt;
    &lt;span class="co1"&gt;// returns note number required for correct frequency&lt;/span&gt;
    fun &lt;span class="kw4"&gt;int&lt;/span&gt; PitchBend&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;float&lt;/span&gt; pitch, &lt;span class="kw4"&gt;int&lt;/span&gt; velocity&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        &lt;span class="co1"&gt;//send pitchbend&lt;/span&gt;
        &lt;span class="nu0"&gt;224&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; chans&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;ctr&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="kw3"&gt;Math&lt;/span&gt;.&lt;span class="me1"&gt;round&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;pitch &lt;span class="sy0"&gt;%&lt;/span&gt; &lt;span class="nu0"&gt;1.0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;*&lt;/span&gt; &lt;span class="nu0"&gt;32.0&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="nu0"&gt;64.0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; $ &lt;span class="kw4"&gt;int&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        mouse.&lt;span class="me1"&gt;send&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;outmsg&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="kw3"&gt;Math&lt;/span&gt;.&lt;span class="me1"&gt;floor&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;pitch&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; $ &lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span class="co1"&gt;// StartRelay&lt;/span&gt;
    &lt;span class="co1"&gt;// input: number of MIDI device, MidiTransform to be used&lt;/span&gt;
    &lt;span class="co1"&gt;// creates a loop ~ should be sporked&lt;/span&gt;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; StartRelay&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt; deviceNum, MidiTransform mt&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
        &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="sy0"&gt;!&lt;/span&gt;min.&lt;span class="me1"&gt;open&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inDeviceNum&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; me.&lt;span class="me1"&gt;exit&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="sy0"&gt;!&lt;/span&gt;mouse.&lt;span class="me1"&gt;open&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;outDeviceNum&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; me.&lt;span class="me1"&gt;exit&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
        &lt;span class="co1"&gt;// print out device that was opened&lt;/span&gt;
        &lt;span class="sy0"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; min.&lt;span class="me1"&gt;num&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot; -&amp;gt; &amp;quot;&lt;/span&gt;, min.&lt;span class="me1"&gt;name&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;
        &lt;span class="sy0"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; mouse.&lt;span class="me1"&gt;num&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot; -&amp;gt; &amp;quot;&lt;/span&gt;, mouse.&lt;span class="me1"&gt;name&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;
&amp;nbsp;
        &lt;span class="kw1"&gt;while&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
            min &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; now&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
            &lt;span class="kw1"&gt;while&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; min.&lt;span class="me1"&gt;recv&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inmsg&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
            &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;     
                &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;%&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="co1"&gt;// only receive on channel 1&lt;/span&gt;
                &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                    &lt;span class="sy0"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;r &amp;quot;&lt;/span&gt;, inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt;, inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;%&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt;, inmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;, inmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;
&amp;nbsp;
                    &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="nu0"&gt;9&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
                    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; 
                        mt.&lt;span class="me1"&gt;NoteOn&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;, inmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
                    &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
                    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                        mt.&lt;span class="me1"&gt;NoteOff&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;, inmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
                    &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="nu0"&gt;12&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
                    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                        &lt;span class="co1"&gt;//prog change apply to channels 1-16&lt;/span&gt;
                        &lt;span class="co1"&gt;//works!&lt;/span&gt;
                        inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;-&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;%&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; base&lt;span class="sy0"&gt;;&lt;/span&gt;
                        &lt;span class="kw1"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt; i&lt;span class="sy0"&gt;;&lt;/span&gt; i&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; i&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
                        &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                            base &lt;span class="sy0"&gt;+&lt;/span&gt; chans&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            inmsg.&lt;span class="me1"&gt;data2&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            i&lt;span class="sy0"&gt;++;&lt;/span&gt;
                            &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; i &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="nu0"&gt;15&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; 
                            &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                                &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                                mouse.&lt;span class="me1"&gt;send&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;outmsg&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                                &lt;span class="kw1"&gt;break&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
                            base &lt;span class="sy0"&gt;+&lt;/span&gt; chans&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            mouse.&lt;span class="me1"&gt;send&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;outmsg&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            inmsg.&lt;span class="me1"&gt;data2&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            i&lt;span class="sy0"&gt;++;&lt;/span&gt;
                            &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; i &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="nu0"&gt;15&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
                            &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                                &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data2&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                                mouse.&lt;span class="me1"&gt;send&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;outmsg&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                                &lt;span class="kw1"&gt;break&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
                            base &lt;span class="sy0"&gt;+&lt;/span&gt; chans&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            inmsg.&lt;span class="me1"&gt;data2&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            mouse.&lt;span class="me1"&gt;send&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;outmsg&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                        &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
                    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
                    &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="nu0"&gt;11&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
                    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                        &lt;span class="co1"&gt;//apply any controller data to channels 1-16&lt;/span&gt;
                        inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;-&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inmsg.&lt;span class="me1"&gt;data1&lt;/span&gt; &lt;span class="sy0"&gt;%&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; base&lt;span class="sy0"&gt;;&lt;/span&gt;
                        inmsg.&lt;span class="me1"&gt;data2&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                        inmsg.&lt;span class="me1"&gt;data3&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                        &lt;span class="kw1"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt; i&lt;span class="sy0"&gt;;&lt;/span&gt; i&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nu0"&gt;16&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; i&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
                        &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                            base &lt;span class="sy0"&gt;+&lt;/span&gt; i &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                            mouse.&lt;span class="me1"&gt;send&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;outmsg&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                        &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
                    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
                &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
            &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
    &lt;span class="co1"&gt;// NoteOn&lt;/span&gt;
    &lt;span class="co1"&gt;// input: pitch in midi note-number extended, velocity&lt;/span&gt;
    &lt;span class="co1"&gt;// action: sends a MIDI pitchbend + note-on message to mouse on the current channel&lt;/span&gt;
    &lt;span class="co1"&gt;//    keeping track of holds&lt;/span&gt;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; NoteOn&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;float&lt;/span&gt; nn, &lt;span class="kw4"&gt;int&lt;/span&gt; velocity&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        IncrementCtr&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        nn &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; holds&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;chans&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;ctr&lt;span class="sy0"&gt;%&lt;/span&gt;14&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        PitchBend&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;nn, velocity&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="co1"&gt;// note on, right channel&lt;/span&gt;
        &lt;span class="nu0"&gt;144&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; chans&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;ctr&lt;span class="sy0"&gt;%&lt;/span&gt;14&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
        velocity &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        mouse.&lt;span class="me1"&gt;send&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;outmsg&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="co1"&gt;//&amp;lt;&amp;lt;&amp;lt; &amp;quot;s &amp;quot;, outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span class="co1"&gt;// increments mod-14 counter, skipping over channels with&lt;/span&gt;
    &lt;span class="co1"&gt;// notes already on them, if possible.&lt;/span&gt;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; IncrementCtr&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        ctr&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; i&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="kw1"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; i&lt;span class="sy0"&gt;;&lt;/span&gt; i&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nu0"&gt;14&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; i&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
            &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; holds&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;chans&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ctr&lt;span class="sy0"&gt;+&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;%&lt;/span&gt; &lt;span class="nu0"&gt;14&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="nu0"&gt;0.0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
            &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;    &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ctr &lt;span class="sy0"&gt;+&lt;/span&gt; i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;%&lt;/span&gt; &lt;span class="nu0"&gt;14&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; ctr&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ctr &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;%&lt;/span&gt; &lt;span class="nu0"&gt;14&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; ctr&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span class="co1"&gt;// NoteOff&lt;/span&gt;
    &lt;span class="co1"&gt;// input: pitch &amp;amp; note-off velocity&lt;/span&gt;
    &lt;span class="co1"&gt;// action: finds the pitch &amp;amp; offs it.&lt;/span&gt;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; NoteOff&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;float&lt;/span&gt; nn, &lt;span class="kw4"&gt;int&lt;/span&gt; velocity&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; c&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="kw1"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;c&lt;span class="sy0"&gt;;&lt;/span&gt; c&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nu0"&gt;16&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; c&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
            &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;holds&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;c&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; nn&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="co1"&gt;// we found the pitch!&lt;/span&gt;
            &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                &lt;span class="nu0"&gt;128&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; c &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                &lt;span class="kw3"&gt;Math&lt;/span&gt;.&lt;span class="me1"&gt;floor&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;nn&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; $ &lt;span class="kw4"&gt;int&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                velocity &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                mouse.&lt;span class="me1"&gt;send&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;outmsg&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                &lt;span class="co1"&gt;//&amp;lt;&amp;lt;&amp;lt; &amp;quot;s &amp;quot;, outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;
                &lt;span class="nu0"&gt;0.0&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; holds&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;c&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
            &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;span class="sy0"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;MISS&amp;quot;&lt;/span&gt;, nn&lt;span class="sy0"&gt;&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;
        &lt;span class="co1"&gt;// we couldn't find the pitch!&lt;/span&gt;
        &lt;span class="co1"&gt;// don't do anything.            &lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; ControlChange&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt; channel, &lt;span class="kw4"&gt;int&lt;/span&gt; prognum, &lt;span class="kw4"&gt;int&lt;/span&gt; val&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        &lt;span class="nu0"&gt;128&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; channel &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        prognum &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        val &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; outmsg.&lt;span class="me1"&gt;data3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class="kw1"&gt;class&lt;/span&gt; MidiTransform
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
    &lt;span class="co1"&gt;// superclass for MIDI transformers to be used by MicroRobinMidiIO&lt;/span&gt;
    MicroRobinMidiIO myIO&lt;span class="sy0"&gt;;&lt;/span&gt;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; LinkToIO&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;MicroRobinMidiIO io&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        io @&lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; myIO&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; NoteOn&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; nn, &lt;span class="kw4"&gt;int&lt;/span&gt; vel&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; NoteOff&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; nn, &lt;span class="kw4"&gt;int&lt;/span&gt; vel&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class="kw1"&gt;class&lt;/span&gt; SuperparticularSamchillian &lt;span class="kw1"&gt;extends&lt;/span&gt; MidiTransform
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
    &lt;span class="nu0"&gt;57&lt;/span&gt;. &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;float&lt;/span&gt; resentFreq&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="nu0"&gt;57&lt;/span&gt;. &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;float&lt;/span&gt; prevFreq&lt;span class="sy0"&gt;;&lt;/span&gt; 
&amp;nbsp;
    &lt;span class="nu0"&gt;62&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; keyboardCenterNN&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span class="kw4"&gt;float&lt;/span&gt; prevFreqsByKey&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="nu0"&gt;128&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span class="co1"&gt;//set pans funky&lt;/span&gt;
    &lt;span class="co1"&gt;//for(0=&amp;gt;int f; f&amp;lt;16; f++)&lt;/span&gt;
    &lt;span class="co1"&gt;//{&lt;/span&gt;
    &lt;span class="co1"&gt;//    myIO.ControlChange(f, 9, f*8);&lt;/span&gt;
    &lt;span class="co1"&gt;//}&lt;/span&gt;
&amp;nbsp;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; NoteOn&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; nn, &lt;span class="kw4"&gt;int&lt;/span&gt; vel&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;nn &lt;span class="sy0"&gt;==&lt;/span&gt; keyboardCenterNN&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
            myIO.&lt;span class="me1"&gt;NoteOn&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; Std.&lt;span class="me1"&gt;ftom&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;prevFreq&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, vel&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;span class="kw1"&gt;else&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
            &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;nn &lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt; keyboardCenterNN&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
            &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                &lt;span class="co1"&gt;// superparticular!&lt;/span&gt;
                &lt;span class="nu0"&gt;1&lt;/span&gt;. &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;.&lt;span class="sy0"&gt;/&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;keyboardCenterNN &lt;span class="sy0"&gt;-&lt;/span&gt; nn&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;/=&amp;gt;&lt;/span&gt; prevFreq&lt;span class="sy0"&gt;;&lt;/span&gt;
                myIO.&lt;span class="me1"&gt;NoteOn&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; Std.&lt;span class="me1"&gt;ftom&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;prevFreq&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, vel&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
            &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
            &lt;span class="kw1"&gt;else&lt;/span&gt;
            &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;nn &lt;span class="sy0"&gt;&amp;gt;&lt;/span&gt; keyboardCenterNN&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
                &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
                    &lt;span class="nu0"&gt;1&lt;/span&gt;. &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;.&lt;span class="sy0"&gt;/&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;nn &lt;span class="sy0"&gt;-&lt;/span&gt; keyboardCenterNN&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;*=&amp;gt;&lt;/span&gt; prevFreq&lt;span class="sy0"&gt;;&lt;/span&gt;
                    myIO.&lt;span class="me1"&gt;NoteOn&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; Std.&lt;span class="me1"&gt;ftom&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;prevFreq&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, vel&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
            &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        Std.&lt;span class="me1"&gt;ftom&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;prevFreq&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; prevFreqsByKey&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;nn&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
    fun &lt;span class="kw4"&gt;void&lt;/span&gt; NoteOff&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; nn, &lt;span class="kw4"&gt;int&lt;/span&gt; vel&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        myIO.&lt;span class="me1"&gt;NoteOff&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; prevFreqsByKey&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;nn&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;, vel&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
MicroRobinMidiIO mrmio&lt;span class="sy0"&gt;;&lt;/span&gt;
SuperparticularSamchillian easy&lt;span class="sy0"&gt;;&lt;/span&gt;
easy.&lt;span class="me1"&gt;LinkToIO&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;mrmio&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
spork ~ mrmio.&lt;span class="me1"&gt;StartRelay&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;, easy&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;::&lt;/span&gt;second &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; now&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
KBHit kb&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span class="kw1"&gt;while&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
    kb &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; now&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span class="kw1"&gt;while&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; kb.&lt;span class="me1"&gt;more&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        kb.&lt;span class="me1"&gt;getchar&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; c&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="sy0"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;ascii:&amp;quot;&lt;/span&gt;, c&lt;span class="sy0"&gt;&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;
        easy.&lt;span class="me1"&gt;NoteOn&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;c, &lt;span class="nu0"&gt;88&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;
 
&lt;!-- ws:end:WikiTextCodeRule:0 --&gt;&lt;/body&gt;&lt;/html&gt;</pre></div>