Appearance
External Show Control — IN/OUT Commands
This guide explains how to connect Exaplay 3 to an external show control system (ETC Eos lighting console, Medialon, QLab, Crestron, Q-SYS, CueLab, Alcorn McBride, a custom PLC, or any other device that can send network commands). It covers every supported protocol, with tested command examples and a troubleshooting checklist for each direction.

Part 1 — Commands INTO Exaplay (Incoming)
1A — HTTP Control (most flexible)
Any device that can send an HTTP POST request can control Exaplay.
Fire a cue by name:
bash
curl -X POST http://192.168.1.5:8123/cue/trigger \
-H "Content-Type: application/json" \
-d '{"name": "Scene 1 - Opening"}'Scoping to one composition: without a scope,
/cue/triggerfires the first matching cue across all compositions in project order. If several Timelines share a cue name (e.g. every act has a "Blackout" cue), add"comp": "comp_act2"(orcomp-uid) to disambiguate.
The same "trigger cue X in composition Y" action looks different on each protocol — the cue argument always accepts either the index or the cue name:
| Protocol | "cue 5 in comp_act2" | "cue Blackout in comp_act2" |
|---|---|---|
| TCP / UDP dotted (primary) | comp_act2.cue.go=5 | comp_act2.cue.go=Blackout |
| TCP / UDP classic | set:cue,comp_act2,5 | set:cue,comp_act2,Blackout |
| HTTP | POST /project · {"req":"cue.go","comp-uid":<uid>,"cue":5} | {"req":"cue.go","comp-uid":<uid>,"name":"Blackout"} |
| OSC | /exaplay/comp_act2/cue 5 | /exaplay/comp_act2/cue "Blackout" |
Play a composition by name (shortcut — no UID lookup required):
bash
curl -X POST http://192.168.1.5:8123/composition/play \
-H "Content-Type: application/json" \
-d '{"name":"Main Show"}'Transport control (play/pause/stop/seek by UID), Playlist navigation, and setting any property value (e.g. layer opacity) all go through POST /project with the matching req. Full endpoint list, request/response bodies, and error responses: HTTP REST API.
Stop all playback:
bash
curl -X POST http://192.168.1.5:8123/stopTip: To find the correct path for any property, open it in the Inspector, click the 🔗 link icon, and read the path in the panel options.
1B — OSC (Open Sound Control)
OSC is supported by virtually every professional show control system.
Exaplay OSC listen port: 8000 (default — configurable in Config → Network → OSC)
The address pattern is /<prefix>/<composition-id>/<command> — the prefix defaults to exaplay and <composition-id> is the composition's variable name (e.g. comp_main).
| OSC Address | Arguments | Action |
|---|---|---|
/exaplay/<comp>/play | (none) | Start the named composition |
/exaplay/<comp>/start | (none) | Start the named composition (alias for play) |
/exaplay/<comp>/pause | (none) | Pause the named composition |
/exaplay/<comp>/stop | (none) | Stop the named composition |
/exaplay/<comp>/cuetime | f or i (seconds) | Seek to position (client instances only) |
/exaplay/<comp>/cue | i (index) or s (name) | Fire a cue by index or name in a Timeline or Playlist |
/exaplay/global/start | (none) | Start all compositions (play all) |
/exaplay/global/stop | (none) | Stop all compositions (stop all) |
/exaplay/global/showmode | s (on/off/toggle) or i/f (1/0) | Set global Show Mode |
/exaplay/global/restart | (none) or s (project/clean) | Restart exaplay (reload current project, or clean for empty) |
/timecode (configurable) | f, i, or s (HH:MM:SS:FF) | Drive timecode-slaved compositions |
Note: OSC dispatching is keyed by composition variable name — to fire a cue by name (across all compositions), use the HTTP endpoint
POST /cue/triggerinstead.
What a complete OSC command looks like — every message is one UDP packet to <engine-ip>:8000 containing the OSC address and (optionally) one argument. With the default prefix exaplay and a composition whose variable name is comp_main:
/exaplay/comp_main/play # start comp_main (no argument)
/exaplay/comp_main/start # start comp_main (alias for play)
/exaplay/comp_main/pause # pause comp_main
/exaplay/comp_main/stop # stop comp_main
/exaplay/comp_main/cue 5 # trigger cue index 5 in comp_main (int argument)
/exaplay/comp_main/cue "Blackout" # trigger the cue named Blackout in comp_main
/exaplay/comp_lobby/cue 2 # play Playlist item 2 (1-based position)
/exaplay/comp_lobby/cue "Act 1" # play the Playlist item named "Act 1"
/exaplay/comp_main/cuetime 12.5 # seek comp_main to 12.5 s (client instances only)
/exaplay/global/start # global command: start ALL compositions
/exaplay/global/stop # global command: stop ALL compositions
/exaplay/global/showmode "on" # global command: Show Mode on
/exaplay/global/restart "clean" # global command: restart with empty projectTo control a different composition, only the second address segment changes — e.g. /exaplay/comp_lobby/play starts comp_lobby. Get the variable names from the TCP/UDP command get:complist or from the composition's Inspector.
Index semantics for
/cue: on a Timeline the argument is the cue's variable index; on a Playlist it is the 1-based list position — both identical to TCP/UDPset:cueand HTTPcue.go. A string argument is matched against the cue/item name within that composition. (Backward compatibility: Playlist/cuehistorically matched the item's internal variable index; when a numeric argument doesn't resolve to a position, the engine falls back to that legacy match, so old integrations keep working.)
Example — ETC Eos console firing cue 3 in comp_main:
In the Eos Macro editor, add a Network command:
/exaplay/comp_main/cue 3
UDP to 192.168.1.5:8000Example — Qlab sending OSC:
- In Qlab, add a Network cue.
- Set Type to OSC message.
- Set destination to
192.168.1.5:8000. - Set message:
/exaplay/comp_main/play.
Example — Show Mode ON/OFF via OSC:
/exaplay/global/showmode "on"
/exaplay/global/showmode "off"
/exaplay/global/showmode "toggle"Example — Restart exaplay via OSC:
/exaplay/global/restart # restart and reload the current project
/exaplay/global/restart "project" # same as above (explicit)
/exaplay/global/restart "clean" # restart with no project loaded1C — ArtNet Timecode (not supported)
Not supported. ArtNet timecode receive is not supported, so a lighting console cannot drive Exaplay over ArtNet TC. Use OSC, LTC, or MTC for frame-accurate sync instead (see Timecode Sync). ArtNet remains available for DMX output from Data Tracks.
1D — LTC (Linear Timecode via Audio)
- Connect the LTC output from your console to an audio input on the Exaplay ASIO interface.
- Open Config → Audio Settings → Timecode Input.
- Select the channel, set the frame rate to match the console.
- The Transport bar shows TC: Locked when the signal is detected.
1E — TCP Text Protocol
Exaplay accepts persistent TCP connections carrying simple comma-delimited or dotted-path commands. This is ideal for Medialon, Alcorn McBride, Crestron/AMX, and any custom PLC that works natively with raw TCP sockets.
Default port: 8100 (configure in Config → Network → TCP Listen)
→ get:complist
← comp_main,Main Show
← END
→ play,comp_main
← OK
→ set:cue,comp_main,5
← OKEvery command is a single ASCII line terminated by \r or \r\n, answered with one response line (OK, a value, or ERR,<reason>). Full command reference — dotted vs. comma syntax, transport, cue triggering, Playlist navigation, volume/alpha/loop, status queries, global commands, and error codes: TCP Command API.
If UDP control listen is enabled (default port 8200), the same text commands work as fire-and-forget UDP datagrams. See the UDP Command API for details.
Part 2 — Commands OUT of Exaplay (Outgoing)
2A — OSC Output
Exaplay can transmit its current playback position and custom events to any OSC listener.
Configure OSC output:
- Open Config → Network → OSC Output.
- Enter the destination IP and port (e.g.
192.168.1.20:9000). - Choose the Timecode OSC Address pattern.
Exaplay sends /timecode/hh/mm/ss/ff to the configured destination on every frame during playback.
Custom OSC via Data Tracks:
Any Data Track can output to an OSC address. This lets you send a value (float) to any OSC address at any moment in the timeline:
Data Track "LightingMaster"
Output Type: OSC
OSC Address: /eos/fader/1/value
Destination: 192.168.1.20:8000
Keyframes: fade from 0 to 1.0 over 5 seconds2B — ArtNet DMX Output
Exaplay can drive lighting fixtures, dimmers, and LED controllers directly over Art-Net, independent of any lighting console. This is useful for installations where Exaplay is the only show control system.
See ArtNet & DMX Output for the full guide.
2C — UDP Output
Any Data Track can output raw UDP datagrams to any device that accepts them:
Data Track "MotionRig"
Output Type: UDP
Destination: 192.168.1.30:9500The current interpolated value is sent as a 4-byte big-endian float on every frame.
Part 3 — Verifying Communication with the Monitor
The Monitor tab is the single most important tool for diagnosing show control integration issues.
How to Use the Monitor Tab
- Open the Control View (
/control). - Click the 📡 Monitor tab.
- Trigger a command from the external system.
- Check the Event Log for an entry.
What Good Looks Like
| Protocol | Event Log entry |
|---|---|
| HTTP trigger | POST /cue/trigger — 200 OK from 192.168.1.20 |
| OSC received | OSC /exaplay/comp_main/play from 192.168.1.20:8000 |
| ArtNet DMX sent | ArtNet OpDmx → Universe 0 → 192.168.1.50 |
| OSC sent (outgoing) | OSC /eos/fader/1/value 0.75 → 192.168.1.20:8000 |
If an expected entry is missing, the packet never reached Exaplay — see Part 4.
Part 4 — Troubleshooting
No incoming commands received
| Check | What to do |
|---|---|
| IP address | Open Monitor tab → Host Information card → confirm the correct IP address |
| Port | Confirm the sending device is targeting the correct port (REST: 8123, OSC: 8000, TCP: 8100) |
| Firewall | Allow inbound UDP 8000 and TCP 8123, 8100 in Windows Defender Firewall |
| Subnet | Both devices must be on the same subnet (e.g. 192.168.1.x / 255.255.255.0) |
| OSC address | OSC addresses are case-sensitive — /exaplay/comp_main/play ≠ /Exaplay/comp_main/play |
Windows Firewall — allow Exaplay ports:
batch
netsh advfirewall firewall add rule name="Exaplay HTTP" dir=in action=allow protocol=TCP localport=8123
netsh advfirewall firewall add rule name="Exaplay TCP Control" dir=in action=allow protocol=TCP localport=8100
netsh advfirewall firewall add rule name="Exaplay OSC" dir=in action=allow protocol=UDP localport=8000
netsh advfirewall firewall add rule name="Exaplay ArtNet" dir=in action=allow protocol=UDP localport=6454ArtNet timecode not locking
ArtNet timecode receive is not supported — it cannot lock regardless of network setup. Use OSC, LTC, or MTC for external timecode sync (see Timecode Sync).
OSC going out but console not receiving
| Check | What to do |
|---|---|
| Destination IP | Confirm the console's IP in Config → Network → OSC Output |
| Destination port | Confirm the console's OSC receive port matches the configured destination port |
| Console OSC enabled | Many consoles require OSC receive to be explicitly enabled |
| Firewall on the console machine | Ensure the console's firewall allows incoming UDP on the OSC port |
| Monitor Event Log | Outgoing OSC messages should appear in the log — confirm they are being sent |
HTTP control returns 404 or connection refused
| Check | What to do |
|---|---|
| Engine running | The engine (not just the UI) must be running — check the tray icon |
| Port | HTTP control uses port 8123 — ensure no other app is using this port |
| Endpoint path | Check the exact endpoint path (case-sensitive); verify the property path in the Inspector if needed |
| JSON format | Request body must be valid JSON; Content-Type: application/json header is required |
Part 5 — Quick Reference
Incoming commands summary
| Protocol | Port | Enable in |
|---|---|---|
| REST HTTP | 8123 (TCP) | Always on |
| OSC | 8000 (UDP) | Config → Network → OSC |
| LTC | ASIO audio input | Config → Audio → Timecode Input |
| TCP Text Protocol | 8100 (TCP) | Config → Network → TCP Listen |
| WebSocket events | 8123 (WS) | Always on (same port as HTTP) |
Outgoing commands summary
| Protocol | Port | Enable in |
|---|---|---|
| OSC output | Configurable UDP | Config → Network → OSC Output |
| ArtNet DMX | 6454 (UDP) | Data Track → Output Type: ArtNet |
| UDP raw | Configurable | Data Track → Output Type: UDP |
| WebSocket (effects) | 3001 (WS) | Effects Server (auto-started) |
Part 6 — Integration Examples by System
ETC Eos / Ion
- Enable OSC Rx on Exaplay (port 8000).
- In Eos, create a Macro with a Network cue: OSC
/exaplay/comp_main/cue 1→ target192.168.1.5:8000. To trigger a cue by name (any composition), use a Network cue of type String sending an HTTPPOSTtohttp://192.168.1.5:8123/cue/triggerwith body{"name":"My Cue"}instead. - For bidirectional: configure Eos OSC Tx to send timecode, and Exaplay OSC Rx to receive it.
Qlab (Mac)
- Add a Network cue in Qlab.
- Select OSC or HTTP based on preference.
- For OSC: target
192.168.1.5:8000, address/exaplay/comp_main/play(or/exaplay/comp_main/cuewith an integer argument to fire a specific cue). - For HTTP (fires a cue by name across all compositions): target
http://192.168.1.5:8123/cue/trigger, method POST, body{"name":"My Cue"}.
Medialon / Alcorn McBride, Crestron / AMX, Q-SYS (QSC), CueLab
All four connect over the same TCP Text Protocol (some also support REST HTTP or OSC as an alternative) described in 1E above — a persistent socket to port 8100 sending ASCII commands like play,comp_main\r. Ready-to-use client code (SIMPL+/SIMPL# for Crestron/AMX, Lua for Q-SYS, TCP Device config for Medialon/Alcorn, OSC/REST setup for CueLab) and the full command table live in one place: TCP Command API → Connecting from Common Show Control Systems.
CueLab can additionally receive Exaplay's timecode back over OSC, for bidirectional sync:
- In Exaplay, open Config → Network → OSC Output.
- Set destination to
<CueLab machine IP>:<CueLab OSC Rx port>(check CueLab Settings → Network → OSC Input). - Exaplay will send
/timecode/hh/mm/ss/ffon every frame — CueLab can use this to auto-follow Exaplay's timeline.
Summary Checklist
- [ ] Engine IP address confirmed (Monitor tab → Host Information)
- [ ] Firewall rules added for ports 8123 (TCP), 8100 (TCP) and 8000 (UDP)
- [ ] OSC Rx enabled on the correct port
- [ ] OSC Tx configured with the correct destination IP/port
- [ ] ArtNet sync: Exaplay and console are on the same subnet for ArtNet broadcast (if using ArtNet sync)
- [ ] LTC audio channel and frame rate configured (if using LTC)
- [ ] HTTP control tested from the external system
- [ ] Monitor → Event Log shows incoming commands from the external system
- [ ] Monitor → Event Log shows outgoing commands to the external system
- [ ] Full show run-through with all external triggers verified
