The CueSync Bus
AllMost beat bridges publish a clock — bar, beat, BPM, phase. The CueSync Bus publishes what CueSync knows on top of that: where you are in the arrangement, which way the energy is moving, what key the track is in, how many beats until the next drop, and a live three-band split.
It is plain OSC over UDP, fire-and-forget, with no handshake and no subscription. Bind the addresses you care about and ignore the rest. Anything that can receive OSC can be on it — TouchDesigner, Notch, Resolume, Vizibeat, Chataigne, Millumin, Max/MSP, a Raspberry Pi, a Pi Pico with a strip of LEDs.
The same vocabulary works in both directions. CueSync can send the bus, and it can receive it — so an external source can supply the structure for music CueSync has no analysis for.
Turn it on
- Settings → MIDI → CueSync Bus. Off by default; nothing new goes on the wire until you ask.
- Set the host and port of the machine you are sending to. Default port 9002 — not 9001, which is the older Beat Data Broadcast, a separate sender.
- Set the address prefix. Default
/cuesync/bus, soEnergylands at/cuesync/bus/Energy.
That is the whole setup. The bus streams whenever CueSync has a beat source — a CDJ, the internal clock, show playback or a local file.
The addresses
Addresses are <prefix>/<Leaf>. The leaf names are identical to the ones the CueSync for Unreal plugin receives on its own preset path, so a patch written against one reads against the other.
| Address | Arguments | Range / meaning |
|---|---|---|
<prefix>/Beat | int beatWithinBar, int beatsPerBar, int phraseId, int hostMs | The beat pulse. beatWithinBar is 1-based (1 = downbeat). hostMs is monotonic milliseconds since the stream started — diff consecutive values; it is not wall clock. |
<prefix>/Tempo | float bpm | Sent with every beat. |
<prefix>/Energy | float | 0.0 … 1.0. |
<prefix>/EnergyTrend | int | -1 falling · 0 steady · +1 rising. |
<prefix>/HueShift | float | 0.0 … 1.0. The musical key mapped onto the Camelot wheel — a hue you can drive a palette with directly. |
<prefix>/DropIn | int | Beats until the next drop. -1 = none known or none coming. |
<prefix>/BarInPhrase | int | 1-based bar within the current phrase; 0 = unknown. "Bar 6 of 8." |
<prefix>/Bass | float | 0.0 … 1.0 — low content, ≤ 250 Hz. |
<prefix>/Mid | float | 0.0 … 1.0 — body, ≤ 2.5 kHz. |
<prefix>/High | float | 0.0 … 1.0 — air, ≤ 11 kHz. |
Values arrive as one OSC bundle per change group, so Beat and Tempo land together and the three bands land together.
How often each one arrives
| Signal | Rate |
|---|---|
Beat, Tempo | once per beat — 2 Hz at 120 BPM |
Energy, EnergyTrend, DropIn, BarInPhrase | on change only |
HueShift | on key change only — typically once per track |
Bass / Mid / High | once per beat from a track; 25 Hz while the booth input is capturing. Identical consecutive triples are not re-sent |
Nothing is re-sent on a timer. A receiver that starts mid-track will not be told the current energy until it next changes, so hold the last value you saw and default sensibly until the first packet.
The two signals worth building against
DropIn is the only value about the future
Everything else reports what the music is doing at the instant it is sent, so a visual built on them can only ever react — and a reaction reads a beat late on camera. DropIn says how many beats remain until the next drop, which means you can build into it.
Turn the count into your own 0→1 ramp against your own frame clock. Do the ramp on your side: CueSync deliberately sends the count and not an interpolated value, because it does not know your frame rate, and an interpolated ramp would put its timing in charge of when your world peaks.
Bass / Mid / High are what make a scene look authored
One aggregate loudness gives you a scene that breathes together — everything swelling and falling at once, which reads as a level meter. The split lets the kick drive the strobes while the hats drive the particles.
They come from the loaded track's per-beat analysis by default. Switch on Settings → Audio → Booth Input and they come from the room instead, at 25 Hz — which is how a live band, a guest's laptop or a CD drives the bus at all. Pro DJ Link carries no audio, so that capture is the only door.
Worked receives
TouchDesigner — an OSC In DAT or CHOP on the port; addresses arrive as channel names. Bind Energy to an intensity, DropIn to a Lag-smoothed ramp, Bass to a displacement.
Resolume Arena — Shortcuts → OSC, map <prefix>/Energy to a layer opacity or an effect parameter. (Resolume's own Pro DJ Link sync is unrelated to this and is documented as unreliable; this is a separate feed.)
Notch — an OSC node per address into the block's exposed properties.
Chataigne — add an OSC module on the port; it discovers the addresses as they arrive, then routes them anywhere Chataigne reaches.
Vizibeat (Unreal Engine) — an OSC node in the Motion Graph. Vizibeat brings stems, frequency bands and a node graph; CueSync brings the arrangement, and PhraseId, BarInPhrase, DropIn and EnergyTrend are signals its own analysis does not produce.
Unreal Engine, without a node graph — the free CueSync for Unreal plugin receives this vocabulary natively, writes it into a Material Parameter Collection, and gives every drop-on driver a Drive Source so one fixture group can follow the kick while another follows the hats.
Max/MSP, Pure Data, QLab, a Raspberry Pi — udpreceive and read the address. There is nothing else to it.
Sending the bus into CueSync
CueSync accepts the same vocabulary inbound, so an external source can supply what CueSync would otherwise derive from a prepared track. That is the point of it: a live band, a guest's laptop, a corporate AV feed and a wedding have no rekordbox analysis, and without this the structural layer is simply absent for them. A musical director's foot switch, a stage manager's section marks, an Ableton session's markers or a TouchDesigner rig's own onset detection can drive Energy, DropIn and BarInPhrase directly.
Turn it on: Settings → MIDI → CueSync Bus → Accept bus input. Off by default.
What it drives: CueSync's own Energy, DropIn and BarInPhrase — what AutoPilot, the followers, the pixel wall, the crowd and the outbound bus all read. The card under the toggle shows what has been accepted, what was refused and why, and which values an external sender is driving right now.
Where to send: the app's OSC input port (Settings → Network) — not the bus output port. Output goes to the host and port you configured; input arrives on the shared OSC listener, so enabling both directions cannot feed CueSync its own bus.
Addresses: identical to the table above, under the same prefix. One vocabulary, both directions — rename the root and both the send and the receive move with it.
Four rules a sender has to know
- Keep sending. An external value is authoritative for 5 seconds, then CueSync hands that parameter back to its own analysis. A UDP sender that stops does so silently, and without a window one
Energymessage would hold the show at that value for the rest of the night with nothing on screen explaining why the music stopped moving the lights. If you send on change, heartbeat. BeatandTempoare accepted but never drive the clock. A remote source stuttering a beat stops the show mid-cue with no obvious cause at front of house; a lateEnergymerely blooms a look a beat later. Those two failures are not comparable, so they are not one setting.- Ranges are enforced, not clamped.
Energy,Bass,MidandHighoutside0…1are refused — clamping would hide your bug and you would go on believing1.4meant something.BarInPhrasecounts from 1.DropInaccepts-1for "no drop known" and nothing lower.Tempomust be positive. - A typo is refused by name.
/cuesync/bus/Enrgyis reported along with the list of known leaves. Leaf matching is case-insensitive, so/cuesync/bus/energyworks.
Security
Inbound bus messages go through the same fail-closed allowlist, rate limiter and optional HMAC as every other OSC input — see Diagnostics. It is still UDP on a show LAN: if the sender is not on a trusted network, turn on signature verification.
What the bus is not
- Not a clock replacement. If all you need is bar/beat/BPM, Beat Data Broadcast is the older, narrower feed (
/beat/bar,/beat/beat,/beat/bpm,/beat/phase) and it also sends MIDI CC. The two are independent senders and can point at different machines. - Not authenticated on the way out. It is UDP on a show LAN, like Art-Net. Point it at a host on the show network, not across the internet.
- Not a licence gate. Every edition has it. Editions gate workflows, never connectivity.
See also: Unreal Engine · Protocol Reference · Network Outputs · Diagnostics
Looking for a quick fix?
The Help Center has short task-focused articles and a support team that responds within 24 hours.