Mapping the Roland RJ-202

Hi all,

I’m currently mapping the Roland DJ-202 and after some initial difficulties with the js and xml files it’s working fine so far and I figure most of it will just need a bit of time and experimenting.

But there are three problems for which I don’t see a solution yet:

  1. The DJ-202 does not respond to the Serato SysEx message to get the initial state
  2. The in-built sequencer can be synced to the song playing in Serato. This is crucial to actually use the sequencer in live sitations. Is there a standard way for MIDI devices to beat-sync and can this be done with Mixxx?
  3. I couldn’t figure how to address some of the LEDs.

I thought about intercepting the communictaion with Serato, but unfortunately the DJ-202 doesn’t use MIDI for Serato. It’s still worth a try, though.
The second possibility is to ask Roland about the MIDI specs. I didn’t find any document about this on their page. Does anybody know how well companies usually respond to these kind of requests and where it’s best to direct them?

Best
Lykos153

Wiki page: Roland DJ-202
Mapping branch on GitHub

It wouldn’t hurt to ask Roland for documentation for the MIDI messages. Hopefully that will have information about a MIDI message to send to query for the initial state of the controller and how to control all the LEDs.

There is a MIDI clock standard. Mixxx has no built in support for this, but you may find adapting code from this script useful if the sequencer responds to MIDI clock.

Many thanks to Silvio for his efforts toward supporting the DJ-202! I have a PR open on github to add support for the slip button, tap tempo, and strip search (the latter might benefit from some sensitivity tweaking, eventually).

It would be great to have initial settings picked up from the device. I don’t have access to a Windows box, so unfortunately I couldn’t try this myself, but I’ve noticed that the VirtualDJ folks are making an HID tracing tool available which might help if Serato talks HID to query the device state or set LEDs. Also, it looks like Windows might have this feature built in , too. Perhaps someone has a Windows system available and could look into this.

VirtualDJ also claims to support the device, but so far I haven’t been successful in finding the mapping definitions within the PE-file resources extracted from the Windows binary.

I’ve only had the device since today, so I don’t have too many thoughts on the mappings yet. Something that would eventually be nice to have would be the ability to realign the beat grid and toggle quantization from the controller.

In general, it’s probably good if the mapping adheres to the device labels as much as possible. For things like quantization toggle, etc., which don’t have dedicated buttons, it would be nice to have a list of inputs where it’s reasonable to use them for something else. Some inputs that might fit this category:

  • shift + load1/2 ⇒ currently, ejects the deck; this might not be the most useful feature; the manual says Serato uses these to switch the playlist between sorting based on BPM vs. title. I’m not sure this is something that is a must have function on the device as well, as compared to syncing the beat grid or toggling quantization.
  • shift + sync ⇒ currently available; Serato uses this to disable sync, but since the sync button in Mixxx latches, maybe this is a spot that could be repurposed
  • shift + sampler ⇒ the manual doesn’t say what this does in Serato; it’s labeled «slicer» on the device
  • shift + rotary encoder ⇒ still available, IIRC
  • shift + performance pads

Is it usual that the deck3/4 buttons on these controllers don’t latch, btw.? It seems to me this might make the extra decks much less useful.

Also, how does the sequencer start/stop LED behave under Serato? Currently, it always blinks when the sequencer is stopped, which is a bit distracting.

Kind regards,
S.

Thank’s a lot for your thoughts and the PR!

I set up a Windows VM to sniff the USB traffic, but I hadn’t enough time to inspect it yet. I hope I’ll find something useful regarding initial state and sequencer synchonisation.

I thought so, too. but I started off using only Mixxx’ standard shift behaviour.

I tried to do this, but apparently Mixxx doesn’t have an interface to do so. See mixxx.org/wiki/doku.php/mixxxcontrols

The state of the Pad section is hardcoded in the device. Serato Intro only supports the basic modes: Hot Cue, Loop, Sampler where the lower 4 keys are always for manual loops. Serator DJ supports 4 layers: normal press, double press, shift+press, shift+double press. Those are hardcoded as well and I haven’t yet found a way to access them. As I don’t own a copy of Serato DJ, I also can’t sniff them.

We could implement this manually, but that would require a lot of additional work. I thought about using the PARAM buttons to switch layers, as they don’t seem to be used outside the sequencer mode.

On hardware side, it doesn’t latch. We have to do this in the script, which is not very hard.

Everything regarding the sequencer is hardcoded in the device and cannot be changed.

I created some issues on GitHub to make collaboration easier: github.com/Lykos153/mixxx/issues

Best,
Silvio

This is typically done by sending the controller a specific MIDI message and then it replies with MIDI messages indicating the states of all the faders and knobs. Sometimes that is a sysex message, sometimes it is a plain 3 byte MIDI message. To get that MIDI message, I suggest watching the MIDI signals coming out from Serato when you start Serato. Refer to mixxx.org/wiki/doku.php/midi_cr … midi_tools for some suggested tools.

Quick question for Lykos153 (you’re probably still travelling, so reply whenever it’s convenient): in the Wiki you advise setting the controller into generic USB mode (as opposed to vendor mode). Have you noticed any discrepancies between the two modes, or did you encounter any obstacles when in vendor mode? I still have mine set to vendor mode, but I figure so far the MIDI messages can’t be too different or you would have gotten unexpected results after merging my commits.

Possibly the USB mode just switches some USB device identifiers so that Windows binds its generic drivers to the device, whereas in Linux the driver (snd-usb-audio, apparently) already matches even in vendor mode?

Oh, actually, the usb-devices program (from usbutils) shows me that one interface doesn’t have a driver loaded when in vendor mode:

I:  If#=0x0 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=00 Driver=(none)

Possibly this is the HID part of the device?

Edit: After setting the device to generic mode, that subinterface is now also bound by snd-usb-audio. Not sure what this changes though. The manual says that Serato won’t work like this. Speculatively, maybe this is because Serato uses an HID-interface which has now been disabled. Would be nice to know what the interface is used for, though, and what the interface does when in generic mode (since it gets bound by the driver).

Okay, looks like in vendor mode, the volume fader always sends on MIDI channel 1, even when the Deck-3 button is pressed. In generic mode, Deck-3+Fader sends on channel 3 instead.

Thank you for this work! :sunglasses:

is there a way to modify the knob sensitivity? i need it for filter and trim.

thanks

Hi, just a quick question. Is the mapping still in development?

I have tried to use this live for a couple of times now, but some basic functions like pith range and a big delay on the play button could maybe use some adjustments…

Hi!

Got this controller myself and have to say that I’m quite happy with the mapping so far.
Performance is great, at least on Windows in vendor mode (didn’t have the time to check it on my Linux box yet).
There are some things in the mapping that I might have done a bit different, but I can see the reason they did
it that way and I’m fine with it.

What’s really missing IMHO is a proper explanation in the Wiki and finally inclusion in a Mixxx release.
Seeing that there was no work on this for about 11 month, I strongly suspect that this is abandoned.
I’ll see if I can find the time to check the documented issues and fork this. I strongly believe that this
mapping should make it into Mixxx, as the 202 is a great entry level controller.

Best,
upCASE

Hi upCASE… I’ve been a bit pressed for time as of late. The mapping is pretty complete functionally (perhaps not perfect). Would be nice to see this merged. I started adding some documentation a few months back. I can paste these into the Wiki, perhaps you’d like to do some refinement there. I don’t know if Lykos153 is still active, but I suspect he can be reached. If you’d like to tweak the code, I have write access to the repository, so I can merge PRs. I think we should also rebase the branch on top of MIxxx HEAD. IIRC it was forked from some older dev branch and the PR against Mixxx upstream had some unrelated diffs.

Hi eigengrau,

pleasure to see you online.

Yes, please do paste your stuff into the wiki, so that at least there is some starting point. I guess having a good documentation is key to having this in Mixxx.
Like I said, I think this mapping works great as is. I had some trouble figuring out how the FX are adressed, but this too boils down to documenting stuff.

I checked the issues and I suppose giving the initial parameter dump another shoot would be a good idea in order to have Mixxx initialized to the “real” settings.
Other than that syncying the sequencer would be cool, as this is the most unique feature of this Controller. I’ll look at that as well. I won’t make any promises regarding
timeline as I’m currently between jobs, but this would make for a good hobby and keep me in the Qt/Javascript loop, which I’ll be leaving in my new job now.

Best,
upCASE

Hey, I just wanted to chime in and say that I’m currently mapping the Roland DJ-505 and used your DJ-202 mapping as a starting point. I managed to get the TR-S working (at least partially) and maybe some of my findings are applicable to the DJ-202, too.

Here’s some info how to use the TR-S on the DJ-505: https://github.com/Holzhaus/mixxx/blob/4b0aa8f53fe430939d165f323a4cbb18d1fd97a2/res/controllers/Roland_DJ-505-scripts.js#L944-L981

If the DJ-202 also has a mode that is exited automatically if no keepalive message is sent, you can use this Python script to play around and send MIDI bytes manually:
gist.github.com/Holzhaus/cde3f4 … 0f799118c8

Hi there and thanks for the info!

I’ll definitely have a look at you script. Currently I got most stuff implemented except the TR using custom samples and syncing to bpm. Pitchplay would need some adjustment and the slicer code works to some extend, but is not as nicely usable as in Serato, because the graphic feedback is missing. Getting the initial state after startup is also still an issue for me, as it never catches the real states of the crossfader…

Things have been a little hectic on my side, but I’ll see if I can at least find some time and upload this to a new fork. Anyway, here’s the current code based on Lykos153 and eigengraus achievements:
gist.github.com/upCASE/88fb258e … 3ff924f752

Best,
upCASE

Have you looked at the actual MIDI bytes that are send by the controller? I thought I had the same issue with faders on the DJ505, but the error is actually in the leftDeck/rightDeck implementation, since controller reacts to the SysEx message by sending the current state of all faders (even for decks 3/4, where value 0 is sent), but since the current decks are set to 1/2 the values for Deck 3/4 overwrite the correct values for Deck 1/2.

Well perhaps it would be nice. But how can activate your script? I put it in the mixxx files and under “Controllers”. But how can I activate it?

1 Like

Hi!
Well, you need the xml midi mapping from the original repo mentioned in the first post as well. Then select the controller in the preferences, activate it, select the preset from the dropdown and apply. Simple as that. Maybe have a look at the Mixxx docs for further information.

Best,
upCASE

Thank you for your answer. And I know a dummy like me is so difficult. One question more. Do you have also activate the jog wheels with this script… It is so frustrating. I can not writing java scripts. I looked on the video in youtube. It makes me frustrated. I would like to use my controller. But without jog wheels it is not like it is. I tried to use the midi assistant to configure it. But it will not accept

Step for Step.

I use Linux. I put your script under /home/thomas/.mixxx/controllers/ . Now I have two files DJ-202_MIDI_1.midi.xml and Roland_DJ-202-scripts.js . So I have a xml- File and your script.

I try to understand the philosophy of the scripts. The scripts are the basic to connect mixxx with the hardware and you have to use the midi assistant to configure the controller? - Is this true?

Well I tried to activate it on the match key. but without success. i am frustrated since three weeks. And it is so disspointing me. And in four weeks I have a party. And I want to use it with mixxx not serato.

Well I know I stress you but it would be nice to help a stupid man like me. Thanks.