Quick Sign In:  

Forum: VirtualDJ Technical Support

Topic: I made a definition file for the DJ Tech CTRL. Feel free to use it.
(Sorry if this is not the right forum for this)

This controller is not natively supported so I had to make a definition file for it, which was quite straightforward after resolving some issues with how I was interpreting the midi signals (cleared up by Virtual DJ Support in https://www.virtualdj.com/forums/258463/VirtualDJ_Technical_Support/Mapping_DJ_Tech_CTRL__got_definition_file_started_but_mapped_function_not_working.html, thank you PHANTOMDEEJAY!) but not having to go through with those steps yourself may save you a bit of time.


<device name="CTRL" author="DJ-Tech" description="DJ-Tech CTRL" version="2023" type="MIDI" vid="0x2485" pid="0x504f" decks="2" padColumns="4" padRows="1" padSides="2" hardwareshift="true">

<!--Cue buttons for deck A-->

<button note="0x22" name="cue_1_a" deck="1" channel="0" />
<button note="0x32" name="cue_2_a" deck="1" channel="0" />
<button note="0x39" name="cue_3_a" deck="1" channel="0" />
<button note="0x42" name="cue_4_a" deck="1" channel="0" />

<button note="0x22" name="cue_1_a_shift" deck="1" channel="8" />
<button note="0x32" name="cue_2_a_shift" deck="1" channel="8" />
<button note="0x39" name="cue_3_a_shift" deck="1" channel="8" />
<button note="0x42" name="cue_4_a_shift" deck="1" channel="8" />

<button note="0x0B" name="cue_1_a_sampler" deck="1" channel="0" />
<button note="0x0C" name="cue_2_a_sampler" deck="1" channel="0" />
<button note="0x0D" name="cue_3_a_sampler" deck="1" channel="0" />
<button note="0x14" name="cue_4_a_sampler" deck="1" channel="0" />

<button note="0x0B" name="cue_1_a_sampler_shift" deck="1" channel="8" />
<button note="0x0C" name="cue_2_a_sampler_shift" deck="1" channel="8" />
<button note="0x0D" name="cue_3_a_sampler_shift" deck="1" channel="8" />
<button note="0x14" name="cue_4_a_sampler_shift" deck="1" channel="8" />

<!--Cue buttons for deck B-->

<button note="0x22" name="cue_1_b" deck="2" channel="1" />
<button note="0x32" name="cue_2_b" deck="2" channel="1" />
<button note="0x39" name="cue_3_b" deck="2" channel="1" />
<button note="0x42" name="cue_4_b" deck="2" channel="1" />

<button note="0x22" name="cue_1_b_shift" deck="2" channel="9" />
<button note="0x32" name="cue_2_b_shift" deck="2" channel="9" />
<button note="0x39" name="cue_3_b_shift" deck="2" channel="9" />
<button note="0x42" name="cue_4_b_shift" deck="2" channel="9" />

<button note="0x0B" name="cue_1_b_sampler" deck="2" channel="1" />
<button note="0x0C" name="cue_2_b_sampler" deck="2" channel="1" />
<button note="0x0D" name="cue_3_b_sampler" deck="2" channel="1" />
<button note="0x14" name="cue_4_b_sampler" deck="2" channel="1" />

<button note="0x0B" name="cue_1_b_sampler_shift" deck="2" channel="9" />
<button note="0x0C" name="cue_2_b_sampler_shift" deck="2" channel="9" />
<button note="0x0D" name="cue_3_b_sampler_shift" deck="2" channel="9" />
<button note="0x14" name="cue_4_b_sampler_shift" deck="2" channel="9" />

<!--Loop/Filter/Sync for deck A-->

<button note="0x4A" name="sync_a" deck="1" channel="0" />
<button note="0x2B" name="in_a" deck="1" channel="0" />
<button note="0x2D" name="out_a" deck="1" channel="0" />
<button note="0x34" name="loop_a" deck="1" channel="0" />

<button note="0x4A" name="sync_a_shift" deck="1" channel="8" />
<button note="0x2B" name="in_a_shift" deck="1" channel="8" />
<button note="0x2D" name="out_a_shift" deck="1" channel="8" />
<button note="0x34" name="loop_a_shift" deck="1" channel="8" />

<button note="0x09" name="autoloop_button_a" deck="1" channel="0" />
<button note="0x09" name="autoloop_button_a_shift" deck="1" channel="8" />

<encoder cc="0x55" zero="0x40" name="autoloop_knob_a" deck="1" channel="0" />
<encoder cc="0x55" zero="0x40" name="autoloop_knob_a_shift" deck="1" channel="8" />

<fullencoder cc="0x05" full="128" deck="1" name="filter_a" channel="0" />
<fullencoder cc="0x05" full="128" deck="1" name="filter_a_shift" channel="8" />

<!--Loop/Filter/Sync for deck B-->

<button note="0x4A" name="sync_b" deck="2" channel="1" />
<button note="0x2B" name="in_b" deck="2" channel="1" />
<button note="0x2D" name="out_b" deck="2" channel="1" />
<button note="0x34" name="loop_b" deck="2" channel="1" />

<button note="0x4A" name="sync_b_shift" deck="2" channel="9" />
<button note="0x2B" name="in_b_shift" deck="2" channel="9" />
<button note="0x2D" name="out_b_shift" deck="2" channel="9" />
<button note="0x34" name="loop_b_shift" deck="2" channel="9" />

<button note="0x09" name="autoloop_button_b" deck="2" channel="1" />
<button note="0x09" name="autoloop_button_b_shift" deck="2" channel="9" />

<encoder cc="0x55" zero="0x40" name="autoloop_knob_b" deck="2" channel="1" />
<encoder cc="0x55" zero="0x40" name="autoloop_knob_b_shift" deck="2" channel="9" />

<fullencoder cc="0x05" full="128" deck="1" name="filter_b" channel="1" />
<fullencoder cc="0x05" full="128" deck="1" name="filter_b_shift" channel="9" />

<!--FX for deck A-->

<button note="0x36" name="fx_button_1_a" deck="1" channel="0" />
<button note="0x3E" name="fx_button_2_a" deck="1" channel="0" />
<button note="0x50" name="fx_button_3_a" deck="1" channel="0" />
<button note="0x33" name="tap_a" deck="1" channel="0" />

<button note="0x36" name="fx_button_1_a_shift" deck="1" channel="8" />
<button note="0x3E" name="fx_button_2_a_shift" deck="1" channel="8" />
<button note="0x50" name="fx_button_3_a_shift" deck="1" channel="8" />
<button note="0x33" name="tap_a_shift" deck="1" channel="8" />

<button note="0x3B" name="beat_button_a" deck="1" channel="0" />
<button note="0x3B" name="beat_button_a_shift" deck="1" channel="8" />

<encoder cc="0x27" zero="0x40" name="beat_knob_a" deck="1" channel="0" />
<encoder cc="0x27" zero="0x40" name="beat_knob_a_shift" deck="1" channel="8" />

<fullencoder cc="0x08" full="128" deck="1" name="fx_knob_1_a" channel="0" />
<fullencoder cc="0x08" full="128" deck="1" name="fx_knob_1_a_shift" channel="8" />

<fullencoder cc="0x06" full="128" deck="1" name="fx_knob_2_a" channel="0" />
<fullencoder cc="0x06" full="128" deck="1" name="fx_knob_2_a_shift" channel="8" />

<fullencoder cc="0x07" full="128" deck="1" name="fx_knob_3_a" channel="0" />
<fullencoder cc="0x07" full="128" deck="1" name="fx_knob_3_a_shift" channel="8" />


<!--FX for deck B-->

<button note="0x36" name="fx_button_1_b" deck="2" channel="1" />
<button note="0x3E" name="fx_button_2_b" deck="2" channel="1" />
<button note="0x50" name="fx_button_3_b" deck="2" channel="1" />
<button note="0x33" name="tap_b" deck="2" channel="1" />

<button note="0x36" name="fx_button_1_b_shift" deck="2" channel="9" />
<button note="0x3E" name="fx_button_2_b_shift" deck="2" channel="9" />
<button note="0x50" name="fx_button_3_b_shift" deck="2" channel="9" />
<button note="0x33" name="tap_b_shift" deck="2" channel="9" />

<button note="0x3B" name="beat_button_b" deck="2" channel="1" />
<button note="0x3B" name="beat_button_b_shift" deck="2" channel="9" />

<encoder cc="0x27" zero="0x40" name="beat_knob_b" deck="2" channel="1" />
<encoder cc="0x27" zero="0x40" name="beat_knob_b_shift" deck="2" channel="9" />

<fullencoder cc="0x08" full="128" deck="2" name="fx_knob_1_b" channel="1" />
<fullencoder cc="0x08" full="128" deck="2" name="fx_knob_1_b_shift" channel="9" />

<fullencoder cc="0x06" full="128" deck="2" name="fx_knob_2_b" channel="1" />
<fullencoder cc="0x06" full="128" deck="2" name="fx_knob_2_b_shift" channel="9" />

<fullencoder cc="0x07" full="128" deck="2" name="fx_knob_3_b" channel="1" />
<fullencoder cc="0x07" full="128" deck="2" name="fx_knob_3_b_shift" channel="9" />

<!--Sample/Browse/Load (middle section)-->

<button note="0x56" name="load_a" deck="1" channel="0" />
<button note="0x56" name="load_b" deck="2" channel="1" />

<button note="0x56" name="load_a_shift" deck="1" channel="8" />
<button note="0x56" name="load_b_shift" deck="2" channel="9" />

<button note="0x53" name="l" channel="0" />
<button note="0x2C" name="m" channel="0" />
<button note="0x35" name="r" channel="0" />

<button note="0x53" name="l_shift" channel="1" />
<button note="0x2C" name="m_shift" channel="1" />
<button note="0x35" name="r_shift" channel="1" />

<button note="0x41" name="s_c_a" deck="1" channel="0" />
<button note="0x41" name="s_c_b" deck="2" channel="8" />

<button note="0x41" name="s_c_a_shift" deck="1" channel="1" />
<button note="0x41" name="s_c_b_shift" deck="2" channel="9" />

<button note="0x46" name="back_view" channel="0" />
<button note="0x46" name="prepare_area" channel="1" />

<button note="0x46" name="back_view_shift" channel="8" />
<button note="0x46" name="prepare_area_shift" channel="9" />

<button note="0x3D" name="file_select" channel="0" />
<button note="0x3D" name="file_select_shift" channel="8" />

<encoder cc="0x20" zero="0x40" name="file_select_knob" channel="0" />
<encoder cc="0x20" zero="0x40" name="file_select_knob_shift" channel="8" />

<fullencoder cc="0x0A" full="128" name="sample_volume" channel="0" />


</device>


I also made a mapping for myself which maps a lot of the basic functionality around cue points, loops, effects, and 3 part stems (vocals, drums, instruments) mapped to shift for the loop buttons. This may be a good starting point for some of you as well:


<?xml version="1.0" encoding="UTF-8"?>
<mapper device="CTRL" version="850" date="2024-05-14">
<map value="cue_1_a" action="hot_cue 1" />
<map value="cue_1_b" action="hot_cue 1" />
<map value="cue_1_a_shift" action="delete_cue 1" />
<map value="cue_1_b_shift" action="delete_cue 1" />
<map value="cue_2_a" action="hot_cue 2" />
<map value="cue_2_a_shift" action="delete_cue 2" />
<map value="cue_2_b" action="hot_cue 2" />
<map value="cue_2_b_shift" action="delete_cue 2" />
<map value="cue_3_a" action="hot_cue 3" />
<map value="cue_3_a_shift" action="delete_cue 3" />
<map value="cue_3_b" action="hot_cue 3" />
<map value="cue_3_b_shift" action="delete_cue 3" />
<map value="cue_4_a" action="hot_cue 4" />
<map value="cue_4_a_shift" action="delete_cue 4" />
<map value="cue_4_b" action="hot_cue 4" />
<map value="cue_4_b_shift" action="delete_cue 4" />
<map value="in_a" action="loop_in" />
<map value="out_a" action="loop_out" />
<map value="in_b" action="loop_in" />
<map value="out_b" action="loop_out" />
<map value="loop_a" action="loop" />
<map value="loop_b" action="loop" />
<map value="file_select_knob" action="browser_scroll" />
<map value="load_a" action="load" />
<map value="load_b" action="load" />
<map value="autoloop_button_a" action="loop" />
<map value="autoloop_knob_a" action="param_bigger 41 ? deck loop_double : deck loop_half" />
<map value="autoloop_knob_b" action="param_bigger 41 ? deck loop_double : deck loop_half" />
<map value="autoloop_button_b" action="loop" />
<map value="fx_button_1_a" action="effect_active 1" />
<map value="fx_button_2_a" action="effect_active 2" />
<map value="fx_button_3_a" action="effect_active 3" />
<map value="fx_button_1_b" action="effect_active 1" />
<map value="fx_button_2_b" action="effect_active 2" />
<map value="fx_button_3_b" action="effect_active 3" />
<map value="fx_knob_1_a" action="param_multiply 0.8% & effect_slider 1 1" />
<map value="fx_knob_1_b" action="param_multiply 0.8% & effect_slider 1 1" />
<map value="fx_knob_2_a" action="param_multiply 0.8% & effect_slider 2 1" />
<map value="fx_knob_2_b" action="param_multiply 0.8% & effect_slider 2 1" />
<map value="fx_knob_3_a" action="param_multiply 0.8% & effect_slider 3 1" />
<map value="fx_knob_3_b" action="param_multiply 0.8% & effect_slider 3 1" />
<map value="in_a_shift" action="stem_pad kick & stem_pad hihat " />
<map value="in_b_shift" action="stem_pad kick & stem_pad hihat" />
<map value="out_a_shift" action="stem_pad vocal" />
<map value="out_b_shift" action="stem_pad vocal" />
<map value="loop_a_shift" action="stem_pad instru & stem_pad bass" />
<map value="loop_b_shift" action="stem_pad instru & stem_pad bass" />
</mapper>
 

Posted Wed 15 May 24 @ 6:54 pm
locoDogPRO InfinityModeratorMember since 2013
 

Posted Wed 15 May 24 @ 7:35 pm
djdadPRO InfinityDevelopment ManagerMember since 2005
No leds ?

In most of the cases, the leds have the same Midi value and channel as the buttons, so try ..

<led note="0x22" name="LED_cue_1_a" deck="1" channel="0" />

and test mapping..
LED_cue_1_a --> blink (just as a test)

If that works, you could add all the available leds as above.

 

Posted Thu 16 May 24 @ 3:53 pm
Thanks for the info, LOCODOG!

Thanks for the tip DJDAD! I will look into adding LEDs using the method you provided.
 

Posted Thu 16 May 24 @ 6:35 pm
djdadPRO InfinityDevelopment ManagerMember since 2005
Yes, if leds added, you could upload to Addons, but without leds, it wont help users much.

btw, you could make Mapping a bit easier if you use the same Key names in both sides, since it's quite a "mirror" layout device.

So..
<button note="0x22" name="cue_1_a" deck="1" channel="0" />
<button note="0x22" name="cue_1_b" deck="2" channel="1" />

Can become...
<button note="0x22" name="cue_1" deck="1" channel="0" />
<button note="0x22" name="cue_1" deck="2" channel="1" />

and have just one Key cue_1 to map
 

Posted Thu 16 May 24 @ 6:44 pm
Thanks for the suggestion on making the same buttons for each deck have the same name. One question: if theoretically, someone wanted to map each button on each deck to different functions (like, cue 1 is cue 1 on the left deck but play on the right deck), would distinct names be necessary?
 

Posted Thu 16 May 24 @ 9:15 pm
locoDogPRO InfinityModeratorMember since 2013
no you could do this

action_deck 1 ? cue 1 : play
 

Posted Thu 16 May 24 @ 9:23 pm
Also for reasons internal to VirtualDJ, it's highly suggested that your SHIFT+ keys START with SHIFT_ on their name instead of having it at the end.

As for merging buttons on left/right side, it has been already suggested since the first troubleshooting post.
It's far more convenient to type a single command (action) for all decks and occasionally split a button if there's a need to, than typing the same actions over and over.
Not to mention that it's easier to make mistakes that way.
 

Posted Fri 17 May 24 @ 12:41 am
Thanks so much for the tips, team! I will look into cleaning up and improving the definition file on my end.
 

Posted Fri 17 May 24 @ 6:50 pm