stagelinq
v3.0.4
Published
TypeScript library to connect to Denon StageLinq devices
Downloads
314
Maintainers
Readme
StageLinq
TypeScript library to connect to Denon DJ hardware via the StageLinq protocol.
Installation
npm install stagelinqQuick Start
import { StageLinq } from 'stagelinq';
const stagelinq = new StageLinq({ downloadDbSources: true });
stagelinq.devices.on('trackLoaded', (status) => {
console.log(`${status.title} - ${status.artist} loaded on deck ${status.deck}`);
});
stagelinq.devices.on('nowPlaying', (status) => {
console.log(`Now Playing: ${status.title} - ${status.artist}`);
});
await stagelinq.connect();Features
| Feature | Go | Python | TS v2 | |---------|:--:|:------:|:-----:| | Device Discovery | ✅ | ✅ | ✅ | | StateMap Service | ✅ | ✅ | ✅ | | BeatInfo Service | ✅ | ❌ | ✅ | | FileTransfer Service | ✅ | ❌ | ✅ | | TimeSync Service | ✅ | ❌ | ✅ | | Broadcast Service | ✅ | ❌ | ✅ | | EAAS (gRPC library) | ✅ | ❌ | ✅ | | EAAS (HTTP files) | ✅ | ❌ | ✅ | | Windows Support | ✅ | ✅ | ✅ | | macOS Support | ✅ | ❌ | ✅ | | Linux Support | ✅ | ✅ | ✅ | | Multi-interface discovery | ✅ | ✅ | ✅ | | Database download | ✅ | ❌ | ✅ | | Track path resolution | ❌ | ❌ | ✅ | | Instance-based API | ✅ | ✅ | ✅ | | Static class API | ❌ | ❌ | ✅ | | CLI demo tools | ✅ | ✅ | ✅ | | Wireshark dissector | ❌ | ✅ | ✅ | | Unit tests | ✅ | ✅ | ✅ |
Go = go-stagelinq, Python = PyStageLinQ
Supported Devices
- Denon SC6000 / SC6000M
- Denon SC5000 / SC5000M
- Denon Prime 4 / Prime 2 / Prime Go
- Denon X1850 / X1800 mixers
- Denon LC6000
API
Instance-based (recommended)
import { StageLinq } from 'stagelinq';
const stagelinq = new StageLinq({
downloadDbSources: true,
maxRetries: 3,
});
// Device events
stagelinq.devices.on('ready', (info) => {
console.log(`Connected to ${info.software.name}`);
});
stagelinq.devices.on('trackLoaded', (status) => {
console.log(`Loaded: ${status.title} on deck ${status.deck}`);
});
stagelinq.devices.on('nowPlaying', (status) => {
console.log(`Playing: ${status.title}`);
});
// Database events
stagelinq.devices.on('dbDownloaded', (sourceId, dbPath) => {
console.log(`Database saved to ${dbPath}`);
});
await stagelinq.connect();
// Later...
await stagelinq.disconnect();Static class
import { StageLinq } from 'stagelinq';
StageLinq.options = { downloadDbSources: true };
StageLinq.devices.on('nowPlaying', (status) => {
console.log(`Playing: ${status.title}`);
});
await StageLinq.connect();Events
// Track events
stagelinq.devices.on('trackLoaded', (status: PlayerStatus) => {});
stagelinq.devices.on('nowPlaying', (status: PlayerStatus) => {});
// Device events
stagelinq.devices.on('ready', (info: ConnectionInfo) => {});
stagelinq.devices.on('deviceConnected', (info: ConnectionInfo) => {});
// State events (200+ states per deck)
stagelinq.devices.on('stateChanged', (state: StateData) => {});
// Beat events (real-time BPM, beat position)
stagelinq.devices.on('beatMessage', (data: BeatData) => {});
// Database events
stagelinq.devices.on('dbDownloaded', (sourceId, dbPath) => {});State Data
The library tracks 200+ state values per deck:
| Category | Example States |
|----------|----------------|
| Track | ArtistName, SongName, TrackNetworkPath, TrackLength |
| Playback | Play, PlayState, CurrentBPM, Speed |
| Sync | SyncMode, DeckIsMaster, MasterTempo |
| Loop | LoopEnableState, CurrentLoopSizeInBeats |
| Mixer | ExternalMixerVolume, CrossfaderPosition |
Examples
See the cli/ folder for complete examples:
cli/index.ts- Full example with all eventscli/discover.ts- Network discovery democli/beatinfo.ts- Real-time beat information
Run examples:
# Main CLI
npx ts-node cli/index.ts
# Discovery
npx ts-node cli/discover.ts
# Beat info
npx ts-node cli/beatinfo.tsTools
Wireshark Dissector
A Lua dissector for Wireshark is included for protocol debugging:
# Copy to Wireshark plugins folder
cp tools/wireshark/stagelinq.lua ~/.local/lib/wireshark/plugins/Testing
npm test # Run tests
npm run test:watch # Watch mode
npm run test:coverage # Coverage report205 tests across 14 test files.
Documentation
Guides
- Events Reference - All events and state data
- Protocol Specification - StageLinq protocol details
Services
- StateMap - Track state, playback, faders
- BeatInfo - Real-time beat and tempo
- FileTransfer - Database and file downloads
- EAAS - Engine Library gRPC/HTTP access
- Connection Health - Auto-reconnection
Reference
- CHANGELOG - Version history
Contributors
- Chris Le (@chrisle) - Maintainer
- Martijn Reuvers - Core development
- MarByteBeep (@MarByteBeep) - Original TypeScript implementation
- honusz - BeatInfo, TimeSync, Broadcast services
- Kalle Kirjalainen - Contributions
- docBliny - Contributions
Attribution
This library incorporates code and ideas from other StageLinq implementations:
- go-stagelinq by Carl Kittelberger (icedream) - EAAS, Windows fix, token utilities
- PyStageLinQ by Jaxc - Wireshark dissector, protocol documentation
- kyleawayan/StageLinq by Kyle Awayan - Track path resolution fixes
Related Packages
- alphatheta-connect — Pioneer Pro DJ Link integration
- rekordbox-connect — Rekordbox database integration
- serato-connect — Serato DJ integration
These libraries power Now Playing — a real-time track display app for DJs and streamers.
License
MIT
