← All docs
Mapping

The node graph

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_update frames) 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 support and ?. Default bind is 127.0.0.1 (loopback only); flip to 0.0.0.0 deliberately 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 Outtrigger / set / reset over 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 a warn.
  • Echo guard on Resolume In (default on) — when XOSC writes to a parameter via a resolume-out, the next parameter_update for that path on the matching host:port is suppressed for ~200 ms. Kills the resolume-in → resolume-out → resolume-in loop 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 v with 1 − v.
  • Min / Max — remaps the input range; everything below min becomes 0, everything above max becomes 1.
  • Curve — exponent applied after remap. 1.0 is linear; > 1 is exponential (slow start, fast end); < 1 is 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.
Transforms apply per source node. Multiple input nodes bound to the same physical event each carry their own transform — useful when you want the same MIDI knob driving two outputs with different curves.

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.
The minimap is decorative and read-only — you can't drag nodes or edit wires from inside it.
(Custom minimap as of v0.7.5; the previous xyflow-default version had a long-running bug where nodes went invisible after measurement timing changes.)*

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.