Stagelinq protocol API availability? (Part 1)

Hi,

Does anyone know if there is a developer API available for Stagelinq? I have been live streaming sets using OBS for quite a long time, and it would be fantastic to be able to get the now playing information from the denon players in order to create a “now playing” widget for live streaming. I have experimented with some cloud based recognition API’s, however these are generally paid for solutions based on a quota which is a little overkill for this use case.

I know the data is sent, as it is visible in Resolume, however I haven’t come across anything as yet that would let me tap into the data being passed around.

If there is no currently available API, are there any plans to release one?

Many thanks,

4 Likes

What’s up @crimsonsimon,

I don’t think it’s available but I think it’s a great idea and I encourage you to submit it as a feature request. Not sure how much data is communicated via the Stagelinq connect or it’s expandability/limitations.

This would be a great request for both Rekorbox and Serato as I know that these software already capture playlist information.

I wonder if adapting one of the open source Pioneer DJ Link apps to see if there is any data sent?

Python ProDJ Link: https://github.com/flesniak/python-prodj-link beat-link: https://github.com/Deep-Symmetry/beat-link

It would be interesting to see what is captured from the Link ports.

Same here. A feature like this would be very exciting.

Hi all,

Thanks for the replies on this one. I think I will pop it in as a feature request. It would certainly be well used from my perspective for live streaming!! There are a lot of OBS solutions out there for serato and virtual DJ that I have noticed, and some for VLC and other players, but nothing yet that can tap into the data sent through Pioneer or Denon’s proprietary protocols.

I may have a look through wireshark to see if there is anything in there I can pick out, but it would certainly be nice if an official API was released for us to develop against as they have for Resolume and Soundswitch.

@crimsonsimon I doubt they would release it to the general public, but it must exist as it’s been used by the companies you mention. Serato and Atomix also used a Denon API to add support to their DJ software.

Have you contacted anyone at Denon? If you’re a developer and meet their requirements then presumably they would work with you.

I have been very interested in this. I’m a developer myself. I’ll see what I can find in the network packets the player sends.

Ok so I spent a few hours with Wireshark and was able to figure out a decent bit of the protocol.

It’s possible to get the value of almost any parameter on the console. Song info, knob & fader positions, loop status, etc.

Synchronization data on the other hand is much more difficult. I can’t figure out what the data means, but it does appear to be some sort of clock. It isn’t MIDI clock, MTC, or SMPTE though. I’ll dig around more and see if I can get bpm info anywhere.

It should be relatively easy to create an app that fires a midi trigger when a specific song is played. Having it fire at specific points in a song will be much more difficult.

If any developers out there want to help me out on this please send me a message. I don’t have much time to spare on this.

1 Like

Hey Shayded,

Thanks for this. I haven’t had a chance yet to dig into wireshark, but from what you have found it certainly looks like there is more than enough info to do a simple OBS plugin for now playing… I will experiment with pcap.net and see if I can write something to that effect.

1 Like

Yeah that’s a good idea. Maybe I’ll have the app expose the data via a websockets or rest API so someone could build an OBS plugin based off of that.

Looks like some work has been done on extracting the information from the data available https://github.com/icedream/go-stagelinq

1 Like

Great find!! I have downloaded that project and installed golang which is pretty good. Have tried the code, after a bit of fiddling to get the code to pull from a local repository rather than GitHub and it does appear to work with the sc5000’s.

I am able to pull out all the information required to create a now playing solution which is great. The only drawback to the example is it was written for a prime4 and so is single threaded so I will need to rewrite it to cater for multiple prime devices on the network but so far so good.

4 Likes

So now I’m really really intrigued.

Being able to send the track ID to an OBS video overlay would be perfection. I currently use Radr.dj to send track ID to Twitter as a playlist and knowing I could output from my Prime 4 to either to OBS or getting Radr to locally listen somehow (maybe via a plugin).

https://radr.dj/beta/download

I’m getting pretty excited at where this could lead.

Well, so far have managed to reverse engineer the GoLang code to make it multi-threaded. Now able to connect to both my SC5000’s at the same time and receive data. Additionally, and this is really useful, I am able to get fader positions from the mixer, so able to check if the fader volume is up on a specific deck which will be useful for updating the now playing info. A couple of things I need to do, firstly, be able to differentiate between the two SC5000’s as they both send deck1 and deck two information which leads to ambiguous output…should be able to do this from the connection object array I have created which contains the IP. Secondly need to write the output to a text file in a useful format to use as a text source in OBS…this will need some fine tuning, but so far so good! Exciting!!

5 Likes

Absolutely amazing effort @crimsonsimon

I use something called “Now Playing” in Serato DJ and it works exactly like this. Maybe we could pull both of you guys together to incorporate the data as he has already written the code to write track names to a .txt file which refreshes upon each track loaded (with a delay preset - mine is 45 seconds). There is options for prefixing and double lines for each field.

Your method is better as it has fader position will give an even accurate way of knowing which track is ‘on air’ rather than rely on a time delay.

This is his work in context https://serato.com/forum/discussion/1749875#11110702

Here is the link to the download: https://github.com/e1miran/Now-Playing-Serato/releases/tag/v1.4.0

What you have found could be incorporated into his project or vice versa. His configurable menu options for configuring how the text is written work really well in OBS as a text file so maybe you could look at how it is done?

That doesn’t sound like a bad idea. So far I have a working proof of concept application that pulls the information from the playing deck and writes the track information to a plain text file.

I have added a text source in OBS and set it to read from file and this updates perfectly when tracks are switched over.

Very early doors, but I plan to do a trial by fire on my stream tomorrow night to see if it both lasts the set and correctly populates the lower third.

Best bit, go Lang is cross platform and this has worked on both windows and Mac!!

5 Likes

Fantastic work!

I’ll have to find your stream and see it in action. I get a permanent lower third with the Serato Now Playing app that switches each time the new track kicks in and this seems like you have nailed everything else. Spot on!

EDIT: I guess the “broadcast” commands in the screenshot relate to the new broadcast function in the X1800/X1850 firmware that was just released.

Now if only it sent live track data to OBS!

Any chance of sharing the code? I managed to compile the github go library and it does output a bit lot of information…but I’m not a coder as such and my head started to hurt when I tried to filter the text and output it to a file as it kept throwing up errors in the compiler

Hi all, apologies for going awol, I have been playing around with this. At the moment the code is sc5000 only, as that is what I have. It’s been a bit of a nightmare with soundswitch though, takes a couple of attempts to get the two to play nicely together…I think it is because I am running them together on the same machine.

Sadly I haven’t had much luck finding a good debugger to find out what is actually happening behind the scenes when they interfere with each other.

If you would like a copy of the main.go code send me a PM and I will pass on what I have as a starting point.

1 Like

That’s a shame as I’m on a Prime 4.

I hope someone manages to work out the SoundSwitch clash.