On 9/2/18 4:07 AM, Len Ovens wrote:
On Sat, 1 Sep 2018, Jonathan E. Brickman wrote:
In general I too am attracted to UDP -- but for
MIDI performance transmission,
0.001% loss is still far too much, because that means one note in 1,000 might be
held and never released, causing massive encruditation to the moment :-) This is
because every time I press a key there's a MIDI signal for the press, and a
separate one for the release, and if the release is lost, we can have massive
unpleasantry. And a song can easily have thousands of notes. Some of my tests
over the years actually included this behavior!
All note offs must be received for good performance. I agree.
I have read a lot about OSC. It has seemed to me
that it would have to be an
option, given that it seems to have been designed from the beginning to run over
IP, and otherwise to sidestep all of the well-known MIDI limitations. But
whenever I have dug into it in the past, I have found myself quite profoundly
confused by the massive flexibility. Recently I ran into OSC2MIDI, and if my
OSC has no "standard" for performance transmition except MIDI via OSC which
ends
up having all the same problems as MIDI alone. It would of course be possible to
send messages that were note with length... but that would mean a delay at least
as long as the note was played because the message can not be sent untill note off.
Yet another idea:
Instead of implementing RTP-MIDI (and its hacky journal), I've had a very good
experience with translating (stateless) MIDI to a (stateful) protocol for UDP
communication.
TUIO [1] builds on top of OSC and has been designed to gracefully recover from
packet loss. Don't be intimidated by the spec, you'll only need a really minimal
subset of it (easily implementable) to accomplish your goal.
[1]
https://www.tuio.org/?tuio20
understanding
of what OSC is is correct, OSC2MIDI should theoretically be able to
do the job if it is on both ends of the stream, correct? I'll do a bit of testing
of this, see if I can figure out a bit of toolchain design, but input of
experienced persons is much desired.
I personally don't see how that would help. It sounds like translating an
english email to french to send it and then translating back to english on the
receiving end. It is UDP in both cases. Unless I am missing something.
I will also look at the repos for MIDI over RTP.
Sounds like it's being used in
production now for loss-tolerant control surfaces though, and not performance
transmission, correct?
It is designed for performance as well or even first. It is a journelled setup
that sends both the performance and a journel. The journel allows missing
packets to be noted and replaced. It tries to be smart about what it recreates.
For example, a note off is always recreated even if it ends up late. A note on
that shows up after it's note off will not. So it is the better than tcp, where
a note may sound obviously out of time due to a retry. rtpmidi is what apple
coreaudio uses as it's midi transport. A properly "advertised" rtmidi port
will
show up in core audio just like any other midi port. It is however, true that
some of the linux implementations have gotten it working but have never
completed the journeling part of things (maybe because it worked for them well
enough without) and so for them it is no better than ipmidi (which also tends to
be quite good in a local network context). The transport part of the code is the
easiest and the journel part would take work... at least that is my guess as the
reason so many are partly done.
Tcp with timing information and post analysis could do the same thing, deciding
not to use late note on events. With the speed of networks inceasing and faster
processing at both ends, tcp may be fast enough. A lot depends on how busy the
network is... what other traffic is present. I have had both good and bad
exeriences with udp both on wifi and localhost. Even using localhost, it seems
too many udp packets at a time seems to result in packet loss. (I say packet
loss, but it is possible the receiving OSC lib ran out of buffer too).