diff --git a/res/controllers/Pioneer-DDJ-400-script.js b/res/controllers/Pioneer-DDJ-400-script.js new file mode 100644 index 000000000000..6f56e899ee87 --- /dev/null +++ b/res/controllers/Pioneer-DDJ-400-script.js @@ -0,0 +1,715 @@ +// Pioneer-DDJ-400-script.js +// **************************************************************************** +// * Mixxx mapping script file for the Pioneer DDJ-400. +// * Author: Warker, nschloe, dj3730 +// * Forum: https://mixxx.org/forums/viewtopic.php?f=7&t=12113 +// * Wiki: https://www.mixxx.org/wiki/doku.php/pioneer_ddj-400 +// +// Upstream MIDI spec: +// * https://www.pioneerdj.com/-/media/pioneerdj/software-info/controller/ddj-400/ddj-400_midi_message_list_e1.pdf +// +// Working: +// * Mixer Section (Faders, EQ, Filter, Gain, Cue) +// * Browsing and loading + Waveform zoom (shift) +// * Jogwheels, Scratching, Bending +// * cycle Temporange +// * Beat Sync +// * Beat Loop Mode +// * Sampler Mode +// * BeatFX (controls Effect Unit 1. LEFT selects EFFECT1, RIGHT selects EFFECT2, FX_SELECT selects EFFECT3. +// ON/OFF toggles selected effect slot. SHIFT+ON/OFF disables all three effect slots. +// * Hot Cue Mode +// +// Partially: +// * Beatjump mode (no lighting, shift mode(adjust jump size)) +// * PAD FX (only slots A-H, Q-P) +// * Output (lights) +// * Loop Section: Loop in / Out, Call, Double, Half +// (loop adjust not working, '4 beat loop' doesnt work correctly - see comments in PioneerDDJ400.loopin4beatPressedLong) +// +// Testing: +// * Keyboard Mode (check pitch value) +// * Keyshift Mode (check pitch value) +// +// Not working/implemented: +// * Channel & Crossfader Start +// +var PioneerDDJ400 = {}; + +var LightsPioneerDDJ400 = { + beatFx: { + status: 0x94, + data1: 0x47, + }, + deck1: { + vuMeter: { + status: 0xB0, + data1: 0x02, + }, + playPause: { + status: 0x90, + data1: 0x0B, + }, + shiftPlayPause: { + status: 0x90, + data1: 0x47, + }, + cue: { + status: 0x90, + data1: 0x0C, + }, + shiftCue: { + status: 0x90, + data1: 0x48, + }, + }, + deck2: { + vuMeter: { + status: 0xB0, + data1: 0x02, + }, + playPause: { + status: 0x91, + data1: 0x0B, + }, + shiftPlayPause: { + status: 0x91, + data1: 0x47, + }, + cue: { + status: 0x91, + data1: 0x0C, + }, + shiftCue: { + status: 0x91, + data1: 0x48, + }, + }, +}; + +// Save the Shift State +PioneerDDJ400.shiftState = [0, 0]; + +// JogWheel +PioneerDDJ400.vinylMode = true; +PioneerDDJ400.alpha = 1.0/8; +PioneerDDJ400.beta = PioneerDDJ400.alpha/32; +PioneerDDJ400.highspeedScale = 150; // multiplier for fast seek through track using SHIFT+JOGWHEEL +PioneerDDJ400.bendScale = 0.5; + +PioneerDDJ400.pointJumpSpace = 0.005; // amount in percent of the Song we can jump back to previous Cue or loop point + +PioneerDDJ400.tempoRanges = [0.06, 0.10, 0.16, 0.25]; // WIDE = 25%? + +// Keyboard Mode Variables and Settings +PioneerDDJ400.keyboardHotCuePoint = [0, 0]; // selected HotCue point (eg. PAD) in Keyboard mode per Deck 0 = unset +PioneerDDJ400.keyboardModeRefCount = [0, 0]; // count the currently pressed Pads per Deck +PioneerDDJ400.halftoneToPadMap = [4, 5, 6, 7, 0, 1, 2, 3]; + +// Beatjump Pads +PioneerDDJ400.beatjumpPad = [-1, 1, -2, 2, -4, 4, -8, 8]; // < 0 = left; else right +PioneerDDJ400.beatjumpMultiplier = [1, 1]; // Beatjump Beatcount per Deck + +// Hotcue Pads saved Loop points +PioneerDDJ400.hotcueLoopPoints = { + "[Channel1]": [], + "[Channel2]": [] +}; + +// Loop Section +PioneerDDJ400.loopin4beat = [false, false]; // inn4loop is pressed +PioneerDDJ400.loopout = [false, false]; // out loop is pressed +PioneerDDJ400.loopAdjustMultiply = 5; + +PioneerDDJ400.samplerCallbacks = []; + +// Wrapper to easily ignore the function when the button is released. +var ignoreRelease = function(fn) { + return function(channel, control, value, status, group) { + if (value === 0) { // This means the button is released. + return; + } + return fn(channel, control, value, status, group); + }; +}; + + +PioneerDDJ400.init = function() { + // init controller + + // show focus buttons on Effect Ract 1 only + engine.setValue("[EffectRack1_EffectUnit1]", "show_focus", 1); + + // Connect the VU-Meter LEDS + engine.makeConnection("[Channel1]", "VuMeter", PioneerDDJ400.vuMeterUpdate); + engine.makeConnection("[Channel2]", "VuMeter", PioneerDDJ400.vuMeterUpdate); + + // reset vumeter + PioneerDDJ400.toggleLight(LightsPioneerDDJ400.deck1.vuMeter, false); + PioneerDDJ400.toggleLight(LightsPioneerDDJ400.deck2.vuMeter, false); + + // enable soft takeover for rate controls + engine.softTakeover("[Channel1]", "rate", true); + engine.softTakeover("[Channel2]", "rate", true); + + + // Sampler callbacks + for (var i = 1; i <= 16; ++i) { + PioneerDDJ400.samplerCallbacks.push(engine.makeConnection("[Sampler" + i + "]", "play", PioneerDDJ400.samplerPlayOutputCallbackFunction)); + } + + // trigger "track loaded" animations when a track is loaded + engine.makeConnection("[Channel1]", "track_loaded", PioneerDDJ400.trackLoadedLED); + engine.makeConnection("[Channel2]", "track_loaded", PioneerDDJ400.trackLoadedLED); + + // eye candy : play the "track loaded" animation on both decks at startup + midi.sendShortMsg(0x9F, 0x00, 0x7F); + midi.sendShortMsg(0x9F, 0x01, 0x7F); + + // poll the controller for current control positions on startup + midi.sendSysexMsg([0xF0, 0x00, 0x40, 0x05, 0x00, 0x00, 0x02, 0x06, 0x00, 0x03, 0x01, 0xf7], 12); +}; + +PioneerDDJ400.trackLoadedLED = function(value, group, _control) { + if (value) { + value = 0x7F; + } else { + value = 0x00; + } + var channel = group.match(/^\[Channel(\d+)\]$/)[1]; + midi.sendShortMsg(0x9F, 0x00+(channel-1), value); +}; + +PioneerDDJ400.toggleLight = function(midiIn, active) { + midi.sendShortMsg(midiIn.status, midiIn.data1, active ? 0x7F : 0); +}; + +PioneerDDJ400.jogTurn = function(channel, _control, value, _status, group) { + var deckNum = channel + 1; + // wheel center at 64; <64 rew >64 fwd + var newVal = value - 64; + + // loop_in / out adjust + var loopEnabled = engine.getValue(group, "loop_enabled"); + if (loopEnabled > 0) { + if (this.loopin4beat[channel]) { + newVal = newVal * this.loopAdjustMultiply + engine.getValue(group, "loop_start_position"); + engine.setValue(group, "loop_start_position", newVal); + return; + } + if (this.loopout[channel]) { + newVal = newVal * this.loopAdjustMultiply + engine.getValue(group, "loop_end_position"); + engine.setValue(group, "loop_end_position", newVal); + return; + } + } + + if (engine.isScratching(deckNum)) { + engine.scratchTick(deckNum, newVal); + } else { // fallback + engine.setValue(group, "jog", newVal * this.bendScale); + } +}; + + +PioneerDDJ400.jogSearch = function(_channel, _control, value, _status, group) { + // "highspeed" (scaleup value) pitch bend + var newVal = (value - 64) * this.highspeedScale; + engine.setValue(group, "jog", newVal); +}; + +PioneerDDJ400.jogTouch = function(channel, _control, value) { + var deckNum = channel + 1; + + // skip scratchmode if we adjust the loop points + if (this.loopin4beat[channel] || this.loopout[channel]) { + return; + } + + // on touch jog with vinylmode enabled -> enable scratchmode + if (value !== 0 && this.vinylMode) { + engine.scratchEnable(deckNum, 720, 33+1/3, this.alpha, this.beta); + } else { + // on release jog (value === 0) disable pitch bend mode or scratch mode + engine.scratchDisable(deckNum); + } +}; + +/////////////////////////////////////////////////////////////// +// HIGH RESOLUTION MIDI INPUT HANDLERS // +/////////////////////////////////////////////////////////////// + +PioneerDDJ400.highResMSB = { + '[Channel1]': {}, + '[Channel2]': {}, + '[Channel3]': {}, + '[Channel4]': {} +}; + + +PioneerDDJ400.tempoSliderMSB = function(channel, control, value, status, group) { + PioneerDDJ400.highResMSB[group].tempoSlider = value; +}; + +PioneerDDJ400.tempoSliderLSB = function(channel, control, value, status, group) { + var fullValue = (PioneerDDJ400.highResMSB[group].tempoSlider << 7) + value; + + engine.setValue( + group, + 'rate', + ((0x4000 - fullValue) - 0x2000) / 0x2000 + ); +}; + +PioneerDDJ400.cycleTempoRange = function(_channel, _control, value, _status, group) { + if (value === 0) return; // ignore release + + var currRange = engine.getValue(group, "rateRange"); + var idx = 0; + + for (var i = 0; i < this.tempoRanges.length; i++) { + if (currRange === this.tempoRanges[i]) { + idx = (i + 1) % this.tempoRanges.length; + break; + } + } + engine.setValue(group, "rateRange", this.tempoRanges[idx]); +}; + + +var sortAsc = function(a, b) { + // returns 1 if a > b, -1 if a < b, and 0 otherwise + return (a > b) ? 1 : (b > a ? -1 : 0); +}; + +PioneerDDJ400.initCuePointsAndLoops = function(group) { + // create a list of positions in the track which can be selected + var points = []; + + for (var padNum = 1; padNum <= 8; padNum++) { + points.push(engine.getValue(group, "hotcue_"+padNum+"_position")); + } + points.push(engine.getValue(group, "cue_point")); + points.push(engine.getValue(group, "loop_start_position")); + points.push(engine.getValue(group, "loop_end_position")); + points.sort(sortAsc); // sort asc + return points; +}; + +PioneerDDJ400.cueLoopCallLeft = function(_channel, _control, value, _status, group) { + if (value === 0) { + // ignore release + return; + } + + var loopEnabled = engine.getValue(group, "loop_enabled"); + if (loopEnabled) { + // loop halve + engine.setValue(group, "loop_scale", 0.5); + } else { + var currentPosition = engine.getValue(group, "playposition") - this.pointJumpSpace; + var trackSamples = engine.getValue(group, "track_samples"); + var points = this.initCuePointsAndLoops(group); + var newPosition = currentPosition; + + for (var i = 1; i <= points.length; i++) { + if (i === points.length || points[i] >= currentPosition * trackSamples) { + newPosition = points[i-1] / trackSamples; + break; + } + } + //engine.setValue(group, 'loop_in_goto', 1); + engine.setValue(group, "playposition", newPosition); + } +}; + +PioneerDDJ400.cueLoopCallRight = function(_channel, _control, value, _status, group) { + if (value === 0) { + return; // ignore release + } + + var loopEnabled = engine.getValue(group, "loop_enabled"); + if (loopEnabled) { + // loop double + engine.setValue(group, "loop_scale", 2.0); + } else { + // jump through the cue points + var currentPosition = engine.getValue(group, "playposition"); + var trackSamples = engine.getValue(group, "track_samples"); + var points = this.initCuePointsAndLoops(group); + + var newPosition = currentPosition; + + for (var i = 0; i < points.length; i++) { + if (points[i] > currentPosition * trackSamples) { + newPosition = points[i] / trackSamples; + break; + } + } + engine.setValue(group, "playposition", newPosition); + } +}; + +PioneerDDJ400.keyboardMode = function(channel, _control, value, _status, group) { + if (value > 0) { + // clear current set hotcue point and refcount for keyboard mode + this.keyboardHotCuePoint[channel] = 0; + this.keyboardModeRefCount[channel] = 0; + // reset pitch + engine.setValue(group, "pitch", 0.0); + this.keyboardModeEnabledOutput(channel, group); + } +}; + + +PioneerDDJ400.keyboardModeEnabledOutput = function(channel, group) { + var status = channel === 0 ? 0x97 : 0x99; + var hotcuePad = 1; + + if (this.keyboardHotCuePoint[channel] === 0) { + for (hotcuePad = 1; hotcuePad <= 8; hotcuePad++) { + var hotcueEnabled = engine.getValue(group, "hotcue_"+hotcuePad+"_enabled"); + + midi.sendShortMsg(status, 0x40 + hotcuePad-1, hotcueEnabled > 0 ? 0x7F : 0); + // shift lights on if hotcue is set + midi.sendShortMsg(status+1, 0x40 + hotcuePad-1, hotcueEnabled > 0 ? 0x7F : 0); + } + } else { + // enable all LEDs + for (hotcuePad = 1; hotcuePad <= 8; hotcuePad++) { + midi.sendShortMsg(status, 0x40 + hotcuePad-1, 0x7F); + } + } + // shift keyboard Pad 7 and 8 are always enabled + midi.sendShortMsg(status+1, 0x46, 0x7F); + midi.sendShortMsg(status+1, 0x47, 0x7F); +}; + + +PioneerDDJ400.keyboardModePad = function(channel, control, value, _status, group) { + channel = (channel & 0xf) < 10 ? 0 : 1; + var padNum = (control & 0xf) + 1; + var hotcuePad = this.keyboardHotCuePoint[channel]; + + // if no hotcue is set for keyboard mode set on first press on a pad + if (hotcuePad === 0 && value !== 0) { + hotcuePad = padNum; + this.keyboardHotCuePoint[channel] = hotcuePad; + // if there is no hotcue at this pad, set current play position + var hotcuePos = engine.getValue(group, "hotcue_"+hotcuePad+"_position"); + + if (hotcuePos < 0) { + engine.setValue(group, "hotcue_"+hotcuePad+"_set", 1); + } + + this.keyboardModeRefCount[channel] = 0; // reset count + this.keyboardModeEnabledOutput(channel, group); + return; + } + + // if hotcue point is set perform coresponding halftone operation + if (value > 0) { + // count pressed Pad per deck + this.keyboardModeRefCount[channel] += 1; + var newValue = this.halftoneToPadMap[padNum-1]; + + engine.setValue(group, "pitch", newValue); + engine.setValue(group, "hotcue_"+hotcuePad+"_gotoandplay", 1); + } else { + // decrease the number of active Pads, this should minimize unwanted stops + this.keyboardModeRefCount[channel] -= 1; + if (this.keyboardModeRefCount[channel] <= 0) { + engine.setValue(group, "hotcue_"+hotcuePad+"_gotoandstop", 1); + engine.setValue(group, "pitch", 0.0); // reset pitch + this.keyboardModeRefCount[channel] = 0; // reset refcount to 0 + } + } +}; + +PioneerDDJ400.keyshiftModePad = function(_channel, control, value, _status, group) { + if (value === 0) { + return; // ignore release + } + engine.setValue(group, "pitch", this.halftoneToPadMap[control & 0xf]); +}; + +PioneerDDJ400.samplerModeShiftPadPressed = function(_channel, _control, value, _status, group) { + if (value === 0) { + return; // ignore release + } + + var playing = engine.getValue(group, "play"); + // when playing stop and return to start/cue point + if (playing > 0) { + engine.setValue(group, "cue_gotoandstop", 1); + } else { // load selected track + engine.setValue(group, "LoadSelectedTrack", 1); + } +}; + + +PioneerDDJ400.shiftPressed = function(channel, _control, value) { + this.shiftState[channel] = value; +}; + +PioneerDDJ400.waveFormRotate = function(_channel, _control, value) { + // select the Waveform to zoom left shift = deck1, right shift = deck2 + var deckNum = this.shiftState[0] > 0 ? 1 : 2; + var oldVal = engine.getValue("[Channel"+deckNum+"]", "waveform_zoom"); + var newVal = oldVal + (value > 0x64 ? 1 : -1); + + engine.setValue("[Channel"+deckNum+"]", "waveform_zoom", newVal); +}; + +PioneerDDJ400.loopin4beatPressed = function(channel, _control, value, _status, group) { + var loopEnabled = engine.getValue(group, "loop_enabled"); + this.loopin4beat[channel] = (value > 0); + + if (loopEnabled === 0 && value > 0) { + engine.setValue(group, "loop_in", 1); + } +}; + +PioneerDDJ400.loopin4beatPressedLong = function(_channel, _control, value, _status, group) { + // problematic - loop gets set to the playback position where the 'long press' was recognized + // and not to the point at which the button was initially pressed + // as a result, the loop is not set where one would expect + var loopEnabled = engine.getValue(group, "loop_enabled"); + if (!loopEnabled && value > 0) { + engine.setValue(group, "beatloop_4_activate", 1); + } +}; + +PioneerDDJ400.loopoutPressed = function(channel, _control, value, _status, group) { + var loopEnabled = engine.getValue(group, "loop_enabled"); + this.loopout[channel] = (value > 0); + + if (loopEnabled === 0 && value > 0) { + engine.setValue(group, "loop_out", 1); + } +}; + +// START BEAT FX + +PioneerDDJ400.numFxSlots = 3; + +Object.defineProperty(PioneerDDJ400, "selectedFxSlot", { + get: function() { + return engine.getValue("[EffectRack1_EffectUnit1]", "focused_effect"); + }, + set: function(value) { + if (value < 0 || value > PioneerDDJ400.numFxSlots) { + return; + } + engine.setValue("[EffectRack1_EffectUnit1]", "focused_effect", value); + var isEffectEnabled = engine.getValue(PioneerDDJ400.selectedFxGroup, "enabled"); + PioneerDDJ400.toggleLight(LightsPioneerDDJ400.beatFx, isEffectEnabled); + }, +}); + +Object.defineProperty(PioneerDDJ400, "selectedFxGroup", { + get: function() { + return "[EffectRack1_EffectUnit1_Effect" + PioneerDDJ400.selectedFxSlot + "]"; + }, +}); + +PioneerDDJ400.beatFxLevelDepthRotate = function(_channel, _control, value) { + var newVal = value === 0 ? 0 : (value / 0x7F); + var effectOn = engine.getValue(PioneerDDJ400.selectedFxGroup, "enabled"); + + if (effectOn) { + engine.setValue(PioneerDDJ400.selectedFxGroup, "meta", newVal); + } else { + engine.setValue("[EffectRack1_EffectUnit1]", "mix", newVal); + } +}; + +PioneerDDJ400.beatFxSelectPressed = ignoreRelease(function() { + // focus Effect Slot 3 in Effect Unit 1, or clear focus if it is currently focused + if (PioneerDDJ400.selectedFxSlot === 3) { + PioneerDDJ400.selectedFxSlot = 0; + } else { + PioneerDDJ400.selectedFxSlot = 3; + } +}); + +PioneerDDJ400.beatFxSelectShiftPressed = function(_channel, _control, _value) { + //engine.setValue(PioneerDDJ400.selectedFxGroup, "prev_effect", value); +}; + +PioneerDDJ400.beatFxLeftPressed = ignoreRelease(function() { + // focus Effect Slot 1 in Effect Unit 1, or clear focus if it is currently focused + if (PioneerDDJ400.selectedFxSlot === 1) { + PioneerDDJ400.selectedFxSlot = 0; + } else { + PioneerDDJ400.selectedFxSlot = 1; + } +}); + +PioneerDDJ400.beatFxRightPressed = ignoreRelease(function() { + // focus Effect Slot 2 in Effect Unit 1, or clear focus if it is currently focused + if (PioneerDDJ400.selectedFxSlot === 2) { + PioneerDDJ400.selectedFxSlot = 0; + } else { + PioneerDDJ400.selectedFxSlot = 2; + } +}); + +PioneerDDJ400.beatFxOnOffPressed = ignoreRelease(function() { + // toggle the currently focused effect slot in Effect Unit 1 (if any) + var selectedSlot = PioneerDDJ400.selectedFxSlot; + if (selectedSlot <= 0 || selectedSlot > PioneerDDJ400.numFxSlots) { + return; + } + var isEnabled = !engine.getValue(PioneerDDJ400.selectedFxGroup, "enabled"); + engine.setValue(PioneerDDJ400.selectedFxGroup, "enabled", isEnabled); + PioneerDDJ400.toggleLight(LightsPioneerDDJ400.beatFx, isEnabled); +}); + +PioneerDDJ400.beatFxOnOffShiftPressed = ignoreRelease(function() { + // turn off all three effect slots in Effect Unit 1 + for (var i = 1; i <= PioneerDDJ400.numFxSlots; i += 1) { + engine.setValue("[EffectRack1_EffectUnit1_Effect" + i + "]", "enabled", 0); + } + PioneerDDJ400.toggleLight(LightsPioneerDDJ400.beatFx, false); +}); + +PioneerDDJ400.beatFxChannel = ignoreRelease(function(_channel, control, _value, _status, group) { + var enableChannel1 = control === 0x10 || control === 0x14; + var enableChannel2 = control === 0x11 || control === 0x14; + + engine.setValue(group, "group_[Channel1]_enable", enableChannel1); + engine.setValue(group, "group_[Channel2]_enable", enableChannel2); +}); + +PioneerDDJ400.padFxBelowPressed = ignoreRelease(function(channel, control, value, status, group) { + var groupAbove = group.replace(/\[EffectRack1_EffectUnit(\d+)_Effect(\d+)]/, function(all, unit, effect) { + var effectAbove = parseInt(effect) - 4; + + return "[EffectRack1_EffectUnit" + unit + "_Effect" + effectAbove + "]"; + }); + + engine.setValue(groupAbove, "next_effect", value); +}); + +PioneerDDJ400.padFxShiftBelowPressed = ignoreRelease(function(channel, control, value, status, group) { + var groupAbove = group.replace(/\[EffectRack1_EffectUnit(\d+)_Effect(\d+)]/, function(all, unit, effect) { + var effectAbove = parseInt(effect) - 4; + + return "[EffectRack1_EffectUnit" + unit + "_Effect" + effectAbove + "]"; + }); + + engine.setValue(groupAbove, "prev_effect", value); +}); + +// END BEAT FX + +PioneerDDJ400.vuMeterUpdate = function(value, group) { + var newVal = value * 150; + + switch (group) { + case "[Channel1]": + midi.sendShortMsg(0xB0, 0x02, newVal); + break; + + case "[Channel2]": + midi.sendShortMsg(0xB1, 0x02, newVal); + break; + } +}; + +// +// SAMPLERS +// + +// blink pad when sample playback starts +PioneerDDJ400.samplerPlayOutputCallbackFunction = function(value, group, _control) { + if (value === 1) { + // for some reason, using script.samplerRegEx here results in an error under Linux + var curPad = group.match(/^\[Sampler(\d+)\]$/)[1]; + startSamplerBlink((0x97 + (curPad > 8 ? 2 : 0)), (0x30 + ((curPad > 8 ? curPad-8 : curPad)-1)), group); + } +}; + +PioneerDDJ400.samplerModePadPressed = ignoreRelease(function(_channel, control, _value, status, group) { + var isLoaded = engine.getValue(group, "track_loaded") === 1; + + if (!isLoaded) { + return; + } + engine.setValue(group, "cue_gotoandplay", 1); +}); + + +PioneerDDJ400.samplerModeShiftPadPressed = function(_channel, _control, value, _status, group) { + if (value === 0) { + return; // ignore release + } + var playing = engine.getValue(group, 'play'); + // when playing stop and return to start/cue point + if (playing > 0) { + engine.setValue(group, 'cue_gotoandstop', 1); + } else { // load selected track + // engine.setValue(group, 'LoadSelectedTrack', 1); + } +}; + +var TimersPioneerDDJ400 = {}; + +function startSamplerBlink(channel, control, group) { + var val = 0x7f; + + // print('channel ' + channel + ' +1= ' + (channel+1)); + + stopSamplerBlink(channel, control); + TimersPioneerDDJ400[channel][control] = engine.beginTimer(250, function() { + val = 0x7f - val; + + // blink the appropriate pad + midi.sendShortMsg(channel, control, val); + // also blink the pad while SHIFT is pressed + midi.sendShortMsg((channel+1), control, val); + + var isPlaying = engine.getValue(group, 'play') === 1; + + if (!isPlaying) { + // kill timer + stopSamplerBlink(channel, control); + // set the pad LED to ON + midi.sendShortMsg(channel, control, 0x7f); + // set the pad LED to ON while SHIFT is pressed + midi.sendShortMsg((channel+1), control, 0x7f); + } + }); +} + +function stopSamplerBlink(channel, control) { + TimersPioneerDDJ400[channel] = TimersPioneerDDJ400[channel] || {}; + + if (TimersPioneerDDJ400[channel][control] !== undefined) { + engine.stopTimer(TimersPioneerDDJ400[channel][control]); + TimersPioneerDDJ400[channel][control] = undefined; + } +} + +PioneerDDJ400.shutdown = function() { + // reset vumeter + PioneerDDJ400.toggleLight(LightsPioneerDDJ400.deck1.vuMeter, false); + PioneerDDJ400.toggleLight(LightsPioneerDDJ400.deck2.vuMeter, false); + + // housekeeping + // turn off all Sampler LEDs + for (var i = 0; i <= 7; ++i) { + midi.sendShortMsg(0x97, 0x30 + i, 0x00); // Deck 1 pads + midi.sendShortMsg(0x98, 0x30 + i, 0x00); // Deck 1 pads with SHIFT + midi.sendShortMsg(0x99, 0x30 + i, 0x00); // Deck 2 pads + midi.sendShortMsg(0x9A, 0x30 + i, 0x00); // Deck 2 pads with SHIFT + } + // turn off all Hotcue LEDs + for (i = 0; i <= 7; ++i) { + midi.sendShortMsg(0x97, 0x00 + i, 0x00); // Deck 1 pads + midi.sendShortMsg(0x98, 0x00 + i, 0x00); // Deck 1 pads with SHIFT + midi.sendShortMsg(0x99, 0x00 + i, 0x00); // Deck 2 pads + midi.sendShortMsg(0x9A, 0x00 + i, 0x00); // Deck 2 pads with SHIFT + } +}; diff --git a/res/controllers/Pioneer-DDJ-400.midi.xml b/res/controllers/Pioneer-DDJ-400.midi.xml new file mode 100644 index 000000000000..6d4a9ac74ba2 --- /dev/null +++ b/res/controllers/Pioneer-DDJ-400.midi.xml @@ -0,0 +1,5140 @@ + + + + Pioneer DDJ-400 + Warker/nschloe DEV + Midi Mapping for the Pioneer DDJ-400 + https://www.mixxx.org/wiki/doku.php/pioneer_ddj-400 + https://www.mixxx.org/forums/viewtopic.php?f=7&t=12113 + + + + + + + + + + + BROWSE - rotate - Scroll tracklist/tree view + [Library] + MoveVertical + 0xB6 + 0x40 + + + + + + BROWSE +SHIFT - rotate - Zoom in/out of enlarged waveforms + [Master] + PioneerDDJ400.waveFormRotate + 0xB6 + 0x64 + + + + + + BROWSE - press - Move cursor between track list and tree view + [Library] + MoveFocusForward + 0x96 + 0x41 + + + + + + BROWSE +SHIFT - press - Move cursor between track list and tree view + [Library] + MoveFocusBackward + 0x96 + 0x42 + + + + + + + LOAD (DECK1) - press - Load a Track into Deck 1 + [Channel1] + LoadSelectedTrack + 0x96 + 0x46 + + + + + + + + + LOAD (DECK2) - press - Load a Track into Deck 2 + [Channel2] + LoadSelectedTrack + 0x96 + 0x47 + + + + + + + + + + + PLAY/PAUSE (DECK1) - press - Play/Pause + [Channel1] + play + 0x90 + 0x0B + + + + + + PLAY/PAUSE +SHIFT (DECK1) - press - Reverse playback in Slip Mode while held (Censor) + [Channel1] + reverseroll + 0x90 + 0x47 + + + + + + PLAY/PAUSE (DECK2) - press - Play/Pause + [Channel2] + play + 0x91 + 0x0B + + + + + + PLAY/PAUSE +SHIFT (DECK2) - press - Reverse playback in Slip Mode while held (Censor) + [Channel2] + reverseroll + 0x91 + 0x47 + + + + + + + CUE (DECK1) - press - Set/Call Cue, Back Cue + [Channel1] + cue_default + 0x90 + 0x0C + + + + + + CUE +SHIFT (DECK1) - press - Jump to track start + [Channel1] + start_play + 0x90 + 0x48 + + + + + + CUE (DECK2) - press - Set/Call Cue, Back Cue + [Channel2] + cue_default + 0x91 + 0x0C + + + + + + CUE +SHIFT (DECK2) - press - Jump to track start + [Channel2] + start_play + 0x91 + 0x48 + + + + + + + JOG DIAL PLATTER Vinyl mode On (DECK1) - rotate - Scratch + [Channel1] + PioneerDDJ400.jogTurn + 0xB0 + 0x22 + + + + + + JOG DIAL PLATTER Vinyl mode Off (DECK1) - rotate - Pitch bend + [Channel1] + PioneerDDJ400.jogTurn + 0xB0 + 0x23 + + + + + + JOG DIAL PLATTER +SHIFT (DECK1) - rotate - Search (Fast Pitch bend) + [Channel1] + PioneerDDJ400.jogSearch + 0xB0 + 0x29 + + + + + + JOG DIAL PLATTER (DECK1) - touch - enabe (on touch) / disable (on release) Scraching/Pitch + bend + + [Channel1] + PioneerDDJ400.jogTouch + 0x90 + 0x36 + + + + + + JOG DIAL PLATTER +SHIFT (DECK1) - touch - enabe (on touch) / disable (on release) highspeed + Pitch bend + + [Channel1] + PioneerDDJ400.jogTouch + 0x90 + 0x67 + + + + + + JOG DIAL SIDE (DECK1) - rotate - Pitch bend + [Channel1] + PioneerDDJ400.jogTurn + 0xB0 + 0x21 + + + + + + + JOG DIAL PLATTER Vinyl mode On (DECK2) - rotate - Scratch + [Channel2] + PioneerDDJ400.jogTurn + 0xB1 + 0x22 + + + + + + JOG DIAL PLATTER Vinyl mode Off (DECK2) - rotate - Pitch bend + [Channel2] + PioneerDDJ400.jogTurn + 0xB1 + 0x23 + + + + + + JOG DIAL PLATTER +SHIFT (DECK2) - rotate - Search (Fast Pitch bend) + [Channel2] + PioneerDDJ400.jogSearch + 0xB1 + 0x29 + + + + + + JOG DIAL PLATTER (DECK2) - touch - enabe (on touch) / disable (on release) Scraching/Pitch + bend + + [Channel2] + PioneerDDJ400.jogTouch + 0x91 + 0x36 + + + + + + JOG DIAL PLATTER +SHIFT (DECK2) - touch - enabe (on touch) / disable (on release) highspeed + Pitch bend + + [Channel2] + PioneerDDJ400.jogTouch + 0x91 + 0x67 + + + + + + JOG DIAL SIDE (DECK2) - rotate - Pitch bend + [Channel2] + PioneerDDJ400.jogTurn + 0xB1 + 0x21 + + + + + + + TEMPO (DECK1) - fader - Tempo control LSB + [Channel1] + PioneerDDJ400.tempoSliderLSB + 0xB0 + 0x20 + + + + + + TEMPO (DECK1) - fader - Tempo control MSB + [Channel1] + PioneerDDJ400.tempoSliderMSB + 0xB0 + 0x00 + + + + + + TEMPO (DECK2) - fader - Tempo control LSB + [Channel2] + PioneerDDJ400.tempoSliderLSB + 0xB1 + 0x20 + + + + + + TEMPO (DECK2) - fader - Tempo control MSB + [Channel2] + PioneerDDJ400.tempoSliderMSB + 0xB1 + 0x00 + + + + + + + BEAT SYNC (DECK1) - press - Beat Sync to Master deck + [Channel1] + sync_enabled + 0x90 + 0x58 + + + + + + BEAT SYNC LONG PRESS (DECK1) - press - Set as Master deck + [Channel1] + sync_master + 0x90 + 0x5C + + + + + + BEAT SYNC +SHIFT (DECK1) - press - change Tempo range + [Channel1] + PioneerDDJ400.cycleTempoRange + 0x90 + 0x60 + + + + + + + BEAT SYNC (DECK2) - press - Beat Sync to Master deck + [Channel2] + sync_enabled + 0x91 + 0x58 + + + + + + BEAT SYNC LONG PRESS (DECK2) - press - Set as Master deck + [Channel2] + sync_master + 0x91 + 0x5C + + + + + + BEAT SYNC +SHIFT (DECK2) - press - change Tempo range + [Channel2] + PioneerDDJ400.cycleTempoRange + 0x91 + 0x60 + + + + + + + LOOP IN/4 BEAT (DECK1) - press - (loop off) set Loop point, (loop on) adjust loop in point + with jog wheel + + [Channel1] + PioneerDDJ400.loopin4beatPressed + 0x90 + 0x10 + + + + + + LOOP IN/4 BEAT LONG PRESS (DECK1) - press - Enable Auto 4 Beat loop + [Channel1] + PioneerDDJ400.loopin4beatPressedLong + 0x90 + 0x14 + + + + + + + LOOP IN/4 BEAT (DECK2) - press - (loop off) set Loop point, (loop on) adjust loop in point + with jog wheel + + [Channel2] + PioneerDDJ400.loopin4beatPressed + 0x91 + 0x10 + + + + + + LOOP IN/4 BEAT LONG PRESS (DECK2) - press - Enable Auto 4 Beat loop + [Channel2] + PioneerDDJ400.loopin4beatPressedLong + 0x91 + 0x14 + + + + + + + LOOP OUT (DECK1) - press - (loop off) set Loop out point, (loop on) adjust loop out point + with jog wheel + + [Channel1] + PioneerDDJ400.loopoutPressed + 0x90 + 0x11 + + + + + + LOOP OUT (DECK2) - press - (loop off) set Loop out point, (loop on) adjust loop out point + with jog wheel + + [Channel2] + PioneerDDJ400.loopoutPressed + 0x91 + 0x11 + + + + + + + RELOOP/EXIT (DECK1) - press - (loop off) Reloop, (loop on) Loop exit + [Channel1] + reloop_toggle + 0x90 + 0x4D + + + + + + RELOOP/EXIT +SHIFT (DECK1) - press - Reloop and stop + [Channel1] + reloop_andstop + 0x90 + 0x50 + + + + + + + RELOOP/EXIT (DECK2) - press - (loop off) Reloop, (loop on) Loop exit + [Channel2] + reloop_toggle + 0x91 + 0x4D + + + + + + RELOOP/EXIT +SHIFT (DECK2) - press - Reloop and stop + [Channel2] + reloop_andstop + 0x91 + 0x50 + + + + + + + CUE/LOOP CALL LEFT (DECK1) - press - (loop off) Call stored cue/loop, (loop on) Loop cutter + *2 (half) + + [Channel1] + PioneerDDJ400.cueLoopCallLeft + 0x90 + 0x51 + + + + + + + + CUE/LOOP CALL LEFT (DECK2) - press - (loop off) Call stored cue/loop, (loop on) Loop cutter + *2 (half) + + [Channel2] + PioneerDDJ400.cueLoopCallLeft + 0x91 + 0x51 + + + + + + + + CUE/LOOP CALL RIGHT (DECK1) - press - (loop off) Call stored cue/loop, (loop on) Loop + double + + [Channel1] + PioneerDDJ400.cueLoopCallRight + 0x90 + 0x53 + + + + + + + + CUE/LOOP CALL RIGHT (DECK2) - press - (loop off) Call stored cue/loop, (loop on) Loop + double + + [Channel2] + PioneerDDJ400.cueLoopCallRight + 0x91 + 0x53 + + + + + + + + SHIFT (Deck1) - press - Shift + [Channel1] + PioneerDDJ400.shiftPressed + 0x90 + 0x3F + + + + + + SHIFT (Deck2) - press - Shift + [Channel2] + PioneerDDJ400.shiftPressed + 0x91 + 0x3F + + + + + + + + + + + CROSSFADER - slider + [Master] + crossfader + 0xB6 + 0x1F + + + + + + CROSSFADER - slider + [Master] + crossfader + 0xB6 + 0x3F + + + + + + + CHANNELFADER - slider + [Channel1] + volume + 0xB0 + 0x33 + + + + + + CHANNELFADER - slider + [Channel1] + volume + 0xB0 + 0x13 + + + + + + CHANNELFADER - slider + [Channel2] + volume + 0xB1 + 0x33 + + + + + + CHANNELFADER - slider + [Channel2] + volume + 0xB1 + 0x13 + + + + + + + TRIM - rotate + [Channel1] + pregain + 0xB0 + 0x24 + + + + + + TRIM - rotate + [Channel1] + pregain + 0xB0 + 0x04 + + + + + + TRIM - rotate + [Channel2] + pregain + 0xB1 + 0x24 + + + + + + TRIM - rotate + [Channel2] + pregain + 0xB1 + 0x04 + + + + + + + + EQ HI - rotate + [EqualizerRack1_[Channel1]_Effect1] + parameter3 + 0xB0 + 0x27 + + + + + + EQ MID - rotate + [EqualizerRack1_[Channel1]_Effect1] + parameter2 + 0xB0 + 0x2B + + + + + + EQ LOW - rotate + [EqualizerRack1_[Channel1]_Effect1] + parameter1 + 0xB0 + 0x2F + + + + + + EQ HI - rotate + [EqualizerRack1_[Channel1]_Effect1] + parameter3 + 0xB0 + 0x07 + + + + + + EQ MID - rotate + [EqualizerRack1_[Channel1]_Effect1] + parameter2 + 0xB0 + 0x0B + + + + + + EQ LOW - rotate + [EqualizerRack1_[Channel1]_Effect1] + parameter1 + 0xB0 + 0x0F + + + + + + + EQ HI - rotate + [EqualizerRack1_[Channel2]_Effect1] + parameter3 + 0xB1 + 0x27 + + + + + + EQ MID - rotate + [EqualizerRack1_[Channel2]_Effect1] + parameter2 + 0xB1 + 0x2B + + + + + + EQ LOW - rotate + [EqualizerRack1_[Channel2]_Effect1] + parameter1 + 0xB1 + 0x2F + + + + + + EQ HI - rotate + [EqualizerRack1_[Channel2]_Effect1] + parameter3 + 0xB1 + 0x07 + + + + + + EQ MID - rotate + [EqualizerRack1_[Channel2]_Effect1] + parameter2 + 0xB1 + 0x0B + + + + + + EQ LOW - rotate + [EqualizerRack1_[Channel2]_Effect1] + parameter1 + 0xB1 + 0x0F + + + + + + + CUE Channel - press - toggle Headphone Cue + [Channel1] + pfl + 0x90 + 0x54 + + + + + + CUE Channel - press - toggle Headphone Cue + [Channel2] + pfl + 0x91 + 0x54 + + + + + + + CUE Channel +SHIFT - press - Adjust BPM to match tapped BPM + [Channel1] + bpm_tap + 0x90 + 0x68 + + + + + + CUE Channel +SHIFT - press - Adjust BPM to match tapped BPM + [Channel2] + bpm_tap + 0x91 + 0x68 + + + + + + + MASTER LEVEL - rotate - Master gain + [Master] + gain + 0xB6 + 0x28 + + + + + + MASTER LEVEL - rotate - Master gain + [Master] + gain + 0xB6 + 0x08 + + + + + + + HEADPHONES MIXING - rotate - Monitor Balance + [Master] + headMix + 0xB6 + 0x2C + + + + + + HEADPHONES MIXING - rotate - Monitor Balance + [Master] + headMix + 0xB6 + 0x0C + + + + + + + HEADPHONES LEVEL - rotate - Headphone gain + [Master] + headGain + 0xB6 + 0x2D + + + + + + HEADPHONES LEVEL - rotate - Headphone gain + [Master] + headGain + 0xB6 + 0x0D + + + + + + + + + + + FILTER CH1 - rotate - Filter Effect Knob + [QuickEffectRack1_[Channel1]] + super1 + 0xB6 + 0x17 + + + + + + FILTER CH1 - rotate - Filter Effect Knob + [QuickEffectRack1_[Channel1]] + super1 + 0xB6 + 0x37 + + + + + + FILTER CH2 - rotate - Filter Effect Knob + [QuickEffectRack1_[Channel2]] + super1 + 0xB6 + 0x18 + + + + + + FILTER CH2 - rotate - Filter Effect Knob + [QuickEffectRack1_[Channel2]] + super1 + 0xB6 + 0x38 + + + + + + + + + BEAT LEFT - press - select the FX Slot to the left + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxLeftPressed + 0x94 + 0x4A + + + + + + + BEAT RIGHT - press - select the FX Slot to the right + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxRightPressed + 0x94 + 0x4B + + + + + + + + BEAT FX SELECT - press - next FX in the selected Slot + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxSelectPressed + 0x94 + 0x63 + + + + + + BEAT FX SELECT +SHIFT - press - prev FX in the selected Slot + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxSelectShiftPressed + 0x94 + 0x64 + + + + + + + + BEAT FX CH SELECT CH1 - slide - Select FX on DECK 1 + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxChannel + 0x94 + 0x10 + + + + + + BEAT FX CH SELECT CH2 - slide - Select FX on DECK 2 + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxChannel + 0x94 + 0x11 + + + + + + BEAT FX CH SELECT MASTER - slide - Select FX on Master + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxChannel + 0x94 + 0x14 + + + + + + + BEAT FX LEVEL/DEPTH - rotate (MSB) - Adjust FX Level (mix) and BEAT FX Depth (meta) in the + selected slot + + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxLevelDepthRotate + 0xB4 + 0x02 + + + + + + + BEAT FX ON/OFF - press - Toggle FX in the selected Slot + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxOnOffPressed + 0x94 + 0x47 + + + + + + BEAT FX ON/OFF +SHIFT - press - Disable all enabled Beat FX Slots + [EffectRack1_EffectUnit1] + PioneerDDJ400.beatFxOnOffShiftPressed + 0x94 + 0x43 + + + + + + + + + + + + + PAD 1 (DECK1) HOT CUE MODE - press - set hotcue + [Channel1] + hotcue_1_activate + 0x97 + 0x00 + + + + + + PAD 1 +SHIFT (DECK1) HOT CUE MODE - press - delete hotcue + [Channel1] + hotcue_1_clear + 0x98 + 0x00 + + + + + + PAD 1 (DECK2) HOT CUE MODE - press - set hotcue + [Channel2] + hotcue_1_activate + 0x99 + 0x00 + + + + + + PAD 1 +SHIFT (DECK2) HOT CUE MODE - press - delete hotcue + [Channel2] + hotcue_1_clear + 0x9A + 0x00 + + + + + + PAD 2 (DECK1) HOT CUE MODE - press - set hotcue + [Channel1] + hotcue_2_activate + 0x97 + 0x01 + + + + + + PAD 2 +SHIFT (DECK1) HOT CUE MODE - press - delete hotcue + [Channel1] + hotcue_2_clear + 0x98 + 0x01 + + + + + + PAD 2 (DECK2) HOT CUE MODE - press - set hotcue + [Channel2] + hotcue_2_activate + 0x99 + 0x01 + + + + + + PAD 2 +SHIFT (DECK2) HOT CUE MODE - press - delete hotcue + [Channel2] + hotcue_2_clear + 0x9A + 0x01 + + + + + + PAD 3 (DECK1) HOT CUE MODE - press - set hotcue + [Channel1] + hotcue_3_activate + 0x97 + 0x02 + + + + + + PAD 3 +SHIFT (DECK1) HOT CUE MODE - press - delete hotcue + [Channel1] + hotcue_3_clear + 0x98 + 0x02 + + + + + + PAD 3 (DECK2) HOT CUE MODE - press - set hotcue + [Channel2] + hotcue_3_activate + 0x99 + 0x02 + + + + + + PAD 3 +SHIFT (DECK2) HOT CUE MODE - press - delete hotcue + [Channel2] + hotcue_3_clear + 0x9A + 0x02 + + + + + + PAD 4 (DECK1) HOT CUE MODE - press - set hotcue + [Channel1] + hotcue_4_activate + 0x97 + 0x03 + + + + + + PAD 4 +SHIFT (DECK1) HOT CUE MODE - press - delete hotcue + [Channel1] + hotcue_4_clear + 0x98 + 0x03 + + + + + + PAD 4 (DECK2) HOT CUE MODE - press - set hotcue + [Channel2] + hotcue_4_activate + 0x99 + 0x03 + + + + + + PAD 4 +SHIFT (DECK2) HOT CUE MODE - press - delete hotcue + [Channel2] + hotcue_4_clear + 0x9A + 0x03 + + + + + + PAD 5(DECK1) HOT CUE MODE - press - set hotcue + [Channel1] + hotcue_5_activate + 0x97 + 0x04 + + + + + + PAD 5 +SHIFT (DECK1) HOT CUE MODE - press - delete hotcue + [Channel1] + hotcue_5_clear + 0x98 + 0x04 + + + + + + PAD 5 (DECK2) HOT CUE MODE - press - set hotcue + [Channel2] + hotcue_5_activate + 0x99 + 0x04 + + + + + + PAD 5 +SHIFT (DECK2) HOT CUE MODE - press - delete hotcue + [Channel2] + hotcue_5_clear + 0x9A + 0x04 + + + + + + PAD 6 (DECK1) HOT CUE MODE - press - set hotcue + [Channel1] + hotcue_6_activate + 0x97 + 0x05 + + + + + + PAD 6 +SHIFT (DECK1) HOT CUE MODE - press - delete hotcue + [Channel1] + hotcue_6_clear + 0x98 + 0x05 + + + + + + PAD 6 (DECK2) HOT CUE MODE - press - set hotcue + [Channel2] + hotcue_6_activate + 0x99 + 0x05 + + + + + + PAD 6 +SHIFT (DECK2) HOT CUE MODE - press - delete hotcue + [Channel2] + hotcue_6_clear + 0x9A + 0x05 + + + + + + PAD 7 (DECK1) HOT CUE MODE - press - set hotcue + [Channel1] + hotcue_7_activate + 0x97 + 0x06 + + + + + + PAD 7 +SHIFT (DECK1) HOT CUE MODE - press - delete hotcue + [Channel1] + hotcue_7_clear + 0x98 + 0x06 + + + + + + PAD 7 (DECK2) HOT CUE MODE - press - set hotcue + [Channel2] + hotcue_7_activate + 0x99 + 0x06 + + + + + + PAD 7 +SHIFT (DECK2) HOT CUE MODE - press - delete hotcue + [Channel2] + hotcue_7_clear + 0x9A + 0x06 + + + + + + PAD 8 (DECK1) HOT CUE MODE - press - set hotcue + [Channel1] + hotcue_8_activate + 0x97 + 0x07 + + + + + + PAD 8 +SHIFT (DECK1) HOT CUE MODE - press - delete hotcue + [Channel1] + hotcue_8_clear + 0x98 + 0x07 + + + + + + PAD 8 (DECK2) HOT CUE MODE - press - set hotcue + [Channel2] + hotcue_8_activate + 0x99 + 0x07 + + + + + + PAD 8 +SHIFT (DECK2) HOT CUE MODE - press - delete hotcue + [Channel2] + hotcue_8_clear + 0x9A + 0x07 + + + + + + + + + + PAD 1 (DECK1) BEAT LOOP MODE - press - 1/4 Beatloop + [Channel1] + beatloop_0.25_toggle + 0x97 + 0x60 + + + + + + PAD 1 (DECK2) BEAT LOOP MODE - press - 1/4 Beatloop + [Channel2] + beatloop_0.25_toggle + 0x99 + 0x60 + + + + + + PAD 2 (DECK1) BEAT LOOP MODE - press - 1/2 Beatloop + [Channel1] + beatloop_0.5_toggle + 0x97 + 0x61 + + + + + + PAD 2 (DECK2) BEAT LOOP MODE - press - 1/2 Beatloop + [Channel2] + beatloop_0.5_toggle + 0x99 + 0x61 + + + + + + PAD 3 (DECK1) BEAT LOOP MODE - press - 1/1 Beatloop + [Channel1] + beatloop_1_toggle + 0x97 + 0x62 + + + + + + PAD 3 (DECK2) BEAT LOOP MODE - press - 1/1 Beatloop + [Channel2] + beatloop_1_toggle + 0x99 + 0x62 + + + + + + PAD 4 (DECK1) BEAT LOOP MODE - press - 2 Beatloop + [Channel1] + beatloop_2_toggle + 0x97 + 0x63 + + + + + + PAD 4 (DECK2) BEAT LOOP MODE - press - 2 Beatloop + [Channel2] + beatloop_2_toggle + 0x99 + 0x63 + + + + + + PAD 5 (DECK1) BEAT LOOP MODE - press - 4 Beatloop + [Channel1] + beatloop_4_toggle + 0x97 + 0x64 + + + + + + PAD 5 (DECK2) BEAT LOOP MODE - press - 4 Beatloop + [Channel2] + beatloop_4_toggle + 0x99 + 0x64 + + + + + + PAD 6 (DECK1) BEAT LOOP MODE - press - 8 Beatloop + [Channel1] + beatloop_8_toggle + 0x97 + 0x65 + + + + + + PAD 6 (DECK2) BEAT LOOP MODE - press - 8 Beatloop + [Channel2] + beatloop_8_toggle + 0x99 + 0x65 + + + + + + PAD 7 (DECK1) BEAT LOOP MODE - press - 16 Beatloop + [Channel1] + beatloop_16_toggle + 0x97 + 0x66 + + + + + + PAD 7 (DECK2) BEAT LOOP MODE - press - 16 Beatloop + [Channel2] + beatloop_16_toggle + 0x99 + 0x66 + + + + + + PAD 8 (DECK1) BEAT LOOP MODE - press - 32 Beatloop + [Channel1] + beatloop_32_toggle + 0x97 + 0x67 + + + + + + PAD 8 (DECK2) BEAT LOOP MODE - press - 32 Beatloop + [Channel2] + beatloop_32_toggle + 0x99 + 0x67 + + + + + + + + + + + + [Channel1] + beatjump_1_backward + 0x97 + 0x20 + + + + + + [Channel1] + beatjump_1_forward + 0x97 + 0x21 + + + + + + [Channel1] + beatjump_2_backward + 0x97 + 0x22 + + + + + + [Channel1] + beatjump_2_forward + 0x97 + 0x23 + + + + + + [Channel1] + beatjump_4_backward + 0x97 + 0x24 + + + + + + [Channel1] + beatjump_4_forward + 0x97 + 0x25 + + + + + + [Channel1] + beatjump_8_backward + 0x97 + 0x26 + + + + + + [Channel1] + beatjump_8_forward + 0x97 + 0x27 + + + + + + + [Channel2] + beatjump_1_backward + 0x99 + 0x20 + + + + + + [Channel2] + beatjump_1_forward + 0x99 + 0x21 + + + + + + [Channel2] + beatjump_2_backward + 0x99 + 0x22 + + + + + + [Channel2] + beatjump_2_forward + 0x99 + 0x23 + + + + + + [Channel2] + beatjump_4_backward + 0x99 + 0x24 + + + + + + [Channel2] + beatjump_4_forward + 0x99 + 0x25 + + + + + + [Channel2] + beatjump_8_backward + 0x99 + 0x26 + + + + + + [Channel2] + beatjump_8_forward + 0x99 + 0x27 + + + + + + + + + + + + + PAD 1 (LEFT) SAMPLE MODE - press - Play Sample + [Sampler1] + PioneerDDJ400.samplerModePadPressed + 0x97 + 0x30 + + + + + + PAD 1 (LEFT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler1] + PioneerDDJ400.samplerModeShiftPadPressed + 0x98 + 0x30 + + + + + + PAD 2 (LEFT) SAMPLE MODE - press - Play Sample + [Sampler2] + PioneerDDJ400.samplerModePadPressed + 0x97 + 0x31 + + + + + + PAD 2 (LEFT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler2] + PioneerDDJ400.samplerModeShiftPadPressed + 0x98 + 0x31 + + + + + + PAD 3 (LEFT) SAMPLE MODE - press - Play Sample + [Sampler3] + PioneerDDJ400.samplerModePadPressed + 0x97 + 0x32 + + + + + + PAD 3 (LEFT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler3] + PioneerDDJ400.samplerModeShiftPadPressed + 0x98 + 0x32 + + + + + + PAD 4 (LEFT) SAMPLE MODE - press - Play Sample + [Sampler4] + PioneerDDJ400.samplerModePadPressed + 0x97 + 0x33 + + + + + + PAD 4 (LEFT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler4] + PioneerDDJ400.samplerModeShiftPadPressed + 0x98 + 0x33 + + + + + + PAD 5 (LEFT) SAMPLE MODE - press - Play Sample + [Sampler5] + PioneerDDJ400.samplerModePadPressed + 0x97 + 0x34 + + + + + + PAD 5 (LEFT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler5] + PioneerDDJ400.samplerModeShiftPadPressed + 0x98 + 0x34 + + + + + + PAD 6 (LEFT) SAMPLE MODE - press - Play Sample + [Sampler6] + PioneerDDJ400.samplerModePadPressed + 0x97 + 0x35 + + + + + + PAD 6 (LEFT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler6] + PioneerDDJ400.samplerModeShiftPadPressed + 0x98 + 0x35 + + + + + + PAD 7 (LEFT) SAMPLE MODE - press - Play Sample + [Sampler7] + PioneerDDJ400.samplerModePadPressed + 0x97 + 0x36 + + + + + + PAD 7 (LEFT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler7] + PioneerDDJ400.samplerModeShiftPadPressed + 0x98 + 0x36 + + + + + + PAD 8 (LEFT) SAMPLE MODE - press - Play Sample + [Sampler8] + PioneerDDJ400.samplerModePadPressed + 0x97 + 0x37 + + + + + + PAD 8 (LEFT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler8] + PioneerDDJ400.samplerModeShiftPadPressed + 0x98 + 0x37 + + + + + + + + PAD 1 (RIGHT) SAMPLE MODE - press - Play Sample + [Sampler9] + PioneerDDJ400.samplerModePadPressed + 0x99 + 0x30 + + + + + + PAD 1 (RIGHT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler9] + PioneerDDJ400.samplerModeShiftPadPressed + 0x9A + 0x30 + + + + + + PAD 2 (RIGHT) SAMPLE MODE - press - Play Sample + [Sampler10] + PioneerDDJ400.samplerModePadPressed + 0x99 + 0x31 + + + + + + PAD 2 (RIGHT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler10] + PioneerDDJ400.samplerModeShiftPadPressed + 0x9A + 0x31 + + + + + + PAD 3 (RIGHT) SAMPLE MODE - press - Play Sample + [Sampler11] + PioneerDDJ400.samplerModePadPressed + 0x99 + 0x32 + + + + + + PAD 3 (RIGHT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler11] + PioneerDDJ400.samplerModeShiftPadPressed + 0x9A + 0x32 + + + + + + PAD 4 (RIGHT) SAMPLE MODE - press - Play Sample + [Sampler12] + PioneerDDJ400.samplerModePadPressed + 0x99 + 0x33 + + + + + + PAD 4 (RIGHT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler12] + PioneerDDJ400.samplerModeShiftPadPressed + 0x9A + 0x33 + + + + + + PAD 5 (RIGHT) SAMPLE MODE - press - Play Sample + [Sampler13] + PioneerDDJ400.samplerModePadPressed + 0x99 + 0x34 + + + + + + PAD 5 (RIGHT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler13] + PioneerDDJ400.samplerModeShiftPadPressed + 0x9A + 0x34 + + + + + + PAD 6 (RIGHT) SAMPLE MODE - press - Play Sample + [Sampler14] + PioneerDDJ400.samplerModePadPressed + 0x99 + 0x35 + + + + + + PAD 6 (RIGHT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler14] + PioneerDDJ400.samplerModeShiftPadPressed + 0x9A + 0x35 + + + + + + PAD 7 (RIGHT) SAMPLE MODE - press - Play Sample + [Sampler15] + PioneerDDJ400.samplerModePadPressed + 0x99 + 0x36 + + + + + + PAD 7 (RIGHT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler15] + PioneerDDJ400.samplerModeShiftPadPressed + 0x9A + 0x36 + + + + + + PAD 8 (RIGHT) SAMPLE MODE - press - Play Sample + [Sampler16] + PioneerDDJ400.samplerModePadPressed + 0x99 + 0x37 + + + + + + PAD 8 (RIGHT)+SHIFT SAMPLE MODE - press - Stop Sample or Load Selected Track into Sampler + Pad + + [Sampler16] + PioneerDDJ400.samplerModeShiftPadPressed + 0x9A + 0x37 + + + + + + + + + + HOT CUE (DECK1) +Shift - press - activate Keyboard mode + [Channel1] + PioneerDDJ400.keyboardMode + 0x90 + 0x69 + + + + + + HOT CUE (DECK2) +Shift - press - activate Keyboard mode + [Channel2] + PioneerDDJ400.keyboardMode + 0x91 + 0x69 + + + + + + + PAD 1 (DECK1) KEYBOARD MODE - press - +4 Halftone + [Channel1] + PioneerDDJ400.keyboardModePad + 0x97 + 0x40 + + + + + + PAD 1 (DECK1) +Shift KEYBOARD MODE - press - unset hotcue + [Channel1] + PioneerDDJ400.keyboardMode + 0x98 + 0x40 + + + + + + PAD 1 (DECK2) KEYBOARD MODE - press - +4 Halftone + [Channel2] + PioneerDDJ400.keyboardModePad + 0x99 + 0x40 + + + + + + PAD 1 (DECK2) +Shift KEYBOARD MODE - press - unset hotcue + [Channel2] + PioneerDDJ400.keyboardMode + 0x9A + 0x40 + + + + + + + PAD 2 (DECK1) KEYBOARD MODE - press - +5 Halftone + [Channel1] + PioneerDDJ400.keyboardModePad + 0x97 + 0x41 + + + + + + PAD 2 (DECK1) +Shift KEYBOARD MODE - press - unset hotcue + [Channel1] + PioneerDDJ400.keyboardMode + 0x98 + 0x41 + + + + + + PAD 2 (DECK2) KEYBOARD MODE - press - +5 Halftone + [Channel2] + PioneerDDJ400.keyboardModePad + 0x99 + 0x41 + + + + + + PAD 2 (DECK2) +Shift KEYBOARD MODE - press - unset hotcue + [Channel2] + PioneerDDJ400.keyboardMode + 0x9A + 0x41 + + + + + + + PAD 3 (DECK1) KEYBOARD MODE - press - +6 Halftone + [Channel1] + PioneerDDJ400.keyboardModePad + 0x97 + 0x42 + + + + + + PAD 3 (DECK1) +Shift KEYBOARD MODE - press - unset hotcue + [Channel1] + PioneerDDJ400.keyboardMode + 0x98 + 0x42 + + + + + + PAD 3 (DECK2) KEYBOARD MODE - press - +6 Halftone + [Channel2] + PioneerDDJ400.keyboardModePad + 0x99 + 0x42 + + + + + + PAD 3 (DECK2) +Shift KEYBOARD MODE - press - unset hotcue + [Channel2] + PioneerDDJ400.keyboardMode + 0x9A + 0x42 + + + + + + + PAD 4 (DECK1) KEYBOARD MODE - press - +7 Halftone + [Channel1] + PioneerDDJ400.keyboardModePad + 0x97 + 0x43 + + + + + + PAD 4 (DECK1) +Shift KEYBOARD MODE - press - unset hotcue + [Channel1] + PioneerDDJ400.keyboardMode + 0x98 + 0x43 + + + + + + PAD 4 (DECK2) KEYBOARD MODE - press - +7 Halftone + [Channel2] + PioneerDDJ400.keyboardModePad + 0x99 + 0x43 + + + + + + PAD 4 (DECK2) +Shift KEYBOARD MODE - press - unset hotcue + [Channel2] + PioneerDDJ400.keyboardMode + 0x9A + 0x43 + + + + + + + PAD 5 (DECK1) KEYBOARD MODE - press - +0 Halftone + [Channel1] + PioneerDDJ400.keyboardModePad + 0x97 + 0x44 + + + + + + PAD 5 (DECK1) +Shift KEYBOARD MODE - press - unset hotcue + [Channel1] + PioneerDDJ400.keyboardMode + 0x98 + 0x44 + + + + + + PAD 5 (DECK2) KEYBOARD MODE - press - +0 Halftone + [Channel2] + PioneerDDJ400.keyboardModePad + 0x99 + 0x44 + + + + + + PAD 5 (DECK2) +Shift KEYBOARD MODE - press - unset hotcue + [Channel2] + PioneerDDJ400.keyboardMode + 0x9A + 0x44 + + + + + + + PAD 6 (DECK1) KEYBOARD MODE - press - +1 Halftone + [Channel1] + PioneerDDJ400.keyboardModePad + 0x97 + 0x45 + + + + + + PAD 6 (DECK1) +Shift KEYBOARD MODE - press - unset hotcue + [Channel1] + PioneerDDJ400.keyboardMode + 0x98 + 0x45 + + + + + + PAD 6 (DECK2) KEYBOARD MODE - press - +1 Halftone + [Channel2] + PioneerDDJ400.keyboardModePad + 0x99 + 0x45 + + + + + + PAD 6 (DECK2) +Shift KEYBOARD MODE - press - unset hotcue + [Channel2] + PioneerDDJ400.keyboardMode + 0x9A + 0x45 + + + + + + + PAD 7 (DECK1) KEYBOARD MODE - press - +2 Halftone + [Channel1] + PioneerDDJ400.keyboardModePad + 0x97 + 0x46 + + + + + + PAD 7 (DECK1) +Shift KEYBOARD MODE - press - Halftone up + [Channel1] + pitch_up + 0x98 + 0x46 + + + + + + PAD 7 (DECK2) KEYBOARD MODE - press - +2 Halftone + [Channel2] + PioneerDDJ400.keyboardModePad + 0x99 + 0x46 + + + + + + PAD 7 (DECK2) +Shift KEYBOARD MODE - press - Halftone up + [Channel2] + pitch_up + 0x9A + 0x46 + + + + + + + PAD 8 (DECK1) KEYBOARD MODE - press - +3 Halftone + [Channel1] + PioneerDDJ400.keyboardModePad + 0x97 + 0x47 + + + + + + PAD 8 (DECK1) +Shift KEYBOARD MODE - press - Halftone down + [Channel1] + pitch_down + 0x98 + 0x47 + + + + + + PAD 8 (DECK2) KEYBOARD MODE - press - +3 Halftone + [Channel2] + PioneerDDJ400.keyboardModePad + 0x99 + 0x47 + + + + + + PAD 8 (DECK2) +Shift KEYBOARD MODE - press - Halftone down + [Channel2] + pitch_down + 0x9A + 0x47 + + + + + + + + + + PAD 1 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect1] + enabled + 0x97 + 0x10 + + + + + + PAD 1 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect1] + enabled + 0x99 + 0x10 + + + + + + PAD 2 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect2] + enabled + 0x97 + 0x11 + + + + + + PAD 2 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect2] + enabled + 0x99 + 0x11 + + + + + + PAD 3 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect3] + enabled + 0x97 + 0x12 + + + + + + PAD 3 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect3] + enabled + 0x99 + 0x12 + + + + + + PAD 4 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect4] + enabled + 0x97 + 0x13 + + + + + + PAD 4 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect4] + enabled + 0x99 + 0x13 + + + + + + PAD 5 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect5] + PioneerDDJ400.padFxBelowPressed + 0x97 + 0x14 + + + + + + PAD 5 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect5] + PioneerDDJ400.padFxBelowPressed + 0x99 + 0x14 + + + + + + PAD 6 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect6] + PioneerDDJ400.padFxBelowPressed + 0x97 + 0x15 + + + + + + PAD 6 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect6] + PioneerDDJ400.padFxBelowPressed + 0x99 + 0x15 + + + + + + PAD 7 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect7] + PioneerDDJ400.padFxBelowPressed + 0x97 + 0x16 + + + + + + PAD 7 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect7] + PioneerDDJ400.padFxBelowPressed + 0x99 + 0x16 + + + + + + PAD 8 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect8] + PioneerDDJ400.padFxBelowPressed + 0x97 + 0x17 + + + + + + PAD 8 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect8] + PioneerDDJ400.padFxBelowPressed + 0x99 + 0x17 + + + + + + + + + PAD 5 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect5] + PioneerDDJ400.padFxShiftBelowPressed + 0x98 + 0x14 + + + + + + PAD 5 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect5] + PioneerDDJ400.padFxShiftBelowPressed + 0x9A + 0x14 + + + + + + PAD 6 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect6] + PioneerDDJ400.padFxShiftBelowPressed + 0x98 + 0x15 + + + + + + PAD 6 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect6] + PioneerDDJ400.padFxShiftBelowPressed + 0x9A + 0x15 + + + + + + PAD 7 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect7] + PioneerDDJ400.padFxShiftBelowPressed + 0x98 + 0x16 + + + + + + PAD 7 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect7] + PioneerDDJ400.padFxShiftBelowPressed + 0x9A + 0x16 + + + + + + PAD 8 (DECK1) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit1_Effect8] + PioneerDDJ400.padFxShiftBelowPressed + 0x98 + 0x17 + + + + + + PAD 8 (DECK2) PAD FX 1 MODE - press - Effect + [EffectRack1_EffectUnit2_Effect8] + PioneerDDJ400.padFxShiftBelowPressed + 0x9A + 0x17 + + + + + + + + + + PAD 1 (DECK1) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit1_Effect1] + enabled + 0x97 + 0x50 + + + + + + PAD 1 (DECK2) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit2_Effect1] + enabled + 0x99 + 0x50 + + + + + + PAD 2 (DECK1) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit1_Effect2] + enabled + 0x97 + 0x51 + + + + + + PAD 2 (DECK2) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit2_Effect2] + enabled + 0x99 + 0x51 + + + + + + PAD 3 (DECK1) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit1_Effect3] + enabled + 0x97 + 0x52 + + + + + + PAD 3 (DECK2) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit2_Effect3] + enabled + 0x99 + 0x52 + + + + + + PAD 4 (DECK1) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit1_Effect4] + enabled + 0x97 + 0x53 + + + + + + PAD 4 (DECK2) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit2_Effect4] + enabled + 0x99 + 0x53 + + + + + + PAD 5 (DECK1) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit1_Effect5] + enabled + 0x97 + 0x54 + + + + + + PAD 5 (DECK2) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit2_Effect5] + enabled + 0x99 + 0x54 + + + + + + PAD 6 (DECK1) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit1_Effect6] + enabled + 0x97 + 0x55 + + + + + + PAD 6 (DECK2) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit2_Effect6] + enabled + 0x99 + 0x55 + + + + + + PAD 7 (DECK1) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit1_Effect7] + enabled + 0x97 + 0x56 + + + + + + PAD 7 (DECK2) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit2_Effect7] + enabled + 0x99 + 0x56 + + + + + + PAD 8 (DECK1) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit1_Effect8] + enabled + 0x97 + 0x57 + + + + + + PAD 8 (DECK2) PAD FX 2 MODE - press - Effect + [EffectRack2_EffectUnit2_Effect8] + enabled + 0x99 + 0x57 + + + + + + + + + + PAD 1 (DECK1) KEYSHIFT MODE - press - permanent halftone +4 + [Channel1] + PioneerDDJ400.keyshiftModePad + 0x97 + 0x70 + + + + + + PAD 2 (DECK1) KEYSHIFT MODE - press - permanent halftone +5 + [Channel1] + PioneerDDJ400.keyshiftModePad + 0x97 + 0x71 + + + + + + PAD 3 (DECK1) KEYSHIFT MODE - press - permanent halftone +6 + [Channel1] + PioneerDDJ400.keyshiftModePad + 0x97 + 0x72 + + + + + + PAD 4 (DECK1) KEYSHIFT MODE - press - permanent halftone +7 + [Channel1] + PioneerDDJ400.keyshiftModePad + 0x97 + 0x73 + + + + + + PAD 5 (DECK1) KEYSHIFT MODE - press - permanent halftone 0 + [Channel1] + PioneerDDJ400.keyshiftModePad + 0x97 + 0x74 + + + + + + PAD 6 (DECK1) KEYSHIFT MODE - press - permanent halftone +1 + [Channel1] + PioneerDDJ400.keyshiftModePad + 0x97 + 0x75 + + + + + + PAD 7 (DECK1) KEYSHIFT MODE - press - permanent halftone +2 + [Channel1] + PioneerDDJ400.keyshiftModePad + 0x97 + 0x76 + + + + + + PAD 7 (DECK1) +SHIFT KEYSHIFT MODE - press - permanent halftone up + [Channel1] + pitch_up + 0x98 + 0x76 + + + + + + PAD 8 (DECK1) KEYSHIFT MODE - press - permanent halftone +3 + [Channel1] + PioneerDDJ400.keyshiftModePad + 0x97 + 0x77 + + + + + + PAD 8 (DECK1) +SHIFT KEYSHIFT MODE - press - permanent halftone down + [Channel1] + pitch_down + 0x98 + 0x77 + + + + + + + + PAD 1 (DECK2) KEYSHIFT MODE - press - permanent halftone +4 + [Channel2] + PioneerDDJ400.keyshiftModePad + 0x99 + 0x70 + + + + + + PAD 2 (DECK2) KEYSHIFT MODE - press - permanent halftone +5 + [Channel2] + PioneerDDJ400.keyshiftModePad + 0x99 + 0x71 + + + + + + PAD 3 (DECK2) KEYSHIFT MODE - press - permanent halftone +6 + [Channel2] + PioneerDDJ400.keyshiftModePad + 0x99 + 0x72 + + + + + + PAD 4 (DECK2) KEYSHIFT MODE - press - permanent halftone +7 + [Channel2] + PioneerDDJ400.keyshiftModePad + 0x99 + 0x73 + + + + + + PAD 5 (DECK2) KEYSHIFT MODE - press - permanent halftone 0 + [Channel2] + PioneerDDJ400.keyshiftModePad + 0x99 + 0x74 + + + + + + PAD 6 (DECK2) KEYSHIFT MODE - press - permanent halftone +1 + [Channel2] + PioneerDDJ400.keyshiftModePad + 0x99 + 0x75 + + + + + + PAD 7 (DECK2) KEYSHIFT MODE - press - permanent halftone +2 + [Channel2] + PioneerDDJ400.keyshiftModePad + 0x99 + 0x76 + + + + + + PAD 7 (DECK2) +SHIFT KEYSHIFT MODE - press - permanent halftone up + [Channel2] + pitch_up + 0x9A + 0x76 + + + + + + PAD 8 (DECK2) KEYSHIFT MODE - press - permanent halftone +3 + [Channel2] + PioneerDDJ400.keyshiftModePad + 0x99 + 0x77 + + + + + + PAD 8 (DECK2) +SHIFT KEYSHIFT MODE - press - permanent halftone down + [Channel2] + pitch_down + 0x9A + 0x77 + + + + + + + + + + + + + + + [Channel1] + play_indicator + 0x90 + 0x0B + 0x7F + 0.5 + + + [Channel2] + play_indicator + 0x91 + 0x0B + 0x7F + 0.5 + + + [Channel1] + play_indicator + 0x90 + 0x47 + 0x7F + 0.5 + + + [Channel2] + play_indicator + 0x91 + 0x47 + 0x7F + 0.5 + + + + + [Channel1] + cue_indicator + 0x90 + 0x0C + 0x7F + 0.5 + + + [Channel2] + cue_indicator + 0x91 + 0x0C + 0x7F + 0.5 + + + + + [Channel1] + cue_indicator + 0x90 + 0x47 + 0x7F + 0.5 + + + [Channel2] + cue_indicator + 0x91 + 0x47 + 0x7F + 0.5 + + + + + [Channel1] + sync_enabled + 0x90 + 0x58 + 0x7F + 0.5 + + + [Channel2] + sync_enabled + 0x91 + 0x58 + 0x7F + 0.5 + + + [Channel1] + sync_master + 0x90 + 0x60 + 0x7F + 0.5 + + + [Channel2] + sync_master + 0x91 + 0x60 + 0x7F + 0.5 + + + + + [Channel1] + loop_in + 0x90 + 0x10 + 0x7F + 0.5 + + + [Channel2] + loop_in + 0x91 + 0x10 + 0x7F + 0.5 + + + + + [Channel1] + loop_in + 0x90 + 0x4C + 0x7F + 0.5 + + + [Channel2] + loop_in + 0x91 + 0x4C + 0x7F + 0.5 + + + + + [Channel1] + loop_out + 0x90 + 0x11 + 0x7F + 0.5 + + + [Channel2] + loop_out + 0x91 + 0x11 + 0x7F + 0.5 + + + + + [Channel1] + loop_in + 0x90 + 0x4E + 0x7F + 0.5 + + + [Channel2] + loop_in + 0x91 + 0x4E + 0x7F + 0.5 + + + + + [Channel1] + loop_start_position + 0x90 + 0x4D + 0x7F + 0.5 + + + [Channel1] + loop_enabled + 0x90 + 0x4D + 0x7F + 0.5 + + + [Channel2] + loop_start_position + 0x91 + 0x4D + 0x7F + 0.5 + + + [Channel2] + loop_enabled + 0x91 + 0x4D + 0x7F + 0.5 + + + [Channel1] + loop_enabled + 0x90 + 0x50 + 0x7F + 0.5 + + + [Channel2] + loop_enabled + 0x91 + 0x50 + 0x7F + 0.5 + + + + + [Channel1] + pfl + 0x90 + 0x54 + 0x7F + 0.5 + + + [Channel2] + pfl + 0x91 + 0x54 + 0x7F + 0.5 + + + + + [Channel1] + hotcue_1_enabled + 0x97 + 0x00 + 0x7F + 0.5 + + + [Channel2] + hotcue_1_enabled + 0x99 + 0x00 + 0x7F + 0.5 + + + [Channel1] + hotcue_2_enabled + 0x97 + 0x01 + 0x7F + 0.5 + + + [Channel2] + hotcue_2_enabled + 0x99 + 0x01 + 0x7F + 0.5 + + + [Channel1] + hotcue_3_enabled + 0x97 + 0x02 + 0x7F + 0.5 + + + [Channel2] + hotcue_3_enabled + 0x99 + 0x02 + 0x7F + 0.5 + + + [Channel1] + hotcue_4_enabled + 0x97 + 0x03 + 0x7F + 0.5 + + + [Channel2] + hotcue_4_enabled + 0x99 + 0x03 + 0x7F + 0.5 + + + [Channel1] + hotcue_5_enabled + 0x97 + 0x04 + 0x7F + 0.5 + + + [Channel2] + hotcue_5_enabled + 0x99 + 0x04 + 0x7F + 0.5 + + + [Channel1] + hotcue_6_enabled + 0x97 + 0x05 + 0x7F + 0.5 + + + [Channel2] + hotcue_6_enabled + 0x99 + 0x05 + 0x7F + 0.5 + + + [Channel1] + hotcue_7_enabled + 0x97 + 0x06 + 0x7F + 0.5 + + + [Channel2] + hotcue_7_enabled + 0x99 + 0x06 + 0x7F + 0.5 + + + [Channel1] + hotcue_8_enabled + 0x97 + 0x07 + 0x7F + 0.5 + + + [Channel2] + hotcue_8_enabled + 0x99 + 0x07 + 0x7F + 0.5 + + + + + [Channel1] + hotcue_1_enabled + 0x98 + 0x00 + 0x7F + 0.5 + + + [Channel2] + hotcue_1_enabled + 0x9A + 0x00 + 0x7F + 0.5 + + + [Channel1] + hotcue_2_enabled + 0x98 + 0x01 + 0x7F + 0.5 + + + [Channel2] + hotcue_2_enabled + 0x9A + 0x01 + 0x7F + 0.5 + + + [Channel1] + hotcue_3_enabled + 0x98 + 0x02 + 0x7F + 0.5 + + + [Channel2] + hotcue_3_enabled + 0x9A + 0x02 + 0x7F + 0.5 + + + [Channel1] + hotcue_4_enabled + 0x98 + 0x03 + 0x7F + 0.5 + + + [Channel2] + hotcue_4_enabled + 0x9A + 0x03 + 0x7F + 0.5 + + + [Channel1] + hotcue_5_enabled + 0x98 + 0x04 + 0x7F + 0.5 + + + [Channel2] + hotcue_5_enabled + 0x9A + 0x04 + 0x7F + 0.5 + + + [Channel1] + hotcue_6_enabled + 0x98 + 0x05 + 0x7F + 0.5 + + + [Channel2] + hotcue_6_enabled + 0x9A + 0x05 + 0x7F + 0.5 + + + [Channel1] + hotcue_7_enabled + 0x98 + 0x06 + 0x7F + 0.5 + + + [Channel2] + hotcue_7_enabled + 0x9A + 0x06 + 0x7F + 0.5 + + + [Channel1] + hotcue_8_enabled + 0x98 + 0x07 + 0x7F + 0.5 + + + [Channel2] + hotcue_8_enabled + 0x9A + 0x07 + 0x7F + 0.5 + + + + + [Channel1] + beatloop_0.25_enabled + 0x97 + 0x60 + 0x7F + 0.5 + + + [Channel2] + beatloop_0.25_enabled + 0x99 + 0x60 + 0x7F + 0.5 + + + [Channel1] + beatloop_0.5_enabled + 0x97 + 0x61 + 0x7F + 0.5 + + + [Channel2] + beatloop_0.5_enabled + 0x99 + 0x61 + 0x7F + 0.5 + + + [Channel1] + beatloop_1_enabled + 0x97 + 0x62 + 0x7F + 0.5 + + + [Channel2] + beatloop_1_enabled + 0x99 + 0x62 + 0x7F + 0.5 + + + [Channel1] + beatloop_2_enabled + 0x97 + 0x63 + 0x7F + 0.5 + + + [Channel2] + beatloop_2_enabled + 0x99 + 0x63 + 0x7F + 0.5 + + + [Channel1] + beatloop_4_enabled + 0x97 + 0x64 + 0x7F + 0.5 + + + [Channel2] + beatloop_4_enabled + 0x99 + 0x64 + 0x7F + 0.5 + + + [Channel1] + beatloop_8_enabled + 0x97 + 0x65 + 0x7F + 0.5 + + + [Channel2] + beatloop_8_enabled + 0x99 + 0x65 + 0x7F + 0.5 + + + [Channel1] + beatloop_16_enabled + 0x97 + 0x66 + 0x7F + 0.5 + + + [Channel2] + beatloop_16_enabled + 0x99 + 0x66 + 0x7F + 0.5 + + + [Channel1] + beatloop_32_enabled + 0x97 + 0x67 + 0x7F + 0.5 + + + [Channel2] + beatloop_32_enabled + 0x99 + 0x67 + 0x7F + 0.5 + + + + + [Channel1] + beatloop_0.25_enabled + 0x98 + 0x60 + 0x7F + 0.5 + + + [Channel2] + beatloop_0.25_enabled + 0x9A + 0x60 + 0x7F + 0.5 + + + [Channel1] + beatloop_0.5_enabled + 0x98 + 0x61 + 0x7F + 0.5 + + + [Channel2] + beatloop_0.5_enabled + 0x9A + 0x61 + 0x7F + 0.5 + + + [Channel1] + beatloop_1_enabled + 0x98 + 0x62 + 0x7F + 0.5 + + + [Channel2] + beatloop_1_enabled + 0x9A + 0x62 + 0x7F + 0.5 + + + [Channel1] + beatloop_2_enabled + 0x98 + 0x63 + 0x7F + 0.5 + + + [Channel2] + beatloop_2_enabled + 0x9A + 0x63 + 0x7F + 0.5 + + + [Channel1] + beatloop_4_enabled + 0x98 + 0x64 + 0x7F + 0.5 + + + [Channel2] + beatloop_4_enabled + 0x9A + 0x64 + 0x7F + 0.5 + + + [Channel1] + beatloop_8_enabled + 0x98 + 0x65 + 0x7F + 0.5 + + + [Channel2] + beatloop_8_enabled + 0x9A + 0x65 + 0x7F + 0.5 + + + [Channel1] + beatloop_16_enabled + 0x98 + 0x66 + 0x7F + 0.5 + + + [Channel2] + beatloop_16_enabled + 0x9A + 0x66 + 0x7F + 0.5 + + + [Channel1] + beatloop_32_enabled + 0x98 + 0x67 + 0x7F + 0.5 + + + [Channel2] + beatloop_32_enabled + 0x9A + 0x67 + 0x7F + 0.5 + + + + + + [Sampler1] + track_loaded + 0x97 + 0x30 + 0x7F + 0.5 + + + [Sampler2] + track_loaded + 0x97 + 0x31 + 0x7F + 0.5 + + + [Sampler3] + track_loaded + 0x97 + 0x32 + 0x7F + 0.5 + + + [Sampler4] + track_loaded + 0x97 + 0x33 + 0x7F + 0.5 + + + [Sampler5] + track_loaded + 0x97 + 0x34 + 0x7F + 0.5 + + + [Sampler6] + track_loaded + 0x97 + 0x35 + 0x7F + 0.5 + + + [Sampler7] + track_loaded + 0x97 + 0x36 + 0x7F + 0.5 + + + [Sampler8] + track_loaded + 0x97 + 0x37 + 0x7F + 0.5 + + + + + [Sampler9] + track_loaded + 0x99 + 0x30 + 0x7F + 0.5 + + + [Sampler10] + track_loaded + 0x99 + 0x31 + 0x7F + 0.5 + + + [Sampler11] + track_loaded + 0x99 + 0x32 + 0x7F + 0.5 + + + [Sampler12] + track_loaded + 0x99 + 0x33 + 0x7F + 0.5 + + + [Sampler13] + track_loaded + 0x99 + 0x34 + 0x7F + 0.5 + + + [Sampler14] + track_loaded + 0x99 + 0x35 + 0x7F + 0.5 + + + [Sampler15] + track_loaded + 0x99 + 0x36 + 0x7F + 0.5 + + + [Sampler16] + track_loaded + 0x99 + 0x37 + 0x7F + 0.5 + + + + + + + [Sampler1] + track_loaded + 0x98 + 0x30 + 0x7F + 0.5 + + + [Sampler2] + track_loaded + 0x98 + 0x31 + 0x7F + 0.5 + + + [Sampler3] + track_loaded + 0x98 + 0x32 + 0x7F + 0.5 + + + [Sampler4] + track_loaded + 0x98 + 0x33 + 0x7F + 0.5 + + + [Sampler5] + track_loaded + 0x98 + 0x34 + 0x7F + 0.5 + + + [Sampler6] + track_loaded + 0x98 + 0x35 + 0x7F + 0.5 + + + [Sampler7] + track_loaded + 0x98 + 0x36 + 0x7F + 0.5 + + + [Sampler8] + track_loaded + 0x98 + 0x37 + 0x7F + 0.5 + + + + + + + [Sampler9] + track_loaded + 0x9A + 0x30 + 0x7F + 0.5 + + + [Sampler10] + track_loaded + 0x9A + 0x31 + 0x7F + 0.5 + + + [Sampler11] + track_loaded + 0x9A + 0x32 + 0x7F + 0.5 + + + [Sampler12] + track_loaded + 0x9A + 0x33 + 0x7F + 0.5 + + + [Sampler13] + track_loaded + 0x9A + 0x34 + 0x7F + 0.5 + + + [Sampler14] + track_loaded + 0x9A + 0x35 + 0x7F + 0.5 + + + [Sampler15] + track_loaded + 0x9A + 0x36 + 0x7F + 0.5 + + + [Sampler16] + track_loaded + 0x9A + 0x37 + 0x7F + 0.5 + + + + + + [Channel1] + hotcue_1_enabled + 0x97 + 0x40 + 0x7F + 0.5 + + + [Channel2] + hotcue_1_enabled + 0x99 + 0x40 + 0x7F + 0.5 + + + [Channel1] + hotcue_2_enabled + 0x97 + 0x41 + 0x7F + 0.5 + + + [Channel2] + hotcue_2_enabled + 0x99 + 0x41 + 0x7F + 0.5 + + + [Channel1] + hotcue_3_enabled + 0x97 + 0x42 + 0x7F + 0.5 + + + [Channel2] + hotcue_3_enabled + 0x99 + 0x42 + 0x7F + 0.5 + + + [Channel1] + hotcue_4_enabled + 0x97 + 0x43 + 0x7F + 0.5 + + + [Channel2] + hotcue_4_enabled + 0x99 + 0x43 + 0x7F + 0.5 + + + [Channel1] + hotcue_5_enabled + 0x97 + 0x44 + 0x7F + 0.5 + + + [Channel2] + hotcue_5_enabled + 0x99 + 0x44 + 0x7F + 0.5 + + + [Channel1] + hotcue_6_enabled + 0x97 + 0x45 + 0x7F + 0.5 + + + [Channel2] + hotcue_6_enabled + 0x99 + 0x45 + 0x7F + 0.5 + + + [Channel1] + hotcue_7_enabled + 0x97 + 0x46 + 0x7F + 0.5 + + + [Channel2] + hotcue_7_enabled + 0x99 + 0x46 + 0x7F + 0.5 + + + [Channel1] + hotcue_8_enabled + 0x97 + 0x47 + 0x7F + 0.5 + + + [Channel2] + hotcue_8_enabled + 0x99 + 0x47 + 0x7F + 0.5 + + + + + [Channel1] + hotcue_1_enabled + 0x98 + 0x40 + 0x7F + 0.5 + + + [Channel2] + hotcue_1_enabled + 0x9A + 0x40 + 0x7F + 0.5 + + + [Channel1] + hotcue_2_enabled + 0x98 + 0x41 + 0x7F + 0.5 + + + [Channel2] + hotcue_2_enabled + 0x9A + 0x41 + 0x7F + 0.5 + + + [Channel1] + hotcue_3_enabled + 0x98 + 0x42 + 0x7F + 0.5 + + + [Channel2] + hotcue_3_enabled + 0x9A + 0x42 + 0x7F + 0.5 + + + [Channel1] + hotcue_4_enabled + 0x98 + 0x43 + 0x7F + 0.5 + + + [Channel2] + hotcue_4_enabled + 0x9A + 0x43 + 0x7F + 0.5 + + + [Channel1] + hotcue_5_enabled + 0x98 + 0x44 + 0x7F + 0.5 + + + [Channel2] + hotcue_5_enabled + 0x9A + 0x44 + 0x7F + 0.5 + + + [Channel1] + hotcue_6_enabled + 0x98 + 0x45 + 0x7F + 0.5 + + + [Channel2] + hotcue_6_enabled + 0x9A + 0x45 + 0x7F + 0.5 + + + [Channel1] + play + 0x98 + 0x46 + 0x7F + 0.5 + + + [Channel2] + play + 0x9A + 0x46 + 0x7F + 0.5 + + + [Channel1] + play + 0x98 + 0x47 + 0x7F + 0.5 + + + [Channel2] + play + 0x9A + 0x47 + 0x7F + 0.5 + + + + + + + + + + + [Channel1] + play + 0x97 + 0x70 + 0x7F + 0.5 + + + [Channel1] + play + 0x97 + 0x71 + 0x7F + 0.5 + + + [Channel1] + play + 0x97 + 0x72 + 0x7F + 0.5 + + + [Channel1] + play + 0x97 + 0x73 + 0x7F + 0.5 + + + [Channel1] + play + 0x97 + 0x74 + 0x7F + 0.5 + + + [Channel1] + play + 0x97 + 0x75 + 0x7F + 0.5 + + + [Channel1] + play + 0x97 + 0x76 + 0x7F + 0.5 + + + [Channel1] + play + 0x97 + 0x77 + 0x7F + 0.5 + + + [Channel1] + play + 0x98 + 0x76 + 0x7F + 0.5 + + + [Channel1] + play + 0x98 + 0x77 + 0x7F + 0.5 + + + + [Channel2] + play + 0x99 + 0x70 + 0x7F + 0.5 + + + [Channel2] + play + 0x99 + 0x71 + 0x7F + 0.5 + + + [Channel2] + play + 0x99 + 0x72 + 0x7F + 0.5 + + + [Channel2] + play + 0x99 + 0x73 + 0x7F + 0.5 + + + [Channel2] + play + 0x99 + 0x74 + 0x7F + 0.5 + + + [Channel2] + play + 0x99 + 0x75 + 0x7F + 0.5 + + + [Channel2] + play + 0x99 + 0x76 + 0x7F + 0.5 + + + [Channel2] + play + 0x99 + 0x77 + 0x7F + 0.5 + + + [Channel2] + play + 0x9A + 0x76 + 0x7F + 0.5 + + + [Channel2] + play + 0x9A + 0x77 + 0x7F + 0.5 + + + + + + + +