Files
Marc Monka 2308bfdeab Pitch slider modification
Arduino sends now LSB / MSB to have 14 bit resolution for the pitch slider. Mapping modified. We have now tempo increments of 0,01%.
2025-11-19 12:36:34 +01:00

449 lines
13 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
var XDJ100SX = {};
XDJ100SX.currentMode = 0;
//Init
XDJ100SX.init = function(){
engine.setValue("[Channel2]", "filterLowKill", 1); //This is the default mode
engine.setValue("[Channel2]", "filterMidKill", 0);
engine.setValue("[Channel2]", "filterHighKill", 0);
engine.setValue("[Channel3]", "filterLowKill", 0);
engine.setValue("[Channel3]", "filterMidKill", 0);
engine.setValue("[Channel3]", "filterHighKill", 0);
}
//Shutdown
XDJ100SX.shutdown = function(){
//Turn off all leds
var LedNotes = [0x41, 0x3D, 0x40, 0x3E, 0x3F];
for (var i = 0; i < LedNotes.length; i++) {
var note = LedNotes[i];
// Enviem el missatge Note Off (status, nota, velocitat 0)
midi.sendShortMsg(0x80, note, 0x00);
}
};
//Jog Wheel
XDJ100SX.JogWheelEnabled = false;
XDJ100SX.nudgeWheelTurn = function (channel, control, value, status, group) {
XDJ100SX.lastJogMoveTime = Date.now();
var newValue = value - 64;
var deckNumber = script.deckFromGroup(group);
if (engine.isScratching(deckNumber)) {
engine.scratchTick(deckNumber, newValue); // Scratch!
XDJ100SX.JogWheelEnabled = false;
} else {
engine.setValue(group, 'jog', newValue); // Pitch bend
XDJ100SX.JogWheelEnabled = true;
}
};
//Search buttons
XDJ100SX.searchButton = function (channel, control, value, status, group){
const NOTE_SEARCH_FORWARD = 0x43;
const NOTE_SEARCH_BACKWARD = 0x42;
var isJogActive = (Date.now() - XDJ100SX.lastJogMoveTime < 100);
//Si moc el jog wheel
if (isJogActive){
if (control === NOTE_SEARCH_FORWARD) {
if (value === 127) { // Si s'ha premut (Note On)
script.triggerControl(group,"rateSearch_up", 1);
}
if (value === 0){
script.triggerControl(group,"rateSearch_set_zero", 1);
}
}
else if (control === NOTE_SEARCH_BACKWARD){
if(value === 127){
script.triggerControl(group,"rateSearch_down",1);
}
if(value === 0){
script.triggerControl(group,"rateSearch_set_zero",1);
}
}
}
//Si no moc el jog wheel
else{
if (control === NOTE_SEARCH_FORWARD) {
if (value === 127) { // Si s'ha premut (Note On)
script.triggerControl(group,"rateSearch_up_small", 1);
}
if (value === 0){
script.triggerControl(group,"rateSearch_set_zero", 1);
}
}
else if (control === NOTE_SEARCH_BACKWARD){
if(value === 127){
script.triggerControl(group,"rateSearch_down_small",1);
}
if(value === 0){
script.triggerControl(group,"rateSearch_set_zero",1);
}
}
}
};
//Pitch ranges
XDJ100SX.rateRanges = [0.08, 0.10, 0.16, 0.24, 0.50]; //valors de rang del pitch
XDJ100SX.currentRange = 0;
//Beat Jump ranges
XDJ100SX.BeatJumpRanges = [4, 8, 16, 32, 64, 128];
XDJ100SX.currentBeatJumpRange = 3;
//Shift
XDJ100SX.shiftPressed = false;
XDJ100SX.shift = function(channel,control,value,status,group){
if(value === 127){
XDJ100SX.shiftPressed = true;
}
else{
XDJ100SX.shiftPressed = false;
}
};
//Master Tempo & Tempo Range
XDJ100SX.key = function (channel, control, value, status, group){
if(XDJ100SX.shiftPressed){
if (value){
XDJ100SX.currentRange++;
if(XDJ100SX.currentRange >= XDJ100SX.rateRanges.length){
XDJ100SX.currentRange = 0;
}
engine.setValue(group, "rateRange", XDJ100SX.rateRanges[XDJ100SX.currentRange]);
}
}
else{
script.toggleControl(group, "keylock", 100);
}
};
//Button Mode
XDJ100SX.buttonMode = function (channel, control, value, status, group) {
if (value > 0) {
// Go to next mode
XDJ100SX.currentMode = (XDJ100SX.currentMode + 1) % 6;
// Set all to 0
engine.setValue("[Channel2]", "filterLowKill", 0);
engine.setValue("[Channel2]", "filterMidKill", 0);
engine.setValue("[Channel2]", "filterHighKill", 0);
engine.setValue("[Channel3]", "filterLowKill", 0);
engine.setValue("[Channel3]", "filterMidKill", 0);
engine.setValue("[Channel3]", "filterHighKill", 0);
// Enable the current one
if (XDJ100SX.currentMode === 0) {
engine.setValue("[Channel2]", "filterLowKill", 1); //Mode 1
} else if (XDJ100SX.currentMode === 1) {
engine.setValue("[Channel2]", "filterMidKill", 1); //Mode 2
} else if (XDJ100SX.currentMode === 2){
engine.setValue("[Channel2]", "filterHighKill", 1); //Mode 3
}
else if (XDJ100SX.currentMode === 3){
engine.setValue("[Channel3]", "filterLowKill", 1); //Mode 4
}
else if (XDJ100SX.currentMode === 4){
engine.setValue("[Channel3]", "filterMidKill", 1); //Mode 5
}
else{
engine.setValue("[Channel3]", "filterHighKill", 1); //Mode 6
}
}
};
//Buttons (Jet, Zip, Wah)
//Mode 0 = Hot Cue A, B, C
//Mode 1 = Hot Cue D, E, F
//Mode 2 = Hot Cue G, H
//Mode 3 = Loop Roll 1/8, Loop Roll 1/4, Loop Roll 1/2
//Mode 4 = Beat Jump Length Back, Beat Jump Length Forward, Change Beat Jump Length
//Mode 5 = Key Shift -, Key Shift +, Key Reset
XDJ100SX.button = function(buttonNumber){
return function (channel, control, value, status, group){
if(value === 127){
//Hot Cue A, B, C
if(XDJ100SX.currentMode === 0){
if(XDJ100SX.shiftPressed){
engine.setValue(group, "hotcue_" + buttonNumber + "_clear", 1);
}
else{
engine.setValue(group, "hotcue_" + buttonNumber + "_activate", 1);
}
}
// Hot Cue D, E, F
if(XDJ100SX.currentMode === 1){
var mode = buttonNumber + 3;
if(XDJ100SX.shiftPressed){
engine.setValue(group, "hotcue_" + mode + "_clear", 1);
}
else{
engine.setValue(group, "hotcue_" + mode + "_activate", 1);
}
}
// Hot Cue G, H
if(XDJ100SX.currentMode === 2){
var mode = buttonNumber + 6;
if(XDJ100SX.shiftPressed){
engine.setValue(group, "hotcue_" + mode + "_clear", 1);
}
else{
engine.setValue(group, "hotcue_" + mode + "_activate", 1);
}
}
//Loop Roll
if (XDJ100SX.currentMode === 3){
if (buttonNumber === 1){
engine.setValue(group, "beatlooproll_0.125_activate", 1);
}
if (buttonNumber === 2){
engine.setValue(group, "beatlooproll_0.25_activate", 1);
}
else if(buttonNumber === 3){
engine.setValue(group,"beatlooproll_0.5_activate", 1);
}
}
//BeatJump
if (XDJ100SX.currentMode === 4){
if (buttonNumber === 1){
engine.setValue(group, "beatjump_" + XDJ100SX.BeatJumpRanges[XDJ100SX.currentBeatJumpRange] + "_backward", 1);
}
if (buttonNumber === 2){
engine.setValue(group, "beatjump_" + XDJ100SX.BeatJumpRanges[XDJ100SX.currentBeatJumpRange] + "_forward", 1);
}
else if(buttonNumber === 3){
XDJ100SX.currentBeatJumpRange++;
if(XDJ100SX.currentBeatJumpRange >= XDJ100SX.BeatJumpRanges.length){
XDJ100SX.currentBeatJumpRange = 0;
}
engine.setValue(group,"beatjump_size", XDJ100SX.BeatJumpRanges[XDJ100SX.currentBeatJumpRange]);
}
}
//Key Shift
if(XDJ100SX.currentMode === 5){
if (buttonNumber === 1){
engine.setValue(group, "pitch_down", 1);
}
if (buttonNumber === 2){
engine.setValue(group, "pitch_up", 1);
}
else if(buttonNumber === 3){
engine.setValue(group,"reset_key", 1);
}
}
}
//When release button (Note Off) (Must to disable Loop Roll)
else if(value === 0){
if (XDJ100SX.currentMode === 3){
if (buttonNumber === 1){
engine.setValue(group, "beatlooproll_0.125_activate", 0);
}
if (buttonNumber === 2){
engine.setValue(group, "beatlooproll_0.25_activate", 0);
}
else if(buttonNumber === 3){
engine.setValue(group,"beatlooproll_0.5_activate", 0);
}
}
}
}
};
XDJ100SX.button1 = XDJ100SX.button(1);
XDJ100SX.button2 = XDJ100SX.button(2);
XDJ100SX.button3 = XDJ100SX.button(3);
//BOTÓ CUE: shift + cue torna a l'inici
XDJ100SX.cue = function (channel, control, value, status, group){
if(value === 127){
if(XDJ100SX.shiftPressed){
engine.setValue(group, "start_stop", 1);
}
else{
engine.setValue(group, "cue_cdj",1);
}
}
else{
engine.setValue(group, "cue_cdj",0);
}
}
/*
//Pitch Slider old
XDJ100SX.pitchLast = 0;
XDJ100SX.pitch = function (channel, control, value, status, group) {
var midiMin = 0;
var midiMax = 127;
var midiCenter = 60; // ajusta segons el teu fader real
// Normalitza directament a -1..+1
var normalized;
if (value >= midiCenter) {
normalized = (value - midiCenter) / (midiMax - midiCenter);
} else {
normalized = (value - midiCenter) / (midiCenter - midiMin);
}
normalized = -normalized;
// Deadzone per evitar soroll
var threshold = 0.015;
if (Math.abs(normalized - XDJ100SX.pitchLast) > threshold) {
XDJ100SX.pitchLast = normalized;
engine.setValue(group, "rate", normalized);
}
};
*/
// Pitch slider new
XDJ100SX.pitchMSB = 0;
XDJ100SX.pitchLSB = 0;
XDJ100SX.pitch = function (channel, control, value, status, group) {
if (control === 0) { // MSB
XDJ100SX.pitchMSB = value;
} else if (control === 32) { // LSB
XDJ100SX.pitchLSB = value;
}
// Combinar MSB + LSB
var full = (XDJ100SX.pitchMSB << 7) | XDJ100SX.pitchLSB; // 016383
// Convertir a rang de Mixxx (-1.0 .. +1.0)
var normalized = - (full - 8192) / 8192;
engine.setValue(group, "rate", normalized);
};
//Browse Encoder (scroll + canviar vista)
XDJ100SX.browseDown = function(channel, control, value, status, group) {
if (value === 127) {
// llegim el control actual
var currentTab = engine.getValue("[Tab]", "current");
if (currentTab === 0) { // 0 = overview
engine.setValue("[Channel1]", "waveform_zoom_down", 1); // 1 = library
}
// Enviem moviment al browser
engine.setValue("[Library]", "MoveDown", 1);
}
};
XDJ100SX.browseUp = function(channel, control, value, status, group) {
if (value === 127) {
var currentTab = engine.getValue("[Tab]", "current");
if (currentTab === 0) {
engine.setValue("[Channel1]", "waveform_zoom_up", 1);
}
engine.setValue("[Library]", "MoveUp", 1);
}
};
//Botó LOAD (carregar cançó + tornar a vista overview o vista anterior)
XDJ100SX.loadTrack = function(channel, control, value, status, group){
if (value === 127){
var currentTab = engine.getValue("[Tab]", "current");
var currentLibrary = engine.getValue("[Sidebar]", "sidebar_visible");
if (currentTab === 1 && currentLibrary === 0){
engine.setValue(group,"LoadSelectedTrack", 1);
engine.setValue("[Tab]", "current", 0); //overview
}
if (currentTab === 1 && currentLibrary === 1){
engine.setValue("[Sidebar]", "sidebar_visible", 0); //overview
engine.setValue("[Library]", "GoToItem", 2); //salta't el search i focus a llibreria
}
}
};
//Botó BACK
XDJ100SX.backButton = function(channel, control, value, status, group){
if(value === 127){
var currentTab = engine.getValue("[Tab]", "current");
var currentLibrary = engine.getValue("[Sidebar]", "sidebar_visible");
if (currentTab === 0){
engine.setValue("[Tab]", "current", 1); //library
engine.setValue("[Library]", "focused_widget",3); //salta't el search i focus a les cançons
}
if(currentTab === 1 && currentLibrary == 0){ //llista principal
engine.setValue("[Sidebar]","sidebar_visible",1);
engine.setValue("[Library]", "focused_widget", 2); //salta't el search i focus a les carpetes
}
if(currentTab === 1 && currentLibrary == 1){ //llistes de reproducció
engine.setValue("[Sidebar]","sidebar_visible",0);
engine.setValue("[Library]", "focused_widget", 3); //salta't el search i focus a les cançons
}
}
};