<br><br><div><span class="gmail_quote">On 9/19/07, <b class="gmail_sendername">Scott Wheeler</b> &lt;<a href="mailto:wheeler@kde.org">wheeler@kde.org</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>Extra Credit:&nbsp;&nbsp;One thing that I&#39;ve noticed in a couple of places is that<br>sometimes sporking doesn&#39;t do what I would expect it to.&nbsp;&nbsp;For instance,<br>if I change line 223 to &quot;spork ~ node.item.set(value);&quot; to make it
<br>non-blocking the program doesn&#39;t work.&nbsp;&nbsp;I don&#39;t see why.</blockquote><div><br><br><br>I&#39;ll share my thoughts on livecoding practice and so on too, later. I just wanted to say now that bug reports benefit from a bit more exposure then this paragraph got in your mail, hence this rather explicitly topic-changing reply.
<br><br>&nbsp;I don&#39;t see why that would affect matters either, this is in reference to the &quot;set&quot; command that also broadcasts a event, right? The one thing I could think of would be a name space issue. Normally sporked shreds have their parent&#39;s namespace but this wouldn&#39;t be the first time things went a little odd when inside of classes and you certainly have no shortage of those here. Also; if it&#39;s namespace that should yield a complaint. Strange.
<br><br>:¬)<br><br>Cheers,<br>Kas.<br>&nbsp;</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">// MIDI Event IDs<br><br>int codes[0];<br><br>
144 =&gt; codes[&quot;NoteOn&quot;];<br>128 =&gt; codes[&quot;NoteOff&quot;];<br>176 =&gt; codes[&quot;ControlChange&quot;];<br><br>class MidiMessage<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;int id;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun int[] data()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return [ 0, 0 ];
<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>class NoteMessage extends MidiMessage<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;int pitch;<br>&nbsp;&nbsp;&nbsp;&nbsp;int velocity;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun int[] data()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return [ pitch, velocity ];<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>class NoteOnMessage extends NoteMessage
<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;codes[&quot;NoteOn&quot;] =&gt; id;<br>&nbsp;&nbsp;&nbsp;&nbsp;100 =&gt; velocity;<br>}<br><br>class NoteOffMessage extends NoteMessage<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;codes[&quot;NoteOff&quot;] =&gt; id;<br>&nbsp;&nbsp;&nbsp;&nbsp;0 =&gt; velocity;<br>}<br><br>class ControlChangeMessage extends MidiMessage
<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;codes[&quot;ControlChange&quot;] =&gt; id;<br>&nbsp;&nbsp;&nbsp;&nbsp;8 =&gt; int control;<br>&nbsp;&nbsp;&nbsp;&nbsp;127 =&gt; int value;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun int [] data()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return [ control, value ];<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>class MidiHandler
<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;// Members<br><br>&nbsp;&nbsp;&nbsp;&nbsp;MidiIn input;<br>&nbsp;&nbsp;&nbsp;&nbsp;MidiOut output;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;0 =&gt; int inputDevice;<br>&nbsp;&nbsp;&nbsp;&nbsp;0 =&gt; int outputDevice;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;// Constructor<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if(!input.open(inputDevice))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Could not open MIDI input device.&quot; &gt;&gt;&gt;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.exit();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if(!output.open(outputDevice))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Could not open MIDI output device.&quot; &gt;&gt;&gt;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.exit();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void send(MidiMessage message)
<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.data() @=&gt; int data[];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(data.cap() == 2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MidiMsg out;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://message.id">message.id</a> =&gt; out.data1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[0] =&gt; 
out.data2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[1] =&gt; out.data3;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.send(out);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Invalid data() for MidiMessage.&quot; &gt;&gt;&gt;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void run()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Now handle incoming events.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MidiMsg message;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(true)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input =&gt; now;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(input.recv
(message))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.data1 =&gt; int code;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(code == codes[&quot;NoteOn&quot;])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spork ~ noteOn(message.data2, message.data3
);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(code == codes[&quot;NoteOff&quot;])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spork ~ noteOff(message.data2, message.data3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(code == codes[&quot;ControlChange&quot;])
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spork ~ controlChange(message.data2, message.data3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Unhandled MIDI Message: &quot;, 
message.data1, message.data2, message.data3 &gt;&gt;&gt;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void noteOn(int pitch, int velocity)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Note On: &quot;, pitch, velocity &gt;&gt;&gt;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void noteOff(int pitch, int velocity)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Note Off: &quot;, pitch, velocity &gt;&gt;&gt;;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void controlChange(int control, int value)<br>&nbsp;&nbsp;&nbsp;&nbsp;{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Control Change: &quot;, control, value &gt;&gt;&gt;;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>class Control<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;-1 =&gt; int cc;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;ControlDispatcher.register(this);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void set(int value)
<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Control Changed: &quot;, cc, &quot;, &quot;, value &gt;&gt;&gt;;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>class ControlEvent extends Event<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;int control;<br>&nbsp;&nbsp;&nbsp;&nbsp;int value;<br>}<br><br>class EventControl extends Control
<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;ControlEvent changed;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void set(int value)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc =&gt; changed.control;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value =&gt; changed.value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changed.broadcast();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>class ControlNode
<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;ControlNode @ next;<br>&nbsp;&nbsp;&nbsp;&nbsp;Control @ item;<br>}<br><br>class ControlList<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;static ControlNode @ first;<br>&nbsp;&nbsp;&nbsp;&nbsp;static ControlNode @ last;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void append(Control control)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(first == null)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new ControlNode @=&gt; first;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first @=&gt; last;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control @=&gt; first.item;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new ControlNode @=&gt; last.next
;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last.next @=&gt; last;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control @=&gt; last.item;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>class ControlDispatcher extends MidiHandler<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;static ControlList @ controls;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void controlChange(int control, int value)
<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(controls == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controls.first @=&gt; ControlNode @ node;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(node != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(<a href="http://node.item.cc">
node.item.cc</a> == control)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.item.set(value);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.next @=&gt; node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun static void register(Control control)<br>&nbsp;&nbsp;&nbsp;&nbsp;{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(controls == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new ControlList @=&gt; controls;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controls.append(control);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>ControlDispatcher controller;<br><br>// Two demos here:&nbsp;&nbsp;one with subclassing, one with events:
<br><br>class FooControl extends Control<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;1 =&gt; cc;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;fun void set(int value)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Foo: &quot;, value &gt;&gt;&gt;;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>FooControl foo;<br><br>// And now with events.
<br><br>EventControl bar;<br>2 =&gt; bar.cc;<br><br>fun void listener()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;while(true)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bar.changed =&gt; now;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt; &quot;Bar: &quot;, bar.changed.value &gt;&gt;&gt;;<br>&nbsp;&nbsp;&nbsp;&nbsp;}
<br>}<br><br>spork ~ listener();<br><br>// And now let&#39;s create some fake hardware controls to test things.<br><br>fun void fakeKnob()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;ControlChangeMessage message;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;1 =&gt; message.control;<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;for(0 =&gt; int i; i &lt; 10; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i =&gt; message.value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controller.send(message);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10::ms =&gt; now;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>fun void fakeButton()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;ControlChangeMessage message;
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;2 =&gt; message.control;<br>&nbsp;&nbsp;&nbsp;&nbsp;127 =&gt; message.value;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;controller.send(message);<br>}<br><br>spork ~ fakeKnob();<br>spork ~ fakeButton();<br><br>controller.run();<br><br>_______________________________________________
<br>chuck-users mailing list<br><a href="mailto:chuck-users@lists.cs.princeton.edu">chuck-users@lists.cs.princeton.edu</a><br><a href="https://lists.cs.princeton.edu/mailman/listinfo/chuck-users">https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
</a><br><br></blockquote></div><br>