Documentating my Traktor to BOME mapping experiences

Hi All,

I have several very large Traktor mappings, and I've just migrated to BOME. Below I've taken the time to document everything:

This is my main BMTP file:

The technical documentation has all the meaning of my BOME variables:

Because I'm lacking arrays, I'm emulating them for the 4-decks with sequences of global variables. This leads to a lot of copy-paste: 1234 5678 ABCD EFGH IJLM OPQR STUV XYWZ

And here I describe how I emulate 14-bit High resolution messages, Absolute positions, and Needle progress:

This is how the mapping looks like:


hope this info is useful to more mappers.

Thanks for documenting your experience.!I suspect other Traktor users running DDJ-1000 will find this quite useful.

Steve Caldwell
Bome Q and A Moderator and
Independent Bome Consultant/Specialist

Thanks for documenting your experience.!I suspect other Traktor users running DDJ-1000 will find this quite useful.

Steve Caldwell
Bome Q and A Moderator and
Independent Bome Consultant/Specialist

For documentation, this is the most important findings of my experiments: 14-bit High resolution messages, Absolute positions, and Needle progress:


ADVANCED BOME INTEGRATION – 14-bit out messages:
Q2: The BPM and Percentage values are very close, but not exactly the same, of what it displayed on the laptop screen
A2: Reason: Traktor lacks high-resolution MIDI out messages. Even so, a trick was already implemented to improve accuracy 10x times (compared to a naive mapping).

T2: Traktor receives 14-bit messages just fine (combo messages), but cannot send it.
This was confirmed by hacking CMDR to generate a valid TSI of a combo message – nothing got sent by Traktor.

As a workaround, accuracy was improved 10x by creating 10x separate 7-bit ranges, each on a separate CC, and reacting to only a part of the whole range, eg: 0.0->0.1; 0.1->0.2; 0.2->0.3; …
This lead to the next problem: when the value crosses multiple ranges, potentially all, then all of them independently react with their extreme values. Note that these output values also follow a non-deterministic order.
This was addressed as follows: collect all outputs until a 10ms timer expires, and ignore the extreme values, keeping only the final intermediate value (which can come in any order).
If really going to an extreme value, in particular 0.0 or 1.0, collect that with 11th low resolution CC that encompasses the whole range.
After the timer expires, process the single value as normal
Q3: The time elapsed/remain is approximate to what is displayed on the laptop screen. Ans/Or, the seconds advances either too fast or too slow.
A3: Reason: Traktor doesn’t send the absolute minutes:seconds position, only the relative percentage position instead.
The mapping guesses the total track length using an internal clock.
press shift+quantize (=”Wake up”) while the track is playing to reset the measurement process.

ADVANCED BOME INTEGRATION – Absolute track position emulation:
T3: even with the high-resolution trick explained above, it is still a relative position.
To transform this into an absolute value, we implement a master clock in BOME with a timer every 100ms. On the seek position code we measure how many ticks elapsed when 0.5% of the track has elapsed without any jumps or interruptions.
When we have this value, a simple multiplication by 200 gives the estimated track length, to which is then trivial to calculate elapsed/remain values in MM:SS format.
As mentioned, pressing shift+quantize triggers a “send monitor state” command that resends all values, restarting the measurement process.

ADVANCED BOME INTEGRATION – Needle progress emulation:
Q4: Needle position sometimes jumps around after scratching.
A4: Traktor lacks a “jog turn out message”, so this is emulated in BOME. Please join the DJTT discussion to improve this in the next version.

T4: The best message to implement the needle position is “beat phase”. Significant amount of time was spend using this message. It only sends the -45deg..45deg information. This is accumulated internally to a 0deg..360deg value that is displayed for the user.
When the user seeks away, we just get a new 45deg position, unlinked to the actual 360 position. (this could be improved by merging with the 1000 points seek relative position descried above).
Instead, we implemented the full state machine of the deck (stopped, playing, cueing), interpreted the jog touch and jog turn messages directly from the device (instead of traktor), and advanced the needle using the internal fake clock.

I’ve added this post to the advanced mappings index:

Hi Pedro,
I was researching into turn Traktor controllers into standalones (class compliant) and I found your post. I want to share this resource due I believe it’s the missing piece for improve the final step for your amazing job.

This is the library which Vicenzo was building before join NI to help develop M+. It’s not up to date because the improvements he had make in between should be at M+ guts but since there are lots of users reporting issues with usb and since NI doesn’t seems willing to release a “simple midification box” I believe bomebox could be the missing dot (and maybe you could do a deal with NI like Vicenzo did back in the day) and get special “bomebox for NI”.