Author: Teo Tormo DJ TechTools
From the early years of Scratch Live to the current Serato DJ Pro, Serato has been relatively secretive about the MIDI implementation of their software. Though the software allows the use of any MIDI device, many features are only available on certified controllers. You can’t map your own jogwheels, s like needle search / slicer are restricted, and there are no shift control layers or modifiers to create advanced mappings. In today’s tutorial, DJTT contributor Teo Tormo shares secrets for writing custom MIDI mappings for Serato DJ – including jogwheels, modifiers, and more.
If you manually write a MIDI mapping for Serato DJ, it unlocks many more features for any MIDI controller. The problem is that there is no manual for this (Serato employees probably have a top secret one), so you don’t know the commands or the complete syntax and variables.
To learn more, I started my own research on forums and websites. I’ve downloaded many mappings others have done (Radikarl might be the user who has contributed the most to the Serato users community), and found some code for mapping the jogwheels and for using modifiers. In today’s article, I share the Serato DJ MIDI mapping secrets I’ve found – and in the video, I demo using that code with a Pioneer DJ XDJ-700 (one of the few players from Pioneer that is not Serato certified).
Editor’s Warning: Making your own custom mappings or using non-certified gear is really fun, but if you break something, it’s your own fault. We recommend not using these mapping tricks in real word situations where your reputation is on the line – this is primarily for fun home experimentation!
Before the text explanations, watch the step by step video tutorial below for mapping jogwheels, a touchstrip/needlesearch , and creating a modifier for assigning more than one to a control. The necessary XML code is at the end of the article, so after watching the video you can download it and use it for your own mappings.
Author’s note: Please excuse my terrible English pronunciation! This is the first video I’ve ever recorded in English.
channel="1"
touch_strip_scrub
can also be used with touchstrip controls. It works in a similar way to the Novation Twitch or the Kontrol D2. I’ve also found some commands for the slicer like slicer_ enabler
, slicer_domain_values
and slicer_domain_size
or slicer_trigger
but no luck making it work so far. The same with filter_roll_touch
and filter_roll_knob
.If you look carefully at a Serato DJ mapping file – even without knowing anything about XML- you’ll find:
<midi app="[version number]">
and ends with </midi>
, you can also start a mapping with just <midi>
. Remember the golden rule that when using a markup language you always have to close every tag. A XML editor like Komodo will help you a lot because it checks if the code is properly written –only checks XML rules, not Serato MIDI mapping specific rules–<case>
tag and the <condition>
tag for each modifier value you want to use. You can create as many cases as you want, for example, this is used for pads with five or six different s which are selected using a set of buttons on top of the pads –the typical set of 8 pads per deck that every controller has now–.Here’s the most interesting part of the article: the XML code. You just have to copy and paste it in your mapping, remembering to replace the CC and Note On numbers with the right ones for your controller. Also, remember to respect the MIDI markups at the beginning and the end of the XML mapping file. Another thing yo’ll have to change for your controller is the “range” variable in the jogwheel code. In the video and in the code below, the min and max range is 1536 – but why? I can’t give a precise answer for that.
In some mappings I have found during my research on this topic, usually the range is the number of messages that the wheel sends in one turn, and I found mappings with values of 1500, 450, 1800… but with the XDJ-700 I discovered that the jogwheel only sends a max of 128 messages in one turn. I tried with a value of 128 in the mapping, but the result was terrible, so I tried multiples of that value. Finally the value that worked best was 1536, that it’s 128 times 12.
<control channel="1" control_type="CC" event_type="Control Change" control="16" data_type="Relative Binary Offset">
<userio event="click">
<platter_move deck_id="1">
<translation>
<range in_min="-1546" in_max="1546" out_min="-1" out_max="1" />
</translation>
</platter_move>
</userio>
</control>
<control channel="1" control_type="CC" event_type="Control Change" control="48" data_type="Relative Binary Offset">
<userio event="click">
<platter_move deck_id="1">
<translation>
<range in_min="-1546" in_max="1546" out_min="-1" out_max="1" />
</translation>
</platter_move>
</userio>
</control>
<control channel="1" event_type="Note On" control="32">
<userio event="click">
<platter_touch deck_set="Default" deck_id="0" slot_id="0">
<translation action_on="any" behaviour="explicit"/>
</platter_touch>
</userio>
</control>
<control channel="1" control_type="CC" event_type="Control Change" control="28">
<userio event="click">
<touch_seek deck_set="Default" deck_id="0" slot_id="0">
<translation action_on="any" behaviour="explicit"/>
</touch_seek>
</userio>
</control>
Remember that you can change this code and use touch_strip_scrub
instead of touch_seek
.
<control channel="1" event_type="Note On" control="18">
<userio event="click">
<modifier_1>
<translation action_on="any" behaviour="explicit"/>
</modifier_1>
</userio>
</control>
<control channel="1" event_type="Note On" control="24">
<case>
<condition>
<modifier_1 deck_set="Default" deck_id="0" slot_id="0" operator="equal" cmp_/>
</condition>
<userio event="click">
<cue_point deck_set="Default" deck_id="0" slot_id="0">
<translation action_on="any" behaviour="explicit"/>
</cue_point>
</userio>
</case>
<case>
<condition>
<modifier_1 deck_set="Default" deck_id="0" slot_id="0" operator="equal" cmp_value="on"/>
</condition>
<userio event="click">
<cue_point_delete deck_set="Default" deck_id="0" slot_id="0">
<translation action_on="any" behaviour="explicit"/>
</cue_point_delete>
</userio>
</case>
</control>
Serato has never released detailed information about how their XML mapping works, but you can find inside the software a list of commands and variables that in some way must work. This means that hungry MIDI mappers are free to use the trial/error method and share your results with the world.
Where’s that list? Right-click on the Serato app icon, choose “Show package contents”, open the Contents/MacOS folder, open the real Serato DJ Pro executable with a hex editor (my favorite is Hex Fiend). Then try to search (Command + F) for words like “seek”, “platter”, “touch”, or “enable”, and you will find a lot of commands to try. Maybe you’ll be the next person to show the world something new about Serato MIDI mapping!
Author: AnandTech Among the packed field of PC hardware manufacturers, Lian Li is a company…
Author: Tom's Hardware Alla ricerca di una tastiera meccanica di alta qualità che unisca versatilità,…
Author: GAMEmag Con un annuncio a sorpresa, Valve ha svelato uno strumento integrato di Steam…
Author: Schneider Electric This audio was created using Microsoft Azure Speech Services Pride Month is…
Author: IlSoftware Negli ultimi anni, nel settore delle soluzioni basate sull’intelligenza artificiale (IA) si è…
Author: Hardware Upgrade La missione statunitense NASA OSIRIS-REx ha riportato sulla Terra 121,6 grammi di…