# beat-link-trigger and the case for turning CDJ playback into MIDI

> beat-link-trigger is a Clojure application that watches Pioneer DJ Link network traffic and fires MIDI, lighting, video and Ableton Link events in response, including painting cues directly onto track beat grids. Its hard boundary is that the whole thing depends on Pioneer equipment and on unofficial protocol access.

**Deep-Symmetry/beat-link-trigger** — Trigger events and automate shows in response to events on Pioneer CDJs

- Repository: https://github.com/Deep-Symmetry/beat-link-trigger
- Stars: 725 · Forks: 54
- Language: Clojure
- License: EPL-2.0
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/deep-symmetry-beat-link-trigger

## The core idea: read the network, fire the event

beat-link-trigger is an integration environment for DJ performances, focused on bridging Pioneer DJ professional equipment to lighting, video, laser and digital audio workstation software. It was created as a way to trigger MIDI events when CDJs start playing tracks, play certain kinds of phrase, reach particular beats, and so on.

The mechanism is network traffic, not a control surface. Pioneer DJ Link is the network protocol the CDJs speak to share player status and beat information over Ethernet, and this application listens to it. beat-link, the sibling Clojure library, does the actual protocol decoding, and the project guide describes beat-link-trigger as built using it.

That architecture is what makes the tool interesting and what limits it. Reading the same packets the players broadcast means there is nothing to configure on the CDJ itself, no firmware modification, and no vendor cooperation required. It also means the tool only exists for the protocol Pioneer happens to broadcast, and the guide is candid that this is a limitation rather than a feature.

The scope grew through touring artist requests, and the guide credits those requests explicitly. What began as a trigger for playback has become a small control environment with a player status view and a cue painting interface.

## Three ways to install it, and the one that surprises people

The usage section is short because the project ships as a normal desktop application rather than something you run from a source tree.

You download the latest disk image installer for the Mac, the msi installer for 64-bit Windows, or the executable jar file for other platforms, from the releases page. Then you double-click an installed native app bundle to run it. If that does not work, or if you are using the jar file, the guide points at a startup issues section below.

So there is a native macOS application, a native Windows application and a Java archive as a fallback, and the archive is the one that matters for anyone on Linux. The project is written in Clojure and the repository carries project.clj, which is a Leiningen project file, so the jar is the natural build output of the project rather than an afterthought.

The guide also mentions a startup issues section, which is a hint about the native installers. Wrapping a JVM application as a double-clickable app bundle involves the platform's own conventions, and the escape hatch is the jar.

The releases page is also where the download count badge points, so the project is measuring how many people actually take the installer.

## The trigger window is where a show gets built

When the application starts, a trigger window opens, and in it you choose the players you want to watch, the kind of MIDI message to send when they start and stop, and when the triggers are enabled.

Three choices, and they map onto the three things that vary between shows. Which players to watch matters because a set might use two of four decks. What message to send matters because the message is what a lighting board or a video switcher reacts to, and different rigs want different note numbers or different channels. And the enable toggle matters because a trigger set up during soundcheck should not fire during the walk-in.

The stop side of the pair is as important as the start side. A show that triggers a blackout when a track ends but has no end event leaves the rig in the wrong state, and pairing start and stop messages is the sort of detail that separates a working integration from a demo.

The guide is explicit that this page is only a quick introduction. The full notebook user guide at blt-guide.deepsymmetry.org covers how to configure triggers, how to use expressions, working with title and artist metadata, working with Ableton Link, and integration examples.

## Player status and the show interface, which is the interesting half

Two other windows carry most of the practical work.

The player status interface shows the status of each player found on the network, and you reach it by choosing Show Player Status in the Network menu. That is the debugging and monitoring surface: it tells you which players the application can see, which means it also tells you when it cannot see one.

The show interface, available since version 0.5.0, is the more interesting feature. It lets you paint cues on track beat grids, to automate away the complexities of manually managing triggers. The screenshot in the guide shows a cue snippet, and the idea is that you look at the waveform and the beat grid of a track, place markers where you want something to happen, and the application fires the trigger when the player reaches that point.

That is a fundamentally different approach from the trigger window. The trigger window is a set of rules about events, and it needs no knowledge of the track. The show interface is per-track data attached to a specific piece of music, and it can be as precise as the grid allows.

For a touring artist, the second is the one that scales. Rules that apply to everything get you so far. A cue on the drop of a specific track gets you the moment that matters.

## The hardware support notes are the most honest section

The project carries a prominent note about hardware support in progress, and it is the section a reader should not skip.

The note says the maintainers finally obtained a pair of CDJ-3000s, so version 7.3 and later can work productively with them without warnings or issues, even when they are configured as player 5 and 6. It adds that the project can now take advantage of the high-precision position updates the CDJ-3000s send, to have rock-solid tracking of playback position even when jumping or looping inside beats or playing backwards.

The second paragraph is about the Opus Quad. People who own that hardware contributed significant research and code to allow the project to try to support it in version 8.0 and later, with the help of metadata archives created from the USBs being used.

And then the ask: if you can do any testing with this hardware, share your discoveries and log files on the Zulip channel. Do not open issues until discussing your discoveries and concerns with the community there and arriving at consensus that an issue is the appropriate next stop. The note also says it is not sure yet whether this may be a step towards working with the XDJ-AZ.

That request for log files and hardware loans is a good sign for a project whose protocol support depends on devices nobody in the team owns, and the no-issues-before-Zulip rule is a deliberate way to keep a tracker clean for things that really are defects.

## A Clojure codebase with a documentation site built by Antora

The repository layout shows two projects in one place, and it is worth separating them.

The application is Clojure, with src/, test/, resources/ and a project.clj for Leiningen. The top level also carries .clj-kondo/ for the Clojure language server linter, a CHANGELOG.md, GET_HELP.adoc, CONTRIBUTING.md and a CODE_OF_CONDUCT.md.

The documentation is a separate Antora site. The package.json there is marked private and describes itself as used to build the documentation site, not the project itself. Its dependencies are the Antora PDF extension, the Antora CLI, the Lunr search extension and the Antora site generator, and its scripts run npx antora with the fetch flag against three playbooks:

```json
    "local-docs": "npx antora --fetch doc/antora-playbook-embedded.yml",
    "hosted-docs": "npx antora --fetch doc/antora-playbook-hosted.yml",
    "test-docs": "npx antora --fetch doc/antora-playbook-test.yml"
```

Three playbooks for three purposes is a sign of care: an embedded build for reading offline, a hosted build for the website, and a test build that runs against the same sources in CI. The doc/ directory and the .htmltest.yml file at the root support the same workflow, and the hosted result is the notebook user guide at blt-guide.deepsymmetry.org that the project guide insists you read.

The gemfile and gemfile.lock at the root belong to the same documentation tooling rather than to the application.

## Support comes from Zulip, and the project is free for good

Two community facts are stated plainly, and both shape how you should expect to use the project.

The first is where help happens. Deep Symmetry's projects are generously sponsored with hosting by Zulip, described as an open-source modern team chat app designed to keep both live and asynchronous conversations organized. The project has its own stream, and the project guide links to a Gitter channel where the project used to be discussed before the move to Zulip. Questions, inspiration and sharing ideas all happen there.

The second is money. The funding section states that Beat Link Trigger is, and will remain, completely free and open-source, and asks that if it has helped, taught you something, or pleased you, you share your own discoveries and code, and support the project if you can.

The licence is EPL-2.0, stated in the package metadata and the badge. The repository also carries a gpl-2.0.md file, which is a relic of the licence history and a reminder that the terms of this project have not always been the ones in force today.

The release record shows a long-running project with an active edge. The listed releases are v7.4.1 from 2024-06-02, v8.0.0 from 2025-07-22, and a latest-preview release of v8.1.0 dated 2026-08-28, with the last push to the repository on the same day. A preview tag as the most recent release means pre-release builds are part of the distribution.

## Conclusion

beat-link-trigger suits a touring artist or lighting designer running Pioneer CDJs who wants the show to react to the actual performance, because cue painting on beat grids and trigger configuration are the parts that take real work, and the community research on new hardware is genuinely useful to Pioneer owners. It does not suit someone whose setup is Denon, and it does not suit a lighting designer who needs a documented, supported integration path, since the protocol is unofficial and Pioneer does not support the project. Before you build a show around it, read the user guide and check the hardware support notes, in particular the CDJ-3000 work that landed in version 7.3 and the Opus Quad support that arrived in version 8.0, and note that the last push to the repository was on 2026-08-28.

## FAQ

### What is beat-link-trigger and what does it do?

It is an integration environment for DJ performances that bridges Pioneer DJ professional equipment to lighting, video, laser and DAW software, triggering MIDI events when CDJs start playing tracks, play certain kinds of phrase or reach particular beats.

### How do I install and run beat-link-trigger?

Download the disk image installer for the Mac, the msi installer for 64-bit Windows, or the executable jar file for other platforms from the releases page, then double-click the installed native app bundle. The guide points at a startup issues section if that does not work or if you use the jar.

### What is the show interface in beat-link-trigger?

Available since version 0.5.0, it lets you paint cues on track beat grids so triggers are automated rather than managed by hand. It is separate from the trigger window, which holds rules about events rather than per-track data.

### Which Pioneer hardware does beat-link-trigger support?

Version 7.3 and later work productively with the CDJ-3000 without warnings, including when configured as player 5 and 6, and version 8.0 and later add support for the Opus Quad. The project also notes that this may be a step towards working with the XDJ-AZ.

### Where should I report problems with beat-link-trigger?

Discuss them on the project's Zulip channel first. The project guide asks you to share discoveries and log files there and to reach consensus that an issue is the appropriate next step before opening one, and notes that Pioneer does not support the project.

## Sources

- [Deep-Symmetry/beat-link-trigger on GitHub](https://github.com/Deep-Symmetry/beat-link-trigger)
- [Issues](https://github.com/Deep-Symmetry/beat-link-trigger/issues)
- [License: EPL-2.0](https://github.com/Deep-Symmetry/beat-link-trigger/blob/main/LICENSE)
- [README](https://github.com/Deep-Symmetry/beat-link-trigger/blob/main/README.md)
- [Releases](https://github.com/Deep-Symmetry/beat-link-trigger/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/deep-symmetry-beat-link-trigger
