Superparticular samchillian: Difference between revisions

Wikispaces>xenjacob
**Imported revision 343572870 - Original comment: **
 
Wikispaces>xenjacob
**Imported revision 343680102 - Original comment: **
Line 1: Line 1:
<h2>IMPORTED REVISION FROM WIKISPACES</h2>
<h2>IMPORTED REVISION FROM WIKISPACES</h2>
This is an imported revision from Wikispaces. The revision metadata is included below for reference:<br>
This is an imported revision from Wikispaces. The revision metadata is included below for reference:<br>
: This revision was by author [[User:xenjacob|xenjacob]] and made on <tt>2012-06-07 12:40:57 UTC</tt>.<br>
: 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>343572870</tt>.<br>
: The original revision id was <tt>343680102</tt>.<br>
: The revision comment was: <tt></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>
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>
<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">&lt;span class="s1"&gt;// ChucK code for Superparticular Samchillian&lt;/span&gt;
<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"]]
&lt;span class="s1"&gt;// Samchillian idea by Leon Gruenbaum&lt;/span&gt;
&lt;span class="s1"&gt;// superparticular-ratio implementation by Jacob Barton&lt;/span&gt;


// paste these into a new document in miniAudicle, or save text as a .ck to run in command-line
//ChucK code for Superparticular Samchillian
//Samchillian idea by Leon Gruenbaum
//superparticular-ratio implementation by Jacob Barton


&lt;span class="s1"&gt;// change these to match your input/output device&lt;/span&gt;
//paste these lines into a new document in miniAudicle, or save text as a .ck to run in command-line
&lt;span class="s1"&gt;0 =&gt; int inDeviceNum;&lt;/span&gt;
&lt;span class="s1"&gt;1 =&gt; int outDeviceNum;&lt;/span&gt;


&lt;span class="s1"&gt;class&lt;/span&gt; MicroRobinMidiIO
//change these to match your input/output device
{
0 =&gt; int inDeviceNum;
MidiIn min;
1 =&gt; int outDeviceNum;
MidiOut mouse;
 
MidiMsg inmsg, outmsg;
class MicroRobinMidiIO
&lt;span class="s2"&gt;0&lt;/span&gt; =&gt; &lt;span class="s1"&gt;int&lt;/span&gt; ctr;
//int rr[128][3]; don't think we need this now.
// index = note number?
// column 0 = channel sent to
// column 1 = note number sent
&lt;span class="s1"&gt;int&lt;/span&gt;&lt;span class="s3"&gt; chans[&lt;/span&gt;&lt;span class="s2"&gt;14&lt;/span&gt;&lt;span class="s3"&gt;]; &lt;/span&gt;// list of channels used
&lt;span class="s1"&gt;float&lt;/span&gt;&lt;span class="s3"&gt; holds[&lt;/span&gt;&lt;span class="s2"&gt;16&lt;/span&gt;&lt;span class="s3"&gt;]; &lt;/span&gt;// pitches of on notes, zero if off.
&lt;span class="s3"&gt; [&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;4&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;5&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;6&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;7&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;8&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;10&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;11&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;12&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;13&lt;/span&gt;&lt;span class="s3"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;14&lt;/span&gt;&lt;span class="s3"&gt;] @=&gt; chans; &lt;/span&gt;//exclude channel 10 (drums) &amp; 16 (send channel)
//microtuning stuff
// PitchBend
// input: pitch (midi note number float) &amp; velocity of desired note
// action: sends appropriate pitchbend message
// (assuming pitchbend range = +/- 2 semitones)
// output: note number required for correct frequency to be realized
// sends pitchbend, assuming +/- wholestep pitchbend range
// returns note number required for correct frequency
&lt;span class="s1"&gt;fun int&lt;/span&gt; PitchBend(&lt;span class="s1"&gt;float&lt;/span&gt; pitch, &lt;span class="s1"&gt;int&lt;/span&gt; velocity)
{
//send pitchbend
&lt;span class="s2"&gt;224&lt;/span&gt; + chans[ctr] =&gt; outmsg.data1;
&lt;span class="s2"&gt;0&lt;/span&gt; =&gt; outmsg.data2;
Math.round((pitch % &lt;span class="s2"&gt;1&lt;/span&gt;.&lt;span class="s2"&gt;0&lt;/span&gt;) * &lt;span class="s2"&gt;32&lt;/span&gt;.&lt;span class="s2"&gt;0&lt;/span&gt; + &lt;span class="s2"&gt;64&lt;/span&gt;.&lt;span class="s2"&gt;0&lt;/span&gt;) $ &lt;span class="s1"&gt;int&lt;/span&gt; =&gt; outmsg.data3;
mouse.send(outmsg);
&lt;span class="s1"&gt;return&lt;/span&gt; Math.floor(pitch) $ &lt;span class="s1"&gt;int&lt;/span&gt;;
}
// StartRelay
// input: number of MIDI device, MidiTransform to be used
// creates a loop ~ should be sporked
&lt;span class="s1"&gt;fun void&lt;/span&gt; StartRelay(&lt;span class="s1"&gt;int&lt;/span&gt; deviceNum, MidiTransform mt)
{
&lt;span class="s1"&gt;if&lt;/span&gt;( !min.open(&lt;span class="s2"&gt;inDeviceNum&lt;/span&gt;)) &lt;span class="s1"&gt;me&lt;/span&gt;.exit();
&lt;span class="s1"&gt;if&lt;/span&gt;( !mouse.open(outDeviceNum)) &lt;span class="s1"&gt;me&lt;/span&gt;.exit();
// print out device that was opened
&lt;&lt;&lt; min.num(), &lt;span class="s4"&gt;" -&gt; "&lt;/span&gt;, min.name() &gt;&gt;&gt;;
&lt;&lt;&lt; mouse.num(), &lt;span class="s4"&gt;" -&gt; "&lt;/span&gt;, mouse.name() &gt;&gt;&gt;;
&lt;span class="s1"&gt;while&lt;/span&gt; ( &lt;span class="s1"&gt;true&lt;/span&gt;)
{
min =&gt; &lt;span class="s1"&gt;now&lt;/span&gt;;
&lt;span class="s1"&gt;while&lt;/span&gt;( min.recv(inmsg))
{
&lt;span class="s1"&gt;if&lt;/span&gt;( inmsg.data1 % &lt;span class="s2"&gt;16&lt;/span&gt; == &lt;span class="s2"&gt;0&lt;/span&gt;) &lt;span class="s5"&gt;// only receive on channel 1&lt;/span&gt;
{
&lt;&lt;&lt; &lt;span class="s4"&gt;"r "&lt;/span&gt;, inmsg.data1 / &lt;span class="s2"&gt;16&lt;/span&gt;, inmsg.data1 % &lt;span class="s2"&gt;16&lt;/span&gt;, inmsg.data2, inmsg.data3&gt;&gt;&gt;;
&lt;span class="s1"&gt;if&lt;/span&gt;( inmsg.data1 / &lt;span class="s2"&gt;16&lt;/span&gt; == &lt;span class="s2"&gt;9&lt;/span&gt;)
{
mt.NoteOn(inmsg.data2, inmsg.data3);
}
&lt;span class="s1"&gt;if&lt;/span&gt;( inmsg.data1 / &lt;span class="s2"&gt;16&lt;/span&gt; == &lt;span class="s2"&gt;8&lt;/span&gt;)
{
mt.NoteOff(inmsg.data2, inmsg.data3);
}
&lt;span class="s1"&gt;if&lt;/span&gt;( inmsg.data1 / &lt;span class="s2"&gt;16&lt;/span&gt; == &lt;span class="s2"&gt;12&lt;/span&gt;)
{
//prog change apply to channels 1-16
&lt;span class="s5"&gt;//works!&lt;/span&gt;
inmsg.data1 - (inmsg.data1 % &lt;span class="s2"&gt;16&lt;/span&gt;) =&gt; &lt;span class="s1"&gt;int&lt;/span&gt; base;
&lt;span class="s1"&gt;for&lt;/span&gt;(&lt;span class="s2"&gt;0&lt;/span&gt;=&gt;&lt;span class="s1"&gt;int&lt;/span&gt; i; i&lt;&lt;span class="s2"&gt;15&lt;/span&gt;; i++)
{
base + chans[i] =&gt; outmsg.data1;
inmsg.data2 =&gt; outmsg.data2;
i++;
&lt;span class="s1"&gt;if&lt;/span&gt;( i == &lt;span class="s2"&gt;15&lt;/span&gt;)
{
&lt;span class="s2"&gt;0&lt;/span&gt; =&gt; outmsg.data3;
mouse.send(outmsg);
&lt;span class="s1"&gt;break&lt;/span&gt;;
}
base + chans[i] =&gt; outmsg.data3;
mouse.send(outmsg);
inmsg.data2 =&gt; outmsg.data1;
i++;
&lt;span class="s1"&gt;if&lt;/span&gt;( i == &lt;span class="s2"&gt;15&lt;/span&gt;)
{
{
&lt;span class="s2"&gt;0&lt;/span&gt; =&gt; outmsg.data2 =&gt; outmsg.data3;
    MidiIn min;
mouse.send(outmsg);
    MidiOut mouse;
&lt;span class="s1"&gt;break&lt;/span&gt;;
    MidiMsg inmsg, outmsg;
}
    0 =&gt; int ctr;
base + chans[i] =&gt; outmsg.data2;
   
inmsg.data2 =&gt; outmsg.data3;
    //int rr[128][3]; don't think we need this now.
mouse.send(outmsg);
    // index = note number?
}
    // column 0 = channel sent to
}
    // column 1 = note number sent
&lt;span class="s1"&gt;if&lt;/span&gt;( inmsg.data1 / &lt;span class="s2"&gt;16&lt;/span&gt; == &lt;span class="s2"&gt;11&lt;/span&gt;)
    int chans[14]; // list of channels used
{
    float holds[16];     // pitches of on notes, zero if off.
//apply any controller data to channels 1-16
    [0,1,2,3,4,5,6,7,8,10,11,12,13,14] @=&gt; chans; //exclude channel 10 (drums) &amp; 16 (send channel)
inmsg.data1 - (inmsg.data1 % &lt;span class="s2"&gt;16&lt;/span&gt;) =&gt; &lt;span class="s1"&gt;int&lt;/span&gt; base;
   
inmsg.data2 =&gt; outmsg.data2;
    //microtuning stuff
inmsg.data3 =&gt; outmsg.data3;
   
&lt;span class="s1"&gt;for&lt;/span&gt;(&lt;span class="s2"&gt;0&lt;/span&gt;=&gt;&lt;span class="s1"&gt;int&lt;/span&gt; i; i&lt;&lt;span class="s2"&gt;16&lt;/span&gt;; i++)
    // PitchBend
{
    // input: pitch (midi note number float) &amp; velocity of desired note
base + i =&gt; outmsg.data1;
    // action: sends appropriate pitchbend message
mouse.send(outmsg);
    //        (assuming pitchbend range = +/- 2 semitones)
}
    // output: note number required for correct frequency to be realized
}
    // sends pitchbend, assuming +/- wholestep pitchbend range
}
    // returns note number required for correct frequency
}
    fun int PitchBend(float pitch, int velocity)
}
    {
}
        //send pitchbend
// NoteOn
        224 + chans[ctr] =&gt; outmsg.data1;
// input: pitch in midi note-number extended, velocity
        0 =&gt; outmsg.data2;
// action: sends a MIDI pitchbend + note-on message to mouse on the current channel
        Math.round((pitch % 1.0) * 32.0 + 64.0) $ int =&gt; outmsg.data3;
// keeping track of holds
        mouse.send(outmsg);
&lt;span class="s1"&gt;fun void&lt;/span&gt; NoteOn(&lt;span class="s1"&gt;float&lt;/span&gt; nn, &lt;span class="s1"&gt;int&lt;/span&gt; velocity)
        return Math.floor(pitch) $ int;
{
    }
IncrementCtr();
   
nn =&gt; holds[chans[ctr%&lt;span class="s2"&gt;14&lt;/span&gt;]];
    // StartRelay
PitchBend(nn, velocity) =&gt; outmsg.data2;
    // input: number of MIDI device, MidiTransform to be used
// note on, right channel
    // creates a loop ~ should be sporked
&lt;span class="s2"&gt;144&lt;/span&gt; + chans[ctr%&lt;span class="s2"&gt;14&lt;/span&gt;] =&gt; outmsg.data1;  
    fun void StartRelay(int deviceNum, MidiTransform mt)
velocity =&gt; outmsg.data3;
    {
mouse.send(outmsg);
       
//&lt;&lt;&lt; "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&gt;&gt;&gt;;
        if( !min.open(inDeviceNum)) me.exit();
}
        if( !mouse.open(outDeviceNum)) me.exit();
// increments mod-14 counter, skipping over channels with
       
// notes already on them, if possible.
        // print out device that was opened
&lt;span class="s1"&gt;fun void&lt;/span&gt; IncrementCtr()
        &lt;&lt;&lt; min.num(), " -&gt; ", min.name() &gt;&gt;&gt;;
{
        &lt;&lt;&lt; mouse.num(), " -&gt; ", mouse.name() &gt;&gt;&gt;;
ctr;
       
&lt;span class="s2"&gt;0&lt;/span&gt; =&gt; &lt;span class="s1"&gt;int&lt;/span&gt; i;
        while ( true)
&lt;span class="s1"&gt;for&lt;/span&gt;( i; i&lt;&lt;span class="s2"&gt;14&lt;/span&gt;; i++)
        {
{
            min =&gt; now;
&lt;span class="s1"&gt;if&lt;/span&gt; ( holds[chans[(ctr+i) % &lt;span class="s2"&gt;14&lt;/span&gt;]] == &lt;span class="s2"&gt;0&lt;/span&gt;.&lt;span class="s2"&gt;0&lt;/span&gt;)
           
{ (ctr + i) % &lt;span class="s2"&gt;14&lt;/span&gt; =&gt; ctr; &lt;span class="s1"&gt;return&lt;/span&gt;; }
            while( min.recv(inmsg))
}
            {     
(ctr + &lt;span class="s2"&gt;1&lt;/span&gt;) % &lt;span class="s2"&gt;14&lt;/span&gt; =&gt; ctr;
                if( inmsg.data1 % 16 == 0) // only receive on channel 1
}
                {
// NoteOff
                    &lt;&lt;&lt; "r ", inmsg.data1 / 16, inmsg.data1 % 16, inmsg.data2, inmsg.data3&gt;&gt;&gt;;
// input: pitch &amp; note-off velocity
                   
// action: finds the pitch &amp; offs it.
                    if( inmsg.data1 / 16 == 9)
&lt;span class="s1"&gt;fun void&lt;/span&gt; NoteOff(&lt;span class="s1"&gt;float&lt;/span&gt; nn, &lt;span class="s1"&gt;int&lt;/span&gt; velocity)
                    {  
{
                        mt.NoteOn(inmsg.data2, inmsg.data3);
&lt;span class="s2"&gt;0&lt;/span&gt; =&gt; &lt;span class="s1"&gt;int&lt;/span&gt; c;
                    }
&lt;span class="s1"&gt;for&lt;/span&gt;(c; c&lt;&lt;span class="s2"&gt;16&lt;/span&gt;; c++)
                    if( inmsg.data1 / 16 == 8)
{
                    {
&lt;span class="s1"&gt;if&lt;/span&gt;(holds[c] == nn) &lt;span class="s5"&gt;// we found the pitch!&lt;/span&gt;
                        mt.NoteOff(inmsg.data2, inmsg.data3);
{
                    }
&lt;span class="s2"&gt;128&lt;/span&gt; + c =&gt; outmsg.data1;
                    if( inmsg.data1 / 16 == 12)
Math.floor(nn) $ &lt;span class="s1"&gt;int&lt;/span&gt; =&gt; outmsg.data2;
                    {
velocity =&gt; outmsg.data3;
                        //prog change apply to channels 1-16
mouse.send(outmsg);
                        //works!
//&lt;&lt;&lt; "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&gt;&gt;&gt;;
                        inmsg.data1 - (inmsg.data1 % 16) =&gt; int base;
&lt;span class="s2"&gt;0&lt;/span&gt;.&lt;span class="s2"&gt;0&lt;/span&gt; =&gt; holds[c];
                        for(0=&gt;int i; i&lt;15; i++)
&lt;span class="s1"&gt;return&lt;/span&gt;;
                        {
}
                            base + chans[i] =&gt; outmsg.data1;
}
                            inmsg.data2 =&gt; outmsg.data2;
&lt;&lt;&lt;&lt;span class="s4"&gt;"MISS"&lt;/span&gt;, nn&gt;&gt;&gt;;
                            i++;
// we couldn't find the pitch!
                            if( i == 15)
// don't do anything.
                            {
}
                                0 =&gt; outmsg.data3;
&lt;span class="s1"&gt;fun void&lt;/span&gt; ControlChange(&lt;span class="s1"&gt;int&lt;/span&gt; channel, &lt;span class="s1"&gt;int&lt;/span&gt; prognum, &lt;span class="s1"&gt;int&lt;/span&gt; val)
                                mouse.send(outmsg);
{
                                break;  
&lt;span class="s2"&gt;128&lt;/span&gt; + channel =&gt; outmsg.data1;
                            }
prognum =&gt; outmsg.data2;
                           
val =&gt; outmsg.data3;
                            base + chans[i] =&gt; outmsg.data3;
}
                            mouse.send(outmsg);
                            inmsg.data2 =&gt; outmsg.data1;
                            i++;
                            if( i == 15)
                            {
                                0 =&gt; outmsg.data2 =&gt; outmsg.data3;
                                mouse.send(outmsg);
                                break;
                            }
                            base + chans[i] =&gt; outmsg.data2;
                            inmsg.data2 =&gt; outmsg.data3;
                            mouse.send(outmsg);
                        }
                    }
                   
                    if( inmsg.data1 / 16 == 11)
                    {
                        //apply any controller data to channels 1-16
                        inmsg.data1 - (inmsg.data1 % 16) =&gt; int base;
                        inmsg.data2 =&gt; outmsg.data2;
                        inmsg.data3 =&gt; outmsg.data3;
                        for(0=&gt;int i; i&lt;16; i++)
                        {
                            base + i =&gt; outmsg.data1;
                            mouse.send(outmsg);
                        }
                    }
                }
            }
        }
    }
    // NoteOn
    // input: pitch in midi note-number extended, velocity
    // action: sends a MIDI pitchbend + note-on message to mouse on the current channel
    //     keeping track of holds
    fun void NoteOn(float nn, int velocity)
    {
        IncrementCtr();
        nn =&gt; holds[chans[ctr%14]];
        PitchBend(nn, velocity) =&gt; outmsg.data2;
        // note on, right channel
        144 + chans[ctr%14] =&gt; outmsg.data1;  
       
        velocity =&gt; outmsg.data3;
        mouse.send(outmsg);
        //&lt;&lt;&lt; "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&gt;&gt;&gt;;
    }
   
    // increments mod-14 counter, skipping over channels with
    // notes already on them, if possible.
    fun void IncrementCtr()
    {
        ctr;
        0 =&gt; int i;
        for( i; i&lt;14; i++)
        {
            if ( holds[chans[(ctr+i) % 14]] == 0.0)
            {    (ctr + i) % 14 =&gt; ctr; return; }
        }
        (ctr + 1) % 14 =&gt; ctr;
    }
   
    // NoteOff
    // input: pitch &amp; note-off velocity
    // action: finds the pitch &amp; offs it.
    fun void NoteOff(float nn, int velocity)
    {
        0 =&gt; int c;
        for(c; c&lt;16; c++)
        {
            if(holds[c] == nn) // we found the pitch!
            {
                128 + c =&gt; outmsg.data1;
                Math.floor(nn) $ int =&gt; outmsg.data2;
                velocity =&gt; outmsg.data3;
                mouse.send(outmsg);
                //&lt;&lt;&lt; "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3&gt;&gt;&gt;;
                0.0 =&gt; holds[c];
                return;
            }
        }
        &lt;&lt;&lt;"MISS", nn&gt;&gt;&gt;;
        // we couldn't find the pitch!
        // don't do anything.           
    }
   
    fun void ControlChange(int channel, int prognum, int val)
    {
        128 + channel =&gt; outmsg.data1;
        prognum =&gt; outmsg.data2;
        val =&gt; outmsg.data3;
    }
   
}
}


&lt;span class="s1"&gt;class&lt;/span&gt; MidiTransform
class MidiTransform
{
{
// superclass for MIDI transformers to be used by MicroRobinMidiIO
    // superclass for MIDI transformers to be used by MicroRobinMidiIO
MicroRobinMidiIO myIO;
    MicroRobinMidiIO myIO;
&lt;span class="s1"&gt;fun void&lt;/span&gt; LinkToIO(MicroRobinMidiIO io)
    fun void LinkToIO(MicroRobinMidiIO io)
{
    {
io @=&gt; myIO;
        io @=&gt; myIO;
}
    }
&lt;span class="s1"&gt;fun void&lt;/span&gt; NoteOn( &lt;span class="s1"&gt;int&lt;/span&gt; nn, &lt;span class="s1"&gt;int&lt;/span&gt; vel)
    fun void NoteOn( int nn, int vel)
{
    {
&lt;span class="s1"&gt;return&lt;/span&gt;;
        return;
}
    }
&lt;span class="s1"&gt;fun void&lt;/span&gt; NoteOff( &lt;span class="s1"&gt;int&lt;/span&gt; nn, &lt;span class="s1"&gt;int&lt;/span&gt; vel)
    fun void NoteOff( int nn, int vel)
{
    {
&lt;span class="s1"&gt;return&lt;/span&gt;;
        return;
}
    }
}
}


&lt;span class="s1"&gt;class&lt;/span&gt; SuperparticularSamchillian &lt;span class="s1"&gt;extends&lt;/span&gt; MidiTransform
class SuperparticularSamchillian extends MidiTransform
{
&lt;span class="s2"&gt;57&lt;/span&gt;. =&gt; &lt;span class="s1"&gt;float&lt;/span&gt; resentFreq;
&lt;span class="s2"&gt;57&lt;/span&gt;. =&gt; &lt;span class="s1"&gt;float&lt;/span&gt; prevFreq;
&lt;span class="s2"&gt;62&lt;/span&gt; =&gt; &lt;span class="s1"&gt;int&lt;/span&gt; keyboardCenterNN;
&lt;span class="s1"&gt;float&lt;/span&gt; prevFreqsByKey[&lt;span class="s2"&gt;128&lt;/span&gt;];
//set pans funky
//for(0=&gt;int f; f&lt;16; f++)
&lt;span class="s5"&gt;//{&lt;/span&gt;
// myIO.ControlChange(f, 9, f*8);
&lt;span class="s5"&gt;//}&lt;/span&gt;
&lt;span class="s1"&gt;fun void&lt;/span&gt; NoteOn( &lt;span class="s1"&gt;int&lt;/span&gt; nn, &lt;span class="s1"&gt;int&lt;/span&gt; vel)
{
&lt;span class="s1"&gt;if&lt;/span&gt;(nn == keyboardCenterNN)
{
myIO.NoteOn( Std.ftom(prevFreq), vel);
}
&lt;span class="s1"&gt;else&lt;/span&gt;
{
&lt;span class="s1"&gt;if&lt;/span&gt;(nn &lt; keyboardCenterNN)
{
// superparticular!
&lt;span class="s2"&gt;1&lt;/span&gt;. + &lt;span class="s2"&gt;1&lt;/span&gt;./(keyboardCenterNN - nn) /=&gt; prevFreq;
myIO.NoteOn( Std.ftom(prevFreq), vel);
}
&lt;span class="s1"&gt;else&lt;/span&gt;
{
&lt;span class="s1"&gt;if&lt;/span&gt;(nn &gt; keyboardCenterNN)
{
{
&lt;span class="s2"&gt;1&lt;/span&gt;. + &lt;span class="s2"&gt;1&lt;/span&gt;./(nn - keyboardCenterNN) *=&gt; prevFreq;
    57. =&gt; float resentFreq;
myIO.NoteOn( Std.ftom(prevFreq), vel);
    57. =&gt; float prevFreq; 
}
   
}
    62 =&gt; int keyboardCenterNN;
}
   
Std.ftom(prevFreq) =&gt; prevFreqsByKey[nn];
    float prevFreqsByKey[128];
}
     
&lt;span class="s1"&gt;fun void&lt;/span&gt; NoteOff( &lt;span class="s1"&gt;int&lt;/span&gt; nn, &lt;span class="s1"&gt;int&lt;/span&gt; vel)
    //set pans funky
{
    //for(0=&gt;int f; f&lt;16; f++)
myIO.NoteOff( prevFreqsByKey[nn], vel);
    //{
}
    //    myIO.ControlChange(f, 9, f*8);
    //}
   
    fun void NoteOn( int nn, int vel)
    {
        if(nn == keyboardCenterNN)
        {
            myIO.NoteOn( Std.ftom(prevFreq), vel);
        }
        else
        {
            if(nn &lt; keyboardCenterNN)
            {
                // superparticular!
                1. + 1./(keyboardCenterNN - nn) /=&gt; prevFreq;
                myIO.NoteOn( Std.ftom(prevFreq), vel);
            }
            else
            {
                if(nn &gt; keyboardCenterNN)
                {
                    1. + 1./(nn - keyboardCenterNN) *=&gt; prevFreq;
                    myIO.NoteOn( Std.ftom(prevFreq), vel);
                }
            }
        }
        Std.ftom(prevFreq) =&gt; prevFreqsByKey[nn];
    }
           
       
    fun void NoteOff( int nn, int vel)
    {
        myIO.NoteOff( prevFreqsByKey[nn], vel);
    }
   
}
}


Line 241: Line 266:
SuperparticularSamchillian easy;
SuperparticularSamchillian easy;
easy.LinkToIO(mrmio);
easy.LinkToIO(mrmio);
&lt;span class="s1"&gt;spork&lt;/span&gt; ~ mrmio.StartRelay( &lt;span class="s2"&gt;1&lt;/span&gt;, easy);
spork ~ mrmio.StartRelay( 1, easy);


&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="s3"&gt;::&lt;/span&gt;second&lt;span class="s3"&gt; =&gt; &lt;/span&gt;now&lt;span class="s3"&gt;;&lt;/span&gt;
1::second =&gt; now;


KBHit kb;  
KBHit kb;  


while&lt;span class="s3"&gt;(&lt;/span&gt;true&lt;span class="s3"&gt;)&lt;/span&gt;
while(true)
{
{
kb =&gt; &lt;span class="s1"&gt;now&lt;/span&gt;;
    kb =&gt; now;
&lt;span class="s1"&gt;while&lt;/span&gt;( kb.more() )
   
{
    while( kb.more() )
kb.getchar() =&gt; &lt;span class="s1"&gt;int&lt;/span&gt; c;
    {
&lt;&lt;&lt; &lt;span class="s4"&gt;"ascii:"&lt;/span&gt;, c&gt;&gt;&gt;;
        kb.getchar() =&gt; int c;
easy.NoteOn(c, &lt;span class="s2"&gt;88&lt;/span&gt;);
        &lt;&lt;&lt; "ascii:", c&gt;&gt;&gt;;
        easy.NoteOn(c, 88);
    }
}
}
}</pre></div>
 
[[code]]</pre></div>
<h4>Original HTML content:</h4>
<h4>Original HTML 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;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;span class="s1"&gt;&lt;em&gt; ChucK code for Superparticular Samchillian&lt;/span&gt;&lt;br /&gt;
<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:
&lt;span class="s1"&gt;&lt;/em&gt; Samchillian idea by Leon Gruenbaum&lt;/span&gt;&lt;br /&gt;
&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;span class="s1"&gt;&lt;em&gt; superparticular-ratio implementation by Jacob Barton&lt;/span&gt