Controller support for the Pioneer DDJ-SX3

I did find it, and have been using it. I still use it, while I’m working on the new one.

I was encouraged to start over from a fully reviewed pre-existing definition like the DDJ-SX, so I figured I would. I am definitely having some issues with the white jog wheel spinner and red jog wheel beats. I know the code for the red LED’s, but for some reason I can’t get the white LED’s to illuminate.

If the details of the output messages are not documented by the manufacturer, you’ll need to either guess and check or reverse engineer the MIDI messages sent to the controller from Serato.

Thank you.

Already on it.

Trying to find a good tool to sniff/inspect the midi messages. If anyone knows of a good util, let me know. I’ve looked into MidiOX, but I was unable to see the midi messages sent to the controller. It’s entirely possible I was doing something wrong.

I’m pretty sure it’s the same, so I’m going to play with MidiOX to send data to the controller.

White spinners are probably 0xBB 0x00 (deck 1), 0xBB 0x01 (deck 2), and so on
Red beats are for sure 0xBB, 0x04 (deck 1), 0xBB, 0x05 (deck 2), and so on

Once I verify the white spinners data, I’ll look at the code to see why it’s not updating these components.

Thanks mate! I only got the white working, but the red is even better.
But they only started working after sending serato “keep alive” messages.
Actually most of the stuff started working I think after that.

I think I used usbsnoopy or something like that. I have documented it somewhere as a guide. Install sshd as to have as little as anything to do on windows and then start the stuff, using a time script, and then copying the file to a linux box to inspect it with wireshark.
As for midi, I just read the hex dumps of the usb dump ;-).

At the time I was doing it, my primary goal was to make the SX3 working on linux before my 2 week no questions asked return warranty ended.
I still have things to investigate, but I do not have posession of a windows pc anymore…
things: control of microphones, reverb etc (non midi), and just a basic dump of the various serato modes.
For instance you can add reverb to the mic using serato. But is the reverb added by the pc, that means mic routing is in complete control by midi.

If you have usb dumps without PCM data, or with, and can share them with me, with a script that says at what time you tried what, I can resume RE without doing the windows thing ;-).

1 Like

Hi Ardje,

Interesting, I never thought about keep-alive for Serato. I kinda thought it would be a simple case of switching the controller into Serato mode. Leave it to Pioneer to complicate life.

I’ll take a look at usbsnoopy, and see what it can do. If I acquire some USB dumps without PCM data, I will be sure to share. I don’t use the controller as a soundcard, as I have a Focusrite Saffire Pro 40 audio interface, and prefer to send sound out that, since I can do more complex audio routing with it. But I can always change it for the purposes of testing.

And just like that, sending the Serato message using a timer makes the white jog wheel spinner LED’s spin.

Thank you so much.

1 Like

Pioneer is known to require these annoying keepalive messages for other hardware as well.

This isounds similar to the hotcue pads on the Roland DJ-505. There is a Serato keepalive message that needs to be sent periodically, otherwise the pads don’t react to certain midi messages. There is a python script named “serato heartbeat” in the tools directory that can be used for testing messages. Is the keepalive message the same?

I will take a look tonight to see if they are the same.

Had an interesting thing happen, predictably. If I modify the script with music playing, the controller goes out of Serato mode, and Mixxx v2. 3 appears to crash. I think it’s a timing issue, where reloading the script causes a delay, and the keep alive message isn’t sent in time.

I am going to look at how I can solve that. The script ardje put up on Git never did that.

Hi hlzhs,

I took a look at the Serato heartbeat script. Interesting.

I have only been using: [0xF0, 0x00, 0x20, 0x7F, 0x50, 0x00, 0xF7] (7 bytes), which has worked at keeping it alive, albeit I lose Serato sometimes when the script reloads, and Mixxx crashes.

But I see the serato heartbeat test script sends: [0xF0, 0x00, 0x20, 0x7F, 0x00, 0xF7], plus a second set of 6 bytes ever-so slightly modified: [0xF0, 0x00, 0x20, 0x7F, 0x01, 0xF7].

The keepalive in the test script is only 3 bytes [0xBF, 0x64, 0x00].

I gave these messages a try, and Serato mode would not initialize.

I think I need to sniff some USB and see what’s going on with the actual DJ Serato Pro software, so I can properly understand what’s going on. Maybe they have different init and heartbeat messages for different controllers.

Latest round of updates:

  • Jog wheel spinner LEDs (white)
  • Jog wheel centre LEDs (red)
  • Key up, down, sync and reset buttons

Thank you Ardje for the spinner and centre LEDs. I hope you don’t mind me copying the calculation code.

In other news, I’m considering modding my SX3. I saw a video showing the LOAD buttons of the SX2, using white and blue LEDs. Looks so much nicer than the stock red and amber LEDs. Too bad the colours of those can’t be customized without modding.


I continue to experience Mixxx crashing when the DDJ-SX3 controller script is reloaded. It doesn’t happen every single time, but often enough that it’s extremely annoying.

What is the best way for me to figure out what is causing the crash?

I have the command-line options: --developer --controllerDebug
I tried to look at the log window, but it doesn’t stay on the screen as Mixxx crashes, and the log window is empty when I relaunch Mixxx.

Mixxx also writes the log to a log file.

Crashes can usually be debugged by checking the backtrace.

Should I post the call-stack here, or file a proper bug report? I have one ready.

Please file a bug report on Launchpad and link it here.

I just tried, but had to register on Launchpad. Received the verification email. Clicked the link. Did the captcha, it says, “Bad bot, go away! Request aborted”.

Tried it several times, even requesting a new verification email. The captcha was done successfully.


Edit: I fixed it. Did it from a private window.

The more secure things get, the harder it is carry out legitimate actions.

A bug report has been filed for the crash here:
Bug #1936735 “Mixxx crashes after reloading controller script” : Bugs : Mixxx

I’m currently working on the jog wheel controls.

I decided to start with the jog wheel logic from the github Mixxx wiki, and have that working, complete with the non-ideal way that it works, and I’m going to modify it from there.

I am not happy with the behaviour. The scratching on touch works as-expected, and the pitch-bending on ring also works as expected.

However, one popular way to transition from track to track is to flick the jog wheel forward or backwards, backspin and forwardspin. So I need to figure out how to do that. Right now, it pitch-bends. I suspect Ardje’s idea (taken from his controller script) of disabling scratch on a timer might solve that. I was able to get his script to behave this way with a slight modification.

Another thing I’m unhappy with is when I’m not playing a track, and touch the jog and turn the wheel a distance, and don’t stop moving before releasing the jog, it spins forwards or backwards by an amount which seems almost proportional to the delta. That behaviour isn’t as annoying, but I would like to fix that. Might work on this first, since it’s probably easier to solve.

Time to look at some other controller mappings to see what’s going on under the hood.

Sounds good, Just make sure to create your branch from the 2.3 branch, not main.

??? Did I not already create my branch from 2.3, not main?

I distinctly remember selecting the 2.3 branch.