Audio + MIDI nodes
Stagewright's wired graph has a small set of "hardware" nodes that are always present, the audio I/O and MIDI input cards, plus freely-placed plugin / utility nodes.
Audio I/O nodes
audio-in, pinned to the left edge of the canvas. Output ports = one per channel of the selected input device (e.g. 14 ports for a 14-channel aggregate device). Pick the device in the node inspector or via the inspector chip in the right panel.audio-out, pinned to the right edge. Input ports = one per channel of the selected output device. Most rigs use the same device for both (set both in the audio-devices panel).
Both are singletons, you can't add more or remove them.
MIDI input nodes
midi-in, one card per hardware MIDI device. The card shows the bound device name (e.g. "MIDI Mix", "MPK mini") and exposes a single MIDI output port. Add more via the+button on the back canvas if you have multiple controllers.- Logical name vs. physical port: the card's display name is what scripts and bindings reference. The actual USB / IAC device is picked in the card's inspector and can be swapped at any time, the same
'MIDI Mix'logical name maps to whichever real device is plugged in tonight.
MIDI events from each card flow through:
- Hardware → midi-in card → audio graph's MIDI bus.
- Any wire from the midi-in's port to a plugin / utility delivers that device's MIDI to that plugin.
- The engine ALSO routes every event through the per-device MIDI input log so the Diagnostics → MIDI Monitor panel sees it regardless of graph wiring.
- Scripts can subscribe via
midi.input(name).on(...).
MIDI output (sending)
MIDI output to hardware doesn't have a back-canvas card. Scripts use midi.output(name) directly, the device opens lazily on first send. See MIDI input & output.
Hardware abstraction in the project file
The project file stores midi-in cards as { nodeId, deviceName } entries. Drop a project into a different rig: open the project, the engine warns about unmatched device names, you re-bind on each midi-in card via its inspector. The script doesn't care, it addresses by logical name.