OSC & MIDI control
For setting it up, see firing cues from a console. This is the message-level detail.
What Cuerunner listens on
| Input | Default | Notes |
|---|---|---|
| OSC | UDP port 53000 | Every message is published to the Monitor and the run log with its sender and arguments. |
| MIDI | the ports you tick | With none ticked, every input is opened. An interface that disappears mid-show is reported, because a cue sending down it would otherwise play nowhere in silence. |
| Timecode | one source at a time, chosen in Settings → Timecode. | MTC quarter frames and full-frame locates (F1 0n, F0 7F dd 01 01 hh mm ss ff F7) on a MIDI input; LTC on an audio input channel; ArtTimeCode (OpCode 0x9700) on UDP 6454. Lock and loss are alarms in the Monitor and the run log. |
Panic from anywhere
Two messages stop the show whoever sends them, with no cue written for them:
| Message | Effect |
|---|---|
/cuerunner/panic (any arguments) | Panic: everything stops with a 200 ms fade. |
| MIDI All Sound Off — controller 120, value 0, any channel, any listened port | The same. |
Both are acted on where the engine is rather than in the window, so the fade starts
whether or not the interface is answering. The lights follow the show's own
On panic rule (Lighting → Network): they hold where they are unless
the show says release or black out. A window that stops answering is not a panic for
the lights — they run beside the engine, not in the window. The run log records the sender:
[main] panic (osc): /cuerunner/panic from 192.168.1.24:8000.
The remote
The OSC port also answers the transport, so a tablet or a console can run the show
without a cue written for each press. Two namespaces are answered: Cuerunner's own,
under /cuerunner, and QLab's bare one — with or without the
/workspace/{id} prefix QLab's remotes send — so a remote set up for QLab
on port 53000 runs a Cuerunner show unchanged. Verbs are read without regard to case
or underscores: hardStop, hardstop and hard_stop
are one address.
| Address | Effect |
|---|---|
/go | GO, exactly as Space: the selected cue of the list in front fires and the selection moves on. |
/stop, /hardStop | STOP, as Esc: the list in front is cut where it stands — everything, where no other list is running. |
/panic | Panic, answered where the engine is, as /cuerunner/panic is. |
/pause, /resume, /togglePause (also /pause_toggle) | Hold the whole show, let it go on, or whichever it is not — as P does. |
/cue/{number}/pause, /resume, /togglePause | Hold one playing audio, video or MIDI file cue while the rest of the show goes on, and let it go. |
/select/next, /select/previous (also /playhead/…) | Move the selection one row, over the rows the list shows. Nothing fires. |
/select/{number}, /cue/{number}/select | Stand on that cue. Nothing fires. |
/cue/{number}/go | Stand on that cue and press GO. |
/cue/{number}/start | Fire that cue where it is; the selection stays where the operator left it. A disarmed cue is not fired, and the log says so. |
/cue/{number}/stop | Stop that cue (and a group's children with it). |
/cue/{number}/seek seconds | Move a running audio cue to that many seconds into its region. |
/cue_id/{id}/… | The same verbs, for the cue with that id. QLab counts a cue list as a cue, and so does this: /cue_id/{list id}/go is GO on that list, /stop stops it and /select brings it to the front. A list imported from QLab keeps QLab's id. |
/list/{list}/go (also /cueList/…, /cueLists/…; /start) | GO on that list's own place, without bringing it to the front. The list is named by its id, its name (any case) or its place among the tabs counting from 1. |
/list/{list}/stop | Stop what is running in that list, and nothing else. |
/list/{list}/select | Bring that list to the front. |
/list/{list}/next, /previous | Move that list's place one cue, without bringing it to the front. Nothing fires. |
/list/{list}/arm, /disarm | Put the list back in the show, or take it out: a disarmed list fires nothing, by GO, trigger or clock. |
{number} is the cue's number as the list shows it, or
selected / playhead for the cue the selection stands on.
Every press is written to the run log with its sender — GO from OSC /go from
10.0.0.5:53001 — and a number the show does not have is an error line rather
than a silence. The repeat guard (Settings → General) stands in front of the remote
as it does in front of a trigger, so a desk that sends twice steps once. An address
a cue's own trigger answers is left to that cue: a show that wired /go
to one cue keeps it.
Turn the remote off with the Remote box under Settings → Network; triggers and
/cuerunner/panic still answer. Allow from closes the port
to everyone not on its list — triggers, remote and Monitor alike.
Feedback
The port answers questions as well as commands, from the state the window last
published, and never fires anything for one. A remote written for QLab is answered
the way QLab answers: on /reply/ followed by the address it asked, with a
JSON document — {"workspace_id", "address", "status": "ok", "data"} —
sent back to the address and port it came from. /cue/selected/…,
/cue/playhead/…, /cue/{number}/… and
/cue_id/{id}/… answer number, name,
displayName, type, uniqueID,
armed, colorName, notes,
isRunning, isPaused, actionElapsed,
duration and percentActionElapsed;
/runningCues, /runningOrPausedCues,
/selectedCues, /cueLists (every list, each with its own cues),
/workspaces,
/version and /thump answer too. The same address with a
value is QLab's setter, and is not answered: a remote does not edit the show. A list
is a cue to QLab: /cue_id/{list id}/playbackPosition is that list's own
playhead. /updates 1 asks for QLab's pushes:
/update/workspace/{id}/cueList/{list id}/playbackPosition when any list's
playhead moves, and /update/workspace/{id}/cue_id/{id} when a cue starts, stops or
is held.
| Cuerunner's own | What it carries |
|---|---|
/cuerunner/playhead/number, /name, /id, /type | The cue the list in front's GO fires next; empty strings at the end of it. |
/cuerunner/lists/count; /cuerunner/list/{place}/id, /name, /playhead/number, /playhead/name, /playhead/id, /running/count | Every cue list by its place among the tabs, counting from 1 — the place /list/{place}/go names it by — with its own playhead and how many of its cues run. A list that goes is emptied once. |
/cuerunner/running/count, /active | How many cues run, and 1 or 0. |
/cuerunner/running/{0–7}/number, /name, /id, /state, /list | The running cues as slots, in show order, each with the name of the list it runs in. A slot that empties is written once as empty. |
/cuerunner/running/{0–7}/progress, /elapsed, /remaining, /duration | 0–1 and seconds, at the feedback's rate; −1 where nobody can say (a loop for ever). A freed slot gets one zeroing pulse. |
/cuerunner/cues/count, /cuerunner/cues/options | The list, and a JSON list of [number, "number — name"] a dropdown takes as its values. |
These go to the destination Settings → Network names, and to every remote that sent
/cuerunner/feedback/subscribe — to its own port, or to the port it gives
as the argument — until it sends /cuerunner/feedback/unsubscribe; sixteen
at most, the oldest dropped. /cuerunner/feedback/request sends everything
now. A change is pushed at most twenty times a second however fast the show moves, and
a playing cue's progress is carried on between the window's updates.
What a trigger matches
| Kind | Matched on | Ignored |
|---|---|---|
| OSC | The address, exactly. | Arguments. |
| MIDI note | Port, channel and note number. | Velocity — a note fires whatever it was played at. |
| MIDI control change | Port, channel and controller number. | Value. |
| MIDI program change | Port, channel and program number. | — |
| Show control | Every field the console sent: command, format, device ID, and the cue and list where they are carried. | — |
| Key | A key on this machine and its modifiers — F7, Shift+Q, typed or taken with Record — while the window has the keyboard and no field or dialog does. A key the app already answers (Space, Esc, P, F5, F6, the arrows, the number row, the menus' shortcuts, full screen) is refused with what it does, named the way this keyboard labels it — ⌘S on a Mac, Ctrl+S elsewhere — and so is a key a cart tile already answers; a key another cue answers is said, and fires both. | A key held down: it is one press. |
| Time of day | A time on this machine's clock (19:30 or 19:30:15) on the days ticked — none is every day. A time that went by while the show was closed or the machine asleep is skipped and said in the log, or fired late if it is no more than its grace behind (1–60 minutes); either way only the latest is counted. | — |
| Timecode | The frame of the incoming clock, at the rate it is read at — typed as a label, as seconds from midnight (3610s), or taken from the running clock with Take: the cue fires as the clock runs through it, once per pass, and again after the clock goes back before it. A skip of up to the tolerance still fires; a locate past it does not, unless chase is on. | Which wire the clock came in on. |
A trigger fires its cue exactly as GO would, pre-wait and advance included. A disarmed cue ignores its triggers. The repeat guard (Settings → General) applies to triggers as well as to the space bar.
What Cuerunner sends
| Cue | What goes out |
|---|---|
| OSC cue | Each message's address and typed arguments, in order, to its patch's host and port or its own, from the interface Settings → Network names. |
| MIDI cue | Its list of messages, on the cue's port or the show's default output. |
| MIDI File cue | The file's own messages — notes, controllers, programs, bends, pressure and SysEx; never its meta events — at the file's times, through the cue's channel map and transposition, on the cue's port or the show's default output. On a stop: a Note Off for every note it started and Sustain (CC 64) 0 on each channel it used; on PANIC, All Notes Off (CC 123) on those channels too. |
| Show Control cue | An MSC message: command, equipment format, device ID (127 reaches everything), and cue and list where the command carries them. |
| Light cue | Nothing of its own: it hands the lighting engine its look, and the engine sends every universe that has an output — on a change, and again every 800 ms unchanged, at up to 44 frames a second. sACN (E1.31) data packets carry the machine's source name and component identifier, the output's priority and, when the show synchronises, the sync universe, followed by a universe synchronisation packet; Art-Net 4 sends ArtDmx, then ArtSync when synchronised. Stopping the output sends sACN's stream-terminated packets three times, so a receiver lets go at once. |
| Timecode cue | MTC: a full-frame message (device 7F) where the clock starts, pauses or is located, then four quarter frames a frame, each set of eight starting on an even frame. LTC: the 80-bit SMPTE word, biphase-mark, at the cue's level on its output channel, with the drop-frame flag set at 29.97 drop-frame. ArtTimeCode: one 19-byte datagram a frame. 29.97 non-drop has no code of its own in MTC or Art-Net and is sent as 30. |
| Mic cue | One request to the receiver: { "mute": true } or false, for one channel, and nothing else — no name, no gain, no level. Then a read of that channel to confirm it took. Muting a channel that is already muted is not an error; it is the state asked for. |
| Scene cue | The scene's membership first — which channels it places on which faders, and the faders it takes them off — then each mic's mute, for the channels a recall moves and no others. Nothing outside the show's own channels is named: a mute carries the channel's own number, never a fader's, and a channel the scene leaves off every fader is closed. A mic that changes fader is never muted by the move: it keeps playing and takes the new fader's position. The membership goes over the desk's own route — an SQ's control service on TCP 51326, an Avantis's NRPN 40 on the desk link — and a desk with no membership route reports the gap while the mutes go anyway. |
The desk a scene cue drives is set up once in Show Settings → Channels, where the read-back line says which of the show's channels a recall will touch and what the desk it names can be told. What goes out is the difference against what Cuerunner last sent, held for the session and never undone, and each write is remembered as it lands: there is no read-back of a recall's own writes, so a fader moved by hand at the desk is invisible here: recalling a scene again sends only what has changed since the last send, and that record lives for as long as the show is open. Reopening the show forgets it, and the next recall writes every channel the scene controls.