Dear iOS Control Surface Developers – please support TCP
I have worked with several control surfaces including Lemur, Midi Touch, TouchOSC and I am currently checking out TB MIDI Stuff which seems to be very sweet. I use these apps on both iPads and iPhones to interact with the live keyboard rig I use with The Security Project and Beyond The Wall. They all work pretty well for sending OSC messages back to a laptop.
Last week I decided I’d like to dedicate an iPad as a virtual remote mix controller with bi-directional support for my main faders so that no matter how I changed them (from laptop screen, from iPad, from a pedal or a knob on a physical keyboard), everything would stay synchronized. Further, I wanted to be able to change the name of each fader as I change songs so that it’s obvious for which sound each fader is responsible.
Turns out that that all the Control Surface developers are using OSC over UDP. UDP is unreliable and although you mostly won’t notice a missing packet when you’re adjusting a fader, if your packet is supposed to change the label of a fader but gets lost, your label doesn’t get updated and that’s a real problem. It’s particularly noticable in a wifi environment.
To solve this, these Control Surface apps really need to support the TCP so that delivery of packets is guaranteed. I contacted support at several companies but they all seem to feel it’s a big deal and so not likely to happen soon.
However, I realized that there would actually be a very simple way for these companies to support TCP. All they really need to do is create a simple TCP server (which can be done trivially using the free GCDAsyncSockets library), listen for connections from the outside world and then just forward anything received to the UDP port at localhost (127.0.0.1). Then their existing UDP socket will get the data and process it just like any other received packet.
So come on guys, what’s taking so long?
P.S. I actually tried to build a simple standalone app for the iPad that would receive TCP packets from the outside world and simply forward them to a listening UDP port on localhost. It only took about 1/2 hour in total (including learning GCDAsyncSockets) which is why I know this is easy to do.
Unfortunately Apple restrictions prevent such applications from running continuously in the background so unless I revert to an old version of the iOS and jailbreak it, I’m out of luck.