Hello
I've just got my hands on a very cute dj controller, faderfox dj4, and I am having difficulties to map it properly.
Is there anyone who can is willing to help 1 on 1?
The problems I need to come around:
- The two decks of the controller send CC's on separate MIDI channels but the learn function seems to use omni channel for incoming signals, can't map the two sides.
- The buttons are momentarily, and mapping the play button results in play as long as I press the button..... I need to access a toggle function for that.
- The rotary encoders send incremental or relative changes.
- In the described script directory there is no script at all. I'd love to see a working one for examples, not only the bits and pieces which can be added.
- In the mapper I don't see any solution to address the LED indicators on the device itself. Therefore I think I really need to build a script.
I'd be really glad if somebody could help me where to start.
Many thanks!
I've just got my hands on a very cute dj controller, faderfox dj4, and I am having difficulties to map it properly.
Is there anyone who can is willing to help 1 on 1?
The problems I need to come around:
- The two decks of the controller send CC's on separate MIDI channels but the learn function seems to use omni channel for incoming signals, can't map the two sides.
- The buttons are momentarily, and mapping the play button results in play as long as I press the button..... I need to access a toggle function for that.
- The rotary encoders send incremental or relative changes.
- In the described script directory there is no script at all. I'd love to see a working one for examples, not only the bits and pieces which can be added.
- In the mapper I don't see any solution to address the LED indicators on the device itself. Therefore I think I really need to build a script.
I'd be really glad if somebody could help me where to start.
Many thanks!
Posté Sat 28 Nov 20 @ 11:30 pm
Because the device is complex it needs a specific definition file not only a map
https://www.virtualdj.com/wiki/ControllerDefinitionMIDIv8.html
This allows to describe and name all buttons and encoders and leds ... with their specific values and channel
https://www.virtualdj.com/wiki/ControllerDefinitionMIDIv8.html
This allows to describe and name all buttons and encoders and leds ... with their specific values and channel
Posté Sun 29 Nov 20 @ 1:16 am
Post up your definition file so far
Posté Sun 29 Nov 20 @ 1:26 am
This is where I got so far... I am unsure if any of this works. No mapping so far.
<!-- Faderfox DJ4 VirtualDJ 2021 Controller Script v0.1 -->
<!-- Use setup 3 with factory settings on the DJ4 (shift+global > fx3 > shift+fx3 > shift+global) -->
<!-- Encoders for FX 1-2-3-4 and buttons for deck 3-4 not mapped -->
<device name="FFDJ4" author="mineral808" description="Faderfox DJ4" version="850" type="MIDI" decks="2" vid="2256" pid="2005" identifyer="#vid_2256&pid_2005&mi_00">
<!-- Encoders -->
<encoder cc="0x02" zero="0" name="" deck="1" channel="1" /> <!-- List/Load L -->
<encoder cc="0x04" zero="0" name="" deck="1" channel="1" /> <!-- Seek/Cue L -->
<encoder cc="0x06" zero="0" name="" deck="1" channel="1" /> <!-- Pitch/Key L -->
<encoder cc="0x08" zero="0" name="" deck="1" channel="1" /> <!-- Loop L -->
<encoder cc="0x02" zero="0" name="" deck="2" channel="2" /> <!-- List/Load R -->
<encoder cc="0x04" zero="0" name="" deck="2" channel="2" /> <!-- Seek/Cue R -->
<encoder cc="0x06" zero="0" name="" deck="2" channel="2" /> <!-- Pitch/Key R -->
<encoder cc="0x08" zero="0" name="" deck="2" channel="2" /> <!-- Loop R -->
<!-- Sliders -->
<slider cc="0x5C" zero="0x40" name="" channel="1" /> <!-- Crossfader -->
<slider cc="0x16" name="" deck="1" channel="1" /> <!-- Fader L -->
<slider cc="0x14" zero="0x40" name="" deck="1" channel="1" /> <!-- Filter L -->
<slider cc="0x0C" zero="0x40" name="" deck="1" channel="1" /> <!-- High L -->
<slider cc="0x0E" zero="0x40" name="" deck="1" channel="1" /> <!-- Mid L -->
<slider cc="0x10" zero="0x40" name="" deck="1" channel="1" /> <!-- Low L -->
<slider cc="0x16" name="" deck="2" channel="2" /> <!-- Fader R -->
<slider cc="0x14" zero="0x40" name="" deck="2" channel="2" /> <!-- Filter R -->
<slider cc="0x0C" zero="0x40" name="" deck="2" channel="2" /> <!-- High R -->
<slider cc="0x0E" zero="0x40" name="" deck="2" channel="2" /> <!-- Mid R -->
<slider cc="0x10" zero="0x40" name="" deck="2" channel="2" /> <!-- Low R -->
<!-- Buttons Global-->
<button cc="0x74" value="0x7F" off="0x00" name="" channel="1"/> <!-- Shift -->
<button cc="0x70" value="0x7F" off="0x00" name="" channel="1"/> <!-- List/Load -->
<button cc="0x68" value="0x7F" off="0x00" name="" channel="1"/> <!-- Seek/Cue -->
<button cc="0x6A" value="0x7F" off="0x00" name="" channel="1"/> <!-- Pitch/Key -->
<button cc="0x76" value="0x7F" off="0x00" name="" channel="1"/> <!-- Loop -->
<!-- Buttons Deck L-->
<button cc="0x6C" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- List/Load -->
<button cc="0x52" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Seek/Cue -->
<button cc="0x56" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Pitch/Key -->
<button cc="0x54" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Loop -->
<button cc="0x32" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Filter -->
<button cc="0x26" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Cue -->
<button cc="0x34" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Kill -->
<button cc="0x30" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Sync -->
<button cc="0x38" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Play-->
<button cc="0x4E" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- 1 -->
<button cc="0x50" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- 2 -->
<button cc="0x4A" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- 3 -->
<button cc="0x4F" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- 4 -->
<button cc="0x28" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Shift + 1 -->
<button cc="0x2A" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Shift + 2 -->
<button cc="0x29" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Shift + 3 -->
<button cc="0x2B" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Shift + 4 -->
<button cc="0x75" value="0x7F" name="" deck="1" channel="1"/> <!-- Shift + Sync -->
<button cc="0x75" value="0x7F" name="" deck="1" channel="3"/> <!-- Shift + Play -->
<!-- Buttons Deck R-->
<button cc="0x6C" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- List/Load -->
<button cc="0x52" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Seek/Cue -->
<button cc="0x56" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Pitch/Key -->
<button cc="0x54" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Loop -->
<button cc="0x32" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Filter -->
<button cc="0x26" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Cue -->
<button cc="0x34" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Kill -->
<button cc="0x30" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Sync -->
<button cc="0x38" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Play-->
<button cc="0x4E" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- 1 -->
<button cc="0x50" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- 2 -->
<button cc="0x4A" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- 3 -->
<button cc="0x4F" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- 4 -->
<button cc="0x28" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Shift + 1 -->
<button cc="0x2A" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Shift + 2 -->
<button cc="0x29" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Shift + 3 -->
<button cc="0x2B" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Shift + 4 -->
<button cc="0x75" value="0x7F" name="" deck="1" channel="2"/> <!-- Shift + Sync -->
<button cc="0x75" value="0x7F" name="" deck="1" channel="4"/> <!-- Shift + Play -->
</device>
<!-- Faderfox DJ4 VirtualDJ 2021 Controller Script v0.1 -->
<!-- Use setup 3 with factory settings on the DJ4 (shift+global > fx3 > shift+fx3 > shift+global) -->
<!-- Encoders for FX 1-2-3-4 and buttons for deck 3-4 not mapped -->
<device name="FFDJ4" author="mineral808" description="Faderfox DJ4" version="850" type="MIDI" decks="2" vid="2256" pid="2005" identifyer="#vid_2256&pid_2005&mi_00">
<!-- Encoders -->
<encoder cc="0x02" zero="0" name="" deck="1" channel="1" /> <!-- List/Load L -->
<encoder cc="0x04" zero="0" name="" deck="1" channel="1" /> <!-- Seek/Cue L -->
<encoder cc="0x06" zero="0" name="" deck="1" channel="1" /> <!-- Pitch/Key L -->
<encoder cc="0x08" zero="0" name="" deck="1" channel="1" /> <!-- Loop L -->
<encoder cc="0x02" zero="0" name="" deck="2" channel="2" /> <!-- List/Load R -->
<encoder cc="0x04" zero="0" name="" deck="2" channel="2" /> <!-- Seek/Cue R -->
<encoder cc="0x06" zero="0" name="" deck="2" channel="2" /> <!-- Pitch/Key R -->
<encoder cc="0x08" zero="0" name="" deck="2" channel="2" /> <!-- Loop R -->
<!-- Sliders -->
<slider cc="0x5C" zero="0x40" name="" channel="1" /> <!-- Crossfader -->
<slider cc="0x16" name="" deck="1" channel="1" /> <!-- Fader L -->
<slider cc="0x14" zero="0x40" name="" deck="1" channel="1" /> <!-- Filter L -->
<slider cc="0x0C" zero="0x40" name="" deck="1" channel="1" /> <!-- High L -->
<slider cc="0x0E" zero="0x40" name="" deck="1" channel="1" /> <!-- Mid L -->
<slider cc="0x10" zero="0x40" name="" deck="1" channel="1" /> <!-- Low L -->
<slider cc="0x16" name="" deck="2" channel="2" /> <!-- Fader R -->
<slider cc="0x14" zero="0x40" name="" deck="2" channel="2" /> <!-- Filter R -->
<slider cc="0x0C" zero="0x40" name="" deck="2" channel="2" /> <!-- High R -->
<slider cc="0x0E" zero="0x40" name="" deck="2" channel="2" /> <!-- Mid R -->
<slider cc="0x10" zero="0x40" name="" deck="2" channel="2" /> <!-- Low R -->
<!-- Buttons Global-->
<button cc="0x74" value="0x7F" off="0x00" name="" channel="1"/> <!-- Shift -->
<button cc="0x70" value="0x7F" off="0x00" name="" channel="1"/> <!-- List/Load -->
<button cc="0x68" value="0x7F" off="0x00" name="" channel="1"/> <!-- Seek/Cue -->
<button cc="0x6A" value="0x7F" off="0x00" name="" channel="1"/> <!-- Pitch/Key -->
<button cc="0x76" value="0x7F" off="0x00" name="" channel="1"/> <!-- Loop -->
<!-- Buttons Deck L-->
<button cc="0x6C" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- List/Load -->
<button cc="0x52" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Seek/Cue -->
<button cc="0x56" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Pitch/Key -->
<button cc="0x54" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Loop -->
<button cc="0x32" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Filter -->
<button cc="0x26" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Cue -->
<button cc="0x34" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Kill -->
<button cc="0x30" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Sync -->
<button cc="0x38" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Play-->
<button cc="0x4E" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- 1 -->
<button cc="0x50" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- 2 -->
<button cc="0x4A" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- 3 -->
<button cc="0x4F" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- 4 -->
<button cc="0x28" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Shift + 1 -->
<button cc="0x2A" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Shift + 2 -->
<button cc="0x29" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Shift + 3 -->
<button cc="0x2B" value="0x7F" off="0x00" name="" deck="1" channel="1"/> <!-- Shift + 4 -->
<button cc="0x75" value="0x7F" name="" deck="1" channel="1"/> <!-- Shift + Sync -->
<button cc="0x75" value="0x7F" name="" deck="1" channel="3"/> <!-- Shift + Play -->
<!-- Buttons Deck R-->
<button cc="0x6C" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- List/Load -->
<button cc="0x52" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Seek/Cue -->
<button cc="0x56" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Pitch/Key -->
<button cc="0x54" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Loop -->
<button cc="0x32" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Filter -->
<button cc="0x26" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Cue -->
<button cc="0x34" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Kill -->
<button cc="0x30" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Sync -->
<button cc="0x38" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Play-->
<button cc="0x4E" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- 1 -->
<button cc="0x50" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- 2 -->
<button cc="0x4A" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- 3 -->
<button cc="0x4F" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- 4 -->
<button cc="0x28" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Shift + 1 -->
<button cc="0x2A" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Shift + 2 -->
<button cc="0x29" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Shift + 3 -->
<button cc="0x2B" value="0x7F" off="0x00" name="" deck="2" channel="2"/> <!-- Shift + 4 -->
<button cc="0x75" value="0x7F" name="" deck="1" channel="2"/> <!-- Shift + Sync -->
<button cc="0x75" value="0x7F" name="" deck="1" channel="4"/> <!-- Shift + Play -->
</device>
Posté Sun 29 Nov 20 @ 1:42 am
Thank you for sharing your definition file (in progress).
I am very interested in learning the process to create a definitions file since all controllers are NOT natively supported, and interested in at some point having a controller with some knobs to control the 5 stems of VDJ
This is the first definition file that I have seen, (since any that come with VDJ are natively supported and compiled into the software)
How did you generate this definition file?
Looking at it, and using the link that Nicotux has posted above ( https://www.virtualdj.com/wiki/ControllerDefinitionMIDIv8.html ), I can see that in every instance you have name=""
ie, you have NOT named (all blank) any of the buttons, encoders etc, which will be the NAME used by the Mapper. And imagine this definition file would not work because of that alone.
looking forward to learning more from those that have created a definitions and mapping files for VDJ.
I am very interested in learning the process to create a definitions file since all controllers are NOT natively supported, and interested in at some point having a controller with some knobs to control the 5 stems of VDJ
This is the first definition file that I have seen, (since any that come with VDJ are natively supported and compiled into the software)
How did you generate this definition file?
Looking at it, and using the link that Nicotux has posted above ( https://www.virtualdj.com/wiki/ControllerDefinitionMIDIv8.html ), I can see that in every instance you have name=""
ie, you have NOT named (all blank) any of the buttons, encoders etc, which will be the NAME used by the Mapper. And imagine this definition file would not work because of that alone.
looking forward to learning more from those that have created a definitions and mapping files for VDJ.
Posté Sun 29 Nov 20 @ 5:52 pm
Well honestly, it is the first config file I saw so far too.
I just started notepad and started typing all the relevant stuff I found here: https://www.virtualdj.com/wiki/ControllerDefinitionMIDIv8.html
I use midi-ox to monitor what the controller is doing and adding the CCs in that context.
I have no idea if it will work at all. That is why I am here, asking for support from someone who already did a controller definition.
The empty name="" is supposed to be filled with the function of VirtualDJ. Like play_pause for the play button. I just started to add those, but it is challenging to figure out the function names. I use the mapper in the options.
I just started notepad and started typing all the relevant stuff I found here: https://www.virtualdj.com/wiki/ControllerDefinitionMIDIv8.html
I use midi-ox to monitor what the controller is doing and adding the CCs in that context.
I have no idea if it will work at all. That is why I am here, asking for support from someone who already did a controller definition.
The empty name="" is supposed to be filled with the function of VirtualDJ. Like play_pause for the play button. I just started to add those, but it is challenging to figure out the function names. I use the mapper in the options.
Posté Sun 29 Nov 20 @ 8:14 pm
Yes and There are some other issues:
vid and pid need to be set in HEX with prefix vid="0x2256" pid="0x2005"
with a typo in identifier (which may not be needed if vid and pid are ok)
otherwhise the device file is not used because the device does not match
IIDEEJAYII is right
No name for keys prevent them to appear in the list of available keys and key combo in mapper
It is not supposed to receive script like play_pause but name as "PLAYBUTTON"
then mapping the "PLAYPAUSE" key to "play_pause" is done in the mapper goes to map file not device file
LEDs can also be define as doc says "same as chan in"
good example close to what you needs
https://bassapps.de/mappings.html
other operational (for Pro users) can be found in mappers and used as examples
https://www.virtualdj.com/plugins/index.html?category=other&subcat=2
or older (more having a device file)
http://www.virtualdj.com/addons/controllers.html
vid and pid need to be set in HEX with prefix vid="0x2256" pid="0x2005"
with a typo in identifier (which may not be needed if vid and pid are ok)
otherwhise the device file is not used because the device does not match
IIDEEJAYII is right
No name for keys prevent them to appear in the list of available keys and key combo in mapper
It is not supposed to receive script like play_pause but name as "PLAYBUTTON"
then mapping the "PLAYPAUSE" key to "play_pause" is done in the mapper goes to map file not device file
LEDs can also be define as doc says "same as chan in"
good example close to what you needs
https://bassapps.de/mappings.html
other operational (for Pro users) can be found in mappers and used as examples
https://www.virtualdj.com/plugins/index.html?category=other&subcat=2
or older (more having a device file)
http://www.virtualdj.com/addons/controllers.html
Posté Sun 29 Nov 20 @ 10:16 pm
Ahaa, okay. Now I get it. In the controller definition really just identifies the connected hardware and names all the controls. Then these names will be mapped to functions.
Thanks for the hexa hint in the vid and pid, the hardware was now detected. The named controllers showed up but I can't map them, or at least they do not seem to arrive properly.
Posté Sun 29 Nov 20 @ 10:45 pm
have you named them in the def?
Posté Mon 30 Nov 20 @ 5:03 am
Way back in 2006 I used the Faderfox DJ2 in Ibiza as well as my local nightclub residency. I was using Traktor back then just prior to switching to VirtualDJ. I'm struggling to remember details, but, I must have had a definition file for Traktor to use it. It was great for traveling, I still have it. I used to carry it in my gig bag as a backup controller until one of the faders got damaged. It was pure MIDI output and I had to use a MIDI to USB converter box to connect it to the laptop. I sold the converter box many years ago (can be seen at the bottom left of the pic).
P.S. I still use that Dell Inspiron 6000 laptop as well, just for my accounts though as it's running Windows XP.
Faderfox DJ2 being used at The Orange Corner, San Antonio, Ibiza;
P.S. I still use that Dell Inspiron 6000 laptop as well, just for my accounts though as it's running Windows XP.
Faderfox DJ2 being used at The Orange Corner, San Antonio, Ibiza;
Posté Mon 30 Nov 20 @ 8:36 am
Now that I start to understand I think I did it right this time. All shows up in the mapper in the options.
I am quiet unsure about the LEDs and about deck separation. On the bottom side it got transport and fx buttons for 4 decks, but all the rest is separated to left and right. The buttons send on different channels for deck a and c, but the mid and top section remains on their own midi channels. And I am unsure about the deck="2" parameter right at the top.
I have not started the mapping file yet.
Here it is my controller definition file:
<!-- Faderfox DJ4 VirtualDJ 2021 Controller Definition v0.2 -->
<!-- Use setup 2 with factory settings on the DJ4 (shift+global > fx2 > shift+fx2 > shift+global) -->
<device name="FFDJ4" author="mineral808" description="Faderfox DJ4" version="850" type="MIDI" decks="2" vid="0x2256" pid="0x2005">
<!-- Top Encoders & Buttons -->
<!-- Global -->
<encoder cc="0x64" zero="0" name="GLO-TREE" channel="0" />
<encoder cc="0x60" zero="0" name="GLO-MON-MIX" channel="0" />
<encoder cc="0x62" zero="0" name="GLO-MON-VOL" channel="0" />
<encoder cc="0x5E" zero="0" name="GLO-MAST" channel="0" />
<button cc="0x70" value="0x7F" off="0x00" name="GLO-TREE-PRESS" channel="0"/>
<button cc="0x68" value="0x7F" off="0x00" name="GLO-MON-MIX-PRESS" channel="0"/>
<button cc="0x6A" value="0x7F" off="0x00" name="GLO-MON-VOL-PRESS" channel="0"/>
<button cc="0x76" value="0x7F" off="0x00" name="GLO-MAST-PRESS" channel="0"/>
<!-- L.Deck -->
<encoder cc="0x66" zero="0" name="L-LIST-LOAD" channel="0" />
<encoder cc="0x18" zero="0" name="L-SEEK-CUE" channel="0" />
<encoder cc="0x1C" zero="0" name="L-PITCH-KEY" channel="0" />
<encoder cc="0x1A" zero="0" name="L-LOOP" channel="0" />
<button cc="0x6C" value="0x7F" off="0x00" name="L-LIST-LOAD-PRESS" channel="0"/>
<button cc="0x52" value="0x7F" off="0x00" name="L-SEEK-CUE-PRESS" channel="0"/>
<button cc="0x56" value="0x7F" off="0x00" name="L-PITCH-KEY-PRESS" channel="0"/>
<button cc="0x54" value="0x7F" off="0x00" name="L-LOOP-PRESS" channel="0"/>
<!-- R.Deck -->
<encoder cc="0x66" zero="0" name="R-LIST-LOAD" channel="1" />
<encoder cc="0x18" zero="0" name="R-SEEK-CUE" channel="1" />
<encoder cc="0x1C" zero="0" name="R-PITCH-KEY" channel="1" />
<encoder cc="0x1A" zero="0" name="R-LOOP" channel="1" />
<button cc="0x6C" value="0x7F" off="0x00" name="R-LIST-LOAD-PRESS" channel="1"/>
<button cc="0x52" value="0x7F" off="0x00" name="R-SEEK-CUE-PRESS" channel="1"/>
<button cc="0x56" value="0x7F" off="0x00" name="R-PITCH-KEY-PRESS" channel="1"/>
<button cc="0x54" value="0x7F" off="0x00" name="R-LOOP-PRESS" channel="1"/>
<!-- FX1 -->
<encoder cc="0x02" zero="0" name="FX1-LIST-LOAD" channel="0" />
<encoder cc="0x04" zero="0" name="FX1-SEEK-CUE" channel="0" />
<encoder cc="0x06" zero="0" name="FX1-PITCH-KEY" channel="0" />
<encoder cc="0x08" zero="0" name="FX1-LOOP" channel="0" />
<button cc="0x1E" value="0x7F" off="0x00" name="FX1-LIST-LOAD-PRESS" channel="0"/>
<button cc="0x20" value="0x7F" off="0x00" name="FX1-SEEK-CUE-PRESS" channel="0"/>
<button cc="0x22" value="0x7F" off="0x00" name="FX1-PITCH-KEY-PRESS" channel="0"/>
<button cc="0x24" value="0x7F" off="0x00" name="FX1-LOOP-PRESS" channel="0"/>
<!-- FX2 -->
<encoder cc="0x02" zero="0" name="FX2-LIST-LOAD" channel="1" />
<encoder cc="0x04" zero="0" name="FX2-SEEK-CUE" channel="1" />
<encoder cc="0x06" zero="0" name="FX2-PITCH-KEY" channel="1" />
<encoder cc="0x08" zero="0" name="FX2-LOOP" channel="1" />
<button cc="0x1E" value="0x7F" off="0x00" name="FX2-LIST-LOAD-PRESS" channel="1"/>
<button cc="0x20" value="0x7F" off="0x00" name="FX2-SEEK-CUE-PRESS" channel="1"/>
<button cc="0x22" value="0x7F" off="0x00" name="FX2-PITCH-KEY-PRESS" channel="1"/>
<button cc="0x24" value="0x7F" off="0x00" name="FX2-LOOP-PRESS" channel="1"/>
<!-- FX3 -->
<encoder cc="0x02" zero="0" name="FX3-LIST-LOAD" channel="2" />
<encoder cc="0x04" zero="0" name="FX3-SEEK-CUE" channel="2" />
<encoder cc="0x06" zero="0" name="FX3-PITCH-KEY" channel="2" />
<encoder cc="0x08" zero="0" name="FX3-LOOP" channel="2" />
<button cc="0x1E" value="0x7F" off="0x00" name="FX3-LIST-LOAD-PRESS" channel="2"/>
<button cc="0x20" value="0x7F" off="0x00" name="FX3-SEEK-CUE-PRESS" channel="2"/>
<button cc="0x22" value="0x7F" off="0x00" name="FX3-PITCH-KEY-PRESS" channel="2"/>
<button cc="0x24" value="0x7F" off="0x00" name="FX3-LOOP-PRESS" channel="2"/>
<!-- FX4 -->
<encoder cc="0x02" zero="0" name="FX4-LIST-LOAD" channel="3" />
<encoder cc="0x04" zero="0" name="FX4-SEEK-CUE" channel="3" />
<encoder cc="0x06" zero="0" name="FX4-PITCH-KEY" channel="3" />
<encoder cc="0x08" zero="0" name="FX4-LOOP" channel="3" />
<button cc="0x1E" value="0x7F" off="0x00" name="FX4-LIST-LOAD-PRESS" channel="3"/>
<button cc="0x20" value="0x7F" off="0x00" name="FX4-SEEK-CUE-PRESS" channel="3"/>
<button cc="0x22" value="0x7F" off="0x00" name="FX4-PITCH-KEY-PRESS" channel="3"/>
<button cc="0x24" value="0x7F" off="0x00" name="FX4-LOOP-PRESS" channel="3"/>
<!-- Mid Section -->
<!-- Center -->
<slider cc="0x5C" zero="0x40" name="CROSSFADER" channel="0" />
<!-- Left Knobs, Buttons, LEDs -->
<slider cc="0x16" name="L-FADER" deck="1" channel="0"/>
<slider cc="0x14" zero="0x40" name="L-FILTER" deck="1" channel="0"/>
<slider cc="0x0C" zero="0x40" name="L-EQ-H" deck="1" channel="0"/>
<slider cc="0x0E" zero="0x40" name="L-EQ-M" deck="1" channel="0"/>
<slider cc="0x10" zero="0x40" name="L-EQ-L" deck="1" channel="0"/>
<button cc="0x32" value="0x7F" off="0x00" name="L-FILTER-BUTTON" deck="1" channel="0"/>
<button cc="0x26" value="0x7F" off="0x00" name="L-CUE-BUTTON" deck="1" channel="0"/>
<button cc="0x34" value="0x7F" off="0x00" name="L-KILL-BUTTON" deck="1" channel="0"/>
<led cc="0x32" value="0x7F" ccoff="0x00" sendstatic="true" name="L-FILTER-LED" default="L-FILTER-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<led cc="0x26" value="0x7F" ccoff="0x00" sendstatic="true" name="L-CUE-LED" default="L-CUE-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<led cc="0x34" value="0x7F" ccoff="0x00" sendstatic="true" name="L-KILL-LED" default="L-KILL-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<!-- Right Knobs, Buttons, LEDs -->
<slider cc="0x16" name="R-FADER" deck="2" channel="1"/>
<slider cc="0x14" zero="0x40" name="R-FILTER" deck="2" channel="1"/>
<slider cc="0x0C" zero="0x40" name="R-EQ-H" deck="2" channel="1"/>
<slider cc="0x0E" zero="0x40" name="R-EQ-M" deck="2" channel="1"/>
<slider cc="0x10" zero="0x40" name="R-EQ-L" deck="2" channel="1"/>
<button cc="0x32" value="0x7F" off="0x00" name="R-FILTER-BUTTON" deck="2" channel="1"/>
<button cc="0x26" value="0x7F" off="0x00" name="R-CUE-BUTTON" deck="2" channel="1"/>
<button cc="0x34" value="0x7F" off="0x00" name="R-KILL-BUTTON" deck="2" channel="1"/>
<led cc="0x32" value="0x7F" ccoff="0x00" sendstatic="true" name="R-FILTER-LED" default="R-FILTER-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<led cc="0x26" value="0x7F" ccoff="0x00" sendstatic="true" name="R-CUE-LED" default="R-CUE-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<led cc="0x34" value="0x7F" ccoff="0x00" sendstatic="true" name="R-KILL-LED" default="R-KILL-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<!-- Bottom section -->
<!-- Center -->
<button cc="0x74" value="0x7F" off="0x00" name="SHIFT" channel="0"/>
<!-- Deck-A Buttons, LEDs -->
<button cc="0x30" value="0x7F" off="0x00" name="L-SYNC-DECK-A-BUTTON" deck="1" channel="0"/>
<button cc="0x4E" value="0x7F" off="0x00" name="L-JUMP-DECK-A-BACKWARDS" deck="1" channel="0"/>
<button cc="0x50" value="0x7F" off="0x00" name="L-JUMP-DECK-A-FORWARDS" deck="1" channel="0"/>
<button cc="0x38" value="0x7F" off="0x00" name="L-PLAY-DECK-A-BUTTON" deck="1" channel="0"/>
<button cc="0x4A" value="0x7F" off="0x00" name="L-3-DECK-A-BUTTON" deck="1" channel="0"/>
<button cc="0x4F" value="0x7F" off="0x00" name="L-4-DECK-A-BUTTON" deck="1" channel="0"/>
<button cc="0x28" value="0x7F" off="0x00" name="L-FX1-DECK-A-BUTTON" deck="1" channel="0"/> <!-- hold shift -->
<button cc="0x2A" value="0x7F" off="0x00" name="L-FX2-DECK-A-BUTTON" deck="1" channel="0"/> <!-- hold shift -->
<button cc="0x29" value="0x7F" off="0x00" name="L-FX3-DECK-A-BUTTON" deck="1" channel="0"/> <!-- hold shift -->
<button cc="0x2B" value="0x7F" off="0x00" name="L-FX4-DECK-A-BUTTON" deck="1" channel="0"/> <!-- hold shift -->
<led cc="0x30" value="0x7F" ccoff="0x00" sendstatic="true" name="L-SYNC-DECK-A-LED" default="L-SYNC-DECK-A-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<led cc="0x38" value="0x7F" ccoff="0x00" sendstatic="true" name="L-PLAY-DECK-A-LED" default="L-PLAY-DECK-A-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<!-- Deck-B Buttons, LEDs -->
<button cc="0x30" value="0x7F" off="0x00" name="R-SYNC-DECK-B-BUTTON" deck="2" channel="1"/>
<button cc="0x4E" value="0x7F" off="0x00" name="R-JUMP-DECK-B-BACKWARDS" deck="2" channel="1"/>
<button cc="0x50" value="0x7F" off="0x00" name="R-JUMP-DECK-B-FORWARDS" deck="2" channel="1"/>
<button cc="0x38" value="0x7F" off="0x00" name="R-PLAY-DECK-B-BUTTON" deck="2" channel="1"/>
<button cc="0x4A" value="0x7F" off="0x00" name="R-3-DECK-B-BUTTON" deck="2" channel="1"/>
<button cc="0x4F" value="0x7F" off="0x00" name="R-4-DECK-B-BUTTON" deck="2" channel="1"/>
<button cc="0x28" value="0x7F" off="0x00" name="R-FX1-DECK-B-BUTTON" deck="2" channel="1"/> <!-- hold shift -->
<button cc="0x2A" value="0x7F" off="0x00" name="R-FX2-DECK-B-BUTTON" deck="2" channel="1"/> <!-- hold shift -->
<button cc="0x29" value="0x7F" off="0x00" name="R-FX3-DECK-B-BUTTON" deck="2" channel="1"/> <!-- hold shift -->
<button cc="0x2B" value="0x7F" off="0x00" name="R-FX4-DECK-B-BUTTON" deck="2" channel="1"/> <!-- hold shift -->
<led cc="0x30" value="0x7F" ccoff="0x00" sendstatic="true" name="R-SYNC-DECK-B-LED" default="L-SYNC-DECK-B-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<led cc="0x38" value="0x7F" ccoff="0x00" sendstatic="true" name="R-PLAY-DECK-B-LED" default="L-PLAY-DECK-B-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<!-- Deck-C Buttons, LEDs -->
<button cc="0x30" value="0x7F" off="0x00" name="L-SYNC-DECK-C-BUTTON" deck="3" channel="2"/>
<button cc="0x4E" value="0x7F" off="0x00" name="L-JUMP-DECK-C-BACKWARDS" deck="3" channel="2"/>
<button cc="0x50" value="0x7F" off="0x00" name="L-JUMP-DECK-C-FORWARDS" deck="3" channel="2"/>
<button cc="0x38" value="0x7F" off="0x00" name="L-PLAY-DECK-C-BUTTON" deck="3" channel="2"/>
<button cc="0x4A" value="0x7F" off="0x00" name="L-3-DECK-C-BUTTON" deck="3" channel="2"/>
<button cc="0x4F" value="0x7F" off="0x00" name="L-4-DECK-C-BUTTON" deck="3" channel="2"/>
<button cc="0x28" value="0x7F" off="0x00" name="L-FX1-DECK-C-BUTTON" deck="3" channel="2"/> <!-- hold shift -->
<button cc="0x2A" value="0x7F" off="0x00" name="L-FX2-DECK-C-BUTTON" deck="3" channel="2"/> <!-- hold shift -->
<button cc="0x29" value="0x7F" off="0x00" name="L-FX3-DECK-C-BUTTON" deck="3" channel="2"/> <!-- hold shift -->
<button cc="0x2B" value="0x7F" off="0x00" name="L-FX4-DECK-C-BUTTON" deck="3" channel="2"/> <!-- hold shift -->
<led cc="0x30" value="0x7F" ccoff="0x00" sendstatic="true" name="L-SYNC-DECK-C-LED" default="L-SYNC-DECK-C-BUTTON" deck="3" channel="2"/> <!-- may not work -->
<led cc="0x38" value="0x7F" ccoff="0x00" sendstatic="true" name="L-PLAY-DECK-C-LED" default="L-PLAY-DECK-C-BUTTON" deck="3" channel="2"/> <!-- may not work -->
<!-- Deck-D Buttons, LEDs -->
<button cc="0x30" value="0x7F" off="0x00" name="R-SYNC-DECK-D-BUTTON" deck="4" channel="3"/>
<button cc="0x4E" value="0x7F" off="0x00" name="R-JUMP-DECK-D-BACKWARDS" deck="4" channel="3"/>
<button cc="0x50" value="0x7F" off="0x00" name="R-JUMP-DECK-D-FORWARDS" deck="4" channel="3"/>
<button cc="0x38" value="0x7F" off="0x00" name="R-PLAY-DECK-D-BUTTON" deck="4" channel="3"/>
<button cc="0x4A" value="0x7F" off="0x00" name="R-3-DECK-D-BUTTON" deck="4" channel="3"/>
<button cc="0x4F" value="0x7F" off="0x00" name="R-4-DECK-D-BUTTON" deck="4" channel="3"/>
<button cc="0x28" value="0x7F" off="0x00" name="R-FX1-DECK-D-BUTTON" deck="4" channel="3"/> <!-- hold shift -->
<button cc="0x2A" value="0x7F" off="0x00" name="R-FX2-DECK-D-BUTTON" deck="4" channel="3"/> <!-- hold shift -->
<button cc="0x29" value="0x7F" off="0x00" name="R-FX3-DECK-D-BUTTON" deck="4" channel="3"/> <!-- hold shift -->
<button cc="0x2B" value="0x7F" off="0x00" name="R-FX4-DECK-D-BUTTON" deck="4" channel="3"/> <!-- hold shift -->
<led cc="0x30" value="0x7F" ccoff="0x00" sendstatic="true" name="R-SYNC-DECK-D-LED" default="L-SYNC-DECK-D-BUTTON" deck="4" channel="3"/> <!-- may not work -->
<led cc="0x38" value="0x7F" ccoff="0x00" sendstatic="true" name="R-PLAY-DECK-D-LED" default="L-PLAY-DECK-D-BUTTON" deck="4" channel="3"/> <!-- may not work -->
</device>
I am quiet unsure about the LEDs and about deck separation. On the bottom side it got transport and fx buttons for 4 decks, but all the rest is separated to left and right. The buttons send on different channels for deck a and c, but the mid and top section remains on their own midi channels. And I am unsure about the deck="2" parameter right at the top.
I have not started the mapping file yet.
Here it is my controller definition file:
<!-- Faderfox DJ4 VirtualDJ 2021 Controller Definition v0.2 -->
<!-- Use setup 2 with factory settings on the DJ4 (shift+global > fx2 > shift+fx2 > shift+global) -->
<device name="FFDJ4" author="mineral808" description="Faderfox DJ4" version="850" type="MIDI" decks="2" vid="0x2256" pid="0x2005">
<!-- Top Encoders & Buttons -->
<!-- Global -->
<encoder cc="0x64" zero="0" name="GLO-TREE" channel="0" />
<encoder cc="0x60" zero="0" name="GLO-MON-MIX" channel="0" />
<encoder cc="0x62" zero="0" name="GLO-MON-VOL" channel="0" />
<encoder cc="0x5E" zero="0" name="GLO-MAST" channel="0" />
<button cc="0x70" value="0x7F" off="0x00" name="GLO-TREE-PRESS" channel="0"/>
<button cc="0x68" value="0x7F" off="0x00" name="GLO-MON-MIX-PRESS" channel="0"/>
<button cc="0x6A" value="0x7F" off="0x00" name="GLO-MON-VOL-PRESS" channel="0"/>
<button cc="0x76" value="0x7F" off="0x00" name="GLO-MAST-PRESS" channel="0"/>
<!-- L.Deck -->
<encoder cc="0x66" zero="0" name="L-LIST-LOAD" channel="0" />
<encoder cc="0x18" zero="0" name="L-SEEK-CUE" channel="0" />
<encoder cc="0x1C" zero="0" name="L-PITCH-KEY" channel="0" />
<encoder cc="0x1A" zero="0" name="L-LOOP" channel="0" />
<button cc="0x6C" value="0x7F" off="0x00" name="L-LIST-LOAD-PRESS" channel="0"/>
<button cc="0x52" value="0x7F" off="0x00" name="L-SEEK-CUE-PRESS" channel="0"/>
<button cc="0x56" value="0x7F" off="0x00" name="L-PITCH-KEY-PRESS" channel="0"/>
<button cc="0x54" value="0x7F" off="0x00" name="L-LOOP-PRESS" channel="0"/>
<!-- R.Deck -->
<encoder cc="0x66" zero="0" name="R-LIST-LOAD" channel="1" />
<encoder cc="0x18" zero="0" name="R-SEEK-CUE" channel="1" />
<encoder cc="0x1C" zero="0" name="R-PITCH-KEY" channel="1" />
<encoder cc="0x1A" zero="0" name="R-LOOP" channel="1" />
<button cc="0x6C" value="0x7F" off="0x00" name="R-LIST-LOAD-PRESS" channel="1"/>
<button cc="0x52" value="0x7F" off="0x00" name="R-SEEK-CUE-PRESS" channel="1"/>
<button cc="0x56" value="0x7F" off="0x00" name="R-PITCH-KEY-PRESS" channel="1"/>
<button cc="0x54" value="0x7F" off="0x00" name="R-LOOP-PRESS" channel="1"/>
<!-- FX1 -->
<encoder cc="0x02" zero="0" name="FX1-LIST-LOAD" channel="0" />
<encoder cc="0x04" zero="0" name="FX1-SEEK-CUE" channel="0" />
<encoder cc="0x06" zero="0" name="FX1-PITCH-KEY" channel="0" />
<encoder cc="0x08" zero="0" name="FX1-LOOP" channel="0" />
<button cc="0x1E" value="0x7F" off="0x00" name="FX1-LIST-LOAD-PRESS" channel="0"/>
<button cc="0x20" value="0x7F" off="0x00" name="FX1-SEEK-CUE-PRESS" channel="0"/>
<button cc="0x22" value="0x7F" off="0x00" name="FX1-PITCH-KEY-PRESS" channel="0"/>
<button cc="0x24" value="0x7F" off="0x00" name="FX1-LOOP-PRESS" channel="0"/>
<!-- FX2 -->
<encoder cc="0x02" zero="0" name="FX2-LIST-LOAD" channel="1" />
<encoder cc="0x04" zero="0" name="FX2-SEEK-CUE" channel="1" />
<encoder cc="0x06" zero="0" name="FX2-PITCH-KEY" channel="1" />
<encoder cc="0x08" zero="0" name="FX2-LOOP" channel="1" />
<button cc="0x1E" value="0x7F" off="0x00" name="FX2-LIST-LOAD-PRESS" channel="1"/>
<button cc="0x20" value="0x7F" off="0x00" name="FX2-SEEK-CUE-PRESS" channel="1"/>
<button cc="0x22" value="0x7F" off="0x00" name="FX2-PITCH-KEY-PRESS" channel="1"/>
<button cc="0x24" value="0x7F" off="0x00" name="FX2-LOOP-PRESS" channel="1"/>
<!-- FX3 -->
<encoder cc="0x02" zero="0" name="FX3-LIST-LOAD" channel="2" />
<encoder cc="0x04" zero="0" name="FX3-SEEK-CUE" channel="2" />
<encoder cc="0x06" zero="0" name="FX3-PITCH-KEY" channel="2" />
<encoder cc="0x08" zero="0" name="FX3-LOOP" channel="2" />
<button cc="0x1E" value="0x7F" off="0x00" name="FX3-LIST-LOAD-PRESS" channel="2"/>
<button cc="0x20" value="0x7F" off="0x00" name="FX3-SEEK-CUE-PRESS" channel="2"/>
<button cc="0x22" value="0x7F" off="0x00" name="FX3-PITCH-KEY-PRESS" channel="2"/>
<button cc="0x24" value="0x7F" off="0x00" name="FX3-LOOP-PRESS" channel="2"/>
<!-- FX4 -->
<encoder cc="0x02" zero="0" name="FX4-LIST-LOAD" channel="3" />
<encoder cc="0x04" zero="0" name="FX4-SEEK-CUE" channel="3" />
<encoder cc="0x06" zero="0" name="FX4-PITCH-KEY" channel="3" />
<encoder cc="0x08" zero="0" name="FX4-LOOP" channel="3" />
<button cc="0x1E" value="0x7F" off="0x00" name="FX4-LIST-LOAD-PRESS" channel="3"/>
<button cc="0x20" value="0x7F" off="0x00" name="FX4-SEEK-CUE-PRESS" channel="3"/>
<button cc="0x22" value="0x7F" off="0x00" name="FX4-PITCH-KEY-PRESS" channel="3"/>
<button cc="0x24" value="0x7F" off="0x00" name="FX4-LOOP-PRESS" channel="3"/>
<!-- Mid Section -->
<!-- Center -->
<slider cc="0x5C" zero="0x40" name="CROSSFADER" channel="0" />
<!-- Left Knobs, Buttons, LEDs -->
<slider cc="0x16" name="L-FADER" deck="1" channel="0"/>
<slider cc="0x14" zero="0x40" name="L-FILTER" deck="1" channel="0"/>
<slider cc="0x0C" zero="0x40" name="L-EQ-H" deck="1" channel="0"/>
<slider cc="0x0E" zero="0x40" name="L-EQ-M" deck="1" channel="0"/>
<slider cc="0x10" zero="0x40" name="L-EQ-L" deck="1" channel="0"/>
<button cc="0x32" value="0x7F" off="0x00" name="L-FILTER-BUTTON" deck="1" channel="0"/>
<button cc="0x26" value="0x7F" off="0x00" name="L-CUE-BUTTON" deck="1" channel="0"/>
<button cc="0x34" value="0x7F" off="0x00" name="L-KILL-BUTTON" deck="1" channel="0"/>
<led cc="0x32" value="0x7F" ccoff="0x00" sendstatic="true" name="L-FILTER-LED" default="L-FILTER-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<led cc="0x26" value="0x7F" ccoff="0x00" sendstatic="true" name="L-CUE-LED" default="L-CUE-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<led cc="0x34" value="0x7F" ccoff="0x00" sendstatic="true" name="L-KILL-LED" default="L-KILL-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<!-- Right Knobs, Buttons, LEDs -->
<slider cc="0x16" name="R-FADER" deck="2" channel="1"/>
<slider cc="0x14" zero="0x40" name="R-FILTER" deck="2" channel="1"/>
<slider cc="0x0C" zero="0x40" name="R-EQ-H" deck="2" channel="1"/>
<slider cc="0x0E" zero="0x40" name="R-EQ-M" deck="2" channel="1"/>
<slider cc="0x10" zero="0x40" name="R-EQ-L" deck="2" channel="1"/>
<button cc="0x32" value="0x7F" off="0x00" name="R-FILTER-BUTTON" deck="2" channel="1"/>
<button cc="0x26" value="0x7F" off="0x00" name="R-CUE-BUTTON" deck="2" channel="1"/>
<button cc="0x34" value="0x7F" off="0x00" name="R-KILL-BUTTON" deck="2" channel="1"/>
<led cc="0x32" value="0x7F" ccoff="0x00" sendstatic="true" name="R-FILTER-LED" default="R-FILTER-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<led cc="0x26" value="0x7F" ccoff="0x00" sendstatic="true" name="R-CUE-LED" default="R-CUE-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<led cc="0x34" value="0x7F" ccoff="0x00" sendstatic="true" name="R-KILL-LED" default="R-KILL-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<!-- Bottom section -->
<!-- Center -->
<button cc="0x74" value="0x7F" off="0x00" name="SHIFT" channel="0"/>
<!-- Deck-A Buttons, LEDs -->
<button cc="0x30" value="0x7F" off="0x00" name="L-SYNC-DECK-A-BUTTON" deck="1" channel="0"/>
<button cc="0x4E" value="0x7F" off="0x00" name="L-JUMP-DECK-A-BACKWARDS" deck="1" channel="0"/>
<button cc="0x50" value="0x7F" off="0x00" name="L-JUMP-DECK-A-FORWARDS" deck="1" channel="0"/>
<button cc="0x38" value="0x7F" off="0x00" name="L-PLAY-DECK-A-BUTTON" deck="1" channel="0"/>
<button cc="0x4A" value="0x7F" off="0x00" name="L-3-DECK-A-BUTTON" deck="1" channel="0"/>
<button cc="0x4F" value="0x7F" off="0x00" name="L-4-DECK-A-BUTTON" deck="1" channel="0"/>
<button cc="0x28" value="0x7F" off="0x00" name="L-FX1-DECK-A-BUTTON" deck="1" channel="0"/> <!-- hold shift -->
<button cc="0x2A" value="0x7F" off="0x00" name="L-FX2-DECK-A-BUTTON" deck="1" channel="0"/> <!-- hold shift -->
<button cc="0x29" value="0x7F" off="0x00" name="L-FX3-DECK-A-BUTTON" deck="1" channel="0"/> <!-- hold shift -->
<button cc="0x2B" value="0x7F" off="0x00" name="L-FX4-DECK-A-BUTTON" deck="1" channel="0"/> <!-- hold shift -->
<led cc="0x30" value="0x7F" ccoff="0x00" sendstatic="true" name="L-SYNC-DECK-A-LED" default="L-SYNC-DECK-A-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<led cc="0x38" value="0x7F" ccoff="0x00" sendstatic="true" name="L-PLAY-DECK-A-LED" default="L-PLAY-DECK-A-BUTTON" deck="1" channel="0"/> <!-- may not work -->
<!-- Deck-B Buttons, LEDs -->
<button cc="0x30" value="0x7F" off="0x00" name="R-SYNC-DECK-B-BUTTON" deck="2" channel="1"/>
<button cc="0x4E" value="0x7F" off="0x00" name="R-JUMP-DECK-B-BACKWARDS" deck="2" channel="1"/>
<button cc="0x50" value="0x7F" off="0x00" name="R-JUMP-DECK-B-FORWARDS" deck="2" channel="1"/>
<button cc="0x38" value="0x7F" off="0x00" name="R-PLAY-DECK-B-BUTTON" deck="2" channel="1"/>
<button cc="0x4A" value="0x7F" off="0x00" name="R-3-DECK-B-BUTTON" deck="2" channel="1"/>
<button cc="0x4F" value="0x7F" off="0x00" name="R-4-DECK-B-BUTTON" deck="2" channel="1"/>
<button cc="0x28" value="0x7F" off="0x00" name="R-FX1-DECK-B-BUTTON" deck="2" channel="1"/> <!-- hold shift -->
<button cc="0x2A" value="0x7F" off="0x00" name="R-FX2-DECK-B-BUTTON" deck="2" channel="1"/> <!-- hold shift -->
<button cc="0x29" value="0x7F" off="0x00" name="R-FX3-DECK-B-BUTTON" deck="2" channel="1"/> <!-- hold shift -->
<button cc="0x2B" value="0x7F" off="0x00" name="R-FX4-DECK-B-BUTTON" deck="2" channel="1"/> <!-- hold shift -->
<led cc="0x30" value="0x7F" ccoff="0x00" sendstatic="true" name="R-SYNC-DECK-B-LED" default="L-SYNC-DECK-B-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<led cc="0x38" value="0x7F" ccoff="0x00" sendstatic="true" name="R-PLAY-DECK-B-LED" default="L-PLAY-DECK-B-BUTTON" deck="2" channel="1"/> <!-- may not work -->
<!-- Deck-C Buttons, LEDs -->
<button cc="0x30" value="0x7F" off="0x00" name="L-SYNC-DECK-C-BUTTON" deck="3" channel="2"/>
<button cc="0x4E" value="0x7F" off="0x00" name="L-JUMP-DECK-C-BACKWARDS" deck="3" channel="2"/>
<button cc="0x50" value="0x7F" off="0x00" name="L-JUMP-DECK-C-FORWARDS" deck="3" channel="2"/>
<button cc="0x38" value="0x7F" off="0x00" name="L-PLAY-DECK-C-BUTTON" deck="3" channel="2"/>
<button cc="0x4A" value="0x7F" off="0x00" name="L-3-DECK-C-BUTTON" deck="3" channel="2"/>
<button cc="0x4F" value="0x7F" off="0x00" name="L-4-DECK-C-BUTTON" deck="3" channel="2"/>
<button cc="0x28" value="0x7F" off="0x00" name="L-FX1-DECK-C-BUTTON" deck="3" channel="2"/> <!-- hold shift -->
<button cc="0x2A" value="0x7F" off="0x00" name="L-FX2-DECK-C-BUTTON" deck="3" channel="2"/> <!-- hold shift -->
<button cc="0x29" value="0x7F" off="0x00" name="L-FX3-DECK-C-BUTTON" deck="3" channel="2"/> <!-- hold shift -->
<button cc="0x2B" value="0x7F" off="0x00" name="L-FX4-DECK-C-BUTTON" deck="3" channel="2"/> <!-- hold shift -->
<led cc="0x30" value="0x7F" ccoff="0x00" sendstatic="true" name="L-SYNC-DECK-C-LED" default="L-SYNC-DECK-C-BUTTON" deck="3" channel="2"/> <!-- may not work -->
<led cc="0x38" value="0x7F" ccoff="0x00" sendstatic="true" name="L-PLAY-DECK-C-LED" default="L-PLAY-DECK-C-BUTTON" deck="3" channel="2"/> <!-- may not work -->
<!-- Deck-D Buttons, LEDs -->
<button cc="0x30" value="0x7F" off="0x00" name="R-SYNC-DECK-D-BUTTON" deck="4" channel="3"/>
<button cc="0x4E" value="0x7F" off="0x00" name="R-JUMP-DECK-D-BACKWARDS" deck="4" channel="3"/>
<button cc="0x50" value="0x7F" off="0x00" name="R-JUMP-DECK-D-FORWARDS" deck="4" channel="3"/>
<button cc="0x38" value="0x7F" off="0x00" name="R-PLAY-DECK-D-BUTTON" deck="4" channel="3"/>
<button cc="0x4A" value="0x7F" off="0x00" name="R-3-DECK-D-BUTTON" deck="4" channel="3"/>
<button cc="0x4F" value="0x7F" off="0x00" name="R-4-DECK-D-BUTTON" deck="4" channel="3"/>
<button cc="0x28" value="0x7F" off="0x00" name="R-FX1-DECK-D-BUTTON" deck="4" channel="3"/> <!-- hold shift -->
<button cc="0x2A" value="0x7F" off="0x00" name="R-FX2-DECK-D-BUTTON" deck="4" channel="3"/> <!-- hold shift -->
<button cc="0x29" value="0x7F" off="0x00" name="R-FX3-DECK-D-BUTTON" deck="4" channel="3"/> <!-- hold shift -->
<button cc="0x2B" value="0x7F" off="0x00" name="R-FX4-DECK-D-BUTTON" deck="4" channel="3"/> <!-- hold shift -->
<led cc="0x30" value="0x7F" ccoff="0x00" sendstatic="true" name="R-SYNC-DECK-D-LED" default="L-SYNC-DECK-D-BUTTON" deck="4" channel="3"/> <!-- may not work -->
<led cc="0x38" value="0x7F" ccoff="0x00" sendstatic="true" name="R-PLAY-DECK-D-LED" default="L-PLAY-DECK-D-BUTTON" deck="4" channel="3"/> <!-- may not work -->
</device>
Posté Mon 30 Nov 20 @ 11:38 am
OK I THINK YOU FIND IT , was writing when you posted:
1) What I find strange in your map:
it looks like you name channels with MIDI name, not internal value (MIDI channel name 1..16 have value n in range 0..15)
(i say that because channel 0 is the most commonly use in MIDI and does not appear here)
All buttons are map to cc ( 0xBn controller value) which is uncommon (but may be good depending on device)
most of the time note on is used for that (0x9n note velocity) and sometimes note off (0x8n note velocity)
i do not have such a controller, these are just guesses
2) the map file must match the device (appear in the top right combo)
for that the device="" parameter in the map file must match
1) What I find strange in your map:
it looks like you name channels with MIDI name, not internal value (MIDI channel name 1..16 have value n in range 0..15)
(i say that because channel 0 is the most commonly use in MIDI and does not appear here)
All buttons are map to cc ( 0xBn controller value) which is uncommon (but may be good depending on device)
most of the time note on is used for that (0x9n note velocity) and sometimes note off (0x8n note velocity)
i do not have such a controller, these are just guesses
2) the map file must match the device (appear in the top right combo)
for that the device="" parameter in the map file must match
Posté Mon 30 Nov 20 @ 11:40 am
Yes, I figured, that the MIDI-Channels are not 1-16 but 0-15. Which kind of makes sens but also not. :)
So in the newer version I have deck 1 on channel 0 for that reason.
All the buttons send CCs. No note action is sent. When a button is pressed the CC gets the value 7F (127) and sends 00 (00) when released.
I may have to define the buttons as toggles because if I map play, than I have to keep play pressed. It stops on release.
So in the newer version I have deck 1 on channel 0 for that reason.
All the buttons send CCs. No note action is sent. When a button is pressed the CC gets the value 7F (127) and sends 00 (00) when released.
I may have to define the buttons as toggles because if I map play, than I have to keep play pressed. It stops on release.
Posté Mon 30 Nov 20 @ 11:59 am
I just mapped system > getfood to a button and needed to laugh out loud. :D
Posté Mon 30 Nov 20 @ 12:49 pm
for buttons with on/off you can also use "up ? actionup : actiondown" or "down ? " actiondown : actionup" in a way to map different actions depending on button state
i.e. "down ? sampler_play 'countdown' : play"
or simply "down ? play_button :"
getfood is a joke that can really be used
but avoid to map "crash" it works fine too ;)
i.e. "down ? sampler_play 'countdown' : play"
or simply "down ? play_button :"
getfood is a joke that can really be used
but avoid to map "crash" it works fine too ;)
Posté Mon 30 Nov 20 @ 1:28 pm
It is advised to set your buttons as momentary (x7F while pressed, 0x00 on release) and not toggle.
If not working as expected with CC, then try to use ... <button cc="" value="0x7F" ccoff="0x00" .... />
If not working as expected with CC, then try to use ... <button cc="" value="0x7F" ccoff="0x00" .... />
Posté Mon 30 Nov 20 @ 1:50 pm
I got the majority working now and it is suitable for basic mixing. But my initial mapping is a mess.
There are spare functions which I don't know where to map or what the intended purpose would be.
And there are some functions strangely linked to the active deck and occasionally when I am on the wrong deck it turns the wrong parameter... but I am pretty sure that there is a solution for that. So it needs some refinement but it is already fun to use. Thanks for the help.
I plan to publish it when it once feel like that it's finished.
There are spare functions which I don't know where to map or what the intended purpose would be.
And there are some functions strangely linked to the active deck and occasionally when I am on the wrong deck it turns the wrong parameter... but I am pretty sure that there is a solution for that. So it needs some refinement but it is already fun to use. Thanks for the help.
I plan to publish it when it once feel like that it's finished.
Posté Tue 01 Dec 20 @ 12:05 pm
Is there a MIDI Device Editor/Tool for the Faderfox where you can assign buttons/knobs to different Note/CC, make them toggle or momentary etc ?
If that is the case and you need to share your mapping and definition, make sure you use the factory default Editor template, or other users may not have the same results as you.
If that is the case and you need to share your mapping and definition, make sure you use the factory default Editor template, or other users may not have the same results as you.
Posté Tue 01 Dec 20 @ 3:02 pm
No, it got no editor. All the CCs are fixed. There are few options like MIDI routing and button behavior. It got 4 setup slots. Nr. 1 and 4 is a preset for tracktor and ableton. I used slot 2 with it's factory settings. Factory reset can be done on the device for every slot.
Posté Tue 01 Dec 20 @ 5:51 pm
Hello
I consider the mapping of the device mainly finished.
There are few notes:
- FX1 to FX4 encoders and push functions not mapped. This gives a total of 16 encoders and 16 buttons for free mapping.
- Deck C and D controls not mapped. No four deck operation. I have not got into that so far, I am not really interested and I believe although it could work, but this small controller is really not meant to be used for four decks.
- The FX assign buttons enable and disable the effects, but FX assign 4 is not mapped as there are 3 deck effects as far as I am aware of.
- The kill buttons are not mapped as I did not find a good use for them
- The filter button is mapped to set the grid to 200% bpm. I have not found a better use of it and as I mainly play drum and bass I was bothered that VDJ detects only half the tempo and the detection range can't be chanced.
- The folder navigation kind of works but not as I'd like to. In global mode if you turn the tree encoder it switches between panels rather than scrolling between the folders. I have no fix for that. But frankly I don't care much about that. I can change the folder with the mouse as well. It would only be a nice to have feature.
- Loop controls behave strange. Pressing the encoder engages and disengages looping. But pressing it sets the loop length to 1 bar regardless of previous settings. The encoder does change the loop length tho but by adding one bar instead of always doubling or dividing the value. Which results that lowering the loop length form one bar jumps straight to 1/32. So the loop controls are pretty useless. I don't really use loops so it is a minor problem for me. If it would work better I'd consider it using more as the control would be right there.
- The deck button labelled 3 makes a 16 bar backwards beat jump. Pretty cool if you miss your mixing cue, you can extend your track without anybody noticing a thing.
- The deck button labelled 4 does eject the track. Which is kind of pointless but can contribute to the workflow.
If you have any fixes of the quirks it would be welcome, they have not much priority to me as I consider them minor shortcomings.
Other than that is there any place where I can publish it as community implementation?
Many thanks!
I consider the mapping of the device mainly finished.
There are few notes:
- FX1 to FX4 encoders and push functions not mapped. This gives a total of 16 encoders and 16 buttons for free mapping.
- Deck C and D controls not mapped. No four deck operation. I have not got into that so far, I am not really interested and I believe although it could work, but this small controller is really not meant to be used for four decks.
- The FX assign buttons enable and disable the effects, but FX assign 4 is not mapped as there are 3 deck effects as far as I am aware of.
- The kill buttons are not mapped as I did not find a good use for them
- The filter button is mapped to set the grid to 200% bpm. I have not found a better use of it and as I mainly play drum and bass I was bothered that VDJ detects only half the tempo and the detection range can't be chanced.
- The folder navigation kind of works but not as I'd like to. In global mode if you turn the tree encoder it switches between panels rather than scrolling between the folders. I have no fix for that. But frankly I don't care much about that. I can change the folder with the mouse as well. It would only be a nice to have feature.
- Loop controls behave strange. Pressing the encoder engages and disengages looping. But pressing it sets the loop length to 1 bar regardless of previous settings. The encoder does change the loop length tho but by adding one bar instead of always doubling or dividing the value. Which results that lowering the loop length form one bar jumps straight to 1/32. So the loop controls are pretty useless. I don't really use loops so it is a minor problem for me. If it would work better I'd consider it using more as the control would be right there.
- The deck button labelled 3 makes a 16 bar backwards beat jump. Pretty cool if you miss your mixing cue, you can extend your track without anybody noticing a thing.
- The deck button labelled 4 does eject the track. Which is kind of pointless but can contribute to the workflow.
If you have any fixes of the quirks it would be welcome, they have not much priority to me as I consider them minor shortcomings.
Other than that is there any place where I can publish it as community implementation?
Many thanks!
Posté Sat 05 Dec 20 @ 12:58 pm