summaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authorUwe Klotz <uklotz@mixxx.org>2021-03-12 14:07:24 +0100
committerUwe Klotz <uklotz@mixxx.org>2021-03-12 14:07:24 +0100
commit439a05f08510ce548064a7f43c4a19ec8cee04a2 (patch)
tree26d296eb575f72f56a2ba279fd3abc6a93c9fb07 /res
parent6eb47941d05ac28a392c17fecbb402524db7e99d (diff)
parentd72af1b56a5b03aeb06422061801c54e71e9080d (diff)
Merge branch '2.3' of git@github.com:mixxxdj/mixxx.git
Diffstat (limited to 'res')
-rw-r--r--res/controllers/Ion-Discover-DJ-Pro-scripts.js255
-rw-r--r--res/controllers/Ion-Discover-DJ-Pro.midi.xml798
2 files changed, 1053 insertions, 0 deletions
diff --git a/res/controllers/Ion-Discover-DJ-Pro-scripts.js b/res/controllers/Ion-Discover-DJ-Pro-scripts.js
new file mode 100644
index 0000000000..211d6848a5
--- /dev/null
+++ b/res/controllers/Ion-Discover-DJ-Pro-scripts.js
@@ -0,0 +1,255 @@
+// Ion Discover DJ pro Mapping Script Functions
+// Joachim, meltedpianoman
+var IonDiscoverDjPro = function() {};
+
+IonDiscoverDjPro.init = function() { // called when the MIDI device is opened & set up
+ IonDiscoverDjPro.directoryMode = false;
+ IonDiscoverDjPro.scratchMode = [false, false, false];
+ IonDiscoverDjPro.scratchTimer = [-1, -1, -1];
+ IonDiscoverDjPro.manualLooping = [false, false, false];
+
+ IonDiscoverDjPro.leds = [
+ { },
+ // Deck 1
+ {"rate": 0x70, "scratchMode": 0x48, "keylock": 0x51, "manualLoop": 0x61, "loopIn": 0x53, "loopOut": 0x54, "reLoop": 0x55},
+ // Deck 2
+ {"rate": 0x71, "scratchMode": 0x50, "keylock": 0x52, "manualLoop": 0x62, "loopIn": 0x56, "loopOut": 0x57, "reLoop": 0x58}
+ ];
+};
+
+IonDiscoverDjPro.shutdown = function() { // called when the MIDI device is closed
+ var lowestLED = 0x30;
+ var highestLED = 0x73;
+ for (var i=lowestLED; i<=highestLED; i++) {
+ IonDiscoverDjPro.setLED(i, false); // Turn off all the lights
+ }
+};
+
+IonDiscoverDjPro.groupToDeck = function(group) {
+ var matches = group.match(/^\[Channel(\d+)\]$/);
+ if (matches === null) {
+ return -1;
+ } else {
+ return matches[1];
+ }
+};
+
+IonDiscoverDjPro.setLED = function(value, status) {
+ if (status) {
+ status = 0x64;
+ } else {
+ status = 0x00;
+ }
+ midi.sendShortMsg(0x90, value, status);
+};
+
+IonDiscoverDjPro.samplesPerBeat = function(group) {
+ // FIXME: Get correct samplerate and channels for current deck
+ var sampleRate = 44100;
+ var channels = 2;
+ var bpm = engine.getValue(group, "file_bpm");
+ return channels * sampleRate * 60 / bpm;
+};
+
+IonDiscoverDjPro.selectKnob = function(channel, control, value, status, group) {
+ if (value > 63) {
+ value = value - 128;
+ }
+ if (IonDiscoverDjPro.directoryMode) {
+ var i;
+ if (value > 0) {
+ for (i = 0; i < value; i++) {
+ engine.setValue(group, "SelectNextPlaylist", 1);
+ }
+ } else {
+ for (i = 0; i < -value; i++) {
+ engine.setValue(group, "SelectPrevPlaylist", 1);
+ }
+ }
+ } else {
+ engine.setValue(group, "SelectTrackKnob", value);
+ }
+};
+
+IonDiscoverDjPro.loopIn = function(channel, control, value, status, group) {
+ var deck = IonDiscoverDjPro.groupToDeck(group);
+ if (value) {
+ if (IonDiscoverDjPro.manualLooping[deck]) {
+ // Cut loop to Half
+ var start = engine.getValue(group, "loop_start_position");
+ var end = engine.getValue(group, "loop_end_position");
+ if ((start !== -1) && (end !== -1)) {
+ var len = (end - start) / 2;
+ engine.setValue(group, "loop_end_position", start + len);
+ }
+ } else {
+ if (engine.getValue(group, "loop_enabled")) {
+ engine.setValue(group, "reloop_exit", 1);
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["reLoop"], false);
+ }
+ engine.setValue(group, "loop_in", 1);
+ engine.setValue(group, "loop_end_position", -1);
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["loopIn"], true);
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["loopOut"], false);
+ }
+ }
+};
+
+IonDiscoverDjPro.loopOut = function(channel, control, value, status, group) {
+ var deck = IonDiscoverDjPro.groupToDeck(group);
+ if (value) {
+ var start = engine.getValue(group, "loop_start_position");
+ var end = engine.getValue(group, "loop_end_position");
+ if (IonDiscoverDjPro.manualLooping[deck]) {
+ // Set loop to current Bar (very approximative and would need to get fixed !!!)
+ var bar = IonDiscoverDjPro.samplesPerBeat(group);
+ engine.setValue(group, "loop_in", 1);
+ engine.setValue(group, "loop_end_position", start + bar);
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["loopIn"], true);
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["loopOut"], true);
+ } else {
+ if (start === -1) {
+ return;
+ }
+ if (end !== -1) {
+ // Loop In and Out set -> call Reloop/Exit
+ engine.setValue(group, "reloop_exit", 1);
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["loopIn"], true);
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["loopOut"], true);
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["reLoop"], true);
+ } else {
+ // Loop In set -> call Loop Out
+ engine.setValue(group, "loop_out", 1);
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["loopOut"], true);
+ }
+ }
+ }
+};
+
+IonDiscoverDjPro.reLoop = function(channel, control, value, status, group) {
+ var deck = IonDiscoverDjPro.groupToDeck(group);
+ if (value) {
+ var start = engine.getValue(group, "loop_start_position");
+ var end = engine.getValue(group, "loop_end_position");
+
+ if (IonDiscoverDjPro.manualLooping[deck]) {
+ // Multiply Loop by Two
+ if ((start !== -1) && (end !== -1)) {
+ var len = (end - start) * 2;
+ engine.setValue(group, "loop_end_position", start + len);
+ }
+ } else {
+ if (engine.getValue(group, "loop_enabled")) {
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["reLoop"], false);
+ } else {
+ if ((start !== -1) && (end !== -1)) {
+ // Loop is set ! Light the led
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["reLoop"], true);
+ }
+ }
+ engine.setValue(group, "reloop_exit", 1);
+ }
+ }
+};
+
+IonDiscoverDjPro.playFromCue = function(channel, control, value, status, group) {
+ if (value) {
+ if (engine.getValue(group, "play")) {
+ engine.setValue(group, "play", 0);
+ engine.setValue(group, "cue_gotoandstop", 1);
+ } else {
+ engine.setValue(group, "cue_preview", 1);
+ }
+ } else {
+ engine.setValue(group, "cue_preview", 0);
+ }
+};
+
+IonDiscoverDjPro.jogWheel = function(channel, control, value, status, group) {
+ var deck = IonDiscoverDjPro.groupToDeck(group);
+ var adjustedJog = parseFloat(value);
+ var posNeg = 1;
+ if (adjustedJog > 63) { // Counter-clockwise
+ posNeg = -1;
+ adjustedJog = value - 128;
+ }
+
+ if (IonDiscoverDjPro.scratchMode[deck]) {
+ if (IonDiscoverDjPro.scratchTimer[deck] === -1) {
+ engine.scratchEnable(deck, 128, 33+1/3, 1.0/8, (1.0/8)/32);
+ } else {
+ engine.stopTimer(IonDiscoverDjPro.scratchTimer[deck]);
+ }
+ engine.scratchTick(deck, adjustedJog);
+ IonDiscoverDjPro.scratchTimer[deck] = engine.beginTimer(20, "IonDiscoverDjPro.jogWheelStopScratch(" + deck + ")", true);
+ } else {
+ var gammaInputRange = 23; // Max jog speed
+ var maxOutFraction = 0.5; // Where on the curve it should peak; 0.5 is half-way
+ var sensitivity = 0.5; // Adjustment gamma
+ var gammaOutputRange = 3; // Max rate change
+ if (engine.getValue(group, "play")) {
+ adjustedJog = posNeg * gammaOutputRange * Math.pow(Math.abs(adjustedJog) / (gammaInputRange * maxOutFraction), sensitivity);
+ } else {
+ adjustedJog = gammaOutputRange * adjustedJog / (gammaInputRange * maxOutFraction);
+ }
+ engine.setValue(group, "jog", adjustedJog);
+ }
+};
+
+IonDiscoverDjPro.jogWheelStopScratch = function(deck) {
+ IonDiscoverDjPro.scratchTimer[deck] = -1;
+ engine.scratchDisable(deck);
+};
+
+IonDiscoverDjPro.WheelTouch = function(channel, control, value, status, group) {
+ var deck = IonDiscoverDjPro.groupToDeck(group);
+ if (IonDiscoverDjPro.scratchMode[deck]) {
+ if (value) {
+ engine.scratchEnable(deck, 512, 33+1/3, 0.2, (0.2)/32);
+ IonDiscoverDjPro.scratching[deck-1] = true;
+ } else {
+ engine.scratchDisable(deck);
+ if (IonDiscoverDjPro.KeyIsLocked[deck-1]) {
+ engine.setValur(group, "keylock", 1);
+ }
+ IonDiscoverDjPro.scratching[deck-1] = false;
+ }
+ }
+};
+
+IonDiscoverDjPro.toggleDirectoryMode = function(channel, control, value) {
+ // Toggle setting and light
+ if (value) {
+ if (IonDiscoverDjPro.directoryMode) {
+ IonDiscoverDjPro.directoryMode = false;
+ } else {
+ IonDiscoverDjPro.directoryMode = true;
+ }
+ }
+};
+
+IonDiscoverDjPro.toggleScratchMode = function(channel, control, value, status, group) {
+ var deck = IonDiscoverDjPro.groupToDeck(group);
+ // Toggle setting and light
+ if (value) {
+ if (IonDiscoverDjPro.scratchMode[deck]) {
+ IonDiscoverDjPro.scratchMode[deck] = false;
+ } else {
+ IonDiscoverDjPro.scratchMode[deck] = true;
+ }
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["scratchMode"], IonDiscoverDjPro.scratchMode[deck]);
+ }
+};
+
+IonDiscoverDjPro.toggleManualLooping = function(channel, control, value, status, group) {
+ var deck = IonDiscoverDjPro.groupToDeck(group);
+ // Toggle setting and light
+ if (value) {
+ if (IonDiscoverDjPro.manualLooping[deck]) {
+ IonDiscoverDjPro.manualLooping[deck] = false;
+ } else {
+ IonDiscoverDjPro.manualLooping[deck] = true;
+ }
+ IonDiscoverDjPro.setLED(IonDiscoverDjPro.leds[deck]["manualLoop"], IonDiscoverDjPro.manualLooping[deck]);
+ }
+};
diff --git a/res/controllers/Ion-Discover-DJ-Pro.midi.xml b/res/controllers/Ion-Discover-DJ-Pro.midi.xml
new file mode 100644
index 0000000000..58418593dc
--- /dev/null
+++ b/res/controllers/Ion-Discover-DJ-Pro.midi.xml
@@ -0,0 +1,798 @@
+<?xml version='1.0' encoding='utf-8'?>
+<MixxxControllerPreset mixxxVersion="2.1.0+" schemaVersion="1">
+ <info>
+ <name>Ion Discover DJ Pro</name>
+ <author>joachim,meltedpianoman</author>
+ <description>A mapping for the Ion Discover DJ Pro, a 2-deck controller with integrated audio interface and iPhone dock.</description>
+ <wiki>https://mixxx.org/wiki/doku.php/ion_discover_dj_pro</wiki>
+ <forums>https://mixxx.org/forums/viewtopic.php?f=7&amp;t=3343</forums>
+ </info>
+ <controller id="DISCOVER DJ PRO MIDI 1">
+ <scriptfiles>
+ <file functionprefix="IonDiscoverDjPro" filename="Ion-Discover-DJ-Pro-scripts.js"/>
+ </scriptfiles>
+ <controls>
+ <control>
+ <status>0xb0</status>
+ <midino>0xc</midino>
+ <group>[Master]</group>
+ <key>headMix</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x17</midino>
+ <group>[Master]</group>
+ <key>volume</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0xb</midino>
+ <group>[Master]</group>
+ <key>headVolume</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x0a</midino>
+ <group>[Master]</group>
+ <key>crossfader</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x1a</midino>
+ <group>[Playlist]</group>
+ <key>IonDiscoverDjPro.selectKnob</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x69</midino>
+ <group>[Playlist]</group>
+ <key>IonDiscoverDjPro.toggleDirectoryMode</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x4f</midino>
+ <group>[Playlist]</group>
+ <key>IonDiscoverDjPro.toggleDirectoryMode</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x3b</midino>
+ <group>[Channel1]</group>
+ <key>play</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x33</midino>
+ <group>[Channel1]</group>
+ <key>cue_default</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x40</midino>
+ <group>[Channel1]</group>
+ <key>beatsync</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x4a</midino>
+ <group>[Channel1]</group>
+ <key>IonDiscoverDjPro.playFromCue</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x65</midino>
+ <group>[Channel1]</group>
+ <key>pfl</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x5C</midino>
+ <group>[Channel1]</group>
+ <key>filterHighKill</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x5B</midino>
+ <group>[Channel1]</group>
+ <key>filterMidKill</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x5A</midino>
+ <group>[Channel1]</group>
+ <key>filterLowKill</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x10</midino>
+ <group>[Channel1]</group>
+ <key>filterHigh</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x12</midino>
+ <group>[Channel1]</group>
+ <key>filterMid</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x14</midino>
+ <group>[Channel1]</group>
+ <key>filterLow</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x61</midino>
+ <group>[Channel1]</group>
+ <key>IonDiscoverDjPro.toggleManualLooping</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x53</midino>
+ <group>[Channel1]</group>
+ <key>IonDiscoverDjPro.loopIn</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x54</midino>
+ <group>[Channel1]</group>
+ <key>IonDiscoverDjPro.loopOut</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x55</midino>
+ <group>[Channel1]</group>
+ <key>IonDiscoverDjPro.reLoop</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x4b</midino>
+ <group>[Channel1]</group>
+ <key>LoadSelectedTrack</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x8</midino>
+ <group>[Channel1]</group>
+ <key>volume</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0xd</midino>
+ <group>[Channel1]</group>
+ <key>rate</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x44</midino>
+ <group>[Channel1]</group>
+ <key>rate_temp_up</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x43</midino>
+ <group>[Channel1]</group>
+ <key>rate_temp_down</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x51</midino>
+ <group>[Channel1]</group>
+ <key>keylock</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x52</midino>
+ <group>[Channel2]</group>
+ <key>keylock</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x63</midino>
+ <group>[Channel1]</group>
+ <key>reverse</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x64</midino>
+ <group>[Channel2]</group>
+ <key>reverse</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x48</midino>
+ <group>[Channel1]</group>
+ <key>IonDiscoverDjPro.toggleScratchMode</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x19</midino>
+ <group>[Channel1]</group>
+ <key>IonDiscoverDjPro.jogWheel</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x4e</midino>
+ <group>[Channel1]</group>
+ <key>IonDiscoverDjPro.WheelTouch</key>
+ <description></description>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x42</midino>
+ <group>[Channel2]</group>
+ <key>play</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x3c</midino>
+ <group>[Channel2]</group>
+ <key>cue_default</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x47</midino>
+ <group>[Channel2]</group>
+ <key>beatsync</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x66</midino>
+ <group>[Channel2]</group>
+ <key>pfl</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x60</midino>
+ <group>[Channel2]</group>
+ <key>filterHighKill</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x5f</midino>
+ <group>[Channel2]</group>
+ <key>filterMidKill</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x5e</midino>
+ <group>[Channel2]</group>
+ <key>filterLowKill</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x11</midino>
+ <group>[Channel2]</group>
+ <key>filterHigh</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x13</midino>
+ <group>[Channel2]</group>
+ <key>filterMid</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x15</midino>
+ <group>[Channel2]</group>
+ <key>filterLow</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x62</midino>
+ <group>[Channel2]</group>
+ <key>IonDiscoverDjPro.toggleManualLooping</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x56</midino>
+ <group>[Channel2]</group>
+ <key>IonDiscoverDjPro.loopIn</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x57</midino>
+ <group>[Channel2]</group>
+ <key>IonDiscoverDjPro.loopOut</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x58</midino>
+ <group>[Channel2]</group>
+ <key>IonDiscoverDjPro.reLoop</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x34</midino>
+ <group>[Channel2]</group>
+ <key>LoadSelectedTrack</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x9</midino>
+ <group>[Channel2]</group>
+ <key>volume</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0xe</midino>
+ <group>[Channel2]</group>
+ <key>rate</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x46</midino>
+ <group>[Channel2]</group>
+ <key>rate_temp_up</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x45</midino>
+ <group>[Channel2]</group>
+ <key>rate_temp_down</key>
+ <options>
+ <normal/>
+ </options>
+ </control>
+ <control>
+ <status>0x90</status>
+ <midino>0x50</midino>
+ <group>[Channel2]</group>
+ <key>IonDiscoverDjPro.toggleScratchMode</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <status>0xb0</status>
+ <midino>0x18</midino>
+ <group>[Channel2]</group>
+ <key>IonDiscoverDjPro.jogWheel</key>
+ <options>
+ <script-binding/>
+ </options>
+ </control>-
+ <control>
+ <status>0xb0</status>
+ <midino>0x4d</midino>
+ <group>[Channel2]</group>
+ <key>IonDiscoverDjPro.WheelTouch</key>
+ <description></description>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ </controls>
+ <outputs>
+ <output>
+ <group>[Channel1]</group>
+ <key>play</key>
+ <options>
+ <normal/>
+ </options>
+ <minimum>0</minimum>
+ <maximum>0.1</maximum>
+ <status>0x90</status>
+ <midino>0x3b</midino>
+ <on>0x0</on>
+ <off>0x64</off>
+ </output>
+ <output>
+ <group>[Channel1]</group>
+ <key>cue_default</key>
+ <options>
+ <normal/>
+ </options>
+ <minimum>0</minimum>
+ <maximum>0.1</maximum>
+ <status>0x90</status>
+ <midino>0x33</midino>
+ <on>0x0</on>
+ <off>0x64</off>
+ </output>
+ <output>
+ <group>[Channel1]</group>
+ <key>beatsync</key>
+ <options>
+ <normal/>
+ </options>
+ <minimum>0</minimum>
+ <maximum>0.1</maximum>
+ <status>0x90</status>
+ <midino>0x40</midino>
+ <on>0x0</on>
+ <off>0x64</off>
+ </output>
+ <output>
+ <group>[Channel1]</group>
+ <key>filterLowKill</key>
+ <options>
+ <normal/>
+ </options>
+ <minimum>0</minimum>
+ <maximum>0.1</maximum>
+ <status>0x90</status>
+ <midino>0x5a</midino>
+ <on>0x0</on>
+ <off>0x64</off>
+ </output>
+ <output>
+ <group>[Channel1]</group>
+ <key>pfl</key>
+ <options>
+ <normal/>
+ </options>
+ <minimum>0</minimum>
+ <maximum>0.1</maximum>
+ <status>0x90</status>
+ <midino>0x65</midino>
+ <on>0x0</on>
+ <off>0x64</off>
+ </output>
+ <output>
+ <group>[Channel1]</group>
+ <key>filterLowKill</key>
+ <options>
+ <normal/>
+ </options>
+ <minimum>0</minimum>
+ <maximum>0.1</maximum>
+ <status>0x90</status>
+ <midino>0x5a</midino>
+ <on>0x0</on>
+ <off>0x64</off>
+ </output>
+ <output>
+ <group>[Channel1]</group>
+ <key>filterMidKill</key>
+ <options>
+ <normal/>
+ </options>
+ <minimum>0</minimum>
+ <maximum>0.1</maximum>
+ <status>0x90</status>
+ <midino>0x5b</midino>
+ <on>0x0</on>
+ <off>0x64</off>
+ </output>
+ <output>
+ <group>[Channel1]</group>
+ <key>filterHighKill</key>
+ <options>
+ <normal/>
+ </options>
+ <minimum>0</minimum>
+ <maximum>0.1</maximum>
+ <status>0x90</status>
+ <midino>0x5c</midino>
+ <on>0x0</on>
+ <off>0x64</off>
+ </output>
+ <output>