XOSC's mapping surface is a node graph. Inputs on the left, OSC outputs on the right, wires between them. Nothing else.
Topology
- One input → one output: the boring case. One press fires one OSC packet.
- One input → many outputs: fan-out. Useful when one button needs to fire several Resolume actions at once (trigger a clip and set an opacity, etc).
- Many inputs → one output: fan-in. A single OSC packet that any of several inputs can trigger.
- Many inputs → many outputs: full mesh. Wire whatever you want.
Source kinds
- Input — physical device captured locally: keyboard, MIDI, gamepad, serial.
- Resolume In (v0.3+) — subscribes to a Resolume parameter via the WS bridge (
parameter_updateframes) and acts like any other input source. Use it to mirror or rebroadcast a parameter (e.g. layer 1 opacity → layer 2 opacity, or layer opacity → an OSC packet on a different port for a hardware light controller). - OSC In (v0.5+) — opens a UDP listener on a configurable
(bind, port)and accepts arbitrary OSC packets. Address patterns supportand?. Default bind is127.0.0.1(loopback only); flip to0.0.0.0deliberately for LAN-visible listening. Use it for Stream Deck / Companion / TouchOSC / Reaper / a second XOSC instance — anything that speaks OSC.
Sink kinds
- OSC Out — one UDP packet per fire (or throttled stream for continuous values).
- Resolume Out —
trigger/set/resetover the multiplexed WS bridge.
Loop protection (v0.5+)
Two complementary safeguards stop a runaway feedback loop from pegging your CPU:
- Dispatch depth cap — every event carries a chain depth. Device-originated events start at
0; each re-emission (Resolume rebroadcast attributed to one of XOSC's writes, future logic-node hops) increments. Anything past depth 8 is dropped and logged as awarn. - Echo guard on Resolume In (default on) — when XOSC writes to a parameter via a
resolume-out, the nextparameter_updatefor that path on the matching host:port is suppressed for ~200 ms. Kills theresolume-in → resolume-out → resolume-inloop without affecting user-driven motion. Disable per-node when you actually want the round-trip; the depth cap still bounds it.
Value transform (continuous inputs)
When a continuous input (MIDI CC, pitch bend, gamepad axis, Resolume In) is selected, the inspector shows a value transform section:
- Invert — replaces
vwith1 − v. - Min / Max — remaps the input range; everything below min becomes 0, everything above max becomes 1.
- Curve — exponent applied after remap.
1.0is linear;> 1is exponential (slow start, fast end);< 1is logarithmic (fast start, slow end). Presets:log(0.5),lin(1),expo(2),expo²(3). - Deadzones — center (axes that idle at 0.5), low (snap to 0 below threshold), high (snap to 1 above). Stack as needed.
Snap and grid
Nodes snap to a grid (default 16 px) so layouts stay tidy. Toggle snap in Settings → Snap nodes to grid.
Minimap
The minimap (bottom-right corner of the canvas) shows every node as a coloured dot and every wire between them, with the source-to-target gradient mirrored from the main canvas. The accent-bordered rectangle marks the part of the graph you're currently looking at; the dimmed area outside it is the rest of the canvas.
- Click anywhere on the minimap to jump the viewport there.
- Click + drag to pan continuously — same gesture as scrolling the main canvas.
- Mouse wheel over the minimap zooms the main viewport in or out.
Colours
Each node has a colour, picked from a 12-swatch palette. Wires are gradient-coloured from the source node's colour to the target's, with a soft glow that follows the theme accent. Use colours to group related bindings — all "scene 1" inputs in cyan, all "FX" outputs in magenta, etc.
Selecting and deleting
Click a node to select; its inspector appears in the right-hand panel. <span class="kbd">Shift</span>+click extends the selection. Press <span class="kbd">Delete</span> or <span class="kbd">Backspace</span> to remove the selection — wires touching any deleted node go with it.
Copy / cut / paste
Standard <span class="kbd">Ctrl</span>+<span class="kbd">C</span>/<span class="kbd">X</span>/<span class="kbd">V</span> work on the canvas. Paste produces fresh node IDs and offsets the copies by 24 px from the previous paste. Wires only travel with the paste when both endpoints are part of the selection — see Keyboard shortcuts.
Saving
Everything is auto-saved to %APPDATA%/XOSC/xosc.config.json, debounced 350 ms after the last change. Use the import/export buttons in the toolbar to share a setup with another machine — it's a single .xosc (JSON) file.