Working VU-Meter LEDs for Hercules DJControl Jogvision in djay Pro (custom .djayMidiMapping)
Since the Jogvision was never officially supported by djay, its VU-meter LEDs have been a known dead end in the community for years (see the old threads: “MIDI Mapping VU-meters and LED feedback in general” and “Djay Pro with Hercules JogVision”). I finally got them working on both decks using a custom .djayMidiMapping file, and wanted to document the fix since it wasn’t written down anywhere.
TL;DR
Add this to the <key>outputs</key> array of your .djayMidiMapping file:
<dict>
<key>controlType</key>
<string>control</string>
<key>keyPath</key>
<string>turntable1.monoMeter</string>
<key>midiChannel</key>
<integer>0</integer>
<key>midiData</key>
<integer>68</integer>
<key>midiMessageType</key>
<integer>1</integer>
<key>midiMinValue</key>
<real>0</real>
<key>midiMaxValue</key>
<real>6</real>
</dict>
<dict>
<key>controlType</key>
<string>control</string>
<key>keyPath</key>
<string>turntable2.monoMeter</string>
<key>midiChannel</key>
<integer>1</integer>
<key>midiData</key>
<integer>68</integer>
<key>midiMessageType</key>
<integer>1</integer>
<key>midiMinValue</key>
<real>0</real>
<key>midiMaxValue</key>
<real>6</real>
</dict>
Why this works
The Jogvision’s VU-meter LED protocol is officially documented by Hercules (buried in a PDF most people never find, linked from the Jogvision support page under “MIDI mapping” → “Midi Commands DJControl jogvision”):
VMETER_LEVEL_DA 90 44 Note On, Deck A, note 0x44 (68)
value 00 = all off
value 01–06 = lights LEDs 1 through that number
value 06 = all 6 LEDs on
VMETER_LEVEL_DB 91 44 same, Deck B (channel 2)
So it’s a single Note message per deck; the velocity (0–6) directly sets how many of the 6 segments are lit. It is not a 0–127 range like most CC-based meters — that was the mistake that cost me the most time.
The keyPath (turntable1.monoMeter / turntable2.monoMeter) isn’t documented by Algoriddim anywhere either, but it’s confirmed to exist and work by pulling the outputs block straight out of djay’s own natively-bundled mappings for other controllers that do have officially supported VU-meters — e.g. Hercules DJControl Inpulse 300.djayMidiMapping and NI Traktor Kontrol Z1.djayMidiMapping (both ship inside djay Pro.app/Contents/Resources/MIDI Mappings/). Both use the exact same keyPath, just different midiData/midiChannel matching their own hardware’s protocol.
How to apply it
-
Quit djay Pro.
-
Open your Jogvision
.djayMidiMappingfile in a text editor (it’s plist/XML). On Mac it typically lives in~/Music/djay Pro/MIDI Mappings/. -
Paste the two
<dict>blocks above into the<array>under<key>outputs</key>(create that key/array if your file doesn’t have one yet). -
Save, relaunch djay Pro, load a track and play.
What I couldn’t get working: the 4 beat-position LEDs
The Jogvision also has 4 LEDs that mark which beat (1–4) of the bar is currently playing (BEAT1_DA–BEAT4_DA, Note On/Off, notes 0x3A–0x3D — also documented in the same Hercules PDF). Unlike the VU-meter, this one’s a dead end via custom mapping: djay ships a hardcoded, private class called HerculesBeatAssistLEDController (visible via strings on the app binary) that appears to drive beat LEDs directly for natively-recognized Hercules controllers, bypassing the generic outputs/keyPath system entirely. There’s no exposed keyPath that reflects “current beat position in bar” that a custom mapping can bind to — I checked every native mapping file that has any kind of beat-related output, and none of them expose it this way (Pioneer/Denon/AlphaTheta gear all use per-device-family solutions like customProcessor.* or CDJ HID protocols, not something transferable to a generic MIDI output).
If anyone from Algoriddim reads this: exposing whatever drives HerculesBeatAssistLEDController (or a generic turntableN.beatPositionInBar-style keyPath) as a normal output-bindable property would make this fully solvable for Jogvision owners, and probably a few other non-native Hercules controllers too.
Credit
The general technique of copying an outputs block from a native mapping into a custom one was pointed out years ago by DJ Juwansome in the AKAI AMX mapping thread — worth crediting since that’s what pointed me in the right direction.