OSC & MIDI control

For setting it up, see firing cues from a console. This is the message-level detail.

What Cuerunner listens on

InputDefaultNotes
OSCUDP port 53000Every message is published to the Monitor and the run log with its sender and arguments.
MIDIthe ports you tickWith 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.
Timecodeone 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:

MessageEffect
/cuerunner/panic (any arguments)Panic: everything stops with a 200 ms fade.
MIDI All Sound Off — controller 120, value 0, any channel, any listened portThe 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.

AddressEffect
/goGO, exactly as Space: the selected cue of the list in front fires and the selection moves on.
/stop, /hardStopSTOP, as Esc: the list in front is cut where it stands — everything, where no other list is running.
/panicPanic, 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, /togglePauseHold 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}/selectStand on that cue. Nothing fires.
/cue/{number}/goStand on that cue and press GO.
/cue/{number}/startFire 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}/stopStop that cue (and a group's children with it).
/cue/{number}/seek secondsMove 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}/stopStop what is running in that list, and nothing else.
/list/{list}/selectBring that list to the front.
/list/{list}/next, /previousMove that list's place one cue, without bringing it to the front. Nothing fires.
/list/{list}/arm, /disarmPut 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 ownWhat it carries
/cuerunner/playhead/number, /name, /id, /typeThe 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/countEvery 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, /activeHow many cues run, and 1 or 0.
/cuerunner/running/{0–7}/number, /name, /id, /state, /listThe 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, /duration0–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/optionsThe 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

KindMatched onIgnored
OSCThe address, exactly.Arguments.
MIDI notePort, channel and note number.Velocity — a note fires whatever it was played at.
MIDI control changePort, channel and controller number.Value.
MIDI program changePort, channel and program number.—
Show controlEvery field the console sent: command, format, device ID, and the cue and list where they are carried.—
KeyA 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 dayA 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.—
TimecodeThe 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

CueWhat goes out
OSC cueEach 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 cueIts list of messages, on the cue's port or the show's default output.
MIDI File cueThe 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 cueAn MSC message: command, equipment format, device ID (127 reaches everything), and cue and list where the command carries them.
Light cueNothing 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 cueMTC: 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 cueOne 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 cueThe 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.