diff --git a/build/nsis/Mixxx.nsi b/build/nsis/Mixxx.nsi index d78ff08e7515..3594ec474242 100644 --- a/build/nsis/Mixxx.nsi +++ b/build/nsis/Mixxx.nsi @@ -459,6 +459,8 @@ Section "Uninstall" Delete "$INSTDIR\controllers\lodash.mixxx.js" Delete "$INSTDIR\controllers\M-Audio-Xponent-scripts.js" Delete "$INSTDIR\controllers\M-Audio_Xponent.midi.xml" + Delete "$INSTDIR\controllers\M-Audio-Xponent-Advanced-scripts.js" + Delete "$INSTDIR\controllers\M-Audio Xponent (Advanced).midi.xml" Delete "$INSTDIR\controllers\korg_nanokontrol2.mixco.output.js" Delete "$INSTDIR\controllers\korg_nanokontrol2.mixco.output.midi.xml" Delete "$INSTDIR\controllers\M-Audio_Xsession_pro.midi.xml" diff --git a/res/controllers/M-Audio Xponent (Advanced).midi.xml b/res/controllers/M-Audio Xponent (Advanced).midi.xml new file mode 100644 index 000000000000..bcdd2e77ab75 --- /dev/null +++ b/res/controllers/M-Audio Xponent (Advanced).midi.xml @@ -0,0 +1,3468 @@ + + + + M-Audio Xponent (Advanced) + Mel Grubb, Luca Franceschini, Juan Pedro BolĂ­var Puente + + Advanced mapping for the M-Audio Xponent controller. + Includes Samplers, Effects, Loops, Hotcues, and more. See Wiki for details. + Make sure to set the bank switch on the bottom of the Xponent to A. + + http://www.mixxx.org/forums/viewtopic.php?t=8884 + http://www.mixxx.org/wiki/doku.php/m-audio_xponent + + + + + + + + + + [Master] + MaudioXponent.bankSwitch + Bank A Switch + 0x92 + 0x03 + + + + + + [Master] + MaudioXponent.bankSwitch + Bank A Switch + 0x82 + 0x03 + + + + + + + [Channel1] + MaudioXponent.beatsync + Channel 1 Sync Press + 0x90 + 0x02 + + + + + + [Channel1] + MaudioXponent.beatsync + Channel 1 Sync Release + 0x80 + 0x02 + + + + + + + [Channel2] + MaudioXponent.beatsync + Channel 2 Sync Press + 0x91 + 0x02 + + + + + + [Channel2] + MaudioXponent.beatsync + Channel 2 Sync Release + 0x81 + 0x02 + + + + + + + [Channel3] + MaudioXponent.beatsync + Channel 3 Sync Press + 0x95 + 0x02 + + + + + + [Channel3] + MaudioXponent.beatsync + Channel 3 Sync Release + 0x85 + 0x02 + + + + + + + [Channel4] + MaudioXponent.beatsync + Channel 4 Sync Press + 0x96 + 0x02 + + + + + + [Channel4] + MaudioXponent.beatsync + Channel 4 Sync Release + 0x86 + 0x02 + + + + + + + [Channel1] + MaudioXponent.punchIn + Channel 1 Punch-In Press + 0x90 + 0x07 + + + + + + [Channel1] + MaudioXponent.punchIn + Channel 1 Punch-In Release + 0x80 + 0x07 + + + + + + + [Channel2] + MaudioXponent.punchIn + Channel 2 Punch-In Press + 0x91 + 0x07 + + + + + + [Channel2] + MaudioXponent.punchIn + Channel 2 Punch-In Release + 0x81 + 0x07 + + + + + + + [Channel3] + MaudioXponent.punchIn + Channel 3 Punch-In Press + 0x95 + 0x07 + + + + + + [Channel3] + MaudioXponent.punchIn + Channel 3 Punch-In Release + 0x85 + 0x07 + + + + + + + [Channel4] + MaudioXponent.punchIn + Channel 4 Punch-In Press + 0x96 + 0x07 + + + + + + [Channel4] + MaudioXponent.punchIn + Channel 4 Punch-In Release + 0x86 + 0x07 + + + + + + + [Channel1] + MaudioXponent.filterKill + Channel 1 Low Button Press + 0x90 + 0x08 + + + + + + [Channel1] + MaudioXponent.filterKill + Channel 1 Low Button Release + button + 0x80 + 0x08 + + + + + + [Channel1] + filterLow + Channel 1 Low Knob + 0xB0 + 0x08 + + + + + + + [Channel2] + MaudioXponent.filterKill + Channel 2 Low Button Press + 0x91 + 0x08 + + + + + + [Channel2] + MaudioXponent.filterKill + Channel 2 Low Button Release + 0x81 + 0x08 + + + + + + [Channel2] + filterLow + Channel 2 Low Knob + 0xB1 + 0x08 + + + + + + + [Channel3] + MaudioXponent.filterKill + Channel 3 Low Button Press + 0x95 + 0x08 + + + + + + [Channel3] + MaudioXponent.filterKill + Channel 3 Low Button Release + 0x85 + 0x08 + + + + + + [Channel3] + filterLow + Channel 3 Low Knob + 0xB5 + 0x08 + + + + + + + [Channel4] + MaudioXponent.filterKill + Channel 4 Low Button Press + 0x96 + 0x08 + + + + + + [Channel4] + MaudioXponent.filterKill + Channel 4 Low Button Release + 0x86 + 0x08 + + + + + + [Channel4] + filterLow + Channel 4 Low Knob + 0xB6 + 0x08 + + + + + + + + [Channel1] + MaudioXponent.filterKill + Channel 1 Mid Button Press + 0x90 + 0x09 + + + + + + [Channel1] + MaudioXponent.filterKill + Channel 1 Mid Button Release + 0x80 + 0x09 + + + + + + [Channel1] + filterMid + Channel 1 Mid Knob + 0xB0 + 0x09 + + + + + + + [Channel2] + MaudioXponent.filterKill + Channel 2 Mid Button Press + 0x91 + 0x09 + + + + + + [Channel2] + MaudioXponent.filterKill + Channel 2 Mid Button Release + 0x81 + 0x09 + + + + + + [Channel2] + filterMid + Channel 2 Mid Knob + 0xB1 + 0x09 + + + + + + + [Channel3] + MaudioXponent.filterKill + Channel 3 Mid Button Press + 0x95 + 0x09 + + + + + + [Channel3] + MaudioXponent.filterKill + Channel 3 Mid Button Release + 0x85 + 0x09 + + + + + + [Channel3] + filterMid + Channel 3 Mid Knob + 0xB5 + 0x09 + + + + + + + [Channel4] + MaudioXponent.filterKill + Channel 4 Mid Button Press + 0x96 + 0x09 + + + + + + [Channel4] + MaudioXponent.filterKill + Channel 4 Mid Button Release + 0x86 + 0x09 + + + + + + [Channel4] + filterMid + Channel 4 Mid Knob + 0xB6 + 0x09 + + + + + + + [Channel1] + MaudioXponent.filterKill + Channel 1 High Button Press + 0x90 + 0x0A + + + + + + [Channel1] + MaudioXponent.filterKill + Channel 1 High Button Release + 0x80 + 0x0A + + + + + + [Channel1] + filterHigh + Channel 1 High Knob + 0xB0 + 0x0A + + + + + + + [Channel2] + MaudioXponent.filterKill + Channel 2 High Button Press + 0x91 + 0x0A + + + + + + [Channel2] + MaudioXponent.filterKill + Channel 2 High Button Release + 0x81 + 0x0A + + + + + + [Channel2] + filterHigh + Channel 2 High Knob + 0xB1 + 0x0A + + + + + + + [Channel3] + MaudioXponent.filterKill + Channel 3 High Button Press + 0x95 + 0x0A + + + + + + [Channel3] + MaudioXponent.filterKill + Channel 3 High Button Release + 0x85 + 0x0A + + + + + + [Channel3] + filterHigh + Channel 3 High Knob + 0xB5 + 0x0A + + + + + + + [Channel4] + MaudioXponent.filterKill + Channel 4 High Button Press + 0x96 + 0x0A + + + + + + [Channel4] + MaudioXponent.filterKill + Channel 4 High Button Release + 0x86 + 0x0A + + + + + + [Channel4] + filterHigh + Channel 4 High Knob + 0xB6 + 0x0A + + + + + + + [Channel1] + MaudioXponent.filterKill + Channel 1 Gain Button Press + 0x90 + 0x0B + + + + + + [Channel1] + MaudioXponent.filterKill + Channel 1 Gain Button Release + 0x80 + 0x0B + + + + + + [Channel1] + pregain + Channel 1 Gain Knob + 0xB0 + 0x0B + + + + + + + [Channel2] + MaudioXponent.filterKill + Channel 2 Gain Button Press + 0x91 + 0x0B + + + + + + [Channel2] + MaudioXponent.filterKill + Channel 2 Gain Button Release + 0x81 + 0x0B + + + + + + [Channel2] + pregain + Channel 2 Gain Knob + 0xB1 + 0x0B + + + + + + + [Channel3] + MaudioXponent.filterKill + Channel 3 Gain Button Press + 0x95 + 0x0B + + + + + + [Channel3] + MaudioXponent.filterKill + Channel 3 Gain Button Release + 0x85 + 0x0B + + + + + + [Channel3] + pregain + Channel 3 Gain Knob + 0xB5 + 0x0B + + + + + + + [Channel4] + MaudioXponent.filterKill + Channel 4 Gain Button Press + 0x96 + 0x0B + + + + + + [Channel4] + MaudioXponent.filterKill + Channel 4 Gain Button Release + 0x86 + 0x0B + + + + + + [Channel4] + pregain + Channel 4 Gain Knob + 0xB6 + 0x0B + + + + + + + [Sampler1] + MaudioXponent.samplerButton + Sampler 1 Button Press (Bank A) + 0x90 + 0x0C + + + + + + [Sampler1] + MaudioXponent.samplerButton + Sampler 1 Button Release (Bank A) + 0x80 + 0x0C + + + + + + + [Sampler1] + MaudioXponent.samplerButton + Sampler 1 Button Press (Bank B) + 0x95 + 0x0C + + + + + + [Sampler1] + MaudioXponent.samplerButton + Sampler 1 Button Release (Bank B) + 0x85 + 0x0C + + + + + + + [Sampler1] + pregain + Sampler 1 Knob (Bank A) + 0xB0 + 0x0C + + + + + + [Sampler1] + pregain + Sampler 1 Knob (Bank B) + 0xB5 + 0x0C + + + + + + + [Sampler2] + MaudioXponent.samplerButton + Sampler 2 Button Press (Bank A) + 0x90 + 0x0D + + + + + + [Sampler2] + MaudioXponent.samplerButton + Sampler 2 Button Release (Bank A) + 0x80 + 0x0D + + + + + + + [Sampler2] + MaudioXponent.samplerButton + Sampler 2 Button Press (Bank B) + 0x95 + 0x0D + + + + + + [Sampler2] + MaudioXponent.samplerButton + Sampler 2 Button Release (Bank B) + 0x85 + 0x0D + + + + + + + [Sampler2] + pregain + Sampler 2 Knob (Bank A) + 0xB0 + 0x0D + + + + + + [Sampler2] + pregain + Sampler 2 Knob (Bank B) + 0xB5 + 0x0D + + + + + + + [Sampler3] + MaudioXponent.samplerButton + Sampler 3 Button Press (Bank A) + 0x90 + 0x0E + + + + + + [Sampler3] + MaudioXponent.samplerButton + Sampler 3 Button Release (Bank A) + 0x80 + 0x0E + + + + + + + [Sampler3] + MaudioXponent.samplerButton + Sampler 3 Button Press (Bank B) + 0x95 + 0x0E + + + + + + [Sampler3] + MaudioXponent.samplerButton + Sampler 3 Button Release (Bank B) + 0x85 + 0x0E + + + + + + + [Sampler3] + pregain + Sampler 3 Knob (Bank A) + 0xB0 + 0x0E + + + + + + [Sampler3] + pregain + Sampler 3 Knob (Bank B) + 0xB5 + 0x0E + + + + + + + [Sampler4] + MaudioXponent.samplerButton + Sampler 4 Button Press (Bank A) + 0x90 + 0x0F + + + + + + [Sampler4] + MaudioXponent.samplerButton + Sampler 4 Button Release (Bank A) + 0x80 + 0x0F + + + + + + + [Sampler4] + MaudioXponent.samplerButton + Sampler 4 Button Press (Bank B) + 0x95 + 0x0F + + + + + + [Sampler4] + MaudioXponent.samplerButton + Sampler 4 Button Relase (Bank B) + 0x85 + 0x0F + + + + + + + [Sampler4] + pregain + Sampler 4 Knob (Bank A) + 0xB0 + 0x0F + + + + + + [Sampler4] + pregain + Sampler 4 Knob (Bank B) + 0xB5 + 0x0F + + + + + + + [Channel2] + MaudioXponent.effectButton + Effect Button 1 Press + 0x91 + 0x0C + + + + + + [Channel2] + MaudioXponent.effectButton + Effect Button 2 Press + 0x91 + 0x0D + + + + + + [Channel2] + MaudioXponent.effectButton + Effect Button 3 Press + 0x91 + 0x0E + + + + + + [Channel2] + MaudioXponent.effectButton + Effect Button 4 Press + 0x91 + 0x0F + + + + + + + [Channel4] + MaudioXponent.effectButton + Effect Button 1 Press + 0x96 + 0x0C + + + + + + [Channel4] + MaudioXponent.effectButton + Effect Button 2 Press + 0x96 + 0x0D + + + + + + [Channel4] + MaudioXponent.effectButton + Effect Button 3 Press + 0x96 + 0x0E + + + + + + [Channel4] + MaudioXponent.effectButton + Effect Button 4 Press + 0x96 + 0x0F + + + + + + + [Channel2] + MaudioXponent.effectKnob + Effect Parameter 1 Knob + 0xB1 + 0x0C + + + + + + [Channel2] + MaudioXponent.effectKnob + Effect Parameter 2 Knob + 0xB1 + 0x0D + + + + + + [Channel2] + MaudioXponent.effectKnob + Effect Parameter 3 Knob + 0xB1 + 0x0E + + + + + + [Channel2] + MaudioXponent.effectKnob + Effect Parameter 4 Knob + 0xB1 + 0x0F + + + + + + + [Channel4] + MaudioXponent.effectKnob + Effect Parameter 1 Knob + 0xB6 + 0x0C + + + + + + [Channel4] + MaudioXponent.effectKnob + Effect Parameter 2 Knob + 0xB6 + 0x0D + + + + + + [Channel4] + MaudioXponent.effectKnob + Effect Parameter 3 Knob + 0xB6 + 0x0E + + + + + + [Channel4] + MaudioXponent.effectKnob + Effect Parameter 4 Knob + 0xB6 + 0x0F + + + + + + + [Channel1] + MaudioXponent.nudge + Channel 1 Nudge Left Button Press + 0x90 + 0x10 + + + + + + [Channel1] + MaudioXponent.nudge + Channel 1 Nudge Left Button Release + 0x80 + 0x10 + + + + + + + [Channel2] + MaudioXponent.nudge + Channel 2 Nudge Left Button Press + 0x91 + 0x10 + + + + + + [Channel2] + MaudioXponent.nudge + Channel 2 Nudge Left Button Release + 0x81 + 0x10 + + + + + + + + [Channel3] + MaudioXponent.nudge + Channel 3 Nudge Left Button Press + 0x95 + 0x10 + + + + + + [Channel3] + MaudioXponent.nudge + Channel 3 Nudge Left Button Release + 0x85 + 0x10 + + + + + + + [Channel4] + MaudioXponent.nudge + Channel 4 Nudge Left Button Press + 0x96 + 0x10 + + + + + + [Channel4] + MaudioXponent.nudge + Channel 4 Nudge Left Button Release + 0x86 + 0x10 + + + + + + + [Channel1] + MaudioXponent.nudge + Channel 1 Nudge Right Button Press + 0x90 + 0x11 + + + + + + [Channel1] + MaudioXponent.nudge + Channel 1 Nudge Right Button Release + 0x80 + 0x11 + + + + + + + [Channel2] + MaudioXponent.nudge + Channel 2 Nudge Right Button Press + 0x91 + 0x11 + + + + + + [Channel2] + MaudioXponent.nudge + Channel 2 Nudge Right Button Release + 0x81 + 0x11 + + + + + + + [Channel3] + MaudioXponent.nudge + Channel 3 Nudge Right Button Press + 0x95 + 0x11 + + + + + + [Channel3] + MaudioXponent.nudge + Channel 3 Nudge Right Button Release + 0x85 + 0x11 + + + + + + + [Channel4] + MaudioXponent.nudge + Channel 4 Nudge Right Button Press + 0x96 + 0x11 + + + + + + [Channel4] + MaudioXponent.nudge + Channel 4 Nudge Right Button Release + 0x86 + 0x11 + + + + + + + [Channel1] + MaudioXponent.brake + Channel 1 Brake Button Press + 0x90 + 0x12 + + + + + + [Channel1] + MaudioXponent.brake + Channel 1 Brake Button Release + 0x80 + 0x12 + + + + + + + [Channel2] + MaudioXponent.brake + Channel 2 Brake Button Press + 0x91 + 0x12 + + + + + + [Channel2] + MaudioXponent.brake + Channel 2 Brake Button Release + 0x81 + 0x12 + + + + + + + [Channel3] + MaudioXponent.brake + Channel 3 Brake Button Press + 0x95 + 0x12 + + + + + + [Channel3] + MaudioXponent.brake + Channel 3 Brake Button Release + 0x85 + 0x12 + + + + + + + [Channel4] + MaudioXponent.brake + Channel 4 Brake Button Press + 0x96 + 0x12 + + + + + + [Channel4] + MaudioXponent.brake + Channel 4 Brake Button Release + 0x86 + 0x12 + + + + + + + [Channel1] + MaudioXponent.reverse + Channel 1 Reverse Button Press + 0x90 + 0x13 + + + + + + [Channel1] + MaudioXponent.reverse + Channel 1 Reverse Button Release + 0x80 + 0x13 + + + + + + + [Channel2] + MaudioXponent.reverse + Channel 2 Reverse Button Press + 0x91 + 0x13 + + + + + + [Channel2] + MaudioXponent.reverse + Channel 2 Reverse Button Release + 0x81 + 0x13 + + + + + + + + [Channel3] + MaudioXponent.reverse + Channel 3 Reverse Button Press + 0x95 + 0x13 + + + + + + [Channel3] + MaudioXponent.reverse + Channel 3 Reverse Button Release + 0x85 + 0x13 + + + + + + + [Channel4] + MaudioXponent.reverse + Channel 4 Reverse Button Press + 0x96 + 0x13 + + + + + + [Channel4] + MaudioXponent.reverse + Channel 4 Reverse Button Release + 0x86 + 0x13 + + + + + + + [Channel1] + MaudioXponent.pfl + Channel 1 Pre-Fade Listen Button Press + 0x90 + 0x14 + + + + + + [Channel2] + MaudioXponent.pfl + Channel 2 Pre-Fade Listen Button Press + 0x91 + 0x14 + + + + + + [Channel3] + MaudioXponent.pfl + Channel 3 Pre-Fade Listen Button Press + 0x95 + 0x14 + + + + + + [Channel4] + MaudioXponent.pfl + Channel 4 Pre-Fade Listen Button Press + 0x96 + 0x14 + + + + + + + [Channel1] + MaudioXponent.toggleScratchMode + Channel 1 Scratch Button Press + 0x90 + 0x15 + + + + + + [Channel2] + MaudioXponent.toggleScratchMode + Channel 2 Scratch Button Press + 0x91 + 0x15 + + + + + + [Channel3] + MaudioXponent.toggleScratchMode + Channel 3 Scratch Button Press + 0x95 + 0x15 + + + + + + [Channel4] + MaudioXponent.toggleScratchMode + Channel 4 Scratch Button Press + 0x96 + 0x15 + + + + + + + [Channel1] + MaudioXponent.wheelTouch + Channel 1 Wheel Press + 0x90 + 0x16 + + + + + + [Channel1] + MaudioXponent.wheelTouch + Channel 1 Wheel Release + 0x80 + 0x16 + + + + + + + [Channel2] + MaudioXponent.wheelTouch + Channel 2 Wheel Press + 0x91 + 0x16 + + + + + + [Channel2] + MaudioXponent.wheelTouch + Channel 2 Wheel Release + 0x81 + 0x16 + + + + + + + [Channel3] + MaudioXponent.wheelTouch + Channel 3 Wheel Press + 0x95 + 0x16 + + + + + + [Channel3] + MaudioXponent.wheelTouch + Channel 3 Wheel Release + 0x85 + 0x16 + + + + + + + [Channel4] + MaudioXponent.wheelTouch + Channel 4 Wheel Press + 0x96 + 0x16 + + + + + + [Channel4] + MaudioXponent.wheelTouch + Channel 4 Wheel Release + 0x86 + 0x16 + + + + + + + [Channel1] + MaudioXponent.wheel + Channel 1 Wheel Rotate + 0xB0 + 0x16 + + + + + + [Channel2] + MaudioXponent.wheel + Channel 2 Wheel Rotate + 0xB1 + 0x16 + + + + + + [Channel3] + MaudioXponent.wheel + Channel 3 Wheel Rotate + 0xB5 + 0x16 + + + + + + [Channel4] + MaudioXponent.wheel + Channel 4 Wheel Rotate + 0xB6 + 0x16 + + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 1 Press + 0x90 + 0x17 + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 1 Release + 0x80 + 0x17 + + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 1 Hotcue 1 Press + 0x91 + 0x17 + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 1 Hotcue 1 Release + 0x81 + 0x17 + + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 3 Hotcue 1 Press + 0x95 + 0x17 + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 3 Hotcue 1 Release + 0x85 + 0x17 + + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 1 Press + 0x96 + 0x17 + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 1 Release + 0x86 + 0x17 + + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 2 Press + 0x90 + 0x18 + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 2 Release + 0x80 + 0x18 + + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 2 Hotcue 2 Press + 0x91 + 0x18 + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 2 Hotcue 2 Release + 0x81 + 0x18 + + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 3 Hotcue 2 Press + 0x95 + 0x18 + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 3 Hotcue 2 Release + 0x85 + 0x18 + + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 2 Press + 0x96 + 0x18 + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 2 Release + 0x86 + 0x18 + + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 3 Press + 0x90 + 0x19 + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 3 Release + 0x80 + 0x19 + + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 2 Hotcue 3 Press + 0x91 + 0x19 + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 2 Hotcue 3 Release + 0x81 + 0x19 + + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 31 Hotcue 3 Press + 0x95 + 0x19 + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 3 Hotcue 3 Release + 0x85 + 0x19 + + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 3 Press + 0x96 + 0x19 + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 3 Release + 0x86 + 0x19 + + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 4 Press + 0x90 + 0x1A + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 4 Release + 0x80 + 0x1A + + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 2 Hotcue 4 Press + 0x91 + 0x1A + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 2 Hotcue 4 Release + 0x81 + 0x1A + + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 3 Hotcue 4 Press + 0x95 + 0x1A + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 3 Hotcue 4 Release + 0x85 + 0x1A + + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 4 Press + 0x96 + 0x1A + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 4 Release + 0x86 + 0x1A + + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 5 Press + 0x90 + 0x1B + + + + + + [Channel1] + MaudioXponent.hotcue + Channel 1 Hotcue 5 Release + 0x80 + 0x1B + + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 2 Hotcue 5 Press + 0x91 + 0x1B + + + + + + [Channel2] + MaudioXponent.hotcue + Channel 2 Hotcue 5 Release + 0x81 + 0x1B + + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 3 Hotcue 5 Press + 0x95 + 0x1B + + + + + + [Channel3] + MaudioXponent.hotcue + Channel 3 Hotcue 5 Release + 0x85 + 0x1B + + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 5 Press + 0x96 + 0x1B + + + + + + [Channel4] + MaudioXponent.hotcue + Channel 4 Hotcue 5 Release + 0x86 + 0x1B + + + + + + + [Channel1] + MaudioXponent.beatgridAdjust + Channel 1 Beatgrid Left Press + 0x90 + 0x1C + + + + + + [Channel2] + MaudioXponent.beatgridAdjust + Channel 2 Beatgrid Left Press + 0x91 + 0x1C + + + + + + [Channel3] + MaudioXponent.beatgridAdjust + Channel 3 Beatgrid Left Press + 0x95 + 0x1C + + + + + + [Channel4] + MaudioXponent.beatgridAdjust + Channel 4 Beatgrid Left Press + 0x96 + 0x1C + + + + + + + [Channel1] + MaudioXponent.beatgridAdjust + Channel 1 Beatgrid Right Press + 0x90 + 0x1D + + + + + + [Channel2] + MaudioXponent.beatgridAdjust + Channel 2 Beatgrid Right Press + 0x91 + 0x1D + + + + + + [Channel3] + MaudioXponent.beatgridAdjust + Channel 3 Beatgrid Right Press + 0x95 + 0x1D + + + + + + [Channel4] + MaudioXponent.beatgridAdjust + Channel 4 Beatgrid Right Press + 0x96 + 0x1D + + + + + + + [Channel1] + MaudioXponent.keyLock + Channel 1 Lock Press + 0x90 + 0x1E + + + + + + [Channel2] + MaudioXponent.keyLock + Channel 2 Lock Press + 0x91 + 0x1E + + + + + + [Channel3] + MaudioXponent.keyLock + Channel 3 Lock Press + 0x95 + 0x1E + + + + + + [Channel4] + MaudioXponent.keyLock + Channel 4 Lock Press + 0x96 + 0x1E + + + + + + + [Channel1] + rate_perm_up + Channel 1 Plus Press + 0x90 + 0x1F + + + + + + [Channel1] + rate_perm_up + Channel 1 Plus Release + 0x80 + 0x1F + + + + + + + [Channel2] + rate_perm_up + Channel 2 Plus Press + 0x91 + 0x1F + + + + + + [Channel2] + rate_perm_up + Channel 2 Plus Release + 0x81 + 0x1F + + + + + + + [Channel3] + rate_perm_up + Channel 3 Plus Press + 0x95 + 0x1F + + + + + + [Channel3] + rate_perm_up + Channel 3 Plus Release + 0x85 + 0x1F + + + + + + + [Channel4] + rate_perm_up + Channel 4 Plus Press + 0x96 + 0x1F + + + + + + [Channel4] + rate_perm_up + Channel 4 Plus Release + 0x86 + 0x1F + + + + + + + [Channel1] + rate_perm_down + Channel 1 Minus Press + 0x90 + 0x20 + + + + + + [Channel1] + rate_perm_down + Channel 1 Minus Release + 0x80 + 0x20 + + + + + + + [Channel2] + rate_perm_down + Channel 2 Minus Press + 0x91 + 0x20 + + + + + + [Channel2] + rate_perm_down + Channel 2 Minus Release + 0x81 + 0x20 + + + + + + + [Channel3] + rate_perm_down + Channel 3 Minus Press + 0x95 + 0x20 + + + + + + [Channel3] + rate_perm_down + Channel 3 Minus Release + 0x85 + 0x20 + + + + + + + [Channel4] + rate_perm_down + Channel 4 Minus Press + 0x96 + 0x20 + + + + + + [Channel4] + rate_perm_down + Channel 4 Minus Release + 0x86 + 0x20 + + + + + + + [Channel1] + MaudioXponent.seek + Channel 1 Seek Left Press + 0x90 + 0x21 + + + + + + [Channel1] + MaudioXponent.seek + Channel 1 Seek Left Release + 0x80 + 0x21 + + + + + + + [Channel2] + MaudioXponent.seek + Channel 2 Seek Left Press + 0x91 + 0x21 + + + + + + [Channel2] + MaudioXponent.seek + Channel 2 Seek Left Release + 0x81 + 0x21 + + + + + + + + [Channel3] + MaudioXponent.seek + Channel 3 Seek Left Press + 0x95 + 0x21 + + + + + + [Channel3] + MaudioXponent.seek + Channel 3 Seek Left Release + 0x85 + 0x21 + + + + + + + [Channel4] + MaudioXponent.seek + Channel 4 Seek Left Press + 0x86 + 0x21 + + + + + + [Channel4] + MaudioXponent.seek + Channel 4 Seek Left Release + 0x96 + 0x21 + + + + + + + [Channel1] + MaudioXponent.seek + Channel 1 Seek Right Press + 0x90 + 0x22 + + + + + + [Channel1] + MaudioXponent.seek + Channel 1 Seek Right Release + 0x80 + 0x22 + + + + + + + [Channel2] + MaudioXponent.seek + Channel 2 Seek Right Press + 0x81 + 0x22 + + + + + + [Channel2] + MaudioXponent.seek + Channel 2 Seek Right Release + 0x91 + 0x22 + + + + + + + [Channel3] + MaudioXponent.seek + Channel 3 Seek Right Press + 0x95 + 0x22 + + + + + + [Channel3] + MaudioXponent.seek + Channel 3 Seek Right Release + 0x85 + 0x22 + + + + + + + [Channel4] + MaudioXponent.seek + Channel 4 Seek Right Press + 0x86 + 0x22 + + + + + + [Channel4] + MaudioXponent.seek + Channel 4 Seek Right Release + 0x96 + 0x22 + + + + + + + [Channel1] + MaudioXponent.cue + Channel 1 Cue Press + 0x90 + 0x23 + + + + + + [Channel1] + MaudioXponent.cue + Channel 1 Cue Release + 0x80 + 0x23 + + + + + + + [Channel2] + MaudioXponent.cue + Channel 2 Cue Press + 0x81 + 0x23 + + + + + + [Channel2] + MaudioXponent.cue + Channel 2 Cue Release + 0x91 + 0x23 + + + + + + + [Channel3] + MaudioXponent.cue + Channel 3 Cue Press + 0x95 + 0x23 + + + + + + [Channel3] + MaudioXponent.cue + Channel 3 Cue Release + 0x85 + 0x23 + + + + + + + [Channel4] + MaudioXponent.cue + Channel 4 Cue Press + 0x86 + 0x23 + + + + + + [Channel4] + MaudioXponent.cue + Channel 4 Cue Release + 0x96 + 0x23 + + + + + + + [Channel1] + MaudioXponent.play + Channel 1 Play/Pause Press + 0x90 + 0x24 + + + + + + [Channel1] + MaudioXponent.play + Channel 1 Play/Pause Release + 0x80 + 0x24 + + + + + + + [Channel2] + MaudioXponent.play + Channel 2 Play/Pause Release + 0x91 + 0x24 + + + + + + [Channel2] + MaudioXponent.play + Channel 2 Play/Pause Press + 0x81 + 0x24 + + + + + + + [Channel3] + MaudioXponent.play + Channel 3 Play/Pause Press + 0x95 + 0x24 + + + + + + [Channel3] + MaudioXponent.play + Channel 3 Play/Pause Release + 0x85 + 0x24 + + + + + + + [Channel4] + MaudioXponent.play + Channel 4 Play/Pause Press + 0x96 + 0x24 + + + + + + [Channel4] + MaudioXponent.play + Channel 4 Play/Pause Release + 0x86 + 0x24 + + + + + + + [Channel1] + MaudioXponent.beatgridLoop + Channel 1 Loop 1 Press + 0x90 + 0x25 + + + + + + [Channel1] + MaudioXponent.beatgridLoop + Channel 1 Loop 1 Release + 0x80 + 0x25 + + + + + + + [Channel2] + MaudioXponent.beatgridLoop + Channel 2 Loop 1 Press + 0x91 + 0x25 + + + + + + [Channel2] + MaudioXponent.beatgridLoop + Channel 2 Loop 1 Release + 0x81 + 0x25 + + + + + + + [Channel3] + MaudioXponent.beatgridLoop + Channel 3 Loop 1 Press + 0x95 + 0x25 + + + + + + [Channel3] + MaudioXponent.beatgridLoop + Channel 3 Loop 1 Release + 0x85 + 0x25 + + + + + + + [Channel4] + MaudioXponent.beatgridLoop + Channel 4 Loop 1 Press + 0x96 + 0x25 + + + + + + [Channel4] + MaudioXponent.beatgridLoop + Channel 4 Loop 1 Release + 0x86 + 0x25 + + + + + + + [Channel1] + MaudioXponent.beatgridLoop + Channel 1 Loop 2 Press + 0x90 + 0x26 + + + + + + [Channel1] + MaudioXponent.beatgridLoop + Channel 1 Loop 2 Release + 0x80 + 0x26 + + + + + + + [Channel2] + MaudioXponent.beatgridLoop + Channel 2 Loop 2 Press + 0x91 + 0x26 + + + + + + [Channel2] + MaudioXponent.beatgridLoop + Channel 2 Loop 2 Release + 0x81 + 0x26 + + + + + + + [Channel3] + MaudioXponent.beatgridLoop + Channel 3 Loop 2 Press + 0x95 + 0x26 + + + + + + [Channel3] + MaudioXponent.beatgridLoop + Channel 3 Loop 2 Release + 0x85 + 0x26 + + + + + + + [Channel4] + MaudioXponent.beatgridLoop + Channel 4 Loop 2 Press + 0x96 + 0x26 + + + + + + [Channel4] + MaudioXponent.beatgridLoop + Channel 4 Loop 2 Release + 0x86 + 0x26 + + + + + + + [Channel1] + MaudioXponent.beatgridLoop + Channel 1 Loop 4 Press + 0x90 + 0x27 + + + + + + [Channel1] + MaudioXponent.beatgridLoop + Channel 1 Loop 4 Release + 0x80 + 0x27 + + + + + + + [Channel2] + MaudioXponent.beatgridLoop + Channel 2 Loop 4 Press + 0x91 + 0x27 + + + + + + [Channel2] + MaudioXponent.beatgridLoop + Channel 2 Loop 4 Release + 0x81 + 0x27 + + + + + + + [Channel3] + MaudioXponent.beatgridLoop + Channel 3 Loop 4 Press + 0x95 + 0x27 + + + + + + [Channel3] + MaudioXponent.beatgridLoop + Channel 3 Loop 4 Release + 0x85 + 0x27 + + + + + + + [Channel4] + MaudioXponent.beatgridLoop + Channel 4 Loop 4 Press + 0x96 + 0x27 + + + + + + [Channel4] + MaudioXponent.beatgridLoop + Channel 4 Loop 4 Release + 0x86 + 0x27 + + + + + + + [Channel1] + MaudioXponent.beatgridLoop + Channel 1 Loop 8 Press + 0x90 + 0x28 + + + + + + [Channel1] + MaudioXponent.beatgridLoop + Channel 1 Loop 8 Release + 0x80 + 0x28 + + + + + + + [Channel2] + MaudioXponent.beatgridLoop + Channel 2 Loop 8 Press + 0x91 + 0x28 + + + + + + [Channel2] + MaudioXponent.beatgridLoop + Channel 2 Loop 8 Release + 0x81 + 0x28 + + + + + + + [Channel3] + MaudioXponent.beatgridLoop + Channel 3 Loop 8 Press + 0x95 + 0x28 + + + + + + [Channel3] + MaudioXponent.beatgridLoop + Channel 3 Loop 8 Release + 0x85 + 0x28 + + + + + + + [Channel4] + MaudioXponent.beatgridLoop + Channel 4 Loop 8 Press + 0x96 + 0x28 + + + + + + [Channel4] + MaudioXponent.beatgridLoop + Channel 4 Loop 8 Release + 0x86 + 0x28 + + + + + + + [Channel1] + MaudioXponent.loopin + Channel 1 Loop In Press + 0x90 + 0x29 + + + + + + [Channel2] + MaudioXponent.loopin + Channel 2 Loop In Press + 0x91 + 0x29 + + + + + + [Channel3] + MaudioXponent.loopin + Channel 3 Loop In Press + 0x95 + 0x29 + + + + + + [Channel4] + MaudioXponent.loopin + Channel 4 Loop In Press + 0x96 + 0x29 + + + + + + + [Channel1] + MaudioXponent.loopexit + Channel 1 Loop Exit Press + 0x90 + 0x2A + + + + + + [Channel2] + MaudioXponent.loopexit + Channel 2 Loop Exit Press + 0x91 + 0x2A + + + + + + [Channel3] + MaudioXponent.loopexit + Channel 3 Loop Exit Press + 0x95 + 0x2A + + + + + + [Channel4] + MaudioXponent.loopexit + Channel 4 Loop Exit Press + 0x96 + 0x2A + + + + + + + [Channel1] + MaudioXponent.loopout + Channel 1 Loop Out Press + 0x90 + 0x2B + + + + + + [Channel2] + MaudioXponent.loopout + Channel 2 Loop Out Press + 0x91 + 0x2B + + + + + + [Channel3] + MaudioXponent.loopout + Channel 3 Loop Out Press + 0x95 + 0x2B + + + + + + [Channel4] + MaudioXponent.loopout + Channel 4 Loop Out Press + 0x96 + 0x2B + + + + + + + [Channel1] + MaudioXponent.shift + Channel 1 Shift Press + 0x90 + 0x2C + + + + + + [Channel1] + MaudioXponent.shift + Channel 1 Shift Release + 0x80 + 0x2C + + + + + + + [Channel2] + MaudioXponent.shift + Channel 2 Shift Press + 0x91 + 0x2C + + + + + + [Channel2] + MaudioXponent.shift + Channel 2 Shift Release + 0x81 + 0x2C + + + + + + + [Channel3] + MaudioXponent.shift + Channel 3 Shift Press + 0x95 + 0x2C + + + + + + [Channel3] + MaudioXponent.shift + Channel 3 Shift Release + 0x85 + 0x2C + + + + + + + [Channel4] + MaudioXponent.shift + Channel 4 Shift Press + 0x96 + 0x2C + + + + + + [Channel4] + MaudioXponent.shift + Channel 4 Shift Release + 0x86 + 0x2C + + + + + + + [Master] + MaudioXponent.crossfader + Crossfader + 0xB2 + 0x07 + + + + + + [Master] + MaudioXponent.crossfader + Crossfader + 0xB7 + 0x07 + + + + + + + [Channel1] + volume + Channel 1 Fader + 0xB0 + 0x07 + + + + + + [Channel2] + volume + Channel 2 Fader + 0xB1 + 0x07 + + + + + + [Channel3] + volume + Channel 3 Fader + 0xB5 + 0x07 + + + + + + [Channel4] + volume + Channel 4 Fader + 0xB6 + 0x07 + + + + + + + [Master] + headMix + Headphone Mix + 0xB2 + 0x0D + + + + + + [Master] + headMix + Headphone Mix + 0xB7 + 0x0D + + + + + + + [Channel1] + MaudioXponent.pitch + Channel 1 Rate + 0xE0 + + + + + + [Channel2] + MaudioXponent.pitch + Channel 2 Rate + 0xE1 + + + + + + [Channel3] + MaudioXponent.pitch + Channel 3 Rate + 0xE5 + + + + + + [Channel4] + MaudioXponent.pitch + Channel 4 Rate + 0xE6 + + + + + + + + [Channel1] + cue_default + 0x90 + 0x23 + 1 + + + [Channel2] + cue_default + 0x91 + 0x23 + 1 + + + [Channel3] + cue_default + 0x95 + 0x23 + 1 + + + [Channel4] + cue_default + 0x96 + 0x23 + 1 + + + + [Channel1] + back + 0x90 + 0x21 + 1 + + + [Channel2] + back + 0x91 + 0x21 + 1 + + + [Channel3] + back + 0x95 + 0x21 + 1 + + + [Channel4] + back + 0x96 + 0x21 + 1 + + + [Channel1] + fwd + 0x90 + 0x22 + 1 + + + [Channel2] + fwd + 0x91 + 0x22 + 1 + + + [Channel3] + fwd + 0x95 + 0x22 + 1 + + + [Channel4] + fwd + 0x96 + 0x22 + 1 + + + + \ No newline at end of file diff --git a/res/controllers/M-Audio-Xponent-Advanced-scripts.js b/res/controllers/M-Audio-Xponent-Advanced-scripts.js new file mode 100644 index 000000000000..f6a4f00ee198 --- /dev/null +++ b/res/controllers/M-Audio-Xponent-Advanced-scripts.js @@ -0,0 +1,882 @@ +/* global engine script midi */ + +function MaudioXponent () {} + +// ---------- Global variables ---------- +MaudioXponent.id = ""; // The ID for the particular device being controlled for use in debugging, set at init time +MaudioXponent.on = 0x90; +MaudioXponent.off = 0x80; +MaudioXponent.maxDecks = 0x04; +MaudioXponent.leftDeck; +MaudioXponent.rightDeck; +MaudioXponent.bankA = 0x82; +MaudioXponent.bankB = 0x92; +MaudioXponent.Handshake1 = [0xF0,0x7E,0x7F,0x06,0x01,0xF7]; +MaudioXponent.Handshake2 = [0xF0,0x00,0x20,0x08,0x00,0x00,0x63,0x0E,0x16,0x40,0x00,0x01,0xF7]; +MaudioXponent.Handshake3 = [0xF0,0x00,0x20,0x08,0x00,0x00,0x63,0x0E,0x16,0x40,0x00,0x00,0xF7]; + +MaudioXponent.config = { + nudgeButtonMode : 0, // 0 = Normal, 1 = Reversed + pflMode : 0, // 0 = Independent, 1 = Toggle + syncFlashMode : 0, // 0 = Off, 1 = Pulse, 2 = Toggle + vuMeterMode : 1, // 0 = Master, 1 = Channel + tapDuration : 250, // Maximum touch duration for wheel tap (in milliseconds) +}; + +MaudioXponent.decks = +[ + { noteOffset : 0, on : 0x90, off : 0x80, isLeft : true, isRight : false, isBankA : true, isBankB : false }, + { noteOffset : 1, on : 0x91, off : 0x81, isLeft : false, isRight : true, isBankA : true, isBankB : false }, + { noteOffset : 5, on : 0x95, off : 0x85, isLeft : true, isRight : false, isBankA : false, isBankB : true }, + { noteOffset : 6, on : 0x96, off : 0x86, isLeft : false, isRight : true, isBankA : false, isBankB : true }, +]; + +MaudioXponent.state = { + bank : 0, // Which position is the bank switch currently set to? + faderPosition : 0, // Temporary storage for cross-fader position during punch-ins. + focusedEffectUnit : 0, // Which effect chain has the focus, if any. + plnumberpos : 0, + plnumberneg : 0, +}; + +MaudioXponent.buttons = { + "play_indicator": 0x24, + "cue": 0x23, + "back": 0x21, + "fwd": 0x22, + "loopIn": 0x29, + "loopOut": 0x2B, + "loop": 0x2A, + "loop1": 0x25, + "loop2": 0x26, + "loop4": 0x27, + "loop8": 0x28, + "leftkey": 0x1C, + "rightkey": 0x1D, + "key": 0x1E, + "pluskey": 0x1F, + "minkey": 0x20, + "cue1": 0x17, + "cue2": 0x18, + "cue3": 0x19, + "cue4": 0x1A, + "cue5": 0x1B, + "fx1": 0x0C, + "fx2": 0x0D, + "fx3": 0x0E, + "fx4": 0x0F, + "rate_temp_down": MaudioXponent.config.nudgeButtonMode ? 0x11 : 0x10, + "rate_temp_up": MaudioXponent.config.nudgeButtonMode ? 0x10 : 0x11, + "bigx": 0x12, + "reverse": 0x13, + "pfl": 0x14, + "scratch": 0x15, + "punchIn": 0x07, + "sync": 0x02, + "button_parameter1": 0x08, + "button_parameter2": 0x09, + "button_parameter3": 0x0A, + "gain": 0x0B, + "shift": 0x2C, +}; + +MaudioXponent.controls = { + 8: "button_parameter1", + 9: "button_parameter2", + 10: "button_parameter3", + 16: (MaudioXponent.config.nudgeButtonMode ? "rate_temp_up" : "rate_temp_down"), + 17: (MaudioXponent.config.nudgeButtonMode ? "rate_temp_down" : "rate_temp_up"), + 18: "keylock", + 19: "reverse", + 20: "pfl", + 33: "back", + 34: "fwd", + 36: "play", +}; + +// ---------- Functions ---------- +MaudioXponent.logParams = function(functionName, a, b, c, d, e, f) { + print("***"); + print("*** " + functionName + ": a="+ a + ", b=" + b + ", c=" + c + ", d=" + d + ", e=" + e + ", f=" + f); + print("***"); +}; + +MaudioXponent.init = function () { + MaudioXponent.initDecks(); + MaudioXponent.initLights(); + MaudioXponent.syncLights(); + MaudioXponent.syncEffects(); + // MaudioXponent.probeLights(); +}; + +MaudioXponent.initDecks = function() { + // Because vuMeter values change rapidly, we're pre-digesting the parameters for this function + engine.connectControl("[Master]", "VuMeterL", function(value) { MaudioXponent.vuMeter(0, 0, 0, value); }); + engine.connectControl("[Master]", "VuMeterR", function(value) { MaudioXponent.vuMeter(0, 0, 1, value); }); + engine.connectControl("[Channel1]", "VuMeterL", function(value) { MaudioXponent.vuMeter(1, MaudioXponent.bankA, 0, value); }); + engine.connectControl("[Channel2]", "VuMeterR", function(value) { MaudioXponent.vuMeter(1, MaudioXponent.bankA, 1, value); }); + engine.connectControl("[Channel3]", "VuMeterL", function(value) { MaudioXponent.vuMeter(1, MaudioXponent.bankB, 0, value); }); + engine.connectControl("[Channel4]", "VuMeterR", function(value) { MaudioXponent.vuMeter(1, MaudioXponent.bankB, 1, value); }); + + for (var channel = 1; channel <= MaudioXponent.maxDecks; channel++) { + var group = "[Channel" + (channel) + "]"; + var deck = MaudioXponent.decks[channel - 1]; + deck.id = channel; + deck.beatState = false; + deck.group = group; + deck.progressMeterStatusByte = deck.isBankA ? 0xB3 : 0xB8; + deck.progressMeterSecondByte = deck.isLeft ? 0x14 : 0x15; + deck.vuMeterStatusByte = deck.isBankA ? 0xB3 : 0xB8; + deck.vuMeterSecondByte = deck.isLeft ? 0x12 : 0x13; + deck.scratchEnabled = false; + deck.scratching = false; + deck.shift = false; + deck.warnAt = 0; + deck.filterLow = 1; + deck.filterMid = 1; + deck.filterHigh = 1; + deck.pregain = 1; + deck.isPlaying = function() { + return engine.getValue(this.group, "play"); + }; + + engine.connectControl(group, "play_indicator", "MaudioXponent.onPlay"); + engine.connectControl(group, "playposition", "MaudioXponent.onPlayPositionChange"); + engine.connectControl(group, "duration", "MaudioXponent.onTrackLoaded"); + engine.connectControl(group, "beat_active", "MaudioXponent.onBeatActive"); + engine.connectControl(group, "eject", "MaudioXponent.onEject"); + + for (var i = 1; i <= 5; i++) { + engine.connectControl(group, "hotcue_" + i + "_enabled", "MaudioXponent.onHotCue"); + } + + engine.connectControl(group, "loop_enabled", "MaudioXponent.onLoopExit"); + engine.connectControl(group, "loop_in", "MaudioXponent.onLoopIn"); + engine.connectControl(group, "loop_out", "MaudioXponent.onLoopOut"); + for (i = 0.125; i < 16; i *= 2) { + engine.connectControl(group, "beatloop_" + i + "_enabled", "MaudioXponent.onBeatLoop"); + } + + engine.connectControl(group, "keylock", "MaudioXponent.onkeyLock"); + engine.connectControl(group, "bpm", "MaudioXponent.onBpmChanged"); + engine.connectControl(group, "pfl", "MaudioXponent.onPflChanged"); + + engine.connectControl(group, "reverse", "MaudioXponent.onReverse"); + engine.connectControl(group, "reverseroll", "MaudioXponent.onReverse"); + engine.connectControl(group, "rate_temp_down", "MaudioXponent.onNudge"); + engine.connectControl(group, "rate_temp_up", "MaudioXponent.onNudge"); + + engine.connectControl("[EqualizerRack1_" + group + "_Effect1]", "button_parameter1", "MaudioXponent.onFilterKill"); + engine.connectControl("[EqualizerRack1_" + group + "_Effect1]", "button_parameter2", "MaudioXponent.onFilterKill"); + engine.connectControl("[EqualizerRack1_" + group + "_Effect1]", "button_parameter3", "MaudioXponent.onFilterKill"); + + engine.softTakeover("[Master]", "crossfader", true); + engine.softTakeover(group, "rate", true); + engine.softTakeover(group, "volume", true); + + engine.softTakeover("[EqualizerRack1_" + group + "_Effect1]", "parameter1", true); + engine.softTakeover("[EqualizerRack1_" + group + "_Effect1]", "parameter2", true); + engine.softTakeover("[EqualizerRack1_" + group + "_Effect1]", "parameter3", true); + } + + for (i = 1; i <=4; i++) { + group = "[Sampler" + i + "]"; + engine.connectControl(group, "play_indicator", "MaudioXponent.onSampler"); + } + + // Effects parameters... soft-takeover not working in Mixxx 2.0, should work in 2.1 + for(i = 1; i <= 4; i++) { + engine.softTakeover("[EffectRack1_EffectUnit" + i + "_Effect1]", "parameter1", true); + engine.softTakeover("[EffectRack1_EffectUnit" + i + "_Effect1]", "parameter2", true); + engine.softTakeover("[EffectRack1_EffectUnit" + i + "_Effect1]", "parameter3", true); + engine.softTakeover("[EffectRack1_EffectUnit" + i + "]", "mix", true); + } + + // It would be nice to discover some way to force the Xponent to dump its current status. + // Until then, I just have to assume that you start on Bank A + MaudioXponent.bankSwitch(0, 0, 0, MaudioXponent.bankA, 0); +}; + +// Debug/Test-only function +MaudioXponent.probeLights = function() { + var status = 0xB4; + // for(status = 0xB0; status < 0xC0; status++) { + for (var led in MaudioXponent.buttons) { + var byte2 = MaudioXponent.buttons[led]; + // for(byte2 = 0; byte2 < 128; byte2++) { + for(var byte3 = 0; byte3 < 128; byte3++) { + midi.sendShortMsg(status, byte2, byte3); + MaudioXponent.pauseScript(5); + } + } + // } +}; + +MaudioXponent.initLights = function () { + // Enable lights + midi.sendSysexMsg(MaudioXponent.Handshake1, MaudioXponent.Handshake1.length); + midi.sendSysexMsg(MaudioXponent.Handshake2, MaudioXponent.Handshake2.length); + + for (var led in MaudioXponent.buttons) { + midi.sendShortMsg(MaudioXponent.leftDeck.on, MaudioXponent.buttons[led], 0x01); + midi.sendShortMsg(MaudioXponent.rightDeck.on, MaudioXponent.buttons[led], 0x01); + MaudioXponent.pauseScript(15); + } + + for(var i = 0; i <= 10; i += 1) { + var value = MaudioXponent.convert(i * 0.1); + // VU meters + midi.sendShortMsg(MaudioXponent.leftDeck.vuMeterStatusByte, MaudioXponent.leftDeck.vuMeterSecondByte, value); + midi.sendShortMsg(MaudioXponent.rightDeck.vuMeterStatusByte, MaudioXponent.rightDeck.vuMeterSecondByte, value); + + // Progress meters + midi.sendShortMsg(MaudioXponent.leftDeck.progressMeterStatusByte, MaudioXponent.leftDeck.progressMeterSecondByte, value); + midi.sendShortMsg(MaudioXponent.rightDeck.progressMeterStatusByte, MaudioXponent.rightDeck.progressMeterSecondByte, value); + + MaudioXponent.pauseScript(15); + } + + MaudioXponent.pauseScript(500); + + for (led in MaudioXponent.buttons) { + midi.sendShortMsg(MaudioXponent.on, MaudioXponent.buttons[led], 0x00); + midi.sendShortMsg(MaudioXponent.on + 1, MaudioXponent.buttons[led], 0x00); + MaudioXponent.pauseScript(15); + } + + // VU meters + midi.sendShortMsg(MaudioXponent.leftDeck.vuMeterStatusByte, MaudioXponent.leftDeck.vuMeterSecondByte, 0); + midi.sendShortMsg(MaudioXponent.rightDeck.vuMeterStatusByte, MaudioXponent.rightDeck.vuMeterSecondByte, 0); + + // Progress meters + midi.sendShortMsg(MaudioXponent.leftDeck.progressMeterStatusByte, MaudioXponent.leftDeck.progressMeterSecondByte, 0); + midi.sendShortMsg(MaudioXponent.rightDeck.progressMeterStatusByte, MaudioXponent.rightDeck.progressMeterSecondByte, 0); +}; + +MaudioXponent.shutdown = function () { + for (var led in MaudioXponent.buttons) { + midi.sendShortMsg(MaudioXponent.on, MaudioXponent.buttons[led], 0x00); + midi.sendShortMsg(MaudioXponent.on + 1,MaudioXponent.buttons[led], 0x00); + } + + // VU meters + midi.sendShortMsg(MaudioXponent.leftDeck.vuMeterStatusByte, MaudioXponent.leftDeck.vuMeterSecondByte, 0); + midi.sendShortMsg(MaudioXponent.rightDeck.vuMeterStatusByte, MaudioXponent.rightDeck.vuMeterSecondByte, 0); + + // Progress meters + midi.sendShortMsg(MaudioXponent.leftDeck.progressMeterStatusByte, MaudioXponent.leftDeck.progressMeterSecondByte, 0); + midi.sendShortMsg(MaudioXponent.rightDeck.progressMeterStatusByte, MaudioXponent.rightDeck.progressMeterSecondByte, 0); + + // Secret Handshake + midi.sendSysexMsg(MaudioXponent.Handshake3, MaudioXponent.Handshake3.length); +}; + +MaudioXponent.syncLights = function() { + for (var i = 0; i < MaudioXponent.decks.length; i++) { + var deck = MaudioXponent.decks[i]; + + engine.trigger(deck.group, "play_indicator"); + engine.trigger(deck.group, "pfl"); + engine.trigger(deck.group, "loop_enabled"); + engine.trigger(deck.group, "loop_start_position"); + engine.trigger(deck.group, "loop_end_position"); + + engine.trigger("[EqualizerRack1_" + deck.group + "_Effect1]", "button_parameter1"); + engine.trigger("[EqualizerRack1_" + deck.group + "_Effect1]", "button_parameter2"); + engine.trigger("[EqualizerRack1_" + deck.group + "_Effect1]", "button_parameter3"); + + engine.trigger(deck.group, "keylock"); + engine.trigger(deck.group, "hotcue_1_enabled"); + engine.trigger(deck.group, "hotcue_2_enabled"); + engine.trigger(deck.group, "hotcue_3_enabled"); + engine.trigger(deck.group, "hotcue_4_enabled"); + engine.trigger(deck.group, "hotcue_5_enabled"); + + engine.trigger(deck.group, "loop_in"); + engine.trigger(deck.group, "loop_out"); + + midi.sendShortMsg(deck.on, MaudioXponent.buttons.scratch, deck.scratchEnabled); + + var duration = engine.getValue(deck.group, "duration"); + deck.warnAt = (duration - 30) / parseFloat(duration); + engine.trigger(deck.group, "playposition"); + } +}; + +MaudioXponent.syncEffects = function() { + var deck = MaudioXponent.rightDeck; + + for (var i = 1; i <= 4; i++) { + var control = MaudioXponent.buttons.fx1 + i - 1; + var group = "[EffectRack1_EffectUnit" + i + "]"; + if (!deck.shift) { + // Show enabled effect units + var enabled = engine.getValue(group, "enabled"); + midi.sendShortMsg(deck.on, control, enabled); + engine.setValue(group, "show_focus", false); + } else { + // Show focused effect unit + var focused = MaudioXponent.state.focusedEffectUnit === i; + midi.sendShortMsg(deck.on, control, focused); + engine.setValue(group, "show_focus", focused); + if (!focused) { + engine.setValue(group, "focused_effect", focused); + } + } + } +}; + +MaudioXponent.convert = function(value) { + return (value * 127).toFixed(0); +}; + +MaudioXponent.getDeck = function(group) { + return MaudioXponent.decks[parseInt(group.substring(8)) - 1]; +}; + +MaudioXponent.pauseScript = function(ms) { + var startDate = new Date(); + var currentDate = null; + while(currentDate-startDate < ms) currentDate = new Date(); +}; + +MaudioXponent.vuMeter = function(mode, bank, side, value) { + if (mode === MaudioXponent.config.vuMeterMode) { // Accept messages for the active mode + if ((mode === 0) || (bank === MaudioXponent.state.bank)) { // Accept messages for the active bank + value = MaudioXponent.convert(value); + + if (side === 0) { + midi.sendShortMsg(MaudioXponent.leftDeck.vuMeterStatusByte, MaudioXponent.leftDeck.vuMeterSecondByte, value); + } else { + midi.sendShortMsg(MaudioXponent.rightDeck.vuMeterStatusByte, MaudioXponent.rightDeck.vuMeterSecondByte, value); + } + } + } +}; + +MaudioXponent.bankSwitch = function(channel, control, value, status) { + // script.midiDebug(channel, control, value, status); + MaudioXponent.state.bank = status; + + if (status === MaudioXponent.bankA) { + MaudioXponent.leftDeck = MaudioXponent.decks[0]; + MaudioXponent.rightDeck = MaudioXponent.decks[1]; + } else if (status === MaudioXponent.bankB) { + MaudioXponent.leftDeck = MaudioXponent.decks[2]; + MaudioXponent.rightDeck = MaudioXponent.decks[3]; + } + + MaudioXponent.syncLights(); +}; + +MaudioXponent.shift = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var activate = (status === deck.on); + + deck.shift = activate; + midi.sendShortMsg(deck.on, MaudioXponent.buttons.shift, activate); + + // Unfocus effects on shift release + if (!activate && MaudioXponent.state.focusedEffectUnit) { + MaudioXponent.state.focusedEffectUnit = 0; + } + + MaudioXponent.syncEffects(); +}; + +MaudioXponent.beatsync = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on); + + if (activate) { + if (MaudioXponent.leftDeck.shift && MaudioXponent.rightDeck.shift) { + // Double-shift = cycle flash modes + var mode = MaudioXponent.config.syncFlashMode + 1; + if (mode === 3) { + mode = 0; + } + MaudioXponent.config.syncFlashMode = mode; + } else { + if (deck.shift) { + var currentValue = engine.getValue(deck.group, "sync_enabled"); + engine.setValue(deck.group, "sync_enabled", !currentValue); + } else { + engine.setValue(deck.group, "beatsync", activate); + } + } + } + + midi.sendShortMsg(deck.on, MaudioXponent.buttons.sync, activate); +}; + +MaudioXponent.punchIn = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group) + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on); + + if (activate) { + var faderPosition = engine.getValue("[Master]", "crossfader"); + MaudioXponent.state.faderPosition = faderPosition; + + if ((faderPosition >= 0.90 && deck.isLeft) || (faderPosition <= -0.90 && deck.isRight)) { + engine.setValue("[Master]", "crossfader", 0); + } + } else { + engine.setValue("[Master]", "crossfader", MaudioXponent.state.faderPosition); + } + + midi.sendShortMsg(deck.on, MaudioXponent.buttons.punchIn, activate); +}; + +MaudioXponent.filterKill = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on); + + if (control === MaudioXponent.buttons.gain) { + // Gain Buttons + if (activate && (MaudioXponent.leftDeck.shift && MaudioXponent.rightDeck.shift)) { + // Double-shift = cycle modes + var mode = MaudioXponent.config.vuMeterMode + 1; + if (mode === 2) { + mode = 0; + } + MaudioXponent.config.vuMeterMode = mode; + } else { + if (activate) { + // Save the current value + deck.volume = engine.getValue(deck.group, "volume"); + engine.setValue(deck.group, "volume", 0x00); + } else { + // Restore the saved value from above + engine.setValue(deck.group, "volume", deck.volume); + } + + midi.sendShortMsg(deck.on, MaudioXponent.buttons.gain, activate); + } + } else { + // Low/Mid/High Buttons, momentary kill + group = "[EqualizerRack1_" + deck.group + "_Effect1]"; + engine.setValue(group, MaudioXponent.controls[control], activate); + } +}; + +MaudioXponent.onFilterKill = function(value, group, control) { + var deck = MaudioXponent.decks[parseInt(group.substring(24)) - 1]; + midi.sendShortMsg(deck.on, MaudioXponent.buttons[control], value); +}; + +MaudioXponent.effectButton = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var button = control - 0x0B; + + if (!deck.shift) { + // Toggle EffectUnit + group = "[EffectRack1_EffectUnit" + button + "]"; + var effectEnabled = !engine.getValue(group, "enabled"); + engine.setValue(group, "enabled", effectEnabled); + MaudioXponent.syncEffects(); + } else { + // Focus Effects + if (MaudioXponent.state.focusedEffectUnit === 0) { + // Focus EffectUnit + MaudioXponent.state.focusedEffectUnit = button; + MaudioXponent.syncEffects(); + } else { + group = "[EffectRack1_EffectUnit" + MaudioXponent.state.focusedEffectUnit + "]"; + var focusedEffect = engine.getValue(group, "focused_effect"); + if (focusedEffect === button) { + // Toggle focused Effect + group = "[EffectRack1_EffectUnit" + MaudioXponent.state.focusedEffectUnit + "_Effect" + focusedEffect + "]"; + var enabled = !engine.getValue(group, "enabled"); + engine.setValue(group, "enabled", enabled); + } else { + // Focus effect + engine.setValue(group, "focused_effect", button); + engine.setValue(group, "show_focus", true); + } + } + } +}; + +MaudioXponent.effectKnob = function(channel, control, value) { + var knob = control - 0x0B; + var scaledValue = value / 0x7F; + + if (MaudioXponent.state.focusedEffectUnit === 0) { + if (MaudioXponent.rightDeck.shift) { + // Manipulate Wet/Dry mix + engine.setParameter("[EffectRack1_EffectUnit" + knob + "]", "mix", scaledValue); + } else { + // Manipulate Unit Super-knobs + engine.setParameter("[EffectRack1_EffectUnit" + knob + "]", "super1", scaledValue); + } + } else { + // An effect has focus + var focusedEffect = engine.getValue("[EffectRack1_EffectUnit" + MaudioXponent.state.focusedEffectUnit + "]", "focused_effect"); + + if (focusedEffect === 0) { + // Manipulate focused EffectUnit meta knobs + engine.setParameter("[EffectRack1_EffectUnit" + MaudioXponent.state.focusedEffectUnit + "_Effect" + knob + "]", "meta", scaledValue); + } else { + // Manipulate focused Effect parameters + engine.setParameter("[EffectRack1_EffectUnit" + MaudioXponent.state.focusedEffectUnit + "_Effect" + focusedEffect + "]", "parameter" + knob, scaledValue); + } + } +}; + +MaudioXponent.wheel = function (channel, control, value, status, group) { + var deck = MaudioXponent.getDeck(group); + + if (deck.shift) { + if (value > 64) { + MaudioXponent.state["plnumberpos"]++; + if (MaudioXponent.state["plnumberpos"] % 12 == 0) { + engine.setValue("[Playlist]", "SelectTrackKnob", 1); + } + } else if (value < 64) { + MaudioXponent.state["plnumberneg"]++; + if (MaudioXponent.state["plnumberneg"] % 12 == 0) { + engine.setValue("[Playlist]", "SelectTrackKnob", -1); + } + } + } else { + if (deck.scratching) { + engine.scratchTick(deck.id, value - 64); + } else { + engine.setValue(group, "jog", (value - 64) / 8); + } + } +}; + +MaudioXponent.wheelTouch = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group) + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on); + + if (activate) { + if (deck.scratchEnabled) { + engine.scratchEnable(deck.id, 3 * 128, 33 + 1/3, 1.0/8, (1.0/8)/32); + deck.scratching = true; + } else if (deck.shift) { + deck.lastTouch = new Date(); + } + } else { + if (deck.scratchEnabled) { + engine.scratchDisable (deck.id); + deck.scratching = false; + } else if (deck.shift && deck.lastTouch && (new Date() - deck.lastTouch < MaudioXponent.config.tapDuration)) { + engine.setValue(deck.group, "LoadSelectedTrack", 1); + } + } +}; + +MaudioXponent.onBeatActive = function(value, group) { + var deck = MaudioXponent.getDeck(group); + + if (MaudioXponent.config.syncFlashMode === 1) { + midi.sendShortMsg(deck.on, MaudioXponent.buttons.sync, value); + } + + if (value) { + deck.beatState = !deck.beatState; + + if (MaudioXponent.config.syncFlashMode === 2) { + midi.sendShortMsg(deck.on, MaudioXponent.buttons.sync, deck.beatState); + } + } +}; + +MaudioXponent.onBeatLoop = function(value, group, control) { + var deck = MaudioXponent.getDeck(group); + var offset = deck.shift + ? Math.log(1 / parseFloat(control.substring(9))) / Math.log(2) + : Math.log(parseFloat(control.substring(9))) / Math.log(2); + midi.sendShortMsg(deck.on, MaudioXponent.buttons.loop1 + offset, value); +}; + +MaudioXponent.onBpmChanged = function(/*value, group*/) { + // print ("BPM Change, " + group + ", value=" + value); +}; + +MaudioXponent.onPlayPositionChange = function(value, group) { + var deck = MaudioXponent.getDeck(group); + value = engine.getValue(group, "playposition"); + + if ((value < deck.warnAt) || (!deck.isPlaying()) || (value >= deck.warnAt && deck.beatState)) { + midi.sendShortMsg(deck.progressMeterStatusByte, deck.progressMeterSecondByte, MaudioXponent.convert(value)); + } else { + midi.sendShortMsg(deck.progressMeterStatusByte, deck.progressMeterSecondByte, 0x00); + } +}; + +MaudioXponent.hotcue = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group) + var deck = MaudioXponent.getDeck(group); + var cueNumber = control - 0x16; + var activate = (status == deck.on); + + if (activate) { + if (!deck.shift) { + engine.setValue(group, "hotcue_" + cueNumber + "_activate", activate); + } else { + engine.setValue(group, "hotcue_" + cueNumber + "_clear", 1); + } + } +}; + +MaudioXponent.onHotCue = function(value, group, control) { + var deck = MaudioXponent.getDeck(group); + var cueNumber = parseInt(control.substring(7)) - 1; + midi.sendShortMsg(deck.on, MaudioXponent.buttons.cue1 + cueNumber, value); +}; + +MaudioXponent.loopin = function(channel, control, value, status, group) { + var deck = MaudioXponent.getDeck(group); + engine.setValue(deck.group, "loop_in", !deck.shift); +}; + +MaudioXponent.onLoopIn = function(value, group) { + var deck = MaudioXponent.getDeck(group); + midi.sendShortMsg(deck.on, MaudioXponent.buttons.loopIn, value); +}; + +MaudioXponent.loopout = function(channel, control, value, status, group) { + var deck = MaudioXponent.getDeck(group); + engine.setValue(deck.group, "loop_out", !deck.shift); +}; + +MaudioXponent.onLoopOut = function(value, group) { + var deck = MaudioXponent.getDeck(group); + midi.sendShortMsg(deck.on, MaudioXponent.buttons.loopOut, value); +}; + +MaudioXponent.loopexit = function(channel, control, value, status, group) { + var deck = MaudioXponent.getDeck(group); + engine.setValue(deck.group, "reloop_exit", 1); +}; + +MaudioXponent.onLoopExit = function(value, group, control) { + var deck = MaudioXponent.getDeck(group); + midi.sendShortMsg(deck.on, MaudioXponent.buttons.loop, engine.getValue(group, control) == 1); +}; + +MaudioXponent.pitch = function(channel, control, value, status, group) { + engine.setValue(group, "rate", script.midiPitch(control, value, status)); +}; + +MaudioXponent.toggleScratchMode = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + deck.scratchEnabled = !deck.scratchEnabled; + midi.sendShortMsg(deck.on, MaudioXponent.buttons.scratch, deck.scratchEnabled); +}; + +MaudioXponent.keyLock = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status); + var deck = MaudioXponent.getDeck(group); + + if (!deck.shift) { + // Unshifted = Keylock + engine.setValue(deck.group, "keylock", !engine.getParameter(deck.group, "keylock")); + } else { + // Shifted = Quantize + engine.setValue(deck.group, "quantize", !engine.getParameter(deck.group, "quantize")); + } +}; + +MaudioXponent.onkeyLock = function(value, group) { + var deck = MaudioXponent.getDeck(group); + midi.sendShortMsg(deck.on, MaudioXponent.buttons.key, value); +}; + +MaudioXponent.brake = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on); + + if (deck.shift) { + engine.spinback(deck.id, activate); + } else { + if (deck.isPlaying()) { + engine.brake(deck.id, activate); + } + } +}; + +MaudioXponent.cue = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status); + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on); + + if (deck.shift) { + if (activate) { + engine.setValue(deck.group, "start_stop", 1); + } + } else { + engine.setValue(deck.group, "cue_default", activate); + } +}; + +MaudioXponent.play = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status); + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on); + if (activate) { + engine.setValue(deck.group, "play", !deck.isPlaying()); + } +}; + +MaudioXponent.onPlay = function(value, group, control) { + var deck = MaudioXponent.getDeck(group); + midi.sendShortMsg(deck.on, MaudioXponent.buttons[control], value); + + if (!value) { + midi.sendShortMsg(deck.on, MaudioXponent.buttons.sync, 0x00); + } +}; + +MaudioXponent.beatgridAdjust = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + + if (deck.shift) { + // Shifted = align + engine.setValue(deck.group, "beats_translate_curpos", 1); + } else { + // Unshifted = earlier / later + if (control == MaudioXponent.buttons.leftkey){ + engine.setValue(deck.group, "beats_translate_earlier", 1); + } else { + engine.setValue(deck.group, "beats_translate_later", 1); + } + } +}; + +MaudioXponent.beatgridLoop = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on); + var length = Math.pow(2, control - 0x25); + + if (!deck.shift) { + if (activate) { + engine.setValue(group, "beatloop_" + length + "_toggle", value); + } + } else { + if (activate) { + engine.setValue(group, "beatlooproll_" + 1.0 / length + "_activate", value); + } else { + MaudioXponent.loopexit(channel, control, value, status, group); + } + } +}; + +MaudioXponent.onTrackLoaded = function(duration, group) { + var deck = MaudioXponent.getDeck(group); + deck.warnAt = (duration - 30) / parseFloat(duration); +}; + +MaudioXponent.nudge = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var activate = (status === deck.on); + engine.setValue(group, MaudioXponent.controls[control], activate); +}; + +MaudioXponent.onNudge = function(value, group, control) { + var deck = MaudioXponent.getDeck(group); + midi.sendShortMsg(deck.on, MaudioXponent.buttons[control], value); +}; + +MaudioXponent.pfl = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on); + + if (activate) { + if (MaudioXponent.leftDeck.shift && MaudioXponent.rightDeck.shift) { + // Double-shift = cycle modes + var mode = MaudioXponent.config.pflMode + 1; + if(mode === 2){ + mode = 0; + } + MaudioXponent.config.pflMode = mode; + } else { + for (var i = 1; i <= MaudioXponent.decks.length; i++) { + var grp = "[Channel" + i + "]"; + if (grp === group) { + engine.setValue(grp, "pfl", !engine.getValue(grp, "pfl")); + } else if (MaudioXponent.config.pflMode == 1) { + engine.setValue(grp, "pfl", 0); + } + } + } + } +}; + +MaudioXponent.onPflChanged = function(value, group) { + var deck = MaudioXponent.getDeck(group); + midi.sendShortMsg(deck.on, MaudioXponent.buttons.pfl, value); +}; + +MaudioXponent.reverse = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var activate = (status == deck.on) ? 1 : 0; + if (deck.shift) { + // Reverse rolling + engine.setValue(group, "reverseroll", activate); + } else { + // Normal + engine.setValue(group, "reverse", activate); + } +}; + +MaudioXponent.onReverse = function(value, group, control) { + var deck = MaudioXponent.getDeck(group); + midi.sendShortMsg(deck.on, MaudioXponent.buttons[control], value); +}; + +MaudioXponent.seek = function(channel, control, value, status, group) { + // script.midiDebug(channel, control, value, status, group); + var deck = MaudioXponent.getDeck(group); + var activate = (status === deck.on); + engine.setValue(group, MaudioXponent.controls[control], activate); +}; + +MaudioXponent.samplerButton = function(channel, control, value, status, group) { + //script.midiDebug(channel, control, value, status, group); + var activate = (status === MaudioXponent.leftDeck.on); + + if (activate) { + //print("*** " + group + " cue_gotoandplay"); + engine.setValue(group, "cue_gotoandplay", 1); + } else if (MaudioXponent.leftDeck.shift) { + //print("*** " + group + " cue_gotoandstop"); + engine.setValue(group, "cue_gotoandstop", 1); + } +}; + +MaudioXponent.onSampler = function(value, group) { + var samplerNumber = parseInt(group.substring(8)); + var led = MaudioXponent.buttons.fx1 + samplerNumber - 1; + midi.sendShortMsg(MaudioXponent.on, led, value); + midi.sendShortMsg(MaudioXponent.on + 5, led, value); +}; + +MaudioXponent.onEject = function(value, group) { + if (value) { + engine.setValue(group, "playposition", 0); + MaudioXponent.onPlayPositionChange(null, group); + } +}; + +MaudioXponent.crossfader = function(channel, control, value, status, group) { + //script.midiDebug(channel, control, value, status, group); + MaudioXponent.state.faderPosition = (value - 64) / 64; + engine.setValue(group, "crossfader", MaudioXponent.state.faderPosition); +}; \ No newline at end of file