The Patch
The node editor: adding, wiring and inspecting nodes, and watching the live data.
The Patch (node editor)#
You build shows by wiring nodes together. Data flows left→right along wires. Live wires glow and show a particle stream; idle wires are thin gray.
Patch header#
The Patch has the same frame as the other panels:
- Gear column (left): the gear shows the Patch's own settings (Appearance, e.g. node snapping) in the side panel. Press it again, or select a node, to go back to node properties.
- Header over the graph:
- ◂ BACK leaves a group or cue interior one level; at the top level it goes back through the screens you came from, one step per press.
- The title is where you are: PATCH ▸ group ▸ ….
- Below it are the show's name, the node count and what you are inside (e.g. "inside cue Drop FX").
- The footer's Close does the same as BACK.
All Nodes (nothing selected)#
With no node selected, the properties pane (docked or floating) shows Node Properties - All Nodes: Every node in the show as a tree, grouped into Sources · Controllers · Devices + Routing · Logic · Outputs (alphabetical inside each group, with a count). A node with an interior (a Group, a Device / Router / OSC Input with triggers inside) gets a ▸: click it, or double-click the row, to unfold what lives inside, nested as deep as it goes. Inside, nodes follow the wiring: A node sits under the one that feeds it (a Script wired into a Graphic shows the Graphic under the Script), top to bottom as on the canvas. Type in the Search field to list every matching node at any depth (name or kind), each with the interior it is in. Inside a group, cue or other interior the tree lists only that graph (heading Inside Cue …), in wiring order, BACK out to see the whole show again. Each row shows the node's colour, its name (Description if set; dimmed when bypassed or stopped) and its kind, plus how many nodes are inside. Click a row to jump to that node: the Patch enters the interiors it lives in and selects it. The tree follows adds, deletes, renames and bypass changes by itself; the wheel scrolls it.
Node title-bar controls#
Every node has, at the right of its title bar:
- ● green dot: Normal. Click to Bypass (turns amber, node becomes transparent: data flows in→out untouched; a bypass arrow is drawn over it).
- ■ stop square: Click to Stop (red): node is fully muted, passes nothing.
- ▶ play (Script & Action nodes), test-fire the node by hand.
Node types#
| Node | Role |
|---|---|
| Source | Taps a network (ProDJLink / TCNet), the Timecode Generator, a timecode input (LTC In / MTC In / Art-Net TC In) or the Test Generator. Outputs a bundle of all devices. |
| Device | Picks one device from a source's bundle by Device ID → a single data frame. (Formerly "Selector".) Its Function can also make it an Internal Player (plays local media). Double-click to open its action interior: A private Patch where the Data block carries this device's output, wire Data → Trigger → Action (→ Script…) inside, and the end of every chain (any node whose Out is left unwired) appears as an extra out-pin on the Device node, ready to wire onward in the main Patch; wiring a chain into the interior's Output block instead ADDS its keys to the node's main output. Pin names: the node's Description if set, an Action's selected action, else the node title. |
| Trigger | Fires on a condition in the data (see §4). |
| Script | Runs JavaScript on the data frame (see §6). |
| Action | Does something when a trigger fires (see §5). |
| Outputs (generators) | MIDI · MIDI Clock · MTC · LTC · Click · OSC · UDP · HTTP · MSC · CSV Logger · Art-Net · Art-Net TC · sACN · Ableton Link · Ableton Live · TCNet, see §8. |
| Timer | A Trigger preset to fire on a repeating interval (§4). |
| Router | 8-in / 1-out; picks one input. Has a Name. Double-click opens an action interior exactly like the Device node's (extra out-pins per Action inside). |
| Matrix | 8-in / 4-out with 4 recallable presets. Has a Name. |
| Data Generator | Clock / elapsed / fixed / random values, Mix Analyzer, Tone Monitor, DMX Input (Art-Net / sACN from a lighting desk) and PSN Receiver (tracking positions). |
| Graphic | A drawing surface. A Script wired in draws on it with g.* (see §6). Has a Name, Width, Height. |
| Delay | Delays whatever flows through it. Time = fixed ms or read live from a data key (e.g. beat.msToNextBeat). |
| Countdown | Counts down to a Duration (started / stopped / reset by its Start · Stop · Reset pins or its Command popup), a duration read from a data key, a Time of Day, the next Schedule item or the next cue of a deck. Publishes countdown.remain (H:MM:SS), remainMs, done, running, warning, label. |
| Counter | Counts Up / Down / Reset on the rising edge of what is wired to each pin, with Min / Max / Clamp / Wrap. Publishes counter.value. |
| Timecode Offset | Re-publishes a deck's timecode shifted by ± HH:MM:SS:FF (all decks, one deck or a different offset per deck) so every output downstream (LTC, MTC, Art-Net TC, TCNet, cues) sees the shifted time. |
| Group | A nested subgraph, tidy up messy patches by folding a section into one node. 4 In / 4 Out pins. Double-click to open it; inside, the Inputs and Outputs endpoint blocks carry the group's pins. Close Group (footer) pops back out; the title strip shows the breadcrumb (Patch ▸ Group…). Groups nest, save with the show, and everything inside runs exactly as at top level (sources, scripts, graphics, actions included). |
Moving nodes into a Group: Two ways: drag & drop node(s) onto a Group node (they fold inside, keeping their wiring to each other), or Cut (⌘X / right-click) → double-click into the group → Paste (⌘V / right-click the background). Copy/Paste (⌘C/⌘V) clones node sets the same way, anywhere, wires within the selection survive; wires crossing the selection boundary are dropped (rewire via the Inputs/Outputs blocks). Cut moves the original nodes, so it pastes once; Copy pastes clones (groups themselves can be Cut/moved but not yet deep-copied).
Nodes auto-size to their name (up to a sensible cap); the Graphic node keeps its manual size.
Adding nodes = right-click. The menu is organised into three submenus, Add Source (ProDJ Link · Test Generator · Data Generator), Add Processor (Device, Trigger, Timer, Action, Script, Delay, Operator, Countdown, Counter, Timecode Offset, Router, Matrix, Group, Graphic, Viewer, Program) and Add Output (the outputs, grouped by type: Audio, Timecode, MIDI, Network, Lighting, Video & Media, Show Control, On Screen, Utility, alphabetical inside each), plus Duplicate/Cut/Copy on a node. The new node is auto-wired from the clicked node when that makes sense. Right-clicking the background opens the same Add menu, and the node is placed unwired in free space to the right of the existing Patch. The footer holds a single Close button (the old Add buttons are gone), on the floating Patch window it docks the Patch back; on the main window it's reserved for the future return-to-app navigation.
Inspector (Node Properties)#
How settings rows work (every side panel: node properties, window settings, deck and router panels). Each setting is one slim row: the name on the left, the value on the right, and ↺ at the far right to put it back to its default.
- On / Off: Click the row to flip it.
- Numbers with a range: A slider. Click or drag on the track; click the number to type an exact value.
- Other whole numbers: − n +. Click − or +, or click the number to type one.
- Choices: Click the value ▾ for a menu (the current one is ticked).
- Text: Click the value to edit it in place. Return or clicking away keeps it, Esc cancels. A side button (e.g. NOW) sits at the right.
- Colours: Click the swatch.
- Files: Click the name to pick one.
- Actions: Click the chip.
- Multi-line notes and scripts keep their big text boxes.
Selecting a node shows its settings, grouped. The first two sections open expanded; everything below starts collapsed (the Live Data monitor is always at the bottom). Click a header to expand/collapse. A ↺ on each row reverts to default. When there are more sections than fit, wheel-scroll over the settings area (a slim thumb appears on the right edge).
Live Data monitor#
The bottom of the inspector shows the node's incoming data live. Keys that are consumed downstream are colored blue and traced all the way up the chain.
- The search field filters the list too, matches on the key name or the current value (e.g. type "cue" or "5B").
- Scroll the list with the wheel.
- Double-click a row → the full-size Value Editor opens in place of the Patch (same style as the Script editor): the value is live until you click into it; Enter commits; footer has Copy Value / Copy Key / Insert into Script / Revert to Live / Close.
- Override: On Enter, a changed value replaces the live one on the node's output every tick; retyping the exact live value (or Revert to Live) drops the override and the editor goes live again. Overridden rows show amber with a ↺ at the right, click it to revert. Every node downstream paints the key amber too (the ↺ only appears on the node that owns the override). Overridden rows stay listed even when the data flow stops (e.g. the override bypassed an upstream node) and ignore the search filter, the revert is always reachable. A node holding active overrides shows an amber underline below its title bar on the canvas. Reverting stops enforcing but does not undo the last written value. Overrides are runtime-only; they are never saved to the show file.
- With the Script editor open, right-clicking a row offers Add "source.key" to Script and Add value to Script, both insert at the editor's caret.
- Right-click a row → Add Trigger on this key, Add Script with this key (pre-filled
output.<key> = <current value>;, forsetting.*/util.*/led.*/status.*keys that means the device is HELD at that value via writeback; the Script editor opens right away), or copy. - Colored
#RRGGBBvalues (cue colors) render in their color. - A waveform strip appears when the track has a cached waveform.
- Double-clicking
waveform.previewRef/waveform.detailRefshows the waveform in the Value Editor;metadata.artworkRefshows the cover art.
Countdown, Counter, Timecode Offset (utility processors)#
Three small nodes on Add Processor. Each shows its live value on the node face (the countdown turns amber at the Warning time and red when done).
Countdown: Pins Start · Stop · Reset → Out.
- Count Down To: Duration (H:MM:SS, MM:SS or seconds); Duration From Data Key (the length is read off the frame that arrives on Start, e.g.
beat.msToNextBar(Milliseconds or Seconds); Time of Day (22:30 or 22:30:00 on this Mac's clock) Stay Done or roll to the Next Day); Next Program Item (the next Schedule slot;label= the artist); Next Cue (the Master deck's or a player's cue list, at the deck's speed;label= the cue). - Start = run / resume, Stop = pause, Reset = back to the full time, stopped. At Zero: Stop (holds 0:00:00, done = 1), Keep Counting (overtime, a negative remain) or Loop (starts over; done pulses for a second,
countdown.loopscounts). - Pin Key blank = the usual trigger rule (a Trigger firing, or
trigger / cue / item / track .activegoing on). Type a key (e.g.midictl.Pads.pad1) to act on that key going from off to on. - Command (Control group) is a momentary popup (Start / Stop / Reset / Restart) the same thing for the inspector, Stream Deck, Companion, Actions and scripts (
<Name>.cd.cmd = "Start"). - Keys (owner-prefixed like everything):
<Name>.countdown.remainMs,.remain(H:MM:SS, rounded up),.remainS,.done,.running,.warning(remaining ≤ Warning At),.progress(0..1),.label,.totalMs,.loops.
Counter: Pins Up · Down · Reset → Out. Step, Minimum, Maximum, At the Limits (Clamp / Wrap / No Limit), Reset To. The Value is a normal setting, saved with the show, settable by hand or any control path. Keys: <Name>.counter.value, .atMin, .atMax. Pin Key and Command as above.
Timecode Offset: In → Out, between a Source / Device / Router and the outputs. Apply To: All Decks, One Deck, or Per Deck (eight offset fields, blank = none); works on a single deck frame and on a whole Source bundle. Offset +HH:MM:SS:FF / -HH:MM:SS:FF (also HH:MM:SS, MM:SS, seconds), frames at the deck's own frame rate or a fixed one. It shifts timecode.ms, re-draws timecode.value, adds to timecode.offsetMs and (with Shift Deck Position Too (on)) playback.positionUS, so LTC / MTC / Art-Net TC outputs follow it in both Time Source modes. Wrap at 24 h (on) turns a negative result into 23:59:59:… like SMPTE pre-roll. The node adds <Name>.tcoffset.ms. Already there and still useful: a Router's −/+ TC offset (LIVE strip, ms, that router only) and each timecode output's own Offset field (that output only), the Timecode Offset node is the one place that shifts everything downstream of it, per deck.
Text variables: $COUNTDOWN (the first running countdown's remain, else the first countdown's), $COUNTDOWNLABEL, $COUNTER (the first counter's value), in OSD text, UDP, Stream Deck text, anywhere $VARIABLES work.
