summaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authorJan Holthuis <jan.holthuis@ruhr-uni-bochum.de>2020-11-15 22:20:00 +0100
committerGitHub <noreply@github.com>2020-11-15 22:20:00 +0100
commit3838247eed3b2c89a5578ec2484a75c9ea227095 (patch)
treefed9ffd7dabd4d6264ff04aecbbf453306502dee /res
parente3fab0c69863681f1146aafb9071246563bbc077 (diff)
parent19aafa3f70bf37a4cd888d9fafc7586dcde288a1 (diff)
Merge pull request #2949 from toszlanyi/Denon_MC7000_mapping
Denon MC7000 bugfix for softtakeover, Deck 4 Vinyl Mode, Backspin
Diffstat (limited to 'res')
-rw-r--r--res/controllers/Denon-MC7000-scripts.js602
-rw-r--r--res/controllers/Denon-MC7000.midi.xml181
2 files changed, 448 insertions, 335 deletions
diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js
index a8afcd8361..fea38f8b2e 100644
--- a/res/controllers/Denon-MC7000-scripts.js
+++ b/res/controllers/Denon-MC7000-scripts.js
@@ -23,7 +23,7 @@
* the MC7000 internal audio interface is not available out-of-the-box for
* older Linux Kernels. You should upgrade your Kernel to minimum versions
* LTS: 4.19.105 or 5.4.21, stable branch 5.5.5 or current 5.6 (2020-Feb-19).
- * Newer Kernels will surely also provide native audio support for this controller.
+ * Newer Kernels will provide native audio support for this controller.
**/
var MC7000 = {};
@@ -37,11 +37,12 @@ var MC7000 = {};
// can be true or false (recommended: false)
MC7000.needleSearchPlay = false;
-// Possible pitchfader rateranges given in percent.
-// can be cycled through be the RANGE buttons.
+// Possible pitchfader rate ranges given in percent.
+// can be cycled through by the RANGE buttons.
MC7000.rateRanges = [
4/100, // default: 4/100
6/100, // default: 6/100
+ 8/100, // default: 8/100
10/100, // default: 10/100
16/100, // default: 16/100
24/100, // default: 24/100
@@ -67,8 +68,8 @@ MC7000.scratchParams = {
// Sensitivity of the jog wheel (also depends on audio latency)
MC7000.jogParams = {
- // Lower values for less, higher values for more sensitive
- jogSensitivity: 30, // default: 30
+ // Sensitivity factor (0.5 for half, 2 for double sensitivity)
+ jogSensitivity: 1, // default: 1
// this will limit the parameter of "jog" (keep between 0.5 and 3)
maxJogValue: 3 // default: 3
};
@@ -98,6 +99,9 @@ MC7000.currentRateRangeIndex = [0, 0, 0, 0];
// initialize the "factor" function for Spinback
MC7000.factor = [];
+//Set Shift button state to false for default
+MC7000.shift = [false, false, false, false];
+
// initialize the PAD Mode to Hot Cue and all others off when starting
MC7000.PADModeCue = [true, true, true, true];
MC7000.PADModeCueLoop = [false, false, false, false];
@@ -141,17 +145,12 @@ MC7000.padColor = {
/* DECK INITIALIZATION */
MC7000.init = function() {
- // set default Master Volume to 85% to give a little head room for mixing
- // engine.setValue("[Master]", "gain", 0.85);
-
- // The SysEx message to send to the controller to force the midi controller
- // to send the status of every item on the control surface.
- var ControllerStatusSysex = [0xF0, 0x00, 0x20, 0x7F, 0x03, 0x01, 0xF7];
+ var i;
- // After midi controller receive this Outbound Message request SysEx
- // Message, midi controller will send the status of every item on the
- // control surface. (Mixxx will be initialized with current values)
- midi.sendSysexMsg(ControllerStatusSysex, ControllerStatusSysex.length);
+ // Softtakeover for Pitch Faders
+ for (i = 1; i <= 4; i++) {
+ engine.softTakeover("[Channel" + i + "]", "rate", true);
+ }
// VU meters
engine.makeConnection("[Channel1]", "VuMeter", MC7000.VuMeter);
@@ -176,7 +175,7 @@ MC7000.init = function() {
midi.sendShortMsg(0x93, 0x07, MC7000.isVinylMode ? 0x7F: 0x01);
// HotCue Mode LEDs
- for (var i = 1; i <= 8; i++) {
+ for (i = 1; i <= 8; i++) {
engine.makeConnection("[Channel1]", "hotcue_"+i+"_enabled", MC7000.HotCueLED);
engine.makeConnection("[Channel2]", "hotcue_"+i+"_enabled", MC7000.HotCueLED);
engine.makeConnection("[Channel3]", "hotcue_"+i+"_enabled", MC7000.HotCueLED);
@@ -189,267 +188,268 @@ MC7000.init = function() {
engine.makeConnection("[Sampler"+i+"]", "play", MC7000.SamplerLED);
}
- // Sampler Volume Control
- MC7000.samplerLevel = function(channel, control, value) {
- // check if the Sampler Volume is at Zero and if so hide the sampler bank
- if (value > 0x00) {
- engine.setValue("[Samplers]", "show_samplers", true);
- } else {
- engine.setValue("[Samplers]", "show_samplers", false);
- }
- // get the Sampler Rows opened with its details
- engine.setValue("[SamplerRow1]", "expanded", true);
- engine.setValue("[SamplerRow2]", "expanded", true);
+ // Activate Timer for Controller Status SysEx to avoid conflicts with Softtakeover
+ engine.beginTimer(3000, MC7000.delayedSysEx, true);
+};
- //control up to 16 sampler volumes with the one knob on the mixer
- for (var i = 1; i <= 16; i++) {
- engine.setValue("[Sampler"+i+"]", "pregain", script.absoluteNonLin(value, 0, 1.0, 4.0));
- }
- };
+// SysEx message to receive all knob and fader positions
+MC7000.delayedSysEx = function() {
+ var ControllerStatusSysex = [0xF0, 0x00, 0x20, 0x7F, 0x03, 0x01, 0xF7];
+ midi.sendSysexMsg(ControllerStatusSysex, ControllerStatusSysex.length);
+};
- // Activate Softtakeover for Pitch Faders
- for (i = 1; i <= 4; i++) {
- engine.softTakeover("[Channel" + i + "]", "rate", true);
+// Sampler Volume Control
+MC7000.samplerLevel = function(channel, control, value) {
+ // check if the Sampler Volume is at Zero and if so hide the sampler bank
+ if (value > 0) {
+ engine.setValue("[Samplers]", "show_samplers", true);
+ } else {
+ engine.setValue("[Samplers]", "show_samplers", false);
+ }
+ //control the 8 sampler volumes with the one knob on the mixer
+ for (var i = 1; i <= 8; i++) {
+ engine.setValue("[Sampler"+i+"]", "pregain", script.absoluteNonLin(value, 0, 1.0, 4.0));
}
};
// PAD Mode Hot Cue
MC7000.padModeCue = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- // set HotCue Mode true
- MC7000.PADModeCue[deckNumber] = true;
- MC7000.PADModeCueLoop[deckNumber] = false;
- MC7000.PADModeFlip[deckNumber] = false;
- MC7000.PADModeRoll[deckNumber] = false;
- MC7000.PADModeSavedLoop[deckNumber] = false;
- MC7000.PADModeSlicer[deckNumber] = false;
- MC7000.PADModeSlicerLoop[deckNumber] = false;
- MC7000.PADModeSampler[deckNumber] = false;
- MC7000.PADModeVelSamp[deckNumber] = false;
- MC7000.PADModePitch[deckNumber] = false;
}
+ MC7000.PADModeCue[deckNumber] = true;
+ MC7000.PADModeCueLoop[deckNumber] = false;
+ MC7000.PADModeFlip[deckNumber] = false;
+ MC7000.PADModeRoll[deckNumber] = false;
+ MC7000.PADModeSavedLoop[deckNumber] = false;
+ MC7000.PADModeSlicer[deckNumber] = false;
+ MC7000.PADModeSlicerLoop[deckNumber] = false;
+ MC7000.PADModeSampler[deckNumber] = false;
+ MC7000.PADModeVelSamp[deckNumber] = false;
+ MC7000.PADModePitch[deckNumber] = false;
+
// change PAD color when switching to Hot Cue Mode
for (var i = 1; i <= 8; i++) {
if (engine.getValue(group, "hotcue_" + i + "_enabled", true)) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.hotcueon);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.hotcueon);
} else {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.hotcueoff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.hotcueoff);
}
}
};
+
// PAD Mode Cue Loop
MC7000.padModeCueLoop = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- MC7000.PADModeCue[deckNumber] = false;
- MC7000.PADModeCueLoop[deckNumber] = true;
- MC7000.PADModeFlip[deckNumber] = false;
- MC7000.PADModeRoll[deckNumber] = false;
- MC7000.PADModeSavedLoop[deckNumber] = false;
- MC7000.PADModeSlicer[deckNumber] = false;
- MC7000.PADModeSlicerLoop[deckNumber] = false;
- MC7000.PADModeSampler[deckNumber] = false;
- MC7000.PADModeVelSamp[deckNumber] = false;
- MC7000.PADModePitch[deckNumber] = false;
}
+ MC7000.PADModeCue[deckNumber] = false;
+ MC7000.PADModeCueLoop[deckNumber] = true;
+ MC7000.PADModeFlip[deckNumber] = false;
+ MC7000.PADModeRoll[deckNumber] = false;
+ MC7000.PADModeSavedLoop[deckNumber] = false;
+ MC7000.PADModeSlicer[deckNumber] = false;
+ MC7000.PADModeSlicerLoop[deckNumber] = false;
+ MC7000.PADModeSampler[deckNumber] = false;
+ MC7000.PADModeVelSamp[deckNumber] = false;
+ MC7000.PADModePitch[deckNumber] = false;
+
+ // switch off PAD illumination
for (var i = 1; i <= 8; i++) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.alloff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.alloff);
}
};
+
// PAD Mode Flip
MC7000.padModeFlip = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- MC7000.PADModeCue[deckNumber] = false;
- MC7000.PADModeCueLoop[deckNumber] = false;
- MC7000.PADModeFlip[deckNumber] = true;
- MC7000.PADModeRoll[deckNumber] = false;
- MC7000.PADModeSavedLoop[deckNumber] = false;
- MC7000.PADModeSlicer[deckNumber] = false;
- MC7000.PADModeSlicerLoop[deckNumber] = false;
- MC7000.PADModeSampler[deckNumber] = false;
- MC7000.PADModeVelSamp[deckNumber] = false;
- MC7000.PADModePitch[deckNumber] = false;
}
+ MC7000.PADModeCue[deckNumber] = false;
+ MC7000.PADModeCueLoop[deckNumber] = false;
+ MC7000.PADModeFlip[deckNumber] = true;
+ MC7000.PADModeRoll[deckNumber] = false;
+ MC7000.PADModeSavedLoop[deckNumber] = false;
+ MC7000.PADModeSlicer[deckNumber] = false;
+ MC7000.PADModeSlicerLoop[deckNumber] = false;
+ MC7000.PADModeSampler[deckNumber] = false;
+ MC7000.PADModeVelSamp[deckNumber] = false;
+ MC7000.PADModePitch[deckNumber] = false;
+
+ // switch off PAD illumination
for (var i = 1; i <= 8; i++) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1,
- MC7000.padColor.alloff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, MC7000.padColor.alloff);
}
};
+
// PAD Mode Roll
MC7000.padModeRoll = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- MC7000.PADModeCue[deckNumber] = false;
- MC7000.PADModeCueLoop[deckNumber] = false;
- MC7000.PADModeFlip[deckNumber] = false;
- MC7000.PADModeRoll[deckNumber] = true;
- MC7000.PADModeSavedLoop[deckNumber] = false;
- MC7000.PADModeSlicer[deckNumber] = false;
- MC7000.PADModeSlicerLoop[deckNumber] = false;
- MC7000.PADModeSampler[deckNumber] = false;
- MC7000.PADModeVelSamp[deckNumber] = false;
- MC7000.PADModePitch[deckNumber] = false;
}
+ MC7000.PADModeCue[deckNumber] = false;
+ MC7000.PADModeCueLoop[deckNumber] = false;
+ MC7000.PADModeFlip[deckNumber] = false;
+ MC7000.PADModeRoll[deckNumber] = true;
+ MC7000.PADModeSavedLoop[deckNumber] = false;
+ MC7000.PADModeSlicer[deckNumber] = false;
+ MC7000.PADModeSlicerLoop[deckNumber] = false;
+ MC7000.PADModeSampler[deckNumber] = false;
+ MC7000.PADModeVelSamp[deckNumber] = false;
+ MC7000.PADModePitch[deckNumber] = false;
+
+ // change PAD color when switching to Roll Mode
for (var i = 1; i <= 8; i++) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.rolloff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.rolloff);
}
};
+
// PAD Mode Saved Loop
MC7000.padModeSavedLoop = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- MC7000.PADModeCue[deckNumber] = false;
- MC7000.PADModeCueLoop[deckNumber] = false;
- MC7000.PADModeFlip[deckNumber] = false;
- MC7000.PADModeRoll[deckNumber] = false;
- MC7000.PADModeSavedLoop[deckNumber] = true;
- MC7000.PADModeSlicer[deckNumber] = false;
- MC7000.PADModeSlicerLoop[deckNumber] = false;
- MC7000.PADModeSampler[deckNumber] = false;
- MC7000.PADModeVelSamp[deckNumber] = false;
- MC7000.PADModePitch[deckNumber] = false;
}
+ MC7000.PADModeCue[deckNumber] = false;
+ MC7000.PADModeCueLoop[deckNumber] = false;
+ MC7000.PADModeFlip[deckNumber] = false;
+ MC7000.PADModeRoll[deckNumber] = false;
+ MC7000.PADModeSavedLoop[deckNumber] = true;
+ MC7000.PADModeSlicer[deckNumber] = false;
+ MC7000.PADModeSlicerLoop[deckNumber] = false;
+ MC7000.PADModeSampler[deckNumber] = false;
+ MC7000.PADModeVelSamp[deckNumber] = false;
+ MC7000.PADModePitch[deckNumber] = false;
+
+ // switch off PAD illumination
for (var i = 1; i <= 8; i++) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.alloff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.alloff);
}
};
+
// PAD Mode Slicer
MC7000.padModeSlicer = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- MC7000.PADModeCue[deckNumber] = false;
- MC7000.PADModeCueLoop[deckNumber] = false;
- MC7000.PADModeFlip[deckNumber] = false;
- MC7000.PADModeRoll[deckNumber] = false;
- MC7000.PADModeSavedLoop[deckNumber] = false;
- MC7000.PADModeSlicer[deckNumber] = true;
- MC7000.PADModeSlicerLoop[deckNumber] = false;
- MC7000.PADModeSampler[deckNumber] = false;
- MC7000.PADModeVelSamp[deckNumber] = false;
- MC7000.PADModePitch[deckNumber] = false;
}
+ MC7000.PADModeCue[deckNumber] = false;
+ MC7000.PADModeCueLoop[deckNumber] = false;
+ MC7000.PADModeFlip[deckNumber] = false;
+ MC7000.PADModeRoll[deckNumber] = false;
+ MC7000.PADModeSavedLoop[deckNumber] = false;
+ MC7000.PADModeSlicer[deckNumber] = true;
+ MC7000.PADModeSlicerLoop[deckNumber] = false;
+ MC7000.PADModeSampler[deckNumber] = false;
+ MC7000.PADModeVelSamp[deckNumber] = false;
+ MC7000.PADModePitch[deckNumber] = false;
+
+ // change PAD color when switching to Slicer Mode
for (var i = 1; i <= 8; i++) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.sliceron);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.sliceron);
}
};
+
// PAD Mode Slicer Loop
MC7000.padModeSlicerLoop = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- MC7000.PADModeCue[deckNumber] = false;
- MC7000.PADModeCueLoop[deckNumber] = false;
- MC7000.PADModeFlip[deckNumber] = false;
- MC7000.PADModeRoll[deckNumber] = false;
- MC7000.PADModeSavedLoop[deckNumber] = false;
- MC7000.PADModeSlicer[deckNumber] = false;
- MC7000.PADModeSlicerLoop[deckNumber] = true;
- MC7000.PADModeSampler[deckNumber] = false;
- MC7000.PADModeVelSamp[deckNumber] = false;
- MC7000.PADModePitch[deckNumber] = false;
}
+ MC7000.PADModeCue[deckNumber] = false;
+ MC7000.PADModeCueLoop[deckNumber] = false;
+ MC7000.PADModeFlip[deckNumber] = false;
+ MC7000.PADModeRoll[deckNumber] = false;
+ MC7000.PADModeSavedLoop[deckNumber] = false;
+ MC7000.PADModeSlicer[deckNumber] = false;
+ MC7000.PADModeSlicerLoop[deckNumber] = true;
+ MC7000.PADModeSampler[deckNumber] = false;
+ MC7000.PADModeVelSamp[deckNumber] = false;
+ MC7000.PADModePitch[deckNumber] = false;
+
+ // switch off PAD illumination
for (var i = 1; i <= 8; i++) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.alloff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.alloff);
}
};
+
// PAD Mode Sampler
MC7000.padModeSampler = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- MC7000.PADModeCue[deckNumber] = false;
- MC7000.PADModeCueLoop[deckNumber] = false;
- MC7000.PADModeFlip[deckNumber] = false;
- MC7000.PADModeRoll[deckNumber] = false;
- MC7000.PADModeSavedLoop[deckNumber] = false;
- MC7000.PADModeSlicer[deckNumber] = false;
- MC7000.PADModeSlicerLoop[deckNumber] = false;
- MC7000.PADModeSampler[deckNumber] = true;
- MC7000.PADModeVelSamp[deckNumber] = false;
- MC7000.PADModePitch[deckNumber] = false;
}
+ MC7000.PADModeCue[deckNumber] = false;
+ MC7000.PADModeCueLoop[deckNumber] = false;
+ MC7000.PADModeFlip[deckNumber] = false;
+ MC7000.PADModeRoll[deckNumber] = false;
+ MC7000.PADModeSavedLoop[deckNumber] = false;
+ MC7000.PADModeSlicer[deckNumber] = false;
+ MC7000.PADModeSlicerLoop[deckNumber] = false;
+ MC7000.PADModeSampler[deckNumber] = true;
+ MC7000.PADModeVelSamp[deckNumber] = false;
+ MC7000.PADModePitch[deckNumber] = false;
+
// change PAD color when switching to Sampler Mode
for (var i = 1; i <= 8; i++) {
if (engine.getValue("[Sampler" + i + "]", "play")) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.samplerplay);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.samplerplay);
} else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 0) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.sampleroff);
- } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 1 &&
- engine.getValue("[Sampler" + i + "]", "play") === 0) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.samplerloaded);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.sampleroff);
+ } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 1 && engine.getValue("[Sampler" + i + "]", "play") === 0) {
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.samplerloaded);
}
}
};
+
// PAD Mode Velocity Sampler
MC7000.padModeVelSamp = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- MC7000.PADModeCue[deckNumber] = false;
- MC7000.PADModeCueLoop[deckNumber] = false;
- MC7000.PADModeFlip[deckNumber] = false;
- MC7000.PADModeRoll[deckNumber] = false;
- MC7000.PADModeSavedLoop[deckNumber] = false;
- MC7000.PADModeSlicer[deckNumber] = false;
- MC7000.PADModeSlicerLoop[deckNumber] = false;
- MC7000.PADModeSampler[deckNumber] = false;
- MC7000.PADModeVelSamp[deckNumber] = true;
- MC7000.PADModePitch[deckNumber] = false;
}
+ MC7000.PADModeCue[deckNumber] = false;
+ MC7000.PADModeCueLoop[deckNumber] = false;
+ MC7000.PADModeFlip[deckNumber] = false;
+ MC7000.PADModeRoll[deckNumber] = false;
+ MC7000.PADModeSavedLoop[deckNumber] = false;
+ MC7000.PADModeSlicer[deckNumber] = false;
+ MC7000.PADModeSlicerLoop[deckNumber] = false;
+ MC7000.PADModeSampler[deckNumber] = false;
+ MC7000.PADModeVelSamp[deckNumber] = true;
+ MC7000.PADModePitch[deckNumber] = false;
+
+ // switch off PAD illumination
for (var i = 1; i <= 8; i++) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.alloff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.alloff);
}
};
+
// PAD Mode Pitch
MC7000.padModePitch = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
- if (value === 0x7F) {
- MC7000.PADModeCue[deckNumber] = false;
- MC7000.PADModeCueLoop[deckNumber] = false;
- MC7000.PADModeFlip[deckNumber] = false;
- MC7000.PADModeRoll[deckNumber] = false;
- MC7000.PADModeSavedLoop[deckNumber] = false;
- MC7000.PADModeSlicer[deckNumber] = true;
- MC7000.PADModeSlicerLoop[deckNumber] = false;
- MC7000.PADModeSampler[deckNumber] = false;
- MC7000.PADModeVelSamp[deckNumber] = false;
- MC7000.PADModePitch[deckNumber] = true;
}
+ MC7000.PADModeCue[deckNumber] = false;
+ MC7000.PADModeCueLoop[deckNumber] = false;
+ MC7000.PADModeFlip[deckNumber] = false;
+ MC7000.PADModeRoll[deckNumber] = false;
+ MC7000.PADModeSavedLoop[deckNumber] = false;
+ MC7000.PADModeSlicer[deckNumber] = true;
+ MC7000.PADModeSlicerLoop[deckNumber] = false;
+ MC7000.PADModeSampler[deckNumber] = false;
+ MC7000.PADModeVelSamp[deckNumber] = false;
+ MC7000.PADModePitch[deckNumber] = true;
+
+ // switch off PAD illumination
for (var i = 1; i <= 8; i++) {
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1,
- MC7000.padColor.alloff);
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1,
- MC7000.padColor.alloff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.alloff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, MC7000.padColor.alloff);
}
};
@@ -458,8 +458,7 @@ MC7000.PadButtons = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
// activate and clear Hot Cues
- if (MC7000.PADModeCue[deckNumber] &&
- engine.getValue(group, "track_loaded") === 1) {
+ if (MC7000.PADModeCue[deckNumber] && engine.getValue(group, "track_loaded") === 1) {
for (var i = 1; i <= 8; i++) {
if (control === 0x14 + i - 1 && value >= 0x01) {
engine.setValue(group, "hotcue_" + i + "_activate", true);
@@ -468,8 +467,7 @@ MC7000.PadButtons = function(channel, control, value, status, group) {
}
if (control === 0x1C + i - 1 && value >= 0x01) {
engine.setValue(group, "hotcue_" + i + "_clear", true);
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1,
- MC7000.padColor.hotcueoff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, MC7000.padColor.hotcueoff);
}
}
} else if (MC7000.PADModeCueLoop[deckNumber]) {
@@ -481,15 +479,11 @@ MC7000.PadButtons = function(channel, control, value, status, group) {
// check for actual beatloop_size and apply back after a PAD Roll
i = control - 0x14;
if (control === 0x14 + i && value > 0x00) {
- engine.setValue(
- group, "beatlooproll_" + MC7000.beatLoopRoll[i] + "_activate",
- true);
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i,
- MC7000.padColor.rollon);
+ engine.setValue(group, "beatlooproll_" + MC7000.beatLoopRoll[i] + "_activate", true);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i, MC7000.padColor.rollon);
} else if (control === 0x14 + i && value === 0x00) {
engine.setValue(group, "beatlooproll_activate", false);
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i,
- MC7000.padColor.rolloff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i, MC7000.padColor.rolloff);
}
} else if (MC7000.PADModeSavedLoop[deckNumber]) {
return;
@@ -498,16 +492,13 @@ MC7000.PadButtons = function(channel, control, value, status, group) {
var beats = 1 << (control % 4);
if (control > 0x17) {
engine.setValue(group, "beatjump_" + beats + "_backward", value);
- midi.sendShortMsg(0x94 + deckNumber - 1, control,
- MC7000.padColor.slicerJumpBack);
+ midi.sendShortMsg(0x94 + deckNumber - 1, control, MC7000.padColor.slicerJumpBack);
} else {
engine.setValue(group, "beatjump_" + beats + "_forward", value);
- midi.sendShortMsg(0x94 + deckNumber - 1, control,
- MC7000.padColor.slicerJumpFwd);
+ midi.sendShortMsg(0x94 + deckNumber - 1, control, MC7000.padColor.slicerJumpFwd);
}
} else {
- midi.sendShortMsg(0x94 + deckNumber - 1, control,
- MC7000.padColor.sliceron);
+ midi.sendShortMsg(0x94 + deckNumber - 1, control, MC7000.padColor.sliceron);
}
} else if (MC7000.PADModeSlicerLoop[deckNumber]) {
return;
@@ -516,19 +507,16 @@ MC7000.PadButtons = function(channel, control, value, status, group) {
if (control === 0x14 + i - 1 && value >= 0x01) {
if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 0) {
engine.setValue("[Sampler" + i + "]", "LoadSelectedTrack", 1);
- } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") ===
- 1) {
+ } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 1) {
engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1);
}
} else if (control === 0x1C + i - 1 && value >= 0x01) {
if (engine.getValue("[Sampler" + i + "]", "play") === 1) {
engine.setValue("[Sampler" + i + "]", "cue_gotoandstop", 1);
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1,
- MC7000.padColor.samplerloaded);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, MC7000.padColor.samplerloaded);
} else {
engine.setValue("[Sampler" + i + "]", "eject", 1);
- midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1,
- MC7000.padColor.sampleroff);
+ midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, MC7000.padColor.sampleroff);
engine.setValue("[Sampler" + i + "]", "eject", 0);
}
}
@@ -540,23 +528,64 @@ MC7000.PadButtons = function(channel, control, value, status, group) {
}
};
+// Toggle Shift Button
+MC7000.shiftButton = function(channel, control, value, status, group) {
+ var deckNumber = script.deckFromGroup(group);
+ MC7000.shift[deckNumber - 1] = ! MC7000.shift[deckNumber - 1];
+ midi.sendShortMsg(0x90 + deckNumber - 1, 0x32,
+ MC7000.shift[deckNumber - 1] ? 0x7F : 0x01);
+};
+
// Toggle Vinyl Mode
MC7000.vinylModeToggle = function(channel, control, value, status, group) {
- if (value === 0x00)
+ if (value === 0x00) {
return; // don't respond to note off messages
+ }
+ var deckNumber = script.deckFromGroup(group);
+ MC7000.isVinylMode[deckNumber - 1] = !MC7000.isVinylMode[deckNumber - 1];
+ midi.sendShortMsg(0x90 + deckNumber - 1, 0x07,
+ MC7000.isVinylMode[deckNumber - 1] ? 0x7F : 0x01);
+};
+
+// Use select button to load and eject track from deck
+MC7000.loadLongPress = false;
+MC7000.loadTimer = 0;
+
+MC7000.loadAssertLongPress = function() {
+ MC7000.loadLongPress = true;
+ MC7000.loadTimer = 0;
+};
+
+MC7000.loadDown = function() {
+ MC7000.loadLongPress = false;
+ MC7000.loadTimer = engine.beginTimer(500, MC7000.loadAssertLongPress, true);
+};
+MC7000.loadUp = function(group) {
+ if (MC7000.loadTimer !== 0) {
+ engine.stopTimer(MC7000.loadTimer);
+ MC7000.loadTimer = 0;
+ }
+ if (MC7000.loadLongPress) {
+ script.triggerControl(group, "eject", 100);
+ } else {
+ script.triggerControl(group, "LoadSelectedTrack", 100);
+ }
+};
+
+MC7000.loadButton = function(channel, control, value, status, group) {
+ //LOAD hold <500ms: load track, >500ms: eject
if (value === 0x7F) {
- var deckNumber = script.deckFromGroup(group);
- MC7000.isVinylMode[deckNumber] = !MC7000.isVinylMode[deckNumber];
- midi.sendShortMsg(0x90 + channel, 0x07,
- MC7000.isVinylMode[deckNumber] ? 0x7F : 0x01);
+ MC7000.loadDown();
+ } else {
+ MC7000.loadUp(group);
}
};
// The button that enables/disables scratching
MC7000.wheelTouch = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- if (MC7000.isVinylMode[deckNumber]) {
+ if (MC7000.isVinylMode[deckNumber - 1]) {
if (value === 0x7F) {
engine.scratchEnable(deckNumber, MC7000.jogWheelTicksPerRevolution,
MC7000.scratchParams.recordSpeed,
@@ -577,14 +606,16 @@ MC7000.wheelTurn = function(channel, control, value, status, group) {
// Scratch!
engine.scratchTick(deckNumber, numTicks);
} else {
- // Pitch bend
- var jogDelta = numTicks / MC7000.jogWheelTicksPerRevolution *
- MC7000.jogParams.jogSensitivity;
- var jogAbsolute = jogDelta + engine.getValue(group, "jog");
- engine.setValue(
- group, "jog",
- Math.max(-MC7000.jogParams.maxJogValue,
- Math.min(MC7000.jogParams.maxJogValue, jogAbsolute)));
+ if (MC7000.shift[deckNumber - 1]) {
+ // While Shift Button pressed -> Search through track
+ var jogSearch = 5000 * numTicks / MC7000.jogWheelTicksPerRevolution * MC7000.jogParams.jogSensitivity;
+ engine.setValue(group, "jog", jogSearch);
+ } else {
+ // While Shift Button released -> Pitch Bend
+ var jogDelta = numTicks / MC7000.jogWheelTicksPerRevolution * MC7000.jogParams.jogSensitivity * 30;
+ var jogAbsolute = jogDelta + engine.getValue(group, "jog");
+ engine.setValue(group, "jog", Math.max(-MC7000.jogParams.maxJogValue, Math.min(MC7000.jogParams.maxJogValue, jogAbsolute)));
+ }
}
};
@@ -592,8 +623,7 @@ MC7000.wheelTurn = function(channel, control, value, status, group) {
MC7000.needleSearchTouch = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
if (engine.getValue(group, "play")) {
- MC7000.needleSearchTouched[deckNumber] =
- MC7000.needleSearchPlay && (!!value);
+ MC7000.needleSearchTouched[deckNumber] = MC7000.needleSearchPlay && (!!value);
} else {
MC7000.needleSearchTouched[deckNumber] = !!value;
}
@@ -616,10 +646,8 @@ MC7000.needleSearchStripPosition = function(channel, control, value, status,
group) {
var deckNumber = script.deckFromGroup(group);
if (MC7000.needleSearchTouched[deckNumber]) {
- var fullValue = (MC7000.needleDropMSB << 7) +
- value; // move MSB 7 binary gigits to the left and add LSB
- var position = (fullValue / 0x3FFF); // divide by all possible positions to
- // get relative between 0 - 1
+ var fullValue = (MC7000.needleDropMSB << 7) + value; // move MSB 7 binary gigits to the left and add LSB
+ var position = (fullValue / 0x3FFF); // divide by all possible positions to get relative between 0 - 1
engine.setParameter(group, "playposition", position);
}
};
@@ -632,46 +660,69 @@ MC7000.pitchFaderMSB = function(channel, control, value) {
// Pitch Fader Position (MSB + LSB)
MC7000.pitchFaderPosition = function(channel, control, value, status, group) {
var fullValue = (MC7000.pitchMSB << 7) + value;
- var position =
- 1 - (fullValue / 0x3FFF); // 1 - () to turn around the direction
+ var position = 1 - (fullValue / 0x3FFF); // 1 - () to turn around the direction
engine.setParameter(group, "rate", position);
};
// Next Rate range toggle
MC7000.nextRateRange = function(midichan, control, value, status, group) {
- if (value === 0)
+ if (value === 0) {
return; // don't respond to note off messages
+ }
var deckNumber = script.deckFromGroup(group);
// increment currentRateRangeIndex and check for overflow
if (++MC7000.currentRateRangeIndex[deckNumber - 1] ===
MC7000.rateRanges.length) {
MC7000.currentRateRangeIndex[deckNumber - 1] = 0;
}
- engine.setValue(
- group, "rateRange",
- MC7000.rateRanges[MC7000.currentRateRangeIndex[deckNumber - 1]]);
+ engine.setValue(group, "rateRange", MC7000.rateRanges[MC7000.currentRateRangeIndex[deckNumber - 1]]);
};
// Previous Rate range toggle
MC7000.prevRateRange = function(midichan, control, value, status, group) {
- if (value === 0)
+ if (value === 0) {
return; // don't respond to note off messages
+ }
var deckNumber = script.deckFromGroup(group);
// decrement currentRateRangeIndex and check for underflow
if (--MC7000.currentRateRangeIndex[deckNumber - 1] < 0) {
MC7000.currentRateRangeIndex[deckNumber - 1] = MC7000.rateRanges.length - 1;
}
- engine.setValue(
- group, "rateRange",
- MC7000.rateRanges[MC7000.currentRateRangeIndex[deckNumber - 1]]);
+ engine.setValue(group, "rateRange", MC7000.rateRanges[MC7000.currentRateRangeIndex[deckNumber - 1]]);
};
-// Key Select
+// Key & Waveform zoom Select
MC7000.keySelect = function(midichan, control, value, status, group) {
- if (value === 0x01) {
- engine.setValue(group, "pitch_up", true);
- } else if (value === 0x7F) {
- engine.setValue(group, "pitch_down", true);
+ var deckNumber = script.deckFromGroup(group);
+ // While Shift Button is pressed: Waveform Zoom
+ if (MC7000.shift[deckNumber - 1]) {
+ if (value === 0x7F) {
+ script.triggerControl(group, "waveform_zoom_up", 100);
+ } else {
+ script.triggerControl(group, "waveform_zoom_down", 100);
+ }
+ // While Shift Button is released: Key Select
+ } else {
+ if (value === 0x7F) {
+ script.triggerControl(group, "pitch_down", 100);
+ } else {
+ script.triggerControl(group, "pitch_up", 100);
+ }
+ }
+};
+
+// Key & Waveform zoom Reset
+MC7000.keyReset = function(channel, control, value, status, group) {
+ var deckNumber = script.deckFromGroup(group);
+ if (value === 0x00) {
+ return;
+ }
+ // While Shift Button is pressed: Waveform Zoom Reset
+ if (MC7000.shift[deckNumber - 1]) {
+ script.triggerControl(group, "waveform_zoom_set_default", 100);
+ // While Shift Button is released: Key Reset
+ } else {
+ script.triggerControl(group, "reset_key", 100);
}
};
@@ -696,33 +747,53 @@ MC7000.stopTime = function(channel, control, value, status, group) {
};
// Use the CENSOR button as Spinback with STOP TIME adjusted length
-MC7000.censor = function(channel, control, value, status, group) {
+MC7000.reverse = function(channel, control, value, status, group) {
var deckNumber = script.deckFromGroup(group);
- var deck =
- parseInt(group.substring(8, 9)); // work out which deck we are using
- engine.brake(deck, value > 0, MC7000.factor[deckNumber],
- -15); // start at a rate of -15 and decrease by "factor"
+ if (value > 0) {
+ // while the button is pressed spin back
+ engine.brake(deckNumber, true, MC7000.factor[deckNumber], -15); // start at a rate of -15 and decrease by "factor"
+ } else {
+ // when releasing the button the track starts softly again
+ engine.softStart(deckNumber, true, MC7000.factor[deckNumber]);
+ }
+};
+
+// Use of Reverse w/ and w/o Slip mode
+MC7000.censor = function(channel, control, value, status, group) {
+ if (engine.getValue(group, "slip_enabled")) {
+ // This would be the "normal" CENSOR function"
+ if (value > 0) {
+ engine.setValue(group, "reverseroll", 1);
+ } else {
+ engine.setValue(group, "reverseroll", 0);
+ }
+ } else {
+ // reverse play while button pressed
+ if (value > 0) {
+ engine.setValue(group, "reverse", 1);
+ } else {
+ engine.setValue(group, "reverse", 0);
+ }
+ }
};
-/* SET CROSSFADER CURVE */
+// Set Crossfader Curve
MC7000.crossFaderCurve = function(control, value) {
script.crossfaderCurve(value);
};
-/* Set FX wet/dry value */
-MC7000.fxWetDry = function(midichan, control, value, status, group) {
+// Set FX wet/dry value
+MC7000.fxWetDry = function(channel, control, value, status, group) {
var numTicks = (value < 0x64) ? value: (value - 128);
var newVal = engine.getValue(group, "mix") + numTicks/64*2;
engine.setValue(group, "mix", Math.max(0, Math.min(1, newVal)));
-<