Control Adobe Lightroom from a Stream Deck over MIDI
Lightroom has no MIDI support of its own, but the free, open-sourceMIDI2LR plugin adds it — and once Lightroom is listening for MIDI, MIDIRover can drive it from your Stream Deck's dials and keys. Exposure on a dial, a preset on a key, white balance under your thumb.
This page is the part that is usually missing: which CC numbers are safe,absolute versus relative, and the one routing mistake that makes Lightroom pile up history entries on its own.
What you'll need
- Any Stream Deck — a Stream Deck + if you want real dials for the develop sliders; keys work for presets and toggles.
- MIDIRover — this plugin.
- MIDI2LR installed in Lightroom Classic (it is a separate app plus a Lightroom plugin).
- Windows: a virtual MIDI port — the free loopMIDI. macOS: nothing to install; MIDIRover creates its own port.
1. Give them a port to talk over
On Windows, open loopMIDI and create one port (the default name is fine). On macOS, skip this — MIDIRover publishes a port called MIDIRover automatically. Then, in any MIDIRover action, setMIDI Port to that port, and in MIDI2LR's settings choose the same port as itsinput. Full detail in the manual.
2. Use CC numbers MIDI2LR will accept
This is where most setups fail silently. MIDI2LR's own controller documentation is specific:
- Continuous controls should send absolute values, 0–127 unless you deliberately configure otherwise.
- CC numbers must be in the range 0–119.
- Avoid CC 98–101. Those are reserved for NRPN and RPN, and MIDI2LR treats controller numbers above 127 as NRPN.
So in MIDIRover, pick a CC in 0–119, skip 98–101, and leave the dial in its defaultAbsolute mode. MIDIRover's named values help here — label CC 21 asExposure once and every dropdown shows it that way.
3. Map it in Lightroom
In MIDI2LR, click the Lightroom command you want (say Exposure), then move the MIDIRover control — turn the dial, or press a key set to Sweep mode. MIDI2LR learns the incoming CC and binds it. Repeat per parameter. Because MIDIRover sends ordinary MIDI CC, nothing here is MIDIRover-specific: if a control can be learned from a hardware knob, it can be learned from your deck.
4. Dials, or any deck
- Stream Deck + dial — Absolute mode rides the value directly, and the touch strip shows it as a bar, knob or from-centre ring. Best match for Exposure, Contrast, Temperature.
- Any model, no dial — a Control Change key in Sweep mode ramps the value while you hold it, drawing a live slider or knob on the key. See the expression-pedal guide for how Sweep behaves.
- Presets and toggles — a plain Fixed CC key sends one value, which suits binary commands and preset recalls.
The mistake that makes Lightroom edit itself
If Lightroom starts logging history entries every couple of seconds with nobody touching anything, you have a MIDI feedback loop rather than a bug. MIDI2LR's maintainer describes the mechanism plainly: MIDI2LRreplies to all controllers whenever it sends a message. Send it MIDI on one loopback port, and it answers on that same port.
To be clear about where the loop is and is not: a virtual port is a loopback, so MIDIRover does hear its own output on it — but it recognises and discards its own echo, so you do not need a second port. The loop that bites here is between MIDI2LR and whatever else is listening: its replies go to every active controller and virtual driver at once.
What to do, in order:
- Leave MIDIRover's Feedback field on "Off" for Lightroom work. Feedback exists to mirror a DAW's automation, and Lightroom editing has nothing to mirror — this removes MIDIRover from the return path entirely.
- Deactivate unused devices in MIDI2LR's controller list and close virtual ports you are not using. Both are in its maintainer's own diagnosis of the repeating-event reports, and they address the actual cause.
MIDIRover stays silent unless you touch it
Worth stating because it matters for this pairing: MIDIRover sends only in response to a key press, a dial turn or a touch. It never transmits on a timer — no heartbeat, no re-send. (It does re-read the list of MIDI ports every few seconds so it can reconnect if one disappears and comes back, but that check only reads names; it puts nothing on the wire.) Measured on a Windows machine with a fully configured deck, a virtual port carried zero messages over twelve seconds of idle time. So if something is arriving at Lightroom unprompted, it is coming from the loop above or another device on the port — not from the deck.
What about Premiere Pro and After Effects?
Premiere Pro has no built-in MIDI control surface support either, and unlike Lightroom there is no widely-adopted free bridge equivalent to MIDI2LR. Third-party control-surface utilities exist and change often, so rather than publish steps that may be wrong by the time you read them: MIDIRover's job is to send the MIDI, and it will work with any bridge that can learn a MIDI CC, Program Change or Note. If you get a Premiere workflow going, tell us and we will document it here properly.
For editors, the honest alternative today is Stream Deck's own native actions plus keyboard shortcuts — MIDI only earns its place when you need continuous control, which is exactly where Lightroom's develop sliders sit.
Relative encoders, if you need them
MIDI2LR can interpret incoming data as relative encoder increments, and MIDIRover's dial supportsRelative mode with all three common encodings — signed-bit,two's complement and binary offset — so an endless encoder never makes a parameter jump on pickup. Note that relative CC over a virtual port is where users have reported the repeating-value problems above, so start in Absolute, confirm it works, and only move to Relative if you specifically need pickup-free behaviour.
Next steps
- The manual — every action and setting.
- Nothing happening? — symptom-first fixes for ports, channels and MIDI Learn.
- Two-way feedback — if you later want keys that follow software state.
MIDIRover is not affiliated with Adobe or with the MIDI2LR project. MIDI2LR is independent, free and open-source; check its own documentation for the current details of its setup.