Using OSC
You want to control Daydream Scope and a second application (Resolume, TouchDesigner, or something else) from the same OSC source. Or maybe you want one app to control the other over OSC. Unlike MIDI, OSC is network-based and doesn’t have the exclusive-device problem. But it has its own routing considerations, and the setup is different enough to warrant its own guide.Why OSC Instead of MIDI?
Both protocols map physical controls to software parameters, but they work differently under the hood.| MIDI | OSC | |
|---|---|---|
| Values | Integers 0–127 | Floats, strings, ints, blobs |
| Transport | Device connection (USB) | UDP over network |
| Multi-app | Requires virtual routing | Send to multiple IP:port targets natively |
| Mapping | Learn-based (move a knob, app picks it up) | Explicit address paths (more setup, more flexible) |
| Resolution | 128 steps | Full float precision (0.0–1.0+) |
What You’ll Need
- Daydream Scope installed and running (with OSC enabled)
- A second application: Resolume Arena/Avenue, TouchDesigner, or similar
- An OSC source: a tablet/phone app (TouchOSC, OSC/PILOT, Lemur), another piece of software, or a MIDI controller with an OSC bridge
- All devices on the same local network (or running on the same machine using
localhost)
How OSC Routing Works
Each application listens for OSC messages on a specific UDP port on a specific network address (localhost / 127.0.0.1 if everything is on the same machine, or a LAN IP if across machines). No two applications can listen on the same port on the same machine; they each need their own.
Step 1: Enable OSC in Scope
Scope runs an OSC server as a background service that listens on UDP.Open OSC settings
Open Scope and navigate to the OSC settings. The OSC server should automatically be running and ready to receive requests whenever Scope is open.

Note the port number
Note the port number Scope is listening on. You’ll need this when configuring your OSC source.
Step 2: Configure OSC in Your Second Application
Resolume Arena/Avenue
Resolume’s OSC address structure follows a pattern:
/composition/layers/{layer}/clips/{clip}/connect for triggering clips, /composition/layers/{layer}/video/opacity for layer opacity, and so on. Resolume can also send OSC for feedback to your controller or to drive another app.
TouchDesigner
Set the network port
Set the Network Port to your desired listening port (e.g., 8000). Make sure nothing else is already using this port.
- Create an OSC Out CHOP or OSC Out DAT
- Set the Network Address to the target IP (
localhostfor same machine, or the LAN IP for another machine) - Set the Network Port to Scope’s OSC port
- With the CHOP, channel names become OSC address paths. With the DAT, you have full control over message formatting
Step 3: Configure Your OSC Source
Tablet/Phone Apps (TouchOSC, OSC/PILOT, Lemur)
These apps let you define multiple output targets. Add one target per application:- Target 1: Scope’s IP and port (e.g.,
192.168.1.100:9000orlocalhost:9000) - Target 2: Resolume’s IP and port (e.g.,
192.168.1.100:7000)
Another Application (e.g., TouchDesigner → Scope)
- Create an OSC Out CHOP for each destination (or use a single OSC Out DAT with scripted message sending)
- Set each one’s network address and port to the corresponding target app
- Wire your MIDI In CHOP (or any other data source) through any processing you need, then into the OSC Out
MIDI Controller via Bridge
If you have a physical MIDI controller and want to convert its output to OSC:- OSC/PILOT can receive MIDI and send OSC simultaneously
- Open Stage Control is a free, open-source option with MIDI-to-OSC bridging
- TouchDesigner itself is an excellent bridge: MIDI In CHOP → any processing → OSC Out CHOP
- A lightweight Python script using
mido(MIDI) andpython-osc(OSC) can do this in about 20 lines
Step 4: Plan Your Address Space
Unlike MIDI (where you’re mostly dealing with CC numbers 0–127 on channels 1–16), OSC gives you arbitrary string-based addressing. This is more powerful but requires some coordination.OSC addresses are case-sensitive and must match exactly. A typo in an address path is the most common reason messages arrive but don’t affect parameters.
- Use each app’s native OSC addresses where possible (Resolume and TouchDesigner both document theirs)
- For Scope, use the addresses documented in the Scope OSC reference
- If you’re building custom controls, namespace them:
/scope/prompt_strength,/resolume/layer1/opacity, etc. - If the same control should affect both apps, send the same message to both ports (your OSC source handles the fan-out)
Step 5: Connect the Video Pipeline
Same as the MIDI guide: Scope outputs video via Spout (Windows), Syphon (macOS), or NDI (network). This is independent of your control protocol.- Same machine: Spout or Syphon. Sources appear automatically in Resolume and TouchDesigner
- Across machines: NDI. Sources appear automatically on the same network
Routing OSC to Multiple Apps from a Single-Target Source
If your OSC source only supports one output target, you need a relay to fan out the messages:- TouchDesigner: Set it as the sole OSC target, then use multiple OSC Out CHOPs to forward messages to each destination app. This also lets you filter or transform messages per-destination
- Open Stage Control: Acts as a relay with customizable routing rules
- oscrouter / osc-splitter utilities: Small standalone tools that listen on one port and forward to multiple destinations
- Custom script: A Python script with
python-osccan listen on one port and forward every message to N destinations in about 15 lines
Troubleshooting
No OSC arriving in an app
No OSC arriving in an app
Check that the target port matches the app’s listening port. Verify the app is actually listening (Scope: check
/api/v1/osc/status; TouchDesigner: check the OSC In CHOP’s node viewer; Resolume: check the MIDI/OSC monitor in preferences). Make sure your firewall isn’t blocking UDP on that port.Port conflict (app won't start OSC)
Port conflict (app won't start OSC)
Two apps can’t listen on the same port. Give each app its own port and configure your source accordingly.
Messages arriving but not affecting parameters
Messages arriving but not affecting parameters
The address path probably doesn’t match what the app expects. OSC addresses are case-sensitive and must match exactly. Check the app’s documentation for the correct paths.
Works on same machine, fails across network
Works on same machine, fails across network
Verify both machines are on the same subnet. Replace
localhost / 127.0.0.1 with the target machine’s actual LAN IP. Check firewalls on both ends.Jitter or dropped messages
Jitter or dropped messages
OSC over UDP doesn’t guarantee delivery. On a clean local network this is rarely an issue, but WiFi can introduce drops. If you’re controlling from a tablet over WiFi and seeing inconsistency, try a wired connection or reduce your message rate.
The General Pattern
The architecture for multi-app OSC control:- Each app gets its own UDP port on the network. No sharing, no conflicts
- Your OSC source sends to multiple targets (most controller apps support this natively)
- Address paths are per-app — coordinate your namespace so messages go where you intend
- Use a relay (TouchDesigner, Open Stage Control, or a script) when your source only supports one target, or when you need to transform messages per-destination
- Video pipeline (Spout/Syphon/NDI) is separate from the control protocol and works the same regardless of whether you’re using MIDI, OSC, or both
