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, 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 & Sync → CueSync Bus, then switch on Enable 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, so a patch written against one reads against the other.
| Address | Arguments | Range / meaning |
|---|---|---|
<prefix>/Beat | int beatWithinBar, int beatsPerBar, int phraseId, int hostMs, int barInPhrase | The beat pulse. beatWithinBar is 1-based (1 = downbeat). beatsPerBar is the source's bar length: 4 from Pro DJ Link and the internal clock, the track's own for a local file. hostMs is 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-frequency content. |
<prefix>/Mid | float | 0.0 … 1.0 — body. |
<prefix>/High | float | 0.0 … 1.0 — air. |
<prefix>/KickPulse | float | 0.0 … 1.0 — the loaded track's kick as a pulse: the hit's strength on the quarter beat it lands, falling back to 0 within a second. 0 when the track has no kick analysis, nothing is playing or a Theatre show is running. |
<prefix>/HatPulse | float | 0.0 … 1.0 — the same for the track's hats. |
Values arrive inside OSC bundles (one per change group), so Beat and Tempo land together and so do the three bands. Bundles are part of OSC 1.0, so a compliant receiver unpacks them; a receiver that only parses plain messages gets nothing. barInPhrase is the 1-based bar within the phrase (0 when unknown); a receiver that does not need it can ignore it.
How often each one arrives
| Signal | When |
|---|---|
Beat, Tempo | once per beat |
Energy, EnergyTrend, DropIn, BarInPhrase | on change |
HueShift | on key change — typically once per track |
Bass / Mid / High | once per beat from a track with its own band split; continuously from the booth input when the loaded track has none, or nothing is loaded |
KickPulse / HatPulse | continuously while a pulse is falling; nothing while it rests at 0 |
Held values are repeated. CueSync re-sends the values it is holding at regular intervals, and again when an Unreal Engine output connects, so a receiver that starts mid-track has the current picture within a couple of bars. Treat each message as the current state, not as an event.
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.
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 analysis whenever it has a band split. Switch on Settings → Audio → Booth Input and the room's stand in when the loaded track has none, or nothing is loaded — 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.
KickPulse and HatPulse say a hit just happened, where Bass and High say how loud the band is. Bind a strobe or a particle burst to them: a held bassline moves Bass and never KickPulse. The CueSync for Unreal plugin does not receive these two yet; every other receiver does.
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; 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 & Sync → CueSync Bus → Accept bus input. Off by default.
What it drives: CueSync's own Energy, DropIn and BarInPhrase — what Auto Pilot, the pixel wall, the Crowd and the outbound bus all read. The other values are received and shown, not used. 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 → Advanced → OSC Input Listener → Listen Port) — not the bus output port. That listener ships switched off (port 0), and it listens on this machine only until you turn on Allow other devices on the network, so set the port there first.
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 holds for a few seconds, then CueSync hands that parameter back to its own analysis, so a sender that stops never leaves the show stuck on one value. If you send on change, repeat the value regularly — every second or two is plenty.
BeatandTempodo not drive the clock. CueSync accepts them, but its own beat source keeps the show's timing.- Ranges are enforced, not clamped.
Energy,Bass,Mid,High,KickPulseandHatPulseoutside0…1are refused, so a bug on your side shows up instead of hiding.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 are protected like every other OSC input. It is still UDP on a show LAN: if the sender is not on a trusted network, switch on Require signed messages in Settings → Advanced → OSC Input Listener and set a Shared secret on the sender. Message signing is available for senders that support it; contact support for the developer specification.
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 for the open internet. It is plain UDP on a show LAN, like Art-Net. Point it at a host on the show network, not across the internet.
- Not edition-limited. 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.