diff options
author | Uwe Klotz <uklotz@mixxx.org> | 2021-03-12 14:07:24 +0100 |
---|---|---|
committer | Uwe Klotz <uklotz@mixxx.org> | 2021-03-12 14:07:24 +0100 |
commit | 439a05f08510ce548064a7f43c4a19ec8cee04a2 (patch) | |
tree | 26d296eb575f72f56a2ba279fd3abc6a93c9fb07 /res | |
parent | 6eb47941d05ac28a392c17fecbb402524db7e99d (diff) | |
parent | d72af1b56a5b03aeb06422061801c54e71e9080d (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.js | 255 | ||||
-rw-r--r-- | res/controllers/Ion-Discover-DJ-Pro.midi.xml | 798 |
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&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>
|