Blog Reaper 10 min read

REAPER OSC Setup: Control REAPER With a Gamepad Over OSC

Set up OSC control in REAPER — the Control/OSC/web preferences, listen ports, device modes, OSC Learn, and driving it all from a gamepad over UDP.

By Aidxn Design

REAPER OSC is the part of the DAW most people never switch on, and it is the part that solves the two problems MIDI Learn cannot: 7-bit resolution and network transport. OSC gives you 32-bit floats, readable addresses like /track/3/volume, and the ability to drive REAPER from another machine entirely. It is also configured in a dialog with six fields and no documentation on screen, which is why most attempts end with "REAPER isn't receiving anything". This guide covers the dialog field by field, then wires a gamepad into it.

TL;DR
  • What you do: add an OSC control surface in Preferences → Control/OSC/web, set a listen port, allow action binding, and point a sender at that port.
  • What you need: REAPER 6 or 7, any OSC sender — including a gamepad running Universal Controller MIDI in OSC mode.
  • Time: 5 minutes on localhost, 15 if a firewall is involved.
  • Cost: free in REAPER. OSC output is a Pro feature in the bridge, $89 one-time.

How do I set up OSC in REAPER?

Go to Options → Preferences → Control/OSC/web, click Add, choose OSC (Open Sound Control) as the control surface mode, set a local listen port, and tick the action-binding option.

OSC is not under the MIDI preferences, which trips up almost everyone the first time. REAPER treats OSC as a control surface, in the same list as Mackie Control and HUI, because it is bidirectional — REAPER can send state back as well as receive commands.

Signal flow diagram: Gamepad to Bridge / OSC sender to UDP on localhost to REAPER. Gamepad HID Bridge / OSC sender builds OSC messages UDP on localhost listen port REAPER OSC control surface
OSC travels over UDP rather than a MIDI port, which is why none of this appears under REAPER MIDI preferences.

Every field in the OSC device dialog

Once you choose OSC from the mode dropdown, the dialog fills with these:

FieldWhat it doesWhat to set
Device nameA label shown in the surface listSomething meaningful: Gamepad OSC
ModeChooses one-way listening versus two-way with a known device IPLocal port for one-way; Configure device IP + local port for feedback
Local listen portThe UDP port REAPER binds to for incoming messages8000 unless something else owns it
Local IPWhich interface to listen onLeave blank to listen on all interfaces
Device IP / portWhere REAPER sends outgoing stateOnly needed for feedback — the sender's IP, commonly port 9000
Pattern configWhich .ReaperOSC file defines the address vocabularyDefault to start with
Allow binding messages to REAPER actions and FX learnEnables /action/<id> and OSC LearnTick it. Nothing useful works without it

That last checkbox is the one that matters most. Untick it and REAPER will happily receive OSC traffic that maps to the built-in pattern vocabulary, but will ignore every attempt to fire an action or learn an address onto a parameter.

Which mode should I pick?

Pick Local port if your controller only sends, and Configure device IP + local port if you want REAPER to send state back to it.

One-way is the right default for a gamepad: there are no motorised faders to update and no displays to write to. One-way is also simpler to firewall, because only one direction needs a hole.

Two-way becomes interesting when the receiver is a touchscreen app, a tablet layout, or a bridge that can translate REAPER's state into haptics. If your rig does the latter — say, rumbling the controller while transport is rolling — you need the device IP set so REAPER knows where to send /play state. That is also the mode Open Stage Control expects.

Pointing the gamepad at REAPER

On the bridge side, OSC targets are host:port pairs configured in Settings → OSC. Add one:

  • Same machine: 127.0.0.1:8000
  • REAPER on another computer: that machine's LAN IP with the same port, e.g. 192.168.1.42:8000

Each binding in the mapping editor carries its own OSC address. Defaults follow a /controller/<input> shape, and you can rewrite any path. Payloads are typed sensibly for what the control is:

/controller/lstick   0.241  -0.882     # two floats, one per axis
/controller/ltrigger 0.74               # one float, 0.0 to 1.0
/controller/cross    1                  # int, 1 on press, 0 on release

To drive REAPER's own vocabulary, rewrite the address to something REAPER understands — for example pointing a trigger at /track/1/volume or a button at /action/1007. The full address vocabulary, and where the pattern file lives, is covered in the REAPER OSC commands reference.

OSC output is a Pro feature in the bridge — the free tier runs MIDI only, with three saved presets. Pro is $89 one-time, or download the free build first and do the MIDI route if you want to try the workflow before paying for anything.

OSC Learn — the part nobody mentions

With action binding allowed, REAPER's Learn dialog accepts OSC addresses exactly like it accepts MIDI CCs.

Right-click any FX parameter, choose Learn, and move the gamepad control. Instead of MIDI Chan 1 CC 20, the dialog captures something like OSC /controller/ltrigger. Everything else in the dialog still applies — soft takeover, the track-selected scoping box, the focused-FX box. You are using the same binding engine, just with a different transport underneath it.

This is why OSC is worth the setup effort for continuous controls. A 7-bit MIDI CC gives you 128 discrete positions across the full throw of a trigger. An OSC float gives you the resolution of the sensor itself. On a six-second filter sweep, that is the difference between hearing the steps and not.

Running OSC and MIDI at the same time

Both backends can fire from the same physical input, which turns out to be the most practical configuration rather than a party trick.

A sensible split for a REAPER session:

  • MIDI for anything that must be recorded — notes, and CC automation you want baked into a MIDI item or an envelope.
  • OSC for anything that controls REAPER itself — transport actions, track volume, markers, FX parameters you ride at high resolution.

One binding, two outputs, looks like this in the bridge's mapping JSON:

{
  "input": "LT",
  "outputs": [
    { "type": "midi", "port": "Universal Controller", "channel": 1, "cc": 11 },
    { "type": "osc",  "target": "127.0.0.1:8000", "address": "/track/1/volume" }
  ]
}

For a protocol-level comparison of when each one wins, the OSC vs MIDI deep dive covers range, addressability and the practical trade-offs.

Why is REAPER not receiving my OSC?

Work through these in order — it is almost always one of the first three.

  1. Port mismatch. REAPER's local listen port must equal the port your sender targets. Check both numbers rather than assuming.
  2. Firewall eating UDP. Test on 127.0.0.1 first. If localhost works and the LAN does not, the network is blocking it — add an inbound UDP rule for REAPER on the receiving machine.
  3. Action binding not allowed. If REAPER responds to /track/1/volume but ignores /action/1007, that checkbox is off.
  4. Another process owns the port. Only one application can bind a UDP port. If you also run Open Stage Control or TouchOSC on 8000, move one of them.
  5. Wrong IP on a multi-homed machine. A laptop on both Wi-Fi and Ethernet has two addresses. Leave REAPER's local IP blank so it listens on all interfaces.
  6. Bundles the receiver cannot parse. Some receivers want single packets rather than timestamped OSC bundles. REAPER handles both, but if you are chaining through another tool, force single-packet mode in the bridge's OSC transport settings.
  7. Address does not match the pattern file. REAPER only acts on addresses defined in the active .ReaperOSC file, unless the message is an /action or a learned binding.

FAQ

How do I set up OSC in REAPER?

Open Options → Preferences → Control/OSC/web, click Add, choose OSC (Open Sound Control), set a mode and a local listen port, and tick Allow binding messages to REAPER actions and FX learn.

What port does REAPER use for OSC?

REAPER defaults to local port 8000 for incoming OSC and 9000 for outgoing when a device IP is configured, but both are editable in the OSC device dialog. Whatever you set is what your sender must target.

Why is REAPER not receiving my OSC messages?

The usual causes are a port mismatch between sender and REAPER, a firewall silently dropping UDP, or sending to the wrong IP. Test on 127.0.0.1 first; if localhost works and the LAN does not, the network is the problem.

Is OSC better than MIDI for controlling REAPER?

OSC carries 32-bit floats and human-readable addresses, so long sweeps are smoother than 7-bit MIDI CC and the routing is self-documenting. MIDI is better for notes, for recording performances, and for anything that needs to end up in a MIDI item.

Can I use OSC and MIDI from the same controller at once?

Yes. The bridge can emit both backends from the same physical input, so one trigger pull can send a MIDI CC to your instrument and an OSC message to REAPER's control surface at the same time.

Does OSC need REAPER and the controller on the same computer?

No. OSC runs over UDP, so the sender can be on another machine on the LAN. Set the device IP in the OSC dialog and open the port on both firewalls.

Wrap-up

OSC in REAPER is a five-minute setup hidden behind an unlabelled dialog. Add the surface, set the port, allow action binding, point a sender at it — and you get float-precision control and network transport that MIDI simply cannot do. The REAPER user guide documents the control surface chapter in full if you go deeper.

Download Universal Controller MIDI to get a gamepad speaking both protocols into REAPER at once.

Keep reading

More setup walkthroughs