[Etoys] [Fwd: Squeak MIDI output with Linux / ALSA]
Diego Gomez Deck
DiegoGomezDeck at consultar.com
Mon Mar 12 05:02:46 EDT 2007
May be we can include this at OLPC.
--------- Mensaje reenviado --------
> De: Florian Hars <florian at hars.de>
> Responder a: The general-purpose Squeak developers list
> <squeak-dev at lists.squeakfoundation.org>
> Para: squeak-dev at 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."
> 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.
More information about the Etoys