<br><br><div><span class="gmail_quote">On 9/19/07, <b class="gmail_sendername">Scott Wheeler</b> <<a href="mailto:wheeler@kde.org">wheeler@kde.org</a>> 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: One thing that I've noticed in a couple of places is that<br>sometimes sporking doesn't do what I would expect it to. For instance,<br>if I change line 223 to "spork ~ node.item.set(value);" to make it
<br>non-blocking the program doesn't work. I don't see why.</blockquote><div><br><br><br>I'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> I don't see why that would affect matters either, this is in reference to the "set" 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's namespace but this wouldn'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's namespace that should yield a complaint. Strange.
<br><br>:¬)<br><br>Cheers,<br>Kas.<br> </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 => codes["NoteOn"];<br>128 => codes["NoteOff"];<br>176 => codes["ControlChange"];<br><br>class MidiMessage<br>{<br> int id;<br><br> fun int[] data()<br> {<br> return [ 0, 0 ];
<br> }<br>}<br><br>class NoteMessage extends MidiMessage<br>{<br> int pitch;<br> int velocity;<br><br> fun int[] data()<br> {<br> return [ pitch, velocity ];<br> }<br>}<br><br>class NoteOnMessage extends NoteMessage
<br>{<br> codes["NoteOn"] => id;<br> 100 => velocity;<br>}<br><br>class NoteOffMessage extends NoteMessage<br>{<br> codes["NoteOff"] => id;<br> 0 => velocity;<br>}<br><br>class ControlChangeMessage extends MidiMessage
<br>{<br> codes["ControlChange"] => id;<br> 8 => int control;<br> 127 => int value;<br><br> fun int [] data()<br> {<br> return [ control, value ];<br> }<br>}<br><br>class MidiHandler
<br>{<br> // Members<br><br> MidiIn input;<br> MidiOut output;<br><br> 0 => int inputDevice;<br> 0 => int outputDevice;<br><br> // Constructor<br><br> if(!input.open(inputDevice))<br> {<br> <<< "Could not open MIDI input device." >>>;
<br> me.exit();<br> }<br><br> if(!output.open(outputDevice))<br> {<br> <<< "Could not open MIDI output device." >>>;<br> me.exit();<br> }<br><br> fun void send(MidiMessage message)
<br> {<br> message.data() @=> int data[];<br><br> if(data.cap() == 2)<br> {<br> MidiMsg out;<br><br> <a href="http://message.id">message.id</a> => out.data1;<br> data[0] =>
out.data2;<br> data[1] => out.data3;<br><br> output.send(out);<br> }<br> else<br> {<br> <<< "Invalid data() for MidiMessage." >>>;<br> }
<br> }<br><br> fun void run()<br> {<br> // Now handle incoming events.<br><br> MidiMsg message;<br><br> while(true)<br> {<br> input => now;<br><br> while(input.recv
(message))<br> {<br> message.data1 => int code;<br><br> if(code == codes["NoteOn"])<br> {<br> spork ~ noteOn(message.data2, message.data3
);<br> }<br> else if(code == codes["NoteOff"])<br> {<br> spork ~ noteOff(message.data2, message.data3);<br> }<br> else if(code == codes["ControlChange"])
<br> {<br> spork ~ controlChange(message.data2, message.data3);<br> }<br> else<br> {<br> <<< "Unhandled MIDI Message: ",
message.data1, message.data2, message.data3 >>>;<br> }<br> }<br> }<br> }<br><br> fun void noteOn(int pitch, int velocity)<br> {<br> <<< "Note On: ", pitch, velocity >>>;
<br> }<br><br> fun void noteOff(int pitch, int velocity)<br> {<br> <<< "Note Off: ", pitch, velocity >>>;<br> }<br><br> fun void controlChange(int control, int value)<br> {
<br> <<< "Control Change: ", control, value >>>;<br> }<br>}<br><br>class Control<br>{<br> -1 => int cc;<br><br> ControlDispatcher.register(this);<br><br> fun void set(int value)
<br> {<br> <<< "Control Changed: ", cc, ", ", value >>>;<br> }<br>}<br><br>class ControlEvent extends Event<br>{<br> int control;<br> int value;<br>}<br><br>class EventControl extends Control
<br>{<br> ControlEvent changed;<br><br> fun void set(int value)<br> {<br> cc => changed.control;<br> value => changed.value;<br> changed.broadcast();<br> }<br>}<br><br>class ControlNode
<br>{<br> ControlNode @ next;<br> Control @ item;<br>}<br><br>class ControlList<br>{<br> static ControlNode @ first;<br> static ControlNode @ last;<br><br> fun void append(Control control)<br> {<br> if(first == null)
<br> {<br> new ControlNode @=> first;<br> first @=> last;<br> control @=> first.item;<br> }<br> else<br> {<br> new ControlNode @=> last.next
;<br> last.next @=> last;<br> control @=> last.item;<br> }<br> }<br>}<br><br>class ControlDispatcher extends MidiHandler<br>{<br> static ControlList @ controls;<br><br> fun void controlChange(int control, int value)
<br> {<br> if(controls == null)<br> {<br> return;<br> }<br><br> controls.first @=> ControlNode @ node;<br><br> while(node != null)<br> {<br> if(<a href="http://node.item.cc">
node.item.cc</a> == control)<br> {<br> node.item.set(value);<br> }<br> node.next @=> node;<br> }<br> }<br><br> fun static void register(Control control)<br> {
<br> if(controls == null)<br> {<br> new ControlList @=> controls;<br> }<br><br> controls.append(control);<br> }<br>}<br><br>ControlDispatcher controller;<br><br>// Two demos here: one with subclassing, one with events:
<br><br>class FooControl extends Control<br>{<br> 1 => cc;<br><br> fun void set(int value)<br> {<br> <<< "Foo: ", value >>>;<br> }<br>}<br><br>FooControl foo;<br><br>// And now with events.
<br><br>EventControl bar;<br>2 => bar.cc;<br><br>fun void listener()<br>{<br> while(true)<br> {<br> bar.changed => now;<br> <<< "Bar: ", bar.changed.value >>>;<br> }
<br>}<br><br>spork ~ listener();<br><br>// And now let's create some fake hardware controls to test things.<br><br>fun void fakeKnob()<br>{<br> ControlChangeMessage message;<br><br> 1 => message.control;<br><br>
for(0 => int i; i < 10; i++)<br> {<br> i => message.value;<br> controller.send(message);<br> 10::ms => now;<br> }<br>}<br><br>fun void fakeButton()<br>{<br> ControlChangeMessage message;
<br><br> 2 => message.control;<br> 127 => message.value;<br><br> 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>