Part of VizLab, the easiest way for DJs to create visuals in sync to music.
To get started:
- Download latest release
- Run
vizlink
(and make sure Rekordbox.app is not running) - Connect your computer to a Pioneer Pro Link network and CDJs
Now your CDJs are linked to stdin / stdout / stderr:
- stdout has a real-time JSON log of device activity
- stdin takes JSON commands to query and control devices
- stderr has errors and other debugging information
Download an install the latest release.
DEST=/opt/homebrew/bin/vizlink
curl -L https://github.com/nzoschke/vizlink/releases/latest/download/vizlink-darwin-arm64.zip | funzip > $DEST && chmod +x $DEST
Run VizLink. You must close Rekordbox.app first since VizLink requires the same port to talk to CDJs.
vizlink
See events on stdout.
{"payload":{"code":0,"msg":"hi"},"ms":1711834477545,"type":"sys","version":1}
{"payload":{"active":true,"name":"CDJ-3000","player":1},"ms":1711834508255,"type":"device","version":1}
{"payload":{"album":"Falling In A Dream EP","artist":"AADJA","cues":[],"duration":273000,"player":1,"source":{"id":158,"player":1,"slot":"SD_SLOT"},"tempo":147.0,"title":"Falling In A Dream (D.Dan Remix)","year":2021},"ms":1711834531790,"type":"track","version":1}
Send commands on stdin.
// find loaded tracks
{"payload":{"msg":"find"},"type":"sys"}
// fetch audio file loaded in player
{"payload":{"msg":"fetch","code":1},"type":"sys"}
// change player onAir status
{"payload":{"player":1,"onAir":true},"type":"cdj"}
Invoke one-off RPC commands.
vizlink -r '{"fn":"structure","args":["/Users/noah/Library/Pioneer/rekordbox/share/PIONEER/USBANLZ/f6c/ac4e8-f264-481d-b81c-fd16538c4bc2/ANLZ0000.EXT"]}'
{
"payload": {
"bank": "default",
"mood": "mid",
"phrases": [
{ "beat": 1, "kind": "mid/intro" },
{ "beat": 713, "kind": "mid/outro" }
],
"player": null
},
"ms": 1711834911480,
"type": "structure",
"version": 1
}
Deep-Symmetry projects like the Java beat-link library contain the most complete integration with Pioneer DJ protocols, devices and file formats.
Thanks to the detailed specification there are ports to Python, TypeScript and Go, but all of these lag behind the reference implementation in beat-link.
This project uses GraalVM JDK Native Image to wrap beat-link into a self-contained and cross-platform executable that can easily be used from any language with standard i/o RPC conventions.
mvn exec:java -f pom.xml -Dexec.mainClass="net.mixable.vizlink.App" -Dexec.args="--help"
Local native build requires an M1+ Mac:
make
Scaffolding was provided by a maven archetype and prettier:
brew install maven pnpm
mvn archetype:generate -DgroupId=net.mixable.vizlink -DartifactId=vizlink -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
cd vizlink
pnpm install -D @prettier/plugin-xml prettier prettier-plugin-java
pnpm prettier --plugin @prettier/plugin-xml --plugin prettier-plugin-java -w .