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.
- 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,
$89one-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.
Every field in the OSC device dialog
Once you choose OSC from the mode dropdown, the dialog fills with these:
| Field | What it does | What to set |
|---|---|---|
| Device name | A label shown in the surface list | Something meaningful: Gamepad OSC |
| Mode | Chooses one-way listening versus two-way with a known device IP | Local port for one-way; Configure device IP + local port for feedback |
| Local listen port | The UDP port REAPER binds to for incoming messages | 8000 unless something else owns it |
| Local IP | Which interface to listen on | Leave blank to listen on all interfaces |
| Device IP / port | Where REAPER sends outgoing state | Only needed for feedback — the sender's IP, commonly port 9000 |
| Pattern config | Which .ReaperOSC file defines the address vocabulary | Default to start with |
| Allow binding messages to REAPER actions and FX learn | Enables /action/<id> and OSC Learn | Tick 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.
- Port mismatch. REAPER's local listen port must equal the port your sender targets. Check both numbers rather than assuming.
- Firewall eating UDP. Test on
127.0.0.1first. If localhost works and the LAN does not, the network is blocking it — add an inbound UDP rule for REAPER on the receiving machine. - Action binding not allowed. If REAPER responds to
/track/1/volumebut ignores/action/1007, that checkbox is off. - 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.
- 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.
- 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.
- Address does not match the pattern file. REAPER only acts on addresses defined in the active
.ReaperOSCfile, unless the message is an/actionor 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.