Blog Reaper 10 min read

REAPER MIDI Learn: The Complete Guide (Including Gamepads)

How REAPER MIDI Learn works: the MIDI/OSC Learn dialog, CC modes, soft takeover, scoping, where bindings are stored, and why Learn ignores your gamepad.

By Aidxn Design

REAPER MIDI Learn is the fastest binding system in any DAW, and it is also the one people most often decide is broken. It is not broken. There are three separate learn surfaces in REAPER — FX parameters, track controls, and the Actions list — they behave differently, they store their bindings in different files, and the dialog hides a CC-mode dropdown that silently decides whether your binding feels right or feels useless. This guide covers all three, with a gamepad as the example controller because it exposes every edge case at once: absolute sticks, momentary buttons, analogue triggers, and a touchpad.

TL;DR
  • What you do: enable the device for control messages, right-click any control, choose MIDI/OSC Learn, move the control, pick the right CC mode.
  • What you need: REAPER 6 or 7, any MIDI controller or a gamepad bridged to virtual MIDI via Universal Controller MIDI.
  • Time: about 90 seconds for your first binding, 10 minutes for a full working layout.
  • Cost: REAPER's learn system is free and built in. The bridge is free to try, $89 for Pro.

Does REAPER have MIDI Learn?

Yes — REAPER calls it MIDI/OSC Learn and it is available on practically every control in the application. Unlike Ableton's single global mapping mode, REAPER does not have a "mapping mode" you toggle on and off. You right-click the specific thing you want to control, choose Learn, and bind it there. That means you can keep working with the mouse while half your session is already bound, and it means there is no global map to accidentally overwrite.

The three surfaces are worth naming explicitly, because they behave differently:

  • FX parameter learn. Right-click a plugin slider, or use the Param button at the top of the FX window → Learn. Stored per FX instance, inside the project file.
  • Track control learn. Right-click a volume fader, pan knob, send level, mute or solo button in the mixer or TCP. Stored in the project.
  • Action learn. Actions → Show action list, select an action, hit Add under Shortcuts, then send the MIDI message. Stored globally in reaper-kb.ini, and available in every project you ever open.

Most frustration comes from mixing these up. If you bound Play to a button once and it works everywhere, that was an action binding. If you bound a filter cutoff and it vanished when you opened a different song, that was an FX binding living in the old project.

Why is REAPER MIDI Learn not seeing my controller?

Because the device is almost certainly enabled for input but not for control messages, which are two separate ticks in REAPER.

Go to Options → Preferences → Audio → MIDI Devices. Find your controller in the MIDI inputs list. Right-click it. You will see:

  • Enable input — lets MIDI through to record-armed tracks. Notes reach your instruments.
  • Enable input for control messages — lets the same stream reach the learn engine, control surfaces, and action bindings.

A device with only the first tick will play a synth perfectly and refuse to learn a single CC. Tick both. The device row should then read <enabled, control> in the Mode column. If the device does not appear in the list at all, click Reset all MIDI devices at the bottom of that page — REAPER enumerates MIDI hardware at startup and a port created after launch will not show up until you force a rescan.

For a gamepad specifically, the operating system has to see a MIDI device before REAPER can. That is the job of the bridge: Universal Controller MIDI reads the DualSense, Xbox, Switch Pro or 8BitDo HID stream and publishes it as a virtual MIDI port. REAPER then treats it exactly like a Launch Control XL. Nothing about the learn workflow changes. If you have not set that side up yet, the gamepad-to-REAPER setup guide covers the port plumbing.

What do the CC modes in the MIDI Learn dialog do?

The CC mode dropdown decides how REAPER interprets the number arriving on the wire, and picking the wrong one is the number one reason a binding "sort of works".

ModeWhat it expectsUse it for
AbsoluteA value 0–127 that is the parameter positionFaders, analogue triggers, stick axes, touchpad X/Y
Relative 1 (binary offset)Values centred on 64; 65 = +1, 63 = −1Endless encoders on hardware controllers
Relative 2 (twos complement)1 = +1, 127 = −1Encoders on other hardware
Relative 3 (sign bit)1 = +1, 65 = −1Encoders on other hardware again
ToggleAny non-zero flips the stateButtons that should latch — mute, solo, record-arm

A gamepad is absolute everywhere except where you deliberately make it relative. Sticks and triggers send absolute 0–127, so leave them on Absolute. Face buttons send note-on/note-off or a CC of 127/0; for a latching mute, set them to Toggle, otherwise the control unmutes the instant you let go.

There are two more checkboxes worth understanding:

  • Soft takeover (absolute mode only). With this on, REAPER ignores the incoming value until the physical control sweeps past the parameter's current position, then it catches. This is the fix for the classic "I touched the stick and the cutoff jumped to 40%". Turn it on for anything you recall or load presets into.
  • 14-bit CC. If your controller sends an MSB/LSB pair, this gives you 16,384 steps instead of 128. A gamepad stick has more than 7 bits of resolution under the hood, so if your bridge is configured to send 14-bit pairs, tick this and the stair-stepping on long sweeps disappears.

How do I make one knob control the selected track in REAPER?

Tick Enable only when track is selected in the Learn dialog, then make the same binding on every track you care about.

This is REAPER's answer to a bank-switching control surface and it is better than it sounds. Bind left stick Y to track volume on track 1 with the scoping box ticked, copy the track, and the binding comes with it. Now one physical axis rides the volume of whichever track has focus, with no banking logic at all. The sibling option, Enable only when effect configuration is focused, does the same for plugin windows: L2 can be "the first macro of whatever plugin I am currently looking at" across your entire session.

There is a third box, Enable only when effect is focused on some builds, which narrows it further to the specific FX window rather than the FX chain. If a binding only fires sometimes, open the dialog again and check whether one of these scoping boxes is on when you did not want it.

Binding actions instead of parameters

Parameters cover mixing. Actions cover everything else — and in REAPER, everything else is roughly four thousand things.

Open Actions → Show action list. Filter for what you want. With the action selected, click Add… in the Shortcuts box and REAPER opens a small window waiting for input. Press the gamepad button. The binding appears as something like MIDI Chan 1 Note 60. Click OK.

Two details that save a lot of time:

  • Right-click an action → "Copy selected action command ID" gives you the numeric ID (or the _RS… string for a script). You need this the moment you start writing ReaScript or OSC bindings — do not copy command IDs out of forum posts, read them out of your own install.
  • The Section dropdown matters. The Main section is what you want for transport. MIDI Editor bindings live in their own section and will not fire in the arrange view.

A gamepad d-pad bound to four Main-section actions is a transport remote you can operate from across the room without looking. Because the bindings are global, they are there in every project forever — which is exactly what you want for transport and exactly what you do not want for a filter cutoff.

A ReaScript that reads the value, not just the button

Action bindings are on/off by default, but a ReaScript triggered by MIDI can read the incoming value. reaper.get_action_context() returns seven values, and the last three carry the MIDI details when the script was fired by a learned CC.

-- UCMIDI_TriggerToParam.lua
-- Bind this script to an absolute CC (e.g. a gamepad trigger) from the
-- Actions list, then set the binding's CC mode to Absolute.
local is_new, filename, sec, cmd, mode, resolution, val = reaper.get_action_context()

-- mode == -1 means the script was run without MIDI context (e.g. a keypress)
if mode ~= -1 then
  -- val is 0..127 for a 7-bit absolute CC
  local norm = val / 127.0
  local track = reaper.GetSelectedTrack(0, 0)
  if track then
    reaper.SetMediaTrackInfo_Value(track, "D_VOL", norm * 2.0) -- 0..+6dB-ish
  end
end

Load it with Actions → Show action list → New action → Load ReaScript, then bind it like any other action. This is the bridge between the two worlds: the flexibility of the Actions list with the continuous value of a learned CC. If you want that shaping to happen before REAPER ever sees the message, it belongs in a JSFX MIDI processor instead.

Where bindings live, and how to move them

Knowing the storage location turns "my mappings disappeared" into a two-minute fix.

  • FX and track learns → the .rpp project file. To carry them into new sessions, use File → Project Templates → Save Project as Template.
  • Action bindings → reaper-kb.ini in the REAPER resource path (Options → Show REAPER resource path in explorer/finder). Back this file up before you reinstall.
  • FX parameter learns on a specific plugin can also be baked into an FX chain: right-click the FX in the chain → Save selected FX as chain. The learns travel with the chain file.

A clean way to run a gamepad across many projects: transport and navigation as action bindings (global, set once), and everything musical as FX learns inside a project template. On the bridge side, keep the gamepad's own mapping stable so the CC numbers never move under you — that is the whole point of saving a preset rather than remapping per session. The free tier holds three saved presets, which is enough for a studio layout, a mixing layout, and a tracking layout; Pro lifts that limit if you start making one per project.

Want this on a controller you already own? Download Universal Controller MIDI and your gamepad becomes a learnable MIDI device in about two minutes. If you want the full mapping editor, conditional layers and OSC output, Pro is $89 one-time, owned forever.

Troubleshooting MIDI Learn, in order

  1. Nothing is captured. Device not enabled for control messages. Fix it in Preferences → MIDI Devices.
  2. The wrong CC is captured. Another device is chattering. Temporarily disable every MIDI input except the one you are learning from — REAPER binds the first message it sees.
  3. The parameter jumps on load. Enable soft takeover in the Learn dialog.
  4. A button only works while held. Set the CC mode to Toggle, or bind the note-on to an action instead of a parameter.
  5. The sweep sounds stepped. Switch the binding and the bridge to 14-bit, or smooth the stream before REAPER sees it.
  6. The binding works in one project only. That is expected for FX learns. Re-make it as an action binding, or save a project template.
  7. Stick sends values at rest. That is drift, not REAPER. Raise the deadzone in the bridge — the drift compensation guide explains why a fixed deadzone beats a firmware mod.

FAQ

Does REAPER have MIDI Learn?

Yes. REAPER calls it MIDI/OSC Learn and it is available on every FX parameter, track fader, send, pan control and on every entry in the Actions list. Right-click the control and choose Learn.

Why is REAPER MIDI Learn not responding to my controller?

Almost always because the input device is enabled for notes but not for control messages. In Options → Preferences → Audio → MIDI Devices, right-click the device and confirm Enable input for control messages is ticked as well as Enable input.

Where does REAPER store MIDI Learn assignments?

FX parameter and track control learns are stored in the .rpp project file. Action bindings made from the Actions list are global and stored in reaper-kb.ini in your REAPER resource folder.

Can I MIDI Learn a gamepad in REAPER?

Yes, once the gamepad is presented to the operating system as a MIDI device. Universal Controller MIDI converts the HID stream into a virtual MIDI port, and from REAPER's point of view it is an ordinary controller you can Learn from.

What is soft takeover in the MIDI Learn dialog?

Soft takeover stops a parameter jumping when the physical control is in a different position to the stored value. REAPER ignores incoming values until the control passes through the current parameter value, then picks it up.

How do I remove a MIDI Learn binding in REAPER?

Right-click the control again, open MIDI/OSC Learn, and click Clear. For an action binding, find it in the Actions list and use Delete under the Shortcuts section.

Wrap-up

MIDI Learn is not a mapping mode, it is three separate systems that happen to share a dialog. Once you know which one you are in — project-scoped FX learn, project-scoped track learn, or global action binding — REAPER stops being unpredictable and starts being the most flexible binding system in any DAW. The REAPER user guide has the full chapter if you want the hardware-surface detail as well.

Grab Universal Controller MIDI and you can test every one of these behaviours with a controller already sitting on your desk.

Keep reading

More setup walkthroughs