Accesso rapido:  

Forum: VirtualDJ Plugins

Topic: Elgato's Stream Deck integration
DJ HeyePRO InfinityMember since 2017
My goal was to integrate Elgato's Stream Deck and Virtual DJ.
(https://www.elgato.com/en/gaming/stream-deck)

I did not want to use the (integrated) Hotkey functionality inside Stream Deck.
Instead I wanted to control VDJ with MIDI commands.

For this to accomplish you need two additional programs:

1 - A virtual MIDI cable/driver
2 - A MIDI 'transmitter'

I have chosen the following programs for that:

1 - loopMIDI from Tobias Erichsen (http://www.tobias-erichsen.de/software/loopmidi.html)
2 - Stream Deck MIDI plugin from from Trevliga Spel

All software is free for non commercial use.

Short installation instructions:

1 - Download/Install the Stream Deck software.
2 - Install the Midi plugin in Stream Deck
3 - Download/Install loopMIDI and create one MIDI port (remember the name for future reference, ex: LoopMidi1)
4 - Create a LoopMidi1 device 'driver' in the VDJ folder Devices (D:\Users\<username>\Documents\VirtualDJ\Devices)
Choose a free MIDI channel number.

Example:
<?xml version="1.0" encoding="UTF-8"?>
<device name="LoopMidi1" drivername="LoopMidi1" description="LoopMidi1" version="850" decks="0" author="XYZ" type="MIDI">
*****
<button note="36" channel="13" name="LM_1"/>
<button note="37" channel="13" name="LM_2"/>
<button note="38" channel="13" name="LM_3"/>
<button note="39" channel="13" name="LM_4"/>
<button note="40" channel="13" name="LM_5"/>
<button note="41" channel="13" name="LM_6"/>
<button note="42" channel="13" name="LM_7"/>
<button note="43" channel="13" name="LM_8"/>
*****
</device>

5 - Create a mapper file in the VDJ folder Mappers (D:\Users\<username>\Documents\VirtualDJ\Mappers)

Example:
<?xml version="1.0" encoding="UTF-8"?>
<mapper device="LoopMidi1" version="850" date="2020-08-08">
<map value="LM_1" action="deck 1 play" />
<map value="LM_2" action="deck 1 stop" />
</mapper>

6 - Create a Stream Deck Midi button (Note On/Off) with the following parameters:
Title: <any title>
Channel: 14
Key: 36[C2]
Velocity: 127
Button type: Hold
Midi Out port: loopmidi1

Explanation of the parameters:

Channel: 14 - MIDI channel
(strange thing happened with me, that it only responded on this channel 14
while the VDJ midi device file revers to channel 13. Maybe a bug?)

Key: 36[C2] - send note 36

Velocity: 127 - velocity value

Button type: Hold - (works best)

Midi out port: Loopmidi1 - midi device/port name configured in loopMIDI

7 - repeat step 6 and change only the Key parameter with 37[C#2/Db2]

That concludes this little tutorial.
Please add comments and/or suggestions for improvements.
 

Inviato Sat 08 Aug 20 @ 6:50 pm
 

Inviato Sat 08 Aug 20 @ 7:18 pm
Big shout out to DJ Heye for laying the foundation! I went ahead and populated a full Driver XML Template, Mapper Template, and 5 Profile Pages of baseline MIDI buttons in Elgato Stream Deck Profiles and then packaged them all up in this link for a free download.

Follow along the twenty minute video on how to make this happen with the resources I provide

https://djlefave.com/configure-elgato-stream-deck-as-a-midi-controller-for-virtual-dj/
 

Inviato Wed 25 Nov 20 @ 4:01 am
 

Inviato Wed 25 Nov 20 @ 5:53 pm
hey so its not a bug its a common misconception on how pc's count, and in programing 0 is a number not the absence of one so ...

when you
code in 0 you get out channel 1
code in 1 you get out channel 2
...
code in 13 and get out channel 14

hope that makes sense and wish every program just documented this little misconception better.
 

Inviato Wed 19 Jan 22 @ 5:42 pm
Hi guys.

I need help.

I bought X-keys XK-24 streaming deck instead of Elgato's, because of the price and recommendations -https://streammentor.com/best-streaming-deck/.

Can you tell me how can I integrate this streaming deck with VirtualDJ?

Many thanks.
 

Inviato Fri 03 Jun 22 @ 7:39 am
NAWTBOYPRO InfinityMember since 2003
Hey guys. What are the advantages of using midi rather than just using the macros inside elgato software?
 

Inviato Fri 12 Aug 22 @ 9:28 pm
pimpled this out . if anyone needs help i linked shaders to it as well as samples 126 keys worth
 

Inviato Fri 14 Oct 22 @ 3:36 am
NAWTBOY wrote :
Hey guys. What are the advantages of using midi rather than just using the macros inside elgato software?


For one, MIDI does not require you to have the focus on VDJ to execute a script.

 

Inviato Thu 26 Jan 23 @ 2:45 pm
grountyPRO InfinityMember since 2023
DJ Heye wrote :

Example:
<?xml version="1.0" encoding="UTF-8"?>
<device name="LoopMidi1" drivername="LoopMidi1" description="LoopMidi1" version="850" decks="0" author="XYZ" type="MIDI">
*****
<button note="36" channel="13" name="LM_1"/>
<button note="37" channel="13" name="LM_2"/>
<button note="38" channel="13" name="LM_3"/>
<button note="39" channel="13" name="LM_4"/>
<button note="40" channel="13" name="LM_5"/>
<button note="41" channel="13" name="LM_6"/>
<button note="42" channel="13" name="LM_7"/>
<button note="43" channel="13" name="LM_8"/>
*****
</device>


Hi DJ HEYE,
very nice work.

I am currently trying to get a Stream Deck + with VDJ to work.
I followed your instructions and it works for the buttons.
Here is some XML code to consider the Stream Deck control dials to work properly.


<slider cc="0x00" zero="0x40" name="ROTARY_KNOB_0" channel="13" />
<slider note="0x01" name="ROTARY_PRESS_0" channel="13" />
 

Inviato Sun 17 Mar 24 @ 6:51 pm
grountyPRO InfinityMember since 2023
Here is my VDJ device XML mapping for the Stream Deck +.
I have added 5 pages to this mapping.

I set the MIDI channel to 14 in the Stream Deck software. Pay attention: This is a strange speciality of Virtual DJ. The MIDI channel must always be shifted down by one value within the mapping XML compared to the real actual value. In my case 14 -> 13. ¯\_(ツ)_/¯

I used the name "StreamDeckForVDJ" for the LoopMIDI device in this example.

The reason why I sometimes used encoder and sometimes slider is because of the use in VDJ. For example, if I want to control the browser encoder, I have to choose encoder, if I want to control the volume or EQ, I have to choose slider.


<?xml version="1.0" encoding="UTF-8"?>
<device name="StreamDeckForVDJ" author="Grounty" description="Stream Deck +" version="850" type="MIDI" drivername="StreamDeckForVDJ" decks="2">

<!-- Page 1 - General -->
<!-- Rotary control -->
<slider cc="0x00" zero="0x40" name="ROTARY_KNOB_0" channel="13" />
<slider cc="0x08" zero="0x40" name="ROTARY_KNOB_PRESS_0" channel="13" />
<slider note="0x01" name="ROTARY_PRESS_0" channel="13" />
<slider cc="0x02" zero="0x40" name="ROTARY_KNOB_1" channel="13" />
<slider note="0x03" name="ROTARY_PRESS_1" channel="13" />
<slider cc="0x04" zero="0x40" name="ROTARY_KNOB_2" channel="13" />
<slider note="0x05" name="ROTARY_PRESS_2" channel="13" />
<slider cc="0x06" zero="0x40" name="ROTARY_KNOB_3" channel="13" />
<slider note="0x07" name="ROTARY_PRESS_3" channel="13" />
<!-- Currently not used HEX values for later expansions: 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F -->
<!-- Button control -->
<button note="0x10" channel="13" name="BUTTON_0" />
<button note="0x11" channel="13" name="BUTTON_1" />
<button note="0x12" channel="13" name="BUTTON_2" />
<button note="0x13" channel="13" name="BUTTON_3" />
<button note="0x14" channel="13" name="BUTTON_4" />
<button note="0x15" channel="13" name="BUTTON_5" />
<button note="0x16" channel="13" name="BUTTON_6" />
<button note="0x17" channel="13" name="BUTTON_7" />

<!-- Page 2 - Browser -->
<!-- Rotary control -->
<!-- <slider cc="0x18" zero="0x40" name="ROTARY_KNOB_4" channel="13" /> -->
<encoder cc = "0x18" zero = "0x00" name = "ROTARY_KNOB_4_Enc" channel = "13" />
<slider note="0x19" name="ROTARY_PRESS_4" channel="13" />
<!-- <slider cc="0x1A" zero="0x40" name="ROTARY_KNOB_5" channel="13" /> -->
<encoder cc = "0x1A" zero = "0x00" name = "ROTARY_KNOB_5_Enc" channel = "13" />
<encoder cc = "0x20" zero = "0x00" name = "ROTARY_KNOB_PRESS_5_Enc" channel = "13" />
<slider note="0x1B" name="ROTARY_PRESS_5" channel="13" />
<!-- <slider cc="0x1C" zero="0x40" name="ROTARY_KNOB_6" channel="13" /> -->
<encoder cc = "0x1C" zero = "0x00" name = "ROTARY_KNOB_6_Enc" channel = "13" />
<slider note="0x1D" name="ROTARY_PRESS_6" channel="13" />
<slider cc="0x1E" zero="0x40" name="ROTARY_KNOB_7" channel="13" />
<slider note="0x1F" name="ROTARY_PRESS_7" channel="13" />
<!-- Currently not used HEX values for later expansions: 0x21 0x22 0x23 0x24 0x25 0x26 0x27 -->
<!-- Button control -->
<button note="0x28" channel="13" name="BUTTON_8" />
<button note="0x29" channel="13" name="BUTTON_9" />
<button note="0x2A" channel="13" name="BUTTON_10" />
<button note="0x2B" channel="13" name="BUTTON_11" />
<button note="0x2C" channel="13" name="BUTTON_12" />
<button note="0x2D" channel="13" name="BUTTON_13" />
<button note="0x2E" channel="13" name="BUTTON_14" />
<button note="0x2F" channel="13" name="BUTTON_15" />

<!-- Page 3 - Automix -->
<!-- Rotary control -->
<!-- <slider cc="0x30" zero="0x40" name="ROTARY_KNOB_8" channel="13" /> -->
<encoder cc = "0x30" zero = "0x00" name = "ROTARY_KNOB_8_Enc" channel = "13" />
<encoder cc = "0x38" zero = "0x00" name = "ROTARY_KNOB_PRESS_8_Enc" channel = "13" />
<slider note="0x31" name="ROTARY_PRESS_8" channel="13" />
<slider cc="0x32" zero="0x40" name="ROTARY_KNOB_9" channel="13" />
<slider note="0x33" name="ROTARY_PRESS_9" channel="13" />
<slider cc="0x34" zero="0x40" name="ROTARY_KNOB_10" channel="13" />
<slider note="0x34" name="ROTARY_PRESS_10" channel="13" />
<slider cc="0x36" zero="0x40" name="ROTARY_KNOB_11" channel="13" />
<slider note="0x37" name="ROTARY_PRESS_11" channel="13" />
<!-- Currently not used HEX values for later expansions: 0x39 0x3A 0x3B 0x3C 0x3D 0x3E 0x3F -->
<!-- Button control -->
<button note="0x40" channel="13" name="BUTTON_16" />
<button note="0x41" channel="13" name="BUTTON_17" />
<button note="0x42" channel="13" name="BUTTON_18" />
<button note="0x43" channel="13" name="BUTTON_19" />
<button note="0x44" channel="13" name="BUTTON_20" />
<button note="0x45" channel="13" name="BUTTON_21" />
<button note="0x46" channel="13" name="BUTTON_22" />
<button note="0x47" channel="13" name="BUTTON_23" />

<!-- Page 4 - Deck 1 -->
<!-- Rotary control -->
<slider cc="0x48" zero="0x40" name="ROTARY_KNOB_12" deck="1" channel="13" />
<slider note="0x49" name="ROTARY_PRESS_12" deck="1" channel="13" />
<slider cc="0x4A" zero="0x40" name="ROTARY_KNOB_13" deck="1" channel="13" />
<slider note="0x4B" name="ROTARY_PRESS_13" deck="1" channel="13" />
<slider cc="0x4C" zero="0x40" name="ROTARY_KNOB_14" deck="1" channel="13" />
<slider note="0x4D" name="ROTARY_PRESS_14" deck="1" channel="13" />
<slider cc="0x4E" zero="0x40" name="ROTARY_KNOB_15" deck="1" channel="13" />
<slider cc="0x50" zero="0x40" name="ROTARY_KNOB_PRESS_15" deck="1" channel="13" />
<slider note="0x4F" name="ROTARY_PRESS_15" deck="1" channel="13" />
<!-- Currently not used HEX values for later expansions: 0x51 0x52 0x53 0x54 0x55 0x56 0x57 -->
<!-- Button control -->
<button note="0x58" deck="1" channel="13" name="BUTTON_24" />
<button note="0x59" deck="1" channel="13" name="BUTTON_25" />
<button note="0x5A" deck="1" channel="13" name="BUTTON_26" />
<button note="0x5B" deck="1" channel="13" name="BUTTON_27" />
<button note="0x5C" deck="1" channel="13" name="BUTTON_28" />
<button note="0x5D" deck="1" channel="13" name="BUTTON_29" />
<button note="0x5E" deck="1" channel="13" name="BUTTON_30" />
<button note="0x5F" deck="1" channel="13" name="BUTTON_31" />

<!-- Page 5 - Deck 2 -->
<!-- Rotary control -->
<slider cc="0x60" zero="0x40" name="ROTARY_KNOB_16" deck="2" channel="13" />
<slider note="0x61" name="ROTARY_PRESS_16" deck="2" channel="13" />
<slider cc="0x62" zero="0x40" name="ROTARY_KNOB_17" deck="2" channel="13" />
<slider note="0x63" name="ROTARY_PRESS_17" deck="2" channel="13" />
<slider cc="0x64" zero="0x40" name="ROTARY_KNOB_18" deck="2" channel="13" />
<slider note="0x65" name="ROTARY_PRESS_18" deck="2" channel="13" />
<slider cc="0x66" zero="0x40" name="ROTARY_KNOB_19" deck="2" channel="13" />
<slider cc="0x68" zero="0x40" name="ROTARY_KNOB_PRESS_19" deck="2" channel="13" />
<slider note="0x67" name="ROTARY_PRESS_19" deck="2" channel="13" />
<!-- Currently not used HEX values for later expansions: 0x69 0x6A 0x6B 0x6C 0x6D 0x6E 0x6F -->
<!-- Button control -->
<button note="0x70" deck="2" channel="13" name="BUTTON_32" />
<button note="0x71" deck="2" channel="13" name="BUTTON_33" />
<button note="0x72" deck="2" channel="13" name="BUTTON_34" />
<button note="0x73" deck="2" channel="13" name="BUTTON_35" />
<button note="0x74" deck="2" channel="13" name="BUTTON_36" />
<button note="0x75" deck="2" channel="13" name="BUTTON_37" />
<button note="0x76" deck="2" channel="13" name="BUTTON_38" />
<button note="0x77" deck="2" channel="13" name="BUTTON_39" />

</device>


If you add an image (PNG) in the same folder with the same name as the XML file, it will show up in the VDJ controller settings :-) My PNG settings: 255x255 pixel, 72 dpi and transparent background.

Now I am able to assign up to 40 buttons and 20 encoders with VDJ commands :-)
 

Inviato Sat 21 Sep 24 @ 7:50 pm