Universal Controller MIDI
Blog Protocols 9 min read

OSC vs MIDI from a Gamepad — Which Protocol When?

OSC has 32-bit floats, named addresses, and network transport. MIDI has 7-bit ints, fixed message types, and 40 years of inertia. Here is when to use which from a gamepad.

By Aidxn Design

OSC — Open Sound Control — is the modern, network-native, floating-point-friendly cousin of MIDI. It was invented at CNMAT in 1997, the year MIDI turned fourteen, and has been the protocol of choice for live coders, visual artists, and modular DAW builders ever since. So which one should your gamepad speak? Spoiler: both, depending on what's listening. Behold the actual technical differences with no protocol-religion.

TL;DR
  • MIDI: universal in DAWs, 7-bit by default (32-bit in MIDI 2.0), fixed-shape messages, serial transport.
  • OSC: 32-bit floats, named addresses, UDP transport, no host-app standard.
  • Use MIDI when: you're routing into a DAW, a hardware synth, or anything expecting Channel Voice.
  • Use OSC when: you're driving TouchDesigner, Max, Reaktor, vvvv, or anything with a network-friendly protocol.
  • The bridge speaks both. Same physical gamepad, dual outputs.

What OSC actually is

OSC is a transport-agnostic message format. The canonical implementation sends UDP packets to a destination host. Each packet contains one or more OSC messages, each with an address (a slash-separated path like /synth/filter/cutoff) and zero or more arguments (typed: int32, float32, string, blob, even nested arrays). Messages can be wrapped in bundles with a timestamp for scheduled playback.

# OSC message wire format (hex)
2F 73 79 6E 74 68 2F 66 69 6C 74 65 72 2F 63 75 74 6F 66 66 00 00 00 00
                                                  # ^ /synth/filter/cutoff + null padding
2C 66 00 00                                      # type tag string: ",f" = single float
43 7F 00 00                                      # float32 value: 255.0

Where OSC wins

  • Resolution. Native 32-bit float. A stick value goes from -1.000000 to +1.000000 with no quantization steps.
  • Named addresses. No magic CC numbers. /gamepad/stick/left/x is self-documenting.
  • Arbitrary message shapes. One OSC message can carry an entire gyro vector as a tuple of three floats. MIDI would need three separate CCs.
  • Network-native. Send to localhost, send to another machine on the LAN, send to a Raspberry Pi running TouchOSC. Same code path.
  • Rate flexibility. No 31.25 kbaud serial bottleneck. OSC over UDP localhost is ~150 microseconds per packet.

Where MIDI wins

  • Universal DAW support. Every DAW since 1985 speaks MIDI. Almost none speak OSC natively.
  • Hardware support. Every synth, drum machine, sampler, effects pedal accepts MIDI. Vanishingly few accept OSC.
  • Convention. "CC 1 is the mod wheel" is a 40-year shared dictionary. OSC has no equivalent.
  • Tight integration with timing. MIDI clock, song position, beat sync — OSC has nothing analogous out of the box.
  • Bluetooth. BLE-MIDI is widely supported. OSC over BLE is custom and rare.

How the bridge handles both

The bridge runs MIDI and OSC outputs on independent threads. A single gamepad input can drive both at once. The mapping editor shows two columns — one MIDI binding, one OSC binding — and lanes are individually toggleable.

{`{
  "lanes": [
    {
      "input": "stick.left.x",
      "outputs": [
        { "transport": "midi", "type": "cc", "value": 3, "channel": 1 },
        { "transport": "osc",  "address": "/gamepad/stick/left/x", "type": "f", "scale": [-1, 1] }
      ]
    },
    {
      "input": "gyro",
      "outputs": [
        {
          "transport": "osc",
          "address": "/gamepad/gyro",
          "type": "fff",
          "scale": [-180, 180],
          "rateHz": 250
        }
      ]
    }
  ]
}`}

Real example — gyro to TouchDesigner

MIDI cannot represent a 3-axis gyro vector cleanly — you'd burn three CC numbers and lose 5 bits of resolution per axis. OSC sends the whole vector as one message at native precision. In TouchDesigner, the OSC In CHOP receives the bundle and exposes gyro/x, gyro/y, gyro/z as float channels at 250 Hz.

{`# Bridge config snippet
{
  "input": "gyro",
  "transport": "osc",
  "address": "/gamepad/gyro",
  "rateHz": 250,
  "format": "fff"
}

# TouchDesigner OSC In CHOP
# Port: 9000
# Network protocol: UDP
# Filters: /gamepad/gyro
# Output: three float channels at 250 Hz`}
Get Universal Controller MIDI Pro — $49 →

Latency comparison

We measured both transports on the same machine, M2 MacBook, 64-sample audio buffer:

TransportMedianp99Resolution
MIDI 1.0 over IAC4.2 ms5.1 ms7-bit (128 steps)
MIDI 2.0 over UMP4.4 ms5.3 ms32-bit (4.29B steps)
OSC over UDP localhost1.8 ms2.6 ms32-bit float
OSC over LAN (gigabit)2.4 ms3.5 ms32-bit float

OSC wins on raw latency because it skips the virtual MIDI port plumbing entirely. UDP loopback on macOS is one of the fastest IPC mechanisms on the system. For visual apps where every millisecond shows, OSC is the right answer.

When you should run both at once

The killer setup: gamepad → MIDI to Ableton for clip launch + macros, same gamepad → OSC to TouchDesigner for visuals reacting to the same physical motion. One controller, two outputs, perfectly synchronised because they're driven by the same HID event at the source. The bridge ships this as the "Hybrid AV" preset.

Limitations

  • OSC has no standard. Every receiving app picks its own address convention. You will be reading docs.
  • UDP can drop packets. Rare on localhost, possible on Wi-Fi. The bridge sends bundles with sequence numbers; receivers can detect drops.
  • OSC bundles need clock sync for scheduled playback. Most apps ignore the bundle timestamp and play on receipt.
  • Network OSC needs firewall rules. macOS prompts the first time; Windows may block UDP silently.
  • MIDI 2.0 closes the resolution gap. Once your DAW supports UMP, MIDI catches up to OSC on precision.

Pick the protocol that matches the receiver. Universal Controller MIDI speaks both, simultaneously, from the same gamepad — so you don't have to choose.

Keep reading

More setup walkthroughs