Superparticular samchillian: Difference between revisions
Jump to navigation
Jump to search
Wikispaces>xenjacob **Imported revision 343680102 - Original comment: ** |
Wikispaces>FREEZE No edit summary |
||
Line 1: | Line 1: | ||
<pre> <span style="">//ChucK code for Superparticular Samchillian</span><span style="">//Samchillian idea by Leon Gruenbaum</ | |||
Revision as of 00:00, 17 July 2018
<span style="">//ChucK code for Superparticular Samchillian</span><span style="">//Samchillian idea by Leon Gruenbaum</span><span style="">//superparticular-ratio implementation by Jacob Barton</span> <span style="">//paste these lines into a new document in miniAudicle, or save text as a .ck to run in command-line</span> <span style="">//change these to match your input/output device</span><span style="">0</span> <span style="">=></span> <span style="">int</span> inDeviceNum<span style="">;</span><span style="">1</span> <span style="">=></span> <span style="">int</span> outDeviceNum<span style="">;</span> <span style="">class</span> MicroRobinMidiIO<span style="">{</span> MidiIn min<span style="">;</span> MidiOut mouse<span style="">;</span> MidiMsg inmsg, outmsg<span style="">;</span> <span style="">0</span> <span style="">=></span> <span style="">int</span> ctr<span style="">;</span> <span style="">//int rr[128][3]; don't think we need this now.</span> <span style="">// index = note number?</span> <span style="">// column 0 = channel sent to</span> <span style="">// column 1 = note number sent</span> <span style="">int</span> chans<span style="">[</span><span style="">14</span><span style="">]</span><span style="">;</span> <span style="">// list of channels used</span> <span style="">float</span> holds<span style="">[</span><span style="">16</span><span style="">]</span><span style="">;</span> <span style="">// pitches of on notes, zero if off.</span> <span style="">[</span><span style="">0</span>,<span style="">1</span>,<span style="">2</span>,<span style="">3</span>,<span style="">4</span>,<span style="">5</span>,<span style="">6</span>,<span style="">7</span>,<span style="">8</span>,<span style="">10</span>,<span style="">11</span>,<span style="">12</span>,<span style="">13</span>,<span style="">14</span><span style="">]</span> @<span style="">=></span> chans<span style="">;</span> <span style="">//exclude channel 10 (drums) & 16 (send channel)</span> <span style="">//microtuning stuff</span> <span style="">// PitchBend</span> <span style="">// input: pitch (midi note number float) & velocity of desired note</span> <span style="">// action: sends appropriate pitchbend message</span> <span style="">// (assuming pitchbend range = +/- 2 semitones)</span> <span style="">// output: note number required for correct frequency to be realized</span> <span style="">// sends pitchbend, assuming +/- wholestep pitchbend range</span> <span style="">// returns note number required for correct frequency</span> fun <span style="">int</span> PitchBend<span style="">(</span><span style="">float</span> pitch, <span style="">int</span> velocity<span style="">)</span> <span style="">{</span> <span style="">//send pitchbend</span> <span style="">224</span> <span style="">+</span> chans<span style="">[</span>ctr<span style="">]</span> <span style="">=></span> outmsg.<span style="">data1</span><span style="">;</span> <span style="">0</span> <span style="">=></span> outmsg.<span style="">data2</span><span style="">;</span> <span style="">Math</span>.<span style="">round</span><span style="">(</span><span style="">(</span>pitch <span style="">%</span> <span style="">1.0</span><span style="">)</span> <span style="">*</span> <span style="">32.0</span> <span style="">+</span> <span style="">64.0</span><span style="">)</span> $ <span style="">int</span> <span style="">=></span> outmsg.<span style="">data3</span><span style="">;</span> mouse.<span style="">send</span><span style="">(</span>outmsg<span style="">)</span><span style="">;</span> <span style="">return</span> <span style="">Math</span>.<span style="">floor</span><span style="">(</span>pitch<span style="">)</span> $ <span style="">int</span><span style="">;</span> <span style="">}</span> <span style="">// StartRelay</span> <span style="">// input: number of MIDI device, MidiTransform to be used</span> <span style="">// creates a loop ~ should be sporked</span> fun <span style="">void</span> StartRelay<span style="">(</span><span style="">int</span> deviceNum, MidiTransform mt<span style="">)</span> <span style="">{</span> <span style="">if</span><span style="">(</span> <span style="">!</span>min.<span style="">open</span><span style="">(</span>inDeviceNum<span style="">)</span><span style="">)</span> me.<span style="">exit</span><span style="">(</span><span style="">)</span><span style="">;</span> <span style="">if</span><span style="">(</span> <span style="">!</span>mouse.<span style="">open</span><span style="">(</span>outDeviceNum<span style="">)</span><span style="">)</span> me.<span style="">exit</span><span style="">(</span><span style="">)</span><span style="">;</span> <span style="">// print out device that was opened</span> <span style=""><<<</span> min.<span style="">num</span><span style="">(</span><span style="">)</span>, <span style="">" -> "</span>, min.<span style="">name</span><span style="">(</span><span style="">)</span> <span style="">>>>;</span> <span style=""><<<</span> mouse.<span style="">num</span><span style="">(</span><span style="">)</span>, <span style="">" -> "</span>, mouse.<span style="">name</span><span style="">(</span><span style="">)</span> <span style="">>>>;</span> <span style="">while</span> <span style="">(</span> <span style="">true</span><span style="">)</span> <span style="">{</span> min <span style="">=></span> now<span style="">;</span> <span style="">while</span><span style="">(</span> min.<span style="">recv</span><span style="">(</span>inmsg<span style="">)</span><span style="">)</span> <span style="">{</span> <span style="">if</span><span style="">(</span> inmsg.<span style="">data1</span> <span style="">%</span> <span style="">16</span> <span style="">==</span> <span style="">0</span><span style="">)</span> <span style="">// only receive on channel 1</span> <span style="">{</span> <span style=""><<<</span> <span style="">"r "</span>, inmsg.<span style="">data1</span> <span style="">/</span> <span style="">16</span>, inmsg.<span style="">data1</span> <span style="">%</span> <span style="">16</span>, inmsg.<span style="">data2</span>, inmsg.<span style="">data3</span><span style="">>>>;</span> <span style="">if</span><span style="">(</span> inmsg.<span style="">data1</span> <span style="">/</span> <span style="">16</span> <span style="">==</span> <span style="">9</span><span style="">)</span> <span style="">{</span> mt.<span style="">NoteOn</span><span style="">(</span>inmsg.<span style="">data2</span>, inmsg.<span style="">data3</span><span style="">)</span><span style="">;</span> <span style="">}</span> <span style="">if</span><span style="">(</span> inmsg.<span style="">data1</span> <span style="">/</span> <span style="">16</span> <span style="">==</span> <span style="">8</span><span style="">)</span> <span style="">{</span> mt.<span style="">NoteOff</span><span style="">(</span>inmsg.<span style="">data2</span>, inmsg.<span style="">data3</span><span style="">)</span><span style="">;</span> <span style="">}</span> <span style="">if</span><span style="">(</span> inmsg.<span style="">data1</span> <span style="">/</span> <span style="">16</span> <span style="">==</span> <span style="">12</span><span style="">)</span> <span style="">{</span> <span style="">//prog change apply to channels 1-16</span> <span style="">//works!</span> inmsg.<span style="">data1</span> <span style="">-</span> <span style="">(</span>inmsg.<span style="">data1</span> <span style="">%</span> <span style="">16</span><span style="">)</span> <span style="">=></span> <span style="">int</span> base<span style="">;</span> <span style="">for</span><span style="">(</span><span style="">0</span><span style="">=></span><span style="">int</span> i<span style="">;</span> i<span style=""><</span><span style="">15</span><span style="">;</span> i<span style="">++</span><span style="">)</span> <span style="">{</span> base <span style="">+</span> chans<span style="">[</span>i<span style="">]</span> <span style="">=></span> outmsg.<span style="">data1</span><span style="">;</span> inmsg.<span style="">data2</span> <span style="">=></span> outmsg.<span style="">data2</span><span style="">;</span> i<span style="">++;</span> <span style="">if</span><span style="">(</span> i <span style="">==</span> <span style="">15</span><span style="">)</span> <span style="">{</span> <span style="">0</span> <span style="">=></span> outmsg.<span style="">data3</span><span style="">;</span> mouse.<span style="">send</span><span style="">(</span>outmsg<span style="">)</span><span style="">;</span> <span style="">break</span><span style="">;</span> <span style="">}</span> base <span style="">+</span> chans<span style="">[</span>i<span style="">]</span> <span style="">=></span> outmsg.<span style="">data3</span><span style="">;</span> mouse.<span style="">send</span><span style="">(</span>outmsg<span style="">)</span><span style="">;</span> inmsg.<span style="">data2</span> <span style="">=></span> outmsg.<span style="">data1</span><span style="">;</span> i<span style="">++;</span> <span style="">if</span><span style="">(</span> i <span style="">==</span> <span style="">15</span><span style="">)</span> <span style="">{</span> <span style="">0</span> <span style="">=></span> outmsg.<span style="">data2</span> <span style="">=></span> outmsg.<span style="">data3</span><span style="">;</span> mouse.<span style="">send</span><span style="">(</span>outmsg<span style="">)</span><span style="">;</span> <span style="">break</span><span style="">;</span> <span style="">}</span> base <span style="">+</span> chans<span style="">[</span>i<span style="">]</span> <span style="">=></span> outmsg.<span style="">data2</span><span style="">;</span> inmsg.<span style="">data2</span> <span style="">=></span> outmsg.<span style="">data3</span><span style="">;</span> mouse.<span style="">send</span><span style="">(</span>outmsg<span style="">)</span><span style="">;</span> <span style="">}</span> <span style="">}</span> <span style="">if</span><span style="">(</span> inmsg.<span style="">data1</span> <span style="">/</span> <span style="">16</span> <span style="">==</span> <span style="">11</span><span style="">)</span> <span style="">{</span> <span style="">//apply any controller data to channels 1-16</span> inmsg.<span style="">data1</span> <span style="">-</span> <span style="">(</span>inmsg.<span style="">data1</span> <span style="">%</span> <span style="">16</span><span style="">)</span> <span style="">=></span> <span style="">int</span> base<span style="">;</span> inmsg.<span style="">data2</span> <span style="">=></span> outmsg.<span style="">data2</span><span style="">;</span> inmsg.<span style="">data3</span> <span style="">=></span> outmsg.<span style="">data3</span><span style="">;</span> <span style="">for</span><span style="">(</span><span style="">0</span><span style="">=></span><span style="">int</span> i<span style="">;</span> i<span style=""><</span><span style="">16</span><span style="">;</span> i<span style="">++</span><span style="">)</span> <span style="">{</span> base <span style="">+</span> i <span style="">=></span> outmsg.<span style="">data1</span><span style="">;</span> mouse.<span style="">send</span><span style="">(</span>outmsg<span style="">)</span><span style="">;</span> <span style="">}</span> <span style="">}</span> <span style="">}</span> <span style="">}</span> <span style="">}</span> <span style="">}</span> <span style="">// NoteOn</span> <span style="">// input: pitch in midi note-number extended, velocity</span> <span style="">// action: sends a MIDI pitchbend + note-on message to mouse on the current channel</span> <span style="">// keeping track of holds</span> fun <span style="">void</span> NoteOn<span style="">(</span><span style="">float</span> nn, <span style="">int</span> velocity<span style="">)</span> <span style="">{</span> IncrementCtr<span style="">(</span><span style="">)</span><span style="">;</span> nn <span style="">=></span> holds<span style="">[</span>chans<span style="">[</span>ctr<span style="">%</span>14<span style="">]</span><span style="">]</span><span style="">;</span> PitchBend<span style="">(</span>nn, velocity<span style="">)</span> <span style="">=></span> outmsg.<span style="">data2</span><span style="">;</span> <span style="">// note on, right channel</span> <span style="">144</span> <span style="">+</span> chans<span style="">[</span>ctr<span style="">%</span>14<span style="">]</span> <span style="">=></span> outmsg.<span style="">data1</span><span style="">;</span> velocity <span style="">=></span> outmsg.<span style="">data3</span><span style="">;</span> mouse.<span style="">send</span><span style="">(</span>outmsg<span style="">)</span><span style="">;</span> <span style="">//<<< "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3>>>;</span> <span style="">}</span> <span style="">// increments mod-14 counter, skipping over channels with</span> <span style="">// notes already on them, if possible.</span> fun <span style="">void</span> IncrementCtr<span style="">(</span><span style="">)</span> <span style="">{</span> ctr<span style="">;</span> <span style="">0</span> <span style="">=></span> <span style="">int</span> i<span style="">;</span> <span style="">for</span><span style="">(</span> i<span style="">;</span> i<span style=""><</span><span style="">14</span><span style="">;</span> i<span style="">++</span><span style="">)</span> <span style="">{</span> <span style="">if</span> <span style="">(</span> holds<span style="">[</span>chans<span style="">[</span><span style="">(</span>ctr<span style="">+</span>i<span style="">)</span> <span style="">%</span> <span style="">14</span><span style="">]</span><span style="">]</span> <span style="">==</span> <span style="">0.0</span><span style="">)</span> <span style="">{</span> <span style="">(</span>ctr <span style="">+</span> i<span style="">)</span> <span style="">%</span> <span style="">14</span> <span style="">=></span> ctr<span style="">;</span> <span style="">return</span><span style="">;</span> <span style="">}</span> <span style="">}</span> <span style="">(</span>ctr <span style="">+</span> <span style="">1</span><span style="">)</span> <span style="">%</span> <span style="">14</span> <span style="">=></span> ctr<span style="">;</span> <span style="">}</span> <span style="">// NoteOff</span> <span style="">// input: pitch & note-off velocity</span> <span style="">// action: finds the pitch & offs it.</span> fun <span style="">void</span> NoteOff<span style="">(</span><span style="">float</span> nn, <span style="">int</span> velocity<span style="">)</span> <span style="">{</span> <span style="">0</span> <span style="">=></span> <span style="">int</span> c<span style="">;</span> <span style="">for</span><span style="">(</span>c<span style="">;</span> c<span style=""><</span><span style="">16</span><span style="">;</span> c<span style="">++</span><span style="">)</span> <span style="">{</span> <span style="">if</span><span style="">(</span>holds<span style="">[</span>c<span style="">]</span> <span style="">==</span> nn<span style="">)</span> <span style="">// we found the pitch!</span> <span style="">{</span> <span style="">128</span> <span style="">+</span> c <span style="">=></span> outmsg.<span style="">data1</span><span style="">;</span> <span style="">Math</span>.<span style="">floor</span><span style="">(</span>nn<span style="">)</span> $ <span style="">int</span> <span style="">=></span> outmsg.<span style="">data2</span><span style="">;</span> velocity <span style="">=></span> outmsg.<span style="">data3</span><span style="">;</span> mouse.<span style="">send</span><span style="">(</span>outmsg<span style="">)</span><span style="">;</span> <span style="">//<<< "s ", outmsg.data1 / 16, outmsg.data1 % 16, outmsg.data2, outmsg.data3>>>;</span> <span style="">0.0</span> <span style="">=></span> holds<span style="">[</span>c<span style="">]</span><span style="">;</span> <span style="">return</span><span style="">;</span> <span style="">}</span> <span style="">}</span> <span style=""><<<</span><span style="">"MISS"</span>, nn<span style="">>>>;</span> <span style="">// we couldn't find the pitch!</span> <span style="">// don't do anything. </span> <span style="">}</span> fun <span style="">void</span> ControlChange<span style="">(</span><span style="">int</span> channel, <span style="">int</span> prognum, <span style="">int</span> val<span style="">)</span> <span style="">{</span> <span style="">128</span> <span style="">+</span> channel <span style="">=></span> outmsg.<span style="">data1</span><span style="">;</span> prognum <span style="">=></span> outmsg.<span style="">data2</span><span style="">;</span> val <span style="">=></span> outmsg.<span style="">data3</span><span style="">;</span> <span style="">}</span> <span style="">}</span> <span style="">class</span> MidiTransform<span style="">{</span> <span style="">// superclass for MIDI transformers to be used by MicroRobinMidiIO</span> MicroRobinMidiIO myIO<span style="">;</span> fun <span style="">void</span> LinkToIO<span style="">(</span>MicroRobinMidiIO io<span style="">)</span> <span style="">{</span> io @<span style="">=></span> myIO<span style="">;</span> <span style="">}</span> fun <span style="">void</span> NoteOn<span style="">(</span> <span style="">int</span> nn, <span style="">int</span> vel<span style="">)</span> <span style="">{</span> <span style="">return</span><span style="">;</span> <span style="">}</span> fun <span style="">void</span> NoteOff<span style="">(</span> <span style="">int</span> nn, <span style="">int</span> vel<span style="">)</span> <span style="">{</span> <span style="">return</span><span style="">;</span> <span style="">}</span><span style="">}</span> <span style="">class</span> SuperparticularSamchillian <span style="">extends</span> MidiTransform<span style="">{</span> <span style="">57</span>. <span style="">=></span> <span style="">float</span> resentFreq<span style="">;</span> <span style="">57</span>. <span style="">=></span> <span style="">float</span> prevFreq<span style="">;</span> <span style="">62</span> <span style="">=></span> <span style="">int</span> keyboardCenterNN<span style="">;</span> <span style="">float</span> prevFreqsByKey<span style="">[</span><span style="">128</span><span style="">]</span><span style="">;</span> <span style="">//set pans funky</span> <span style="">//for(0=>int f; f<16; f++)</span> <span style="">//{</span> <span style="">// myIO.ControlChange(f, 9, f*8);</span> <span style="">//}</span> fun <span style="">void</span> NoteOn<span style="">(</span> <span style="">int</span> nn, <span style="">int</span> vel<span style="">)</span> <span style="">{</span> <span style="">if</span><span style="">(</span>nn <span style="">==</span> keyboardCenterNN<span style="">)</span> <span style="">{</span> myIO.<span style="">NoteOn</span><span style="">(</span> Std.<span style="">ftom</span><span style="">(</span>prevFreq<span style="">)</span>, vel<span style="">)</span><span style="">;</span> <span style="">}</span> <span style="">else</span> <span style="">{</span> <span style="">if</span><span style="">(</span>nn <span style=""><</span> keyboardCenterNN<span style="">)</span> <span style="">{</span> <span style="">// superparticular!</span> <span style="">1</span>. <span style="">+</span> <span style="">1</span>.<span style="">/</span><span style="">(</span>keyboardCenterNN <span style="">-</span> nn<span style="">)</span> <span style="">/=></span> prevFreq<span style="">;</span> myIO.<span style="">NoteOn</span><span style="">(</span> Std.<span style="">ftom</span><span style="">(</span>prevFreq<span style="">)</span>, vel<span style="">)</span><span style="">;</span> <span style="">}</span> <span style="">else</span> <span style="">{</span> <span style="">if</span><span style="">(</span>nn <span style="">></span> keyboardCenterNN<span style="">)</span> <span style="">{</span> <span style="">1</span>. <span style="">+</span> <span style="">1</span>.<span style="">/</span><span style="">(</span>nn <span style="">-</span> keyboardCenterNN<span style="">)</span> <span style="">*=></span> prevFreq<span style="">;</span> myIO.<span style="">NoteOn</span><span style="">(</span> Std.<span style="">ftom</span><span style="">(</span>prevFreq<span style="">)</span>, vel<span style="">)</span><span style="">;</span> <span style="">}</span> <span style="">}</span> <span style="">}</span> Std.<span style="">ftom</span><span style="">(</span>prevFreq<span style="">)</span> <span style="">=></span> prevFreqsByKey<span style="">[</span>nn<span style="">]</span><span style="">;</span> <span style="">}</span> fun <span style="">void</span> NoteOff<span style="">(</span> <span style="">int</span> nn, <span style="">int</span> vel<span style="">)</span> <span style="">{</span> myIO.<span style="">NoteOff</span><span style="">(</span> prevFreqsByKey<span style="">[</span>nn<span style="">]</span>, vel<span style="">)</span><span style="">;</span> <span style="">}</span> <span style="">}</span> MicroRobinMidiIO mrmio<span style="">;</span>SuperparticularSamchillian easy<span style="">;</span>easy.<span style="">LinkToIO</span><span style="">(</span>mrmio<span style="">)</span><span style="">;</span>spork ~ mrmio.<span style="">StartRelay</span><span style="">(</span> <span style="">1</span>, easy<span style="">)</span><span style="">;</span> <span style="">1</span><span style="">::</span>second <span style="">=></span> now<span style="">;</span> KBHit kb<span style="">;</span> <span style="">while</span><span style="">(</span><span style="">true</span><span style="">)</span><span style="">{</span> kb <span style="">=></span> now<span style="">;</span> <span style="">while</span><span style="">(</span> kb.<span style="">more</span><span style="">(</span><span style="">)</span> <span style="">)</span> <span style="">{</span> kb.<span style="">getchar</span><span style="">(</span><span style="">)</span> <span style="">=></span> <span style="">int</span> c<span style="">;</span> <span style=""><<<</span> <span style="">"ascii:"</span>, c<span style="">>>>;</span> easy.<span style="">NoteOn</span><span style="">(</span>c, <span style="">88</span><span style="">)</span><span style="">;</span> <span style="">}</span><span style="">}</span>