StageGlass Scenic User Guide Preview · Scenic is coming

Chapter 08

Timecode, OSC and Stream Deck

Scenic can take cues from outside: timecode from the sound cart or a playback track, and OSC from a lighting desk, QLab or a Stream Deck. Both go into the Server by the same road as a Controller's cue, so they are checked, logged and reported on each screen in exactly the same way.

Timecode

The Timecode window (⌘5, or Window ▸ Timecode, ⌥⌘C) holds a timeline of cues that fire at set times: slide changes, blackouts, dims, grades, Snapshots, VFX, triggers and video.

The Timecode window: lanes per group with cues on a timeline, and the cue list below.
The Timecode window: lanes per group with cues on a timeline, and the cue list below.

Cues are run by the Server, not by a Controller, so they fire whether or not any Controller is open.

The clock

Choose the source at the top right:

  • LTC: Scenic chases linear timecode coming into an audio input on the Server Mac. Choose the input and channel from the input menu. The first time, macOS asks to let Scenic Server use the microphone; allow it. If it was refused, the window says so and Open Privacy & Security… takes you to the setting.
  • Internal: Scenic runs its own clock. Use the transport buttons: return to start (↩), play and pause (Space), and stop, which returns to the last locate point.

Frame rate: 23.976, 24, 25, 29.97 DF, 30 or 60 (60 is internal only). Stop the transport to change it.

The big readout and the state beside it are the first thing to look at: Locked or Chasing while LTC is coming in, Freewheel for a moment after it drops, No Signal, or Running, Paused and Stopped on the internal clock. When LTC drops, nothing fires until it comes back.

Arming

The Armed button decides whether cues fire at all. Disarmed, the window says "Cues are disarmed. Nothing will fire." Each cue can also be switched off on its own with the checkbox in the cue list.

When the playhead jumps decides what happens when timecode jumps (a locate, a new take): Re-arm only just gets ready for the next cue; Restore screens puts the screens into the state they should be in at the new time.

Lanes and cues

A cue sits on a lane, and a lane is a target: a group, a Player or a single screen. Add Lane chooses which. A cue always fires at its lane's target, never at whatever happens to be selected in a Controller.

To add a cue, click the timeline where you want it and press Add Cue at Cursor, or press Add Cue under the cue list, or right-click the timeline. Then set:

ActionChoices
SlideGo to slide #, Next, Previous, Shuffle
BlackoutOn or off
DimA level
GradeBrightness, colour temperature, contrast
SnapshotRecall a Snapshot
VFXA preset, or off
TriggerA slot, with Loop or Hold last frame
VideoPlay, Pause, Faster, Slower

Give each cue a Name ("Board up", "Pilot call") so the timeline reads like the script.

Snap (Frame, 1 s or Off) lines cues up as you drag them. Follow Playhead keeps the playhead in view. Cue List shows every cue as a table; Firings lists what fired, when, and how it went: Fired, Blocked by lock, Disarmed, or Not sent. The Cues menu exports and imports a cue list.

Follow Timecode: a video that follows the timecode

Follow Timecode locks the video on one screen to the timecode coming in, so a sound department's Pro Tools can play, stop, jump and scrub a lyric video. It is off for every screen until you switch it on, and it is a switch on the screen's card.

The timecode comes into this Mac (the Controller), the one that runs the Server, not into the Player. Use Timecode ▸ Input Setup to choose the audio device and channel. It shows a level meter for the channel (and small meters for the others), the timecode it reads, its frame rate and one state: Receiving, No signal, Too low, Clipping or Audio but no readable timecode. If it hears timecode on another channel it says "Signal found on Channel 2 — switch?".

  1. Send the video to the screen and let it play.
  2. On the screen's card, switch Follow Timecode on. This also starts the timecode input.
  3. Line the video up: with the timecode parked on a moment you can recognise in the video, open Window ▸ Transport (⌥⌘T), scrub the video to the matching frame with its scrubber and press Sync Here. It sets the line-up from the timecode now and the video's position now, so extra seconds at the start of the video, or of the song, are both handled. The line-up reads as a sentence: "Timecode 01:00:00:00 = video 0:05.00". −1 frame and +1 frame nudge it, and Type the line-up… takes both values.

The card says what the screen is doing:

The card saysMeaning
Following · TC 01:00:12:14The video is locked to the timecode.
Seeking…The timecode jumped or is being scrubbed; the video is going to each new position.
No timecode · holdingNo fresh timecode for half a second. The picture holds its frame. It does not say Pro Tools stopped, because a stopped transport and a pulled cable look the same.
Before video start · holding first frameThe timecode is before the line-up's start.
Past video end · holding last frameThe video has ended. It never loops and never moves the slide on.
Manual · Follow suspendedYou pressed Play, Pause, Seek, Next or Previous on that screen. Resume Following goes back to the timecode.
Blackout · following underneathBlackout always wins; the picture stays black while following continues, so a reveal is on the right frame.
Following · no video on this slideThe slide has no video.

The card and the Transport window show both where the Server aimed the video and where the Player last reported it, with how old that report is. A frame-rate mismatch between the timecode and the video is shown as a warning; the video still follows by time.

OSC

OSC (Open Sound Control) lets a lighting console, QLab, Bitfocus Companion, TouchOSC or any other OSC sender cue Scenic over the network. The Server receives it; Controllers and Players never do.

Turning OSC on

Open Settings ▸ OSC on any Mac Controller.

  1. Turn on Enable OSC. The status line reads "Listening on UDP port 8000."
  2. Leave Port at 8000 unless your console needs another.
  3. Listen on: Show network lets any console on the show network send. This Mac only refuses everyone else.
  4. Optional: list Allowed Sources, such as 192.168.1.0/24 or one console's address, to accept only those.

The settings belong to the Server's Mac, not to a Show.

More options in the same pane:

  • Send feedback sends status (blackout, slide, dim, each screen's delivery) to a Destination address and port, for a console that shows it.
  • OSC over TCP also listens for TCP on the same port, for consoles that prefer it.
  • Discoverable (OSCQuery) publishes the whole address space, with the open Show's Player, group and Snapshot names, so an OSCQuery-aware app can browse it (port 8001).
  • Duplicate window (0.1 seconds) ignores the same command twice from the same sender within that time, which tames bouncing buttons. A different value or target always goes through.
  • Log lists every message with its time, sender, address and outcome: Done, Refused, Locked, Duplicate or Not understood.
  • Address Catalog lists every address Scenic understands.

What a command acts on

/scenic/next with no target acts on the OSC selection: All Players, until a console sends a /scenic/select/.... Add a target to the address to be exact:

AddressActs on
/scenic/nextThe OSC selection (All Players by default)
/scenic/all/nextEvery Player in the Show
/scenic/group/Office_Wall/nextEvery screen in the group "Office Wall"
/scenic/player/Booth_Mac_1/nextOne Player
/scenic/player/Wall_Mac/screen/2/nextOne screen of a Player
/scenic/alias/Hero_Laptop/nextA Player or screen by its alias

Names use underscores for spaces and ignore case. A name that matches nothing, or more than one thing, is refused and logged, never guessed. To copy an exact address, right-click a screen or group in the Player List and choose Copy OSC Address.

Settings ▸ General ▸ OSC follows the Player List selection changes the default: an untargeted command then acts on what is selected in a Controller's Player List. Use it when the console operator and the Scenic operator are working the same screens together.

While the Show's input lock is on, every OSC command is refused and logged. A Controller's Interface Lock does not stop OSC.

Common cues

DoSend
Next/scenic/next
Previous/scenic/previous
Go to slide 12/scenic/goto 12
Black out/scenic/blackout/on
Reveal/scenic/blackout/off
Dim to 40 %/scenic/dim 40
Recall the Snapshot for scene 71A/scenic/snapshot/recall "71A"
Fire trigger slot 2/scenic/overlay/trigger/2
SMPTE bars on / off/scenic/testpattern/smpte_bars / /scenic/testpattern/off
Roll the internal timecode/scenic/timecode/play

Stream Deck through Companion

Bitfocus Companion turns an Elgato Stream Deck into a button panel. Scenic has a Companion module, StageGlass Scenic.

  1. On the Server's Mac, turn on OSC (above). If Companion runs on another computer, leave Listen on at Show network.
  2. In Companion, add a StageGlass Scenic connection.
  3. Set Server address to the Server Mac's IP address, OSC port to 8000, and Transport to UDP (or TCP if you turned on OSC over TCP).
  4. Drag the presets onto buttons: Next (All Players), Previous (All Players), Blackout toggle (All Players), Computer Labels toggle (All Players) and Server status.

Actions include Next slide, Previous slide, Go to slide, Blackout (toggle, on or off), Computer Labels, Recall Snapshot, Select target for OSC and a Custom OSC command. Each can target the OSC selection, All Players, a Player, one screen, a group or an alias. Refresh Player, group and Snapshot names reloads the lists after you change the Show.

Buttons can show what happened: a screen's feedback lights amber when the Server has accepted a cue and green when the Player reports it on screen. Other feedbacks show when blackout is on and whether the Server is answering. Variables carry the slide, slide count, connected Players, blackout, dim and timecode for button labels.

OSC address reference

This is the Server's own address table.

Connection

SettingValue
TransportUDP, OSC 1.0 (messages and bundles). Optionally TCP with SLIP framing (OSC 1.1) on the same port number.
Default port8000
DiscoveryOptional OSCQuery: the address space as JSON over HTTP (default port 8001), advertised as _oscjson._tcp.
Default listenerThe show network: any console on it can send once OSC is on. Listing allowed sources narrows it to those addresses; This Mac only refuses everyone else and names them in the log.
Argument typesint32 int64 float32 float64 string blob true false nil impulse

Numeric arguments accept any numeric type or a numeric string: 20, 20.0 and "20" all mean 20. Values outside a range are clamped to it, except slide numbers, which must be 1 or more. Extra trailing arguments are ignored. A command that cannot be understood is rejected and logged in the Network window.

Address spaces

Every address starts with /scenic. Where a command has a shorter form, both are listed.

FormTargets
/scenic/<command>the OSC selection: All Players until a /scenic/select/...
/scenic/player/<name>/<command>one Player
/scenic/player/<name>/screen/<n>/<command>one screen of a Player (n starts at 1, as in the Network window)
/scenic/group/<name>/<command>every member of a group
/scenic/all/<command>every Player in the show
/scenic/alias/<alias>[/screen/<n>]/<command>a Player by alias

Names use underscores for spaces and ignore case: Stage_Left is "Stage Left". A name that matches more than one Player is refused, never guessed. Commands marked show apply to the whole show and take no target prefix. Commands marked Player cannot be sent to a single screen. The same command sent twice within the duplicate window (default 0.1 s) is delivered once; a different value or target is always delivered.

Replies and updates

These follow QLab's conventions. They describe the conversation with one console and never change what the screens show. Each also works under /scenic (/scenic/thump).

MessageArgumentsReply
/thumpnone/reply/thump at once. A heartbeat: send one at least every 60 seconds to stay known.
/alwaysReplyint 1 or 0 (no argument means 1)Turns replies to action messages on or off for this sender. Queries are always answered.
/updatesint 1 or 0 (no argument means 1)Subscribes this sender to status: every /scenic/status/... value at once, then each change.

A reply goes back to the sender, the way the message came (UDP or TCP), at /reply followed by the address it answers, for example /reply/scenic/next. Its one argument is a JSON string: {"address": "/scenic/next", "status": "ok", "data": ...}. The status is ok when the Server accepted the command or answered the query, denied when the Show's input lock or a takeover stopped it, and error otherwise; data then holds the reason. A query's data is its answer, and a Snapshot recall or capture's data is its outcome.

A sender the Server has not heard from for 60 seconds is forgotten: it must send /alwaysReply and /updates again. A sender that is not allowed is never answered.

Slide & Build

AddressArgumentsMeaningTargets
/scenic/slide/next /scenic/nextnoneAdvance to the next slide or build.screen
/scenic/slide/prev /scenic/slide/previous /scenic/previous /scenic/prevnoneGo back one slide or build.screen
/scenic/slide/goto /scenic/gotoint slide number, 1-basedJump to a slide. 0 and below are rejected, never clamped.screen
/scenic/build/nextnoneNext build (same as next slide).screen
/scenic/build/prevnonePrevious build (same as previous slide).screen
/scenic/shufflenoneAssign slides at random across the targeted Players.Player

Blackout & Dim

AddressArgumentsMeaningTargets
/scenic/blackout /scenic/blackout/togglenoneToggle blackout.screen
/scenic/blackout/onnoneBlack out.screen
/scenic/blackout/offnoneClear blackout.screen
/scenic/dimint or float percent, 0-100Set the dim level.screen
/scenic/brightness/adjustint delta, -100...100Change brightness relative to the current dim.screen

Video

AddressArgumentsMeaningTargets
/scenic/video/playnonePlay video.screen
/scenic/video/pausenonePause video.screen
/scenic/video/togglenoneToggle play and pause.Player
/scenic/video/speedupnoneIncrease playback speed.screen
/scenic/video/slowdownnoneDecrease playback speed.screen

Audio

AddressArgumentsMeaningTargets
/scenic/audio/mutenoneMute video audio.Player
/scenic/audio/unmutenoneUnmute video audio.Player
/scenic/audio/volumefloat 0.0-1.0Set video volume.Player

Color & Grading

AddressArgumentsMeaningTargets
/scenic/kelvinint 1800-12000Set color temperature in Kelvin.screen
/scenic/tempint or float -100...100Nudge the warm/cool bias from the current Kelvin.screen
/scenic/temp/resetnoneReset color temperature to 6500 K.screen
/scenic/contrastfloat 0.0-2.0 (1.0 is neutral)Set contrast.screen
/scenic/contrast/adjustfloat delta, -2.0...2.0Change contrast relative to the current value.screen
/scenic/rgbfloat red, float green, float blue, each 0.0-1.0Set per-channel gain.screen
/scenic/gamma9 numbers (blackR gammaR whiteR blackG gammaG whiteG blackB gammaB whiteB), then int apply 0/1Set black, midtone gamma and white per channel. Black and white are -0.5...1.5, gamma 0.1-3.0.screen
/scenic/gamma/resetnoneReset gamma to identity.screen
/scenic/gamma/applyint 0/1Turn the current gamma settings on or off.screen
/scenic/grading/resetnoneReset dim, Kelvin and contrast to 0%, 6500 K and 1.0.screen

Overlays

AddressArgumentsMeaningTargets
/scenic/names/shownoneShow Player name overlays.screen
/scenic/names/hidenoneHide Player name overlays.screen
/scenic/names/togglenoneToggle Player name overlays.screen
/scenic/vfx /scenic/vfx/togglenoneToggle the VFX overlay.screen
/scenic/vfx/onnoneEnable the VFX overlay.screen
/scenic/vfx/offnoneDisable the VFX overlay.screen
/scenic/vfx/cycleint direction, optional (negative goes back; default forward)Step through the VFX presets.screen
/scenic/vfx/presetstring preset name (case-insensitive, underscores read as spaces)Enable VFX with a named preset. Deterministic; prefer it to cycle in cue lists.screen
/scenic/logo /scenic/logo/togglenoneToggle the logo overlay.screen
/scenic/logo/onnoneShow the logo overlay.screen
/scenic/logo/offnoneHide the logo overlay.screen
/scenic/messagestring text (first 500 characters)Show a message.screen
/scenic/message/shownoneShow the current message.screen
/scenic/message/hidenoneHide the current message.screen
/scenic/message/clearnoneClear the message text and hide it.screen

Trigger Overlays

AddressArgumentsMeaningTargets
/scenic/overlay/trigger/<slot>noneFire trigger overlay slot <slot> (1-based, 1 to the configured slot count; default 5). Last wins.screen
/scenic/overlay/offnoneStop the playing trigger overlay.screen
/scenic/overlay/togglenoneToggle the active slot's trigger overlay.screen

Test Patterns

AddressArgumentsMeaningTargets
/scenic/testpattern/offnoneTurn the test pattern off.screen
/scenic/testpattern/<name>noneShow a test pattern. Names are listed below.screen

Aspect

AddressArgumentsMeaningTargets
/scenic/aspect/<mode>noneSet the aspect mode: fit, fill or stretch.screen

Snapshots

AddressArgumentsMeaningTargets
/scenic/snapshot/capturestring name, optionalCapture a Snapshot. With no name it is filed under a timestamp label, like the capture sheet.show
/scenic/snapshot/recallstring nameRecall a Snapshot by exact name (case-insensitive, underscores read as spaces). When no name matches, by its scene number, or its scene and take with any separator between them (71A, 71A_Wide). The newest match wins; no partial matching.show

Timecode Transport

AddressArgumentsMeaningTargets
/scenic/timecode/playnoneRoll from the current position.show
/scenic/timecode/pausenoneHold at the current position.show
/scenic/timecode/togglenoneToggle play and pause.show
/scenic/timecode/stopnoneHalt and return to the last locate point.show
/scenic/timecode/rtznoneReturn to zero.show
/scenic/timecode/locatestring HH:MM:SS:FF, or int/float secondsJump to a position. Timecode strings resolve at the project rate.show

Selection

AddressArgumentsMeaningTargets
/scenic/select/playerstring Player nameMake one Player the OSC selection.show
/scenic/select/groupstring group nameMake a group the OSC selection.show
/scenic/select/aliasstring aliasMake the Player or screen with this alias the OSC selection.show
/scenic/select/screenstring Player name, int screen number (1-based)Make one screen of a Player the OSC selection.show
/scenic/select/allnoneMake All Players the OSC selection.show
/scenic/select/clearnoneReturn the OSC selection to All Players.show

Queries

AddressArgumentsMeaningTargets
/scenic/query/playersnoneReply on /status/players to the feedback destinations.show
/scenic/query/groupsnoneReply on /status/groups to the feedback destinations.show
/scenic/query/selectionnoneReply on /status/selection to the feedback destinations.show
/scenic/query/timecodenoneReply on /status/timecode to the feedback destinations.show
/scenic/query/snapshotsnoneReply on /status/snapshots to the feedback destinations.show

Test pattern names

solid_white (Solid White), gray50 (50% Gray), solid_red (Solid Red), solid_green (Solid Green), solid_blue (Solid Blue), simple_bars (Simple Bars), smpte_bars (SMPTE Color Bars), camera_color_card (Camera Color Card), gamma_pattern (Gamma Pattern), ramp (Grayscale Ramp), crosshatch (Crosshatch Grid), full_hdtv (Full HDTV), audio_sync (Audio Sync), led_wall (LED Wall), arib_bars (ARIB Bars), hdr_bars (HDR Bars), sdi_bars (SDI Pathological)

Names ignore case and underscores, so SMPTE_Bars and smptebars also work.

On the Server

OSC is received by the Scenic Server, not by a Controller or a Player. It is off until you turn it on in Settings, and the setting belongs to the Server Mac, not to a Show. If the port is in use the Network window says so; the Server never moves to another port.

An OSC command goes down the same path as a Controller's: it is accepted or refused by the Server, sent to each screen once, and shown in the operation history as coming from OSC. Once OSC is on, any console on the show network can send; Allowed Sources narrows that, and This Mac only refuses everyone else and names them.

RuleWhat happens
Target namesA Player is named by its name or its alias, a group by its name. The Server resolves the name when the command arrives. A name that matches nothing, or more than one thing, is refused and logged; it is never sent to a guess.
Selection/scenic/<command> acts on the OSC selection: All Players until a /scenic/select/.... The Server keeps one OSC selection for every console; it is not a Controller's selection, and every Controller shows it in Settings ▸ OSC. /scenic/select/clear returns it to All Players. A chosen Player, group or screen is fixed when the select arrives; if those screens leave the Show, a bare command is refused rather than sent elsewhere.
Follow the ControllerThe Show setting "Follow the Controller's Player List selection" (Settings ▸ OSC) changes that: /scenic/<command> then acts on whatever is selected in a Controller's Player List, as the Controller last told the Server, and All Players until a Controller has. With nothing selected there, a bare command is refused. A console's /scenic/select/... is still remembered and applies again when the setting is turned off.
Screen numbersscreen/<n> counts a Player's screens in Network window order, from 1.
Whole-Player commandsA command marked Player is refused if the target holds only some of a Player's screens.
TogglesA toggle acts on each screen from that screen's own state.
DuplicatesThe same command from the same sender inside the duplicate window is delivered once.
Input lockWhile the Show's input lock is on, every OSC command is dropped and logged as blocked. It is not queued. A Controller's own Lock Interface does not stop OSC.
Video on several screensA Play or Pause for more than one screen is started on every screen at the same instant, about a third of a second after it arrives, when every Player in scope supports it. Otherwise all act at once.
Volume/scenic/audio/volume is refused, naming the Player, when a Player in scope cannot set a volume.
Offline screensThe command goes to the screens that are reachable, and the log names the screens it did not reach. If none is reachable, it is refused. /scenic/all/... reaches only the Players in the Show, never another Player on the network.
LogSettings ▸ OSC ▸ Log lists each message with its time, sender, address, outcome and reason: done, refused, blocked, duplicate or not understood.
FeedbackStatus goes to the feedback destinations from what the Players report, on change and at most every 200 ms per address. A query or a Snapshot from a console is answered at once.
RepliesA query is always answered to its sender at /reply/.... After /alwaysReply 1, every command is answered once the Server has handled it: ok when accepted, denied when the input lock or a takeover stopped it, error with the reason otherwise.
UpdatesAfter /updates 1, the sender receives every status value at once and then each change, like a feedback destination, without being listed in Settings. It is forgotten after 60 seconds without a message; a /thump keeps it.
OSC over TCPOff by default. When on, the Server also listens for TCP on the OSC port, with SLIP framing (OSC 1.1). A TCP console is answered on its connection.
OSCQueryOff by default. When on, the Server serves its whole address space as JSON over HTTP (port 8001 unless changed) and advertises it on the show network as _oscjson._tcp, named Scenic Server. Each command has its type, range and description; the dim level, slide numbers and status carry their current values; Player, screen and group branches and the Snapshot and VFX preset choices use the open Show's names. ?HOST_INFO names the OSC port.

Feedback

With feedback on, the Server sends status to each destination as UDP OSC under /scenic/status/: blackout, slide (index from 0, count), connected, overlay (active, slot from 1), dim, testpattern, timecode (state, position) and one screen row per screen (Player, screen from 1, delivery, slide from 0, slide count, blackout). A screen's delivery is sent until the Player acknowledges the Server's last command to it, accepted once it has, and observed only when the Player reports the result; offline, differs and failed say what went wrong. A Companion button shows accepted in amber and observed in green. Values are what the Players report: blackout is 1 when every connected screen is black, and dim is the deepest dim. A change goes out at once and then at most every 200 ms per address, ending on the newest value. Every value is sent again when the listener starts, when a destination is added and when another Show opens.

A console's query/players, query/groups, query/selection, query/timecode and query/snapshots are answered on the matching status/ address. A Snapshot recalled or captured from a console is answered on status/snapshot with captured, recalled (with screens reached and total), notfound, nomatch or failed. When names repeat, the newest capture wins.