That would be great I think. Did you look at it more closely? What synthesizer will it use on the XO - AFAIK there is no HW synth? Can it be made to use the CSound synthesizer?
- Bert -
On Mar 12, 2007, at 10:02 , Diego Gomez Deck wrote:
Folks,
May be we can include this at OLPC.
Cheers,
-- Diego
--------- Mensaje reenviado --------
De: Florian Hars florian@hars.de Responder a: The general-purpose Squeak developers list squeak-dev@lists.squeakfoundation.org Para: squeak-dev@lists.squeakfoundation.org Asunto: Squeak MIDI output with Linux / ALSA Fecha: Sun, 11 Mar 2007 20:33:34 +0100
I spent the sunday reading some ALSA documentation and produced a replacement for sqUnixMIDI.c (which I compiled into Squeak by hacking the generated Makefiles, yuck), which compiles, and the three or so functions Scratch uses actually do something useful (I ignored MIDI input, the drumkit and other things). Maybe somebody with a better (read: any) understanding of the squeak internals can use this as a basis to create something that actually works and is integrated into the build environment.
Some observations that should be adressed in a final version:
midiInit is only ever called when a note is played. So the MIDI output port will only come into existence when the first note has been sent, and only then can you connect the port to the input port of a sythesizer. This connection will be destroyed if you stop the script in Scratch (in sqMIDIClosePort), so you have to reconnect before starting the next script. There *must* be something better than that.
There is a slight mismatch between Squeaks sqMIDIGetPortCount and the ability to create as many ports as you want in ALSA.
The ALSA sequencer can schedule events, but the return type of snd_seq_queue_status_get_tick_time is (typedefed to) unsigned int, so I do not know if the assumption "The MIDI clock is assumed to wrap at or before half the maximum positive SmallInteger value. This allows events to be scheduled into the future without overflowing into LargePositiveIntegers." holds. As far as I understand the ALSA documentation, the client shouldn't make these assumtion at all and refrain from guessing at future clock values: "As each sequencer queue has it's own clock the only way to deliver events at the right time is by using the relative timestamp format. When the event arrives at the queue it is normalised to absolute format." (http://www.alsa-project.org/alsa-doc/alsa-lib/seq.html) My code is probably broken in this regard (Scratch produces only immediate events).
If you route the Squeak MIDI output to a sequencer that outputs to jack, Squeak may no longer be able to open the normal ALSA audio device, so you should either use a synth that does not require jack like timidity -iA - oS, or implement jack output for Squeak. The latter could be difficult, the former has the disadvantage of high latency (at least on my machine I have a noticable delay if I send events from an external keyboard to timidity).
Yours, Florian Hars.
PS: http://www.squeakvm.org/unix/ mentions something like "svn export http://squeakvm.org/svn/squeak/tags/unix-3.9-8", but that doesn't exist, there is no tag past unix-3.9-4 there.