Peter Brinkmann wrote: > I have a sequencer application that has several MIDI output ports, > each connected to some device that accepts MIDI input. Those > devices may have vastly different latencies ... but of course I > don't want to hear a time lag between those devices. > > I'm currently scheduling all my events through one queue (is that the > recommended method? I've been wondering whether it would make more sense > to have, say, one queue per output port, but I don't see how this would > help),
Using multiple queues doesn't make sense except when you wanted to use different timer interrupts for them. > and the only solution I have been able to think of is to explicitly > schedule events for faster devices at a later time. This is clumsy, and > it's exacerbated by the fact that I'd like to schedule events in terms of > ticks rather than milliseconds. Since latencies are usually measured in > milliseconds, that means I have to convert them to ticks, considering > the current tempo of the queue. There's gotta be a better way. > > Ideally, there are two things I'd like to do: > 1. Assign a delay dt to each output port, so that an event scheduled > at time t0 will be sent at time t0+dt. Like this, I could compute the > maximum latency of all my devices, and the output port attached to a > device would get a delay of (max latency - latency of device), so > that everything would be in sync. This would just move the ms-to-tick conversion into the ALSA sequencer. > 2. Automatically determine the latencies of the devices I'm talking > to. In theory, this should be possible. For instance, if timidity is > connected to jack, it could get jack's current latency, add its own > latency, and report the result. Is this science fiction? This doesn't help with external hardware synthesizers; you'd have to measure how soon after a note-on command its analog output shows a signal. Regards, Clemens
