diff --git a/res/controllers/Hercules DJControl MIX.midi.xml b/res/controllers/Hercules DJControl MIX.midi.xml new file mode 100644 index 00000000000..f4a0e34d3c7 --- /dev/null +++ b/res/controllers/Hercules DJControl MIX.midi.xml @@ -0,0 +1,1598 @@ + + + + Hercules DJControl MIX + DJ Phatso for Hercules Technical Support, contributions by Kerrick Staley + MIDI Mapping for Hercules DJControl MIX + https://mixxx.discourse.group/t/hercules-contrl-mix-mapping/26581/ + hercules_djcontrol_MIX + + + + + + + + + + /****************************************************************************************************/ + // NN's MIDI Channel 1 (0x91) + /****************************************************************************************************/ + + // Shift + + [Master] + DJCMIX.shiftButton + Shift button + 0x90 + 0x03 + + + + + + /****************************************************************************************************/ + // NN's MIDI Channel 2 (0x91 Deck A - Standard MODE) + /****************************************************************************************************/ + + // Play + + [Channel1] + play + Play button + 0x91 + 0x07 + + + + + + // CUE + + [Channel1] + cue_default + Cue button + 0x91 + 0x06 + + + + + + // Sync + + [Channel1] + sync_enabled + Sync button + 0x91 + 0x05 + + + + + + // PFL + + [Channel1] + pfl + PFL button + 0x91 + 0x0C + + + + + + // Vinyl button + + [Master] + DJCMIX.vinylButton + Vinyl + 0x91 + 0x03 + + + + + + // Jog wheel touch + + [Channel1] + DJCMIX.wheelTouch + Jog Wheel Touch Deck A + 0x91 + 0x08 + + + + + + /****************************************************************************************************/ + // NN's MIDI Channel 3 (0x92 Deck B - Standard MODE) + /****************************************************************************************************/ + + // Play + + [Channel2] + play + Play button + 0x92 + 0x07 + + + + + + // CUE + + [Channel2] + cue_default + Cue button + 0x92 + 0x06 + + + + + + // Sync + + [Channel2] + sync_enabled + Sync button + 0x92 + 0x05 + + + + + + // PFL + + [Channel2] + pfl + PFL button + 0x92 + 0x0C + + + + + + // Jog wheel touch + + [Channel2] + DJCMIX.wheelTouch + Jog Wheel Touch Deck B + 0x92 + 0x08 + + + + + + /****************************************************************************************************/ + // NN's MIDI Channel 5 (0x94 Deck A - SHIFT MODE) + /****************************************************************************************************/ + + // Play + + [Channel1] + play_stutter + SHIFT + Play: Play Stutter + 0x94 + 0x07 + + + + + + // CUE + + [Channel1] + start + SHIFT + Cue: REWIND to beginning + 0x94 + 0x06 + + + + + + // Sync + + [Channel1] + sync_leader + SHIFT + Sync: Sync Master + 0x94 + 0x05 + + + + + + // PFL + + [Master] + DJCMIX.cueMaster + CUE Master + 0x94 + 0x0C + + + + + + // Jog wheel touch + + [Channel1] + DJCMIX.wheelTouchShift + Jog Wheel Shift Touch Deck A + 0x94 + 0x08 + + + + + + /****************************************************************************************************/ + // NN's MIDI Channel 6 (0x95 Deck B - SHIFT MODE) + /****************************************************************************************************/ + + // Play + + [Channel2] + play_stutter + SHIFT + Play: Play Stutter + 0x95 + 0x07 + + + + + + // CUE + + [Channel2] + start + SHIFT + Cue: REWIND to beginning + 0x95 + 0x06 + + + + + + // Sync + + [Channel2] + sync_leader + SHIFT + Sync: Sync Master + 0x95 + 0x05 + + + + + + // PFL + + [Master] + DJCMIX.cueMix + Headphone CUE + MIX + 0x95 + 0x0C + + + + + + // Jog wheel touch + + [Channel2] + DJCMIX.wheelTouchShift + Jog Wheel Shift Touch Deck B + 0x95 + 0x08 + + + + + + /****************************************************************************************************/ + // NN's MIDI Channel 7 (0x96 Deck A - Pads) + /****************************************************************************************************/ + + // Hot Cues (SET) + + [Channel1] + hotcue_1_activate + PAD 1 + 0x96 + 0x00 + + + + + + + [Channel1] + hotcue_2_activate + PAD 2 + 0x96 + 0x01 + + + + + + + [Channel1] + hotcue_3_activate + PAD 3 + 0x96 + 0x02 + + + + + + + [Channel1] + hotcue_4_activate + PAD 4 + 0x96 + 0x03 + + + + + + // Hot-Cue buttons (SHIFT mode) + + [Channel1] + hotcue_1_clear + PAD 1 + 0x96 + 0x08 + + + + + + + [Channel1] + hotcue_2_clear + PAD 2 + 0x96 + 0x09 + + + + + + + [Channel1] + hotcue_3_clear + PAD 3 + 0x96 + 0x0A + + + + + + + [Channel1] + hotcue_4_clear + PAD 4 + 0x96 + 0x0B + + + + + + // LOOP + + [Channel1] + beatloop_1_toggle + Loop 1 Beat (Pad 1) + 0x96 + 0x30 + + + + + + + [Channel1] + beatloop_2_toggle + Loop 2 Beat (Pad 2) + 0x96 + 0x31 + + + + + + + [Channel1] + beatloop_4_toggle + Loop 4 Beat (Pad 3) + 0x96 + 0x32 + + + + + + + [Channel1] + beatloop_8_toggle + Loop 8 Beat (Pad 4) + 0x96 + 0x33 + + + + + + // FX + + [EffectRack1_EffectUnit1_Effect1] + enabled + (Pad 1) + 0x96 + 0x20 + + + + + + + [EffectRack1_EffectUnit1_Effect2] + enabled + (Pad 2) + 0x96 + 0x21 + + + + + + + [EffectRack1_EffectUnit1_Effect3] + enabled + (Pad 3) + 0x96 + 0x22 + + + + + + + [EffectRack1_EffectUnit1] + group_[Channel1]_enable + (Pad 4) + 0x96 + 0x23 + + + + + + + [EffectRack1_EffectUnit1_Effect1] + effect_selector + SHIFT + (Pad 1) + 0x96 + 0x28 + + + + + + + [EffectRack1_EffectUnit1_Effect2] + effect_selector + SHIFT + (Pad 2) + 0x96 + 0x29 + + + + + + + [EffectRack1_EffectUnit1_Effect3] + effect_selector + SHIFT + (Pad 3) + 0x96 + 0x2A + + + + + + // Sampler + + [Sampler1] + cue_gotoandplay + PAD 1 + 0x96 + 0x10 + + + + + + + [Sampler2] + cue_gotoandplay + PAD 2 + 0x96 + 0x11 + + + + + + + [Sampler3] + cue_gotoandplay + PAD 3 + 0x96 + 0x12 + + + + + + + [Sampler4] + cue_gotoandplay + PAD 4 + 0x96 + 0x13 + + + + + + /****************************************************************************************************/ + // NN's MIDI Channel 8 (0x97 Deck B - Pads) + /****************************************************************************************************/ + + // Hot Cues (SET) + + [Channel2] + hotcue_1_activate + PAD 1 + 0x97 + 0x00 + + + + + + + [Channel2] + hotcue_2_activate + PAD 2 + 0x97 + 0x01 + + + + + + + [Channel2] + hotcue_3_activate + PAD 3 + 0x97 + 0x02 + + + + + + + [Channel2] + hotcue_4_activate + PAD 4 + 0x97 + 0x03 + + + + + + // Hot-Cue buttons (SHIFT mode) + + [Channel2] + hotcue_1_clear + PAD 1 + 0x97 + 0x08 + + + + + + + [Channel2] + hotcue_2_clear + PAD 2 + 0x97 + 0x09 + + + + + + + [Channel2] + hotcue_3_clear + PAD 3 + 0x97 + 0x0A + + + + + + + [Channel2] + hotcue_4_clear + PAD 4 + 0x97 + 0x0B + + + + + + // LOOP + + [Channel2] + beatloop_1_toggle + Loop 1 Beat (Pad 1) + 0x97 + 0x30 + + + + + + + [Channel2] + beatloop_2_toggle + Loop 2 Beat (Pad 2) + 0x97 + 0x31 + + + + + + + [Channel2] + beatloop_4_toggle + Loop 4 Beat (Pad 3) + 0x97 + 0x32 + + + + + + + [Channel2] + beatloop_8_toggle + Loop 8 Beat (Pad 4) + 0x97 + 0x33 + + + + + + // FX + + [EffectRack1_EffectUnit2_Effect1] + enabled + (Pad 1) + 0x97 + 0x20 + + + + + + + [EffectRack1_EffectUnit2_Effect2] + enabled + (Pad 2) + 0x97 + 0x21 + + + + + + + [EffectRack1_EffectUnit2_Effect3] + enabled + (Pad 3) + 0x97 + 0x22 + + + + + + + [EffectRack1_EffectUnit2] + group_[Channel2]_enable + (Pad 4) + 0x97 + 0x23 + + + + + + + [EffectRack1_EffectUnit2_Effect1] + effect_selector + SHIFT +(Pad 1) + 0x97 + 0x28 + + + + + + + [EffectRack1_EffectUnit2_Effect2] + effect_selector + SHIFT +(Pad 2) + 0x97 + 0x29 + + + + + + + [EffectRack1_EffectUnit2_Effect3] + effect_selector + SHIFT +(Pad 3) + 0x97 + 0x2A + + + + + + // Sampler + + [Sampler5] + cue_gotoandplay + PAD 1 + 0x97 + 0x10 + + + + + + + [Sampler6] + cue_gotoandplay + PAD 2 + 0x97 + 0x11 + + + + + + + [Sampler7] + cue_gotoandplay + PAD 3 + 0x97 + 0x12 + + + + + + + [Sampler8] + cue_gotoandplay + PAD 4 + 0x97 + 0x13 + + + + + + /****************************************************************************************************/ + // CC's MIDI Channel 1 (0xB0 Standard mode) + /***************************************************************************************************/ + + // Crossfader + + [Master] + crossfader + Crossfader + 0xB0 + 0x00 + + + + + + // Master Volume + + [Master] + gain + Master Volume + 0xB0 + 0x03 + + + + + + // Headphone Volume + + [Master] + headGain + Headphone Volume + 0xB0 + 0x04 + + + + + + /****************************************************************************************************/ + // CC's MIDI Channel 2 (0xB1 Deck A - Standard mode) + /***************************************************************************************************/ + + // Volume + + [Channel1] + volume + Volume Deck A + 0xB1 + 0x00 + + + + + + // EQ + + [EqualizerRack1_[Channel1]_Effect1] + parameter1 + EQ LOW Deck A + 0xB1 + 0x02 + + + + + + // Filter + + [QuickEffectRack1_[Channel1]] + super1 + Filter Deck A + 0xB1 + 0x01 + + + + + + // Pitch slider + + [Channel1] + rate + 0xB1 + 0x08 + + + + + + + + [Channel1] + rate + 0xB1 + 0x28 + + + + + + + // Jog wheel + + [Channel1] + DJCMIX.scratchWheel + Jog-Wheel Scratch (Held down) + 0xB1 + 0x0A + + + + + + + [Channel1] + DJCMIX.scratchWheelShift + Jog-Wheel Seek (Held down + Shift) + 0xB4 + 0x0A + + + + + + + [Channel1] + DJCMIX.bendWheel + Jog-Wheel Pitch Bend + 0xB1 + 0x09 + + + + + + /****************************************************************************************************/ + // CC's MIDI Channel 3 (0xB2 Deck B - Standard mode) + /***************************************************************************************************/ + + // Volume + + [Channel2] + volume + Volume Deck A + 0xB2 + 0x00 + + + + + + // EQ + + [EqualizerRack1_[Channel2]_Effect1] + parameter1 + EQ LOW Deck B + 0xB2 + 0x02 + + + + + + // Filter + + [QuickEffectRack1_[Channel2]] + super1 + Filter Deck A + 0xB2 + 0x01 + + + + + + // Pitch slider + + [Channel2] + rate + 0xB2 + 0x08 + + + + + + + + [Channel2] + rate + 0xB2 + 0x28 + + + + + + + // Jog wheel + + [Channel2] + DJCMIX.scratchWheel + Jog-Wheel Scratch (Held down) + 0xB2 + 0x0A + + + + + + + [Channel1] + DJCMIX.scratchWheelShift + Jog-Wheel Seek (Held down + Shift) + 0xB5 + 0x0A + + + + + + + [Channel2] + DJCMIX.bendWheel + Jog-Wheel Pitch Bend + 0xB2 + 0x09 + + + + + + + + /****************************************************************************************************/ + //LED output + /***************************************************************************************************/ + + + + // LED Transport + + [Channel1] + play_indicator + PLAY LED Deck A + 0.5 + 1 + 0x91 + 0x07 + 0x7f + 0x0 + + + + [Channel1] + cue_indicator + CUE LED Deck A + 0.5 + 1 + 0x91 + 0x06 + 0x7f + 0x0 + + + + [Channel1] + sync_enabled + SYNC LED Deck A + 0.5 + 1 + 0x91 + 0x05 + 0x7f + 0x0 + + + + [Channel1] + sync_leader + SYNC LED Deck A(SHIFT mode) + 0.5 + 1 + 0x93 + 0x05 + 0x7f + 0x0 + + + + [Channel2] + play_indicator + PLAY LED Deck B + 0.5 + 1 + 0x92 + 0x07 + 0x7f + 0x0 + + + + [Channel2] + cue_indicator + PLAY LED Deck B + 0.5 + 1 + 0x92 + 0x06 + 0x7f + 0x0 + + + + [Channel2] + sync_enabled + SYNC LED Deck B + 0.5 + 1 + 0x92 + 0x05 + 0x7f + 0x0 + + + + [Channel2] + sync_leader + SYNC LED Deck B(SHIFT mode) + 0.5 + 1 + 0x94 + 0x05 + 0x7f + 0x0 + + + // LED PFL buttons + + [Channel1] + pfl + PFL LED DECK A + 0.5 + 1 + 0x91 + 0x0C + 0x7f + 0x0 + + + + [Channel2] + pfl + PFL LED DECK B + 0.5 + 1 + 0x92 + 0x0C + 0x7f + 0x0 + + + // LED HOT CUE (Normal Mode) + + [Channel1] + hotcue_1_enabled + Hotcue 1 (Pad 1) + 0x96 + 0x00 + 0x7E + 0.5 + + + + [Channel1] + hotcue_2_enabled + Hotcue 2 (Pad 2) + 0x96 + 0x01 + 0x7E + 0.5 + + + + [Channel1] + hotcue_3_enabled + Hotcue 3 (Pad 3) + 0x96 + 0x02 + 0x7E + 0.5 + + + + [Channel1] + hotcue_4_enabled + Hotcue 4 (Pad 4) + 0x96 + 0x03 + 0x7E + 0.5 + + + + [Channel2] + hotcue_1_enabled + Hotcue 1 (Pad 1) + 0x97 + 0x00 + 0x7E + 0.5 + + + + [Channel2] + hotcue_2_enabled + Hotcue 2 (Pad 2) + 0x97 + 0x01 + 0x7E + 0.5 + + + + [Channel2] + hotcue_3_enabled + Hotcue 3 (Pad 3) + 0x97 + 0x02 + 0x7E + 0.5 + + + + [Channel2] + hotcue_4_enabled + Hotcue 4 (Pad 4) + 0x97 + 0x03 + 0x7E + 0.5 + + + // LED HOT CUE (SHIFT Mode) + + [Channel1] + hotcue_1_enabled + Hotcue 1 (Pad 1) + 0x96 + 0x08 + 0x7E + 0.5 + + + + [Channel1] + hotcue_2_enabled + Hotcue 2 (Pad 2) + 0x96 + 0x09 + 0x7E + 0.5 + + + + [Channel1] + hotcue_3_enabled + Hotcue 3 (Pad 3) + 0x96 + 0x0A + 0x7E + 0.5 + + + + [Channel1] + hotcue_4_enabled + Hotcue 4 (Pad 4) + 0x96 + 0x0B + 0x7E + 0.5 + + + + [Channel2] + hotcue_1_enabled + Hotcue 1 (Pad 1) + 0x97 + 0x08 + 0x7E + 0.5 + + + + [Channel2] + hotcue_2_enabled + Hotcue 2 (Pad 2) + 0x97 + 0x09 + 0x7E + 0.5 + + + + [Channel2] + hotcue_3_enabled + Hotcue 3 (Pad 3) + 0x97 + 0x0A + 0x7E + 0.5 + + + + [Channel2] + hotcue_4_enabled + Hotcue 4 (Pad 4) + 0x97 + 0x0B + 0x7E + 0.5 + + + // LED LOOP + + [Channel1] + beatloop_1_enabled + Loop 1 Beat (Pad 1) + 0x96 + 0x30 + 0x7F + 0.5 + + + + [Channel1] + beatloop_2_enabled + Loop 2 Beat (Pad 2) + 0x96 + 0x31 + 0x7F + 0.5 + + + + [Channel1] + beatloop_4_enabled + Loop 4 Beat (Pad 3) + 0x96 + 0x32 + 0x7F + 0.5 + + + + [Channel1] + beatloop_8_enabled + Loop 8 Beat (Pad 4) + 0x96 + 0x33 + 0x7F + 0.5 + + + + [Channel2] + beatloop_1_enabled + Loop 1 Beat (Pad 1) + 0x97 + 0x30 + 0x7F + 0.5 + + + + [Channel2] + beatloop_2_enabled + Loop 2 Beat (Pad 2) + 0x97 + 0x31 + 0x7F + 0.5 + + + + [Channel2] + beatloop_4_enabled + Loop 4 Beat (Pad 3) + 0x97 + 0x32 + 0x7F + 0.5 + + + + [Channel2] + beatloop_8_enabled + Loop 8 Beat (Pad 4) + 0x97 + 0x33 + 0x7F + 0.5 + + + + // FX + + [EffectRack1_EffectUnit1_Effect1] + enabled + (Pad 1) + 0x96 + 0x20 + 0x7F + 0.5 + + + + [EffectRack1_EffectUnit1_Effect2] + enabled + (Pad 2) + 0x96 + 0x21 + 0x7F + 0.5 + + + + [EffectRack1_EffectUnit1_Effect3] + enabled + (Pad 3) + 0x96 + 0x22 + 0x7F + 0.5 + + + + [EffectRack1_EffectUnit1] + group_[Channel1]_enable + (Pad 4) + 0x96 + 0x23 + 0x7F + 0.5 + + + + [EffectRack1_EffectUnit2_Effect1] + enabled + (Pad 1) + 0x97 + 0x20 + 0x7F + 0.5 + + + + [EffectRack1_EffectUnit2_Effect2] + enabled + (Pad 2) + 0x97 + 0x21 + 0x7F + 0.5 + + + + [EffectRack1_EffectUnit2_Effect3] + enabled + (Pad 3) + 0x97 + 0x22 + 0x7F + 0.5 + + + + [EffectRack1_EffectUnit2] + group_[Channel2]_enable + (Pad 4) + 0x97 + 0x23 + 0x7F + 0.5 + + + // LED SAMPLE + + [Sampler1] + play_indicator + (Pad 1 DECK A) + 0x96 + 0x10 + 0x7F + 0.5 + + + + [Sampler2] + play_indicator + (Pad 2 DECK A) + 0x96 + 0x11 + 0x7F + 0.5 + + + + [Sampler3] + play_indicator + (Pad 3 DECK A) + 0x96 + 0x12 + 0x7F + 0.5 + + + + [Sampler4] + play_indicator + (Pad 4 DECK A) + 0x96 + 0x13 + 0x7F + 0.5 + + + + [Sampler5] + play_indicator + (Pad 1 DECK B) + 0x97 + 0x10 + 0x7F + 0.5 + + + + [Sampler6] + play_indicator + (Pad 2 DECK B) + 0x97 + 0x11 + 0x7F + 0.5 + + + + [Sampler7] + play_indicator + (Pad 3 DECK B) + 0x97 + 0x12 + 0x7F + 0.5 + + + + [Sampler8] + play_indicator + (Pad 4 DECK B) + 0x97 + 0x13 + 0x7F + 0.5 + + + + + diff --git a/res/controllers/Hercules-DJControl-MIX-scripts.js b/res/controllers/Hercules-DJControl-MIX-scripts.js new file mode 100644 index 00000000000..e01a933cc95 --- /dev/null +++ b/res/controllers/Hercules-DJControl-MIX-scripts.js @@ -0,0 +1,223 @@ +// Hercules-DJControl-MIX-scripts.js +// +// **************************************************************************** +// * Mixxx mapping script file for the Hercules DJControl MIX. +// * Author: DJ Phatso and Kerrick Staley +// * Based on Hercules DJControl Starlight mapping released with Mixxx v2.3.0 +// * -Remapped LOOP and SAMPLER section according to DJControl MIX layout +// * -Added Master Volume and Headphone Volume +// * -Removed superfluous LED configuration (not present on DJControl MIX) +// * Forum: https://mixxx.discourse.group/t/hercules-contrl-mix-mapping/26581/ + +class DJCMixClass { + constructor() { + /////////////////////////////////////////////////////////////// + // USER OPTIONS // + /////////////////////////////////////////////////////////////// + + // How fast scratching is. + this.scratchScale = 1.0; + + // How much faster seeking (shift+scratch) is than scratching. + this.scratchShiftMultiplier = 4; + + // How fast bending is. + this.bendScale = 1.0; + + + this.kScratchActionNone = 0; + this.kScratchActionScratch = 1; + this.kScratchActionSeek = 2; + this.kScratchActionBend = 3; + } + + init() { + this.scratchButtonState = true; + this.scratchAction = { + 1: this.kScratchActionNone, + 2: this.kScratchActionNone + }; + + // Vinyl button LED On. + midi.sendShortMsg(0x91, 0x03, 0x7F); + + // Set effects Levels - Dry/Wet + engine.setParameter("[EffectRack1_EffectUnit1_Effect1]", "meta", 0.6); + engine.setParameter("[EffectRack1_EffectUnit1_Effect2]", "meta", 0.6); + engine.setParameter("[EffectRack1_EffectUnit1_Effect3]", "meta", 0.6); + engine.setParameter("[EffectRack1_EffectUnit2_Effect1]", "meta", 0.6); + engine.setParameter("[EffectRack1_EffectUnit2_Effect2]", "meta", 0.6); + engine.setParameter("[EffectRack1_EffectUnit2_Effect3]", "meta", 0.6); + engine.setParameter("[EffectRack1_EffectUnit1]", "mix", 1); + engine.setParameter("[EffectRack1_EffectUnit2]", "mix", 1); + + // Ask the controller to send all current knob/slider values over MIDI, which will update + // the corresponding GUI controls in MIXXX. + midi.sendShortMsg(0xB0, 0x7F, 0x7F); + } + + // The Vinyl button, used to enable or disable scratching on the jog wheels (The Vinyl button enables both deck). + vinylButton(_channel, _control, value, _status, _group) { + if (value) { + if (this.scratchButtonState) { + this.scratchButtonState = false; + midi.sendShortMsg(0x91, 0x03, 0x00); + + } else { + this.scratchButtonState = true; + midi.sendShortMsg(0x91, 0x03, 0x7F); + } + } + } + + _scratchEnable(deck) { + const alpha = 1.0 / 8; + const beta = alpha / 32; + engine.scratchEnable(deck, 248, 33 + 1 / 3, alpha, beta); + } + + _convertWheelRotation(value) { + // When you rotate the jogwheel, the controller always sends either 0x1 + // (clockwise) or 0x7F (counter clockwise). 0x1 should map to 1, 0x7F + // should map to -1 (IOW it's 7-bit signed). + return value < 0x40 ? 1 : -1; + } + + // The touch action on the jog wheel's top surface + wheelTouch(channel, _control, value, _status, _group) { + const deck = channel; + if (value > 0) { + // Touching the wheel. + if (engine.getValue("[Channel" + deck + "]", "play") !== 1 || this.scratchButtonState) { + this._scratchEnable(deck); + this.scratchAction[deck] = this.kScratchActionScratch; + } else { + this.scratchAction[deck] = this.kScratchActionBend; + } + } else { + // Released the wheel. + engine.scratchDisable(deck); + this.scratchAction[deck] = this.kScratchActionNone; + } + } + + // The touch action on the jog wheel's top surface while holding shift + wheelTouchShift(channel, _control, value, _status, _group) { + const deck = channel - 3; + // We always enable scratching regardless of button state. + if (value > 0) { + this._scratchEnable(deck); + this.scratchAction[deck] = this.kScratchActionSeek; + } else { + // Released the wheel. + engine.scratchDisable(deck); + this.scratchAction[deck] = this.kScratchActionNone; + } + } + + // Scratching on the jog wheel (rotating it while pressing the top surface) + _scratchWheelImpl(deck, value) { + const interval = this._convertWheelRotation(value); + const scratchAction = this.scratchAction[deck]; + + if (scratchAction === this.kScratchActionScratch) { + engine.scratchTick(deck, interval * this.scratchScale); + } else if (scratchAction === this.kScratchActionSeek) { + engine.scratchTick(deck, + interval + * this.scratchScale + * this.scratchShiftMultiplier); + } else { + this._bendWheelImpl(deck, value); + } + } + + // Scratching on the jog wheel (rotating it while pressing the top surface) + scratchWheel(channel, _control, value, _status, _group) { + const deck = channel; + this._scratchWheelImpl(deck, value); + } + + // Seeking on the jog wheel (rotating it while pressing the top surface and holding Shift) + scratchWheelShift(channel, _control, value, _status, _group) { + const deck = channel - 3; + this._scratchWheelImpl(deck, value); + } + + _bendWheelImpl(deck, value) { + const interval = this._convertWheelRotation(value); + engine.setValue("[Channel" + deck + "]", "jog", + interval * this.bendScale); + } + + // Bending on the jog wheel (rotating using the edge) + bendWheel(channel, _control, value, _status, _group) { + const deck = channel; + this._bendWheelImpl(deck, value); + } + + // Cue master button + cueMaster(_channel, _control, value, _status, _group) { + // This button acts as a toggle. Ignore the release. + if (value === 0) { + return; + } + + let masterIsCued = engine.getValue("[Master]", "headMix") > 0; + // Toggle state. + masterIsCued = !masterIsCued; + + const headMixValue = masterIsCued ? 1 : -1; + engine.setValue("[Master]", "headMix", headMixValue); + + // Set LED (will be overwritten when [Shift] is released) + const cueMasterLedValue = masterIsCued ? 0x7F : 0x00; + midi.sendShortMsg(0x91, 0x0C, cueMasterLedValue); + } + + // Cue mix button, toggles PFL / master split feature + // We need a special function for this because we want to turn on the LED (but + // we *don't* want to turn on the LED when the user clicks the headSplit button + // in the GUI). + cueMix(_channel, _control, value, _status, _group) { + // This button acts as a toggle. Ignore the release. + if (value === 0) { + return; + } + + // Toggle state. + script.toggleControl("[Master]", "headSplit"); + + // Set LED (will be overwritten when [Shift] is released) + const cueMixLedValue = + engine.getValue("[Master]", "headSplit") ? 0x7F : 0x00; + midi.sendShortMsg(0x92, 0x0C, cueMixLedValue); + } + + shiftButton(_channel, _control, value, _status, _group) { + if (value >= 0x40) { + // When Shift is held, light the LEDS to show the status of the alt + // functions of the cue buttons. + const cueMasterLedValue = + engine.getValue("[Master]", "headMix") > 0 ? 0x7F : 0x00; + midi.sendShortMsg(0x91, 0x0C, cueMasterLedValue); + const cueMixLedValue = + engine.getValue("[Master]", "headSplit") ? 0x7F : 0x00; + midi.sendShortMsg(0x92, 0x0C, cueMixLedValue); + } else { + // When Shift is released, go back to the normal LED values. + const cueChan1LedValue = + engine.getValue("[Channel1]", "pfl") ? 0x7F : 0x00; + midi.sendShortMsg(0x91, 0x0C, cueChan1LedValue); + const cueChan2LedValue = + engine.getValue("[Channel2]", "pfl") ? 0x7F : 0x00; + midi.sendShortMsg(0x92, 0x0C, cueChan2LedValue); + } + } + // All LED Turned off + shutdown() { + midi.sendShortMsg(0xB0, 0x7F, 0x00); + } +} + +var DJCMIX = new DJCMixClass; // eslint-disable-line no-var, no-unused-vars