(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.
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:
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
Moderators note, if you want to share your work as a in app plugin, post it here for review
https://www.virtualdj.com/plugins/upload.html
https://www.virtualdj.com/plugins/upload.html
Posted Wed 15 May 24 @ 7:35 pm
No leds ?
In most of the cases, the leds have the same Midi value and channel as the buttons, so try ..
and test mapping..
LED_cue_1_a --> blink (just as a test)
If that works, you could add all the available leds as above.
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.
Thanks for the tip DJDAD! I will look into adding LEDs using the method you provided.
Posted Thu 16 May 24 @ 6:35 pm
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..
Can become...
and have just one Key cue_1 to map
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
no you could do this
action_deck 1 ? cue 1 : play
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.
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