diff --git a/res/controllers/Pioneer-DDJ-400-script.js b/res/controllers/Pioneer-DDJ-400-script.js index 0399d1d6a51..10e5d237743 100644 --- a/res/controllers/Pioneer-DDJ-400-script.js +++ b/res/controllers/Pioneer-DDJ-400-script.js @@ -1,7 +1,7 @@ // Pioneer-DDJ-400-script.js // **************************************************************************** // * Mixxx mapping script file for the Pioneer DDJ-400. -// * Authors: Warker, nschloe, dj3730, jusko +// * Authors: Warker, nschloe, dj3730, jusko, tiesjan // * Reviewers: Be-ing, Holzhaus // * Manual: https://manual.mixxx.org/2.3/en/hardware/controllers/pioneer_ddj_400.html // **************************************************************************** @@ -19,14 +19,14 @@ // // Custom (Mixxx specific mappings): // * BeatFX: Assigned Effect Unit 1 -// < LEFT focus EFFECT1 -// > RIGHT focus EFFECT2 -// v FX_SELECT focus EFFECT3. +// < LEFT toggles focus between Effects 1, 2 and 3 leftward +// > RIGHT toggles focus between Effects 1, 2 and 3 rightward +// v DOWN loads next effect entry for focused Effect +// SHIFT + v UP loads previous effect entry for focused Effect +// LEVEL/DEPTH controls the Mix knob of the Effect Unit +// SHIFT + LEVEL/DEPTH controls the Meta knob of the focused Effect // ON/OFF toggles focused effect slot // SHIFT + ON/OFF disables all three effect slots. -// SHIFT + < loads previous effect -// SHIFT + > loads next effect -// // * 32 beat jump forward & back (Shift + CUE/LOOP CALL arrows) // * Toggle quantize (Shift + channel cue) // @@ -34,7 +34,6 @@ // * Loop Section: // * -4BEAT auto loop (hacky---prefer a clean way to set a 4 beat loop // from a previous position on long press) -// // * CUE/LOOP CALL - memory & delete (complex and not useful. Hot cues are sufficient) // // * Secondary pad modes (trial attempts complex and too experimental) @@ -243,30 +242,44 @@ PioneerDDJ400.beatFxLevelDepthRotate = function(_channel, _control, value) { } }; -PioneerDDJ400.beatFxSelectPreviousEffect = function(_channel, _control, value) { - engine.setValue(PioneerDDJ400.focusedFxGroup(), "prev_effect", value); -}; +PioneerDDJ400.changeFocusedEffectBy = function(numberOfSteps) { + var focusedEffect = engine.getValue("[EffectRack1_EffectUnit1]", "focused_effect"); -PioneerDDJ400.beatFxSelectNextEffect = function(_channel, _control, value) { - engine.setValue(PioneerDDJ400.focusedFxGroup(), "next_effect", value); + // Convert to zero-based index + focusedEffect -= 1; + + // Standard Euclidean modulo by use of two plain modulos + var numberOfEffectsPerEffectUnit = 3; + focusedEffect = (((focusedEffect + numberOfSteps) % numberOfEffectsPerEffectUnit) + numberOfEffectsPerEffectUnit) % numberOfEffectsPerEffectUnit; + + // Convert back to one-based index + focusedEffect += 1; + + engine.setValue("[EffectRack1_EffectUnit1]", "focused_effect", focusedEffect); }; PioneerDDJ400.beatFxLeftPressed = function(_channel, _control, value) { if (value === 0) { return; } - engine.setValue("[EffectRack1_EffectUnit1]", "focused_effect", 1); + PioneerDDJ400.changeFocusedEffectBy(-1); }; PioneerDDJ400.beatFxRightPressed = function(_channel, _control, value) { if (value === 0) { return; } - engine.setValue("[EffectRack1_EffectUnit1]", "focused_effect", 2); + PioneerDDJ400.changeFocusedEffectBy(1); }; PioneerDDJ400.beatFxSelectPressed = function(_channel, _control, value) { if (value === 0) { return; } - engine.setValue("[EffectRack1_EffectUnit1]", "focused_effect", 3); + engine.setValue(PioneerDDJ400.focusedFxGroup(), "next_effect", value); +}; + +PioneerDDJ400.beatFxSelectShiftPressed = function(_channel, _control, value) { + if (value === 0) { return; } + + engine.setValue(PioneerDDJ400.focusedFxGroup(), "prev_effect", value); }; PioneerDDJ400.beatFxOnOffPressed = function(_channel, _control, value) { @@ -426,7 +439,7 @@ PioneerDDJ400.syncLongPressed = function(channel, control, value, status, group) }; PioneerDDJ400.cycleTempoRange = function(_channel, _control, value, _status, group) { - if (value === 0) return; // ignore release + if (value === 0) { return; } // ignore release var currRange = engine.getValue(group, "rateRange"); var idx = 0; diff --git a/res/controllers/Pioneer-DDJ-400.midi.xml b/res/controllers/Pioneer-DDJ-400.midi.xml index a2cc1d28eba..2e320ebc168 100644 --- a/res/controllers/Pioneer-DDJ-400.midi.xml +++ b/res/controllers/Pioneer-DDJ-400.midi.xml @@ -2,7 +2,7 @@ Pioneer DDJ-400 - Warker/nschloe/dj3730/jusko + Warker, nschloe, dj3730, jusko, tiesjan Midi Mapping for the Pioneer DDJ-400 pioneer_ddj_400 https://mixxx.discourse.group/t/pioneer-ddj-400/17476 @@ -998,7 +998,7 @@ - BEAT LEFT - press - select effect unit 1 + BEAT LEFT - press - toggle focused Effect leftward [EffectRack1_EffectUnit1] PioneerDDJ400.beatFxLeftPressed 0x94 @@ -1007,19 +1007,9 @@ - - BEAT LEFT + shift - select previous effect for the current unit - [EffectRack1_EffectUnit1] - PioneerDDJ400.beatFxSelectPreviousEffect - 0x94 - 0x66 - - - - - BEAT RIGHT - press - select effect unit 2 + BEAT RIGHT - press - toggle focused Effect rightward [EffectRack1_EffectUnit1] PioneerDDJ400.beatFxRightPressed 0x94 @@ -1028,23 +1018,23 @@ + - BEAT RIGHT + shift - select next effect for the current unit + BEAT FX SELECT - press - load next effect entry for focused Effect [EffectRack1_EffectUnit1] - PioneerDDJ400.beatFxSelectNextEffect + PioneerDDJ400.beatFxSelectPressed 0x94 - 0x6B + 0x63 - - BEAT FX SELECT - press once - select effect unit 3 - press again - clear focus back to wet/dry mix + BEAT FX SELECT +SHIFT - press - load previous effect entry for focused Effect [EffectRack1_EffectUnit1] - PioneerDDJ400.beatFxSelectPressed + PioneerDDJ400.beatFxSelectShiftPressed 0x94 - 0x63 + 0x64