Add files via upload

This commit is contained in:
Marc Monka
2025-10-31 16:59:06 +01:00
committed by GitHub
parent 3ab2a16949
commit 70383e9766
2 changed files with 707 additions and 0 deletions
+420
View File
@@ -0,0 +1,420 @@
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
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);
}
};
//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
}
}
};
+287
View File
@@ -0,0 +1,287 @@
<?xml version='1.0' encoding='utf-8'?>
<MixxxControllerPreset mixxxVersion="" schemaVersion="1">
<info>
<name>XDJ100SX</name>
</info>
<controller id="">
<scriptfiles>
<file filename="XDJ100SX.js" functionprefix="XDJ100SX" />
</scriptfiles>
<controls>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.pitch</key>
<description>PITCH</description>
<status>0xB2</status>
<midino>0x07</midino>
<options>
<script-binding/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>play</key>
<description>PLAY</description>
<status>0x90</status>
<midino>0x3C</midino>
<options>
<normal/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.cue</key>
<description>CUE</description>
<status>0x80</status>
<midino>0x3D</midino>
<options>
<script-binding/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.cue</key>
<description>CUE</description>
<status>0x90</status>
<midino>0x3D</midino>
<options>
<script-binding/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.key</key>
<description>MASTER TEMPO - TEMPO RANGE</description>
<status>0x90</status>
<midino>0x3E</midino>
<options>
<script-binding/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>loop_halve</key>
<description>LOOP HALF</description>
<status>0x90</status>
<midino>0x40</midino>
<options>
<normal/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>loop_double</key>
<description>LOOP DOUBLE</description>
<status>0x90</status>
<midino>0x41</midino>
<options>
<normal/>
</options>
</control>
<!--SEARCH LEFT-->
<control>
<group>[Channel1]</group>
<key>XDJ100SX.searchButton</key>
<description>SEARCH BACKWARD</description>
<status>0x90</status>
<midino>0x42</midino>
<options>
<script-binding/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.searchButton</key>
<description>SEARCH BACKWARD</description>
<status>0x80</status>
<midino>0x42</midino>
<options>
<script-binding/>
</options>
</control>
<!--SEARCH RIGHT-->
<control>
<group>[Channel1]</group>
<key>XDJ100SX.searchButton</key>
<description>SEARCH FORWARD</description>
<status>0x90</status>
<midino>0x43</midino>
<options>
<script-binding/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.searchButton</key>
<description>SEARCH FORWARD</description>
<status>0x80</status>
<midino>0x43</midino>
<options>
<script-binding/>
</options>
</control>
<control>
<key>XDJ100SX.browseDown</key>
<description>BROWSE DOWN</description>
<status>0x92</status>
<midino>0x46</midino>
<options>
<script-binding/></options>
</control>
<control>
<group>[Library]</group>
<key>XDJ100SX.browseUp</key>
<description>BROWSE UP</description>
<status>0x92</status>
<midino>0x47</midino>
<options>
<script-binding/></options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.loadTrack</key>
<description>LOAD</description>
<status>0x90</status>
<midino>0x49</midino>
<options>
<script-binding/></options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.backButton</key>
<description>BACK</description>
<status>0x90</status>
<midino>0x3F</midino>
<options>
<script-binding/></options>
</control>
<!-- Hot Cues i shift - he d'enviar el Note On i el Note off del shift-->
<control>
<group>[Channel1]</group>
<key>XDJ100SX.button1</key> <status>0x90</status> <midino>0x44</midino> <options>
<script-binding/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.button1</key> <status>0x80</status> <midino>0x44</midino> <options>
<script-binding/>
</options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.button2</key>
<status>0x90</status>
<midino>0x45</midino><options>
<script-binding/></options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.button2</key>
<status>0x80</status>
<midino>0x45</midino><options>
<script-binding/></options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.button3</key>
<status>0x90</status>
<midino>0x46</midino><options>
<script-binding/></options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.button3</key>
<status>0x80</status>
<midino>0x46</midino><options>
<script-binding/></options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.shift</key>
<status>0x90</status>
<midino>0x47</midino><options>
<script-binding/></options>
</control>
<control>
<group>[Channel1]</group>
<key>XDJ100SX.shift</key>
<status>0x80</status> <midino>0x47</midino> <options> <!--Note off-->
<script-binding/>
</options>
</control>
<!--Jog-->
<control>
<group>[Channel1]</group>
<key>XDJ100SX.nudgeWheelTurn</key> <status>0xB1</status> <midino>0x14</midino> <options>
<script-binding/>
</options>
</control>
<!-- BUTTON MODES -->
<control>
<group>[Channel1]</group>
<key>XDJ100SX.buttonMode</key> <status>0x90</status> <midino>0x48</midino> <options>
<script-binding/>
</options>
</control>
</controls>
<outputs>
<output>
<group>[Channel1]</group>
<key>beat_active</key>
<description>LED INTERN</description>
<status>0x90</status>
<midino>0x3F</midino>
<maximum>0</maximum>
</output>
<output>
<group>[Channel1]</group>
<key>cue_indicator</key>
<description>CUE LED</description>
<status>0x90</status>
<midino>0x3E</midino>
<on>0x00</on>
<off>0x7F</off>
<maximum>0</maximum>
</output>
<output>
<group>[Channel1]</group>
<key>end_of_track</key>
<description>LED CD END OF TRACK</description>
<status>0x90</status>
<midino>0x40</midino>
<on>0x00</on>
<off>0x7F</off>
<maximum>0</maximum>
</output>
<output>
<group>[Channel1]</group>
<key>play_indicator</key>
<description>PLAY LED</description>
<status>0x90</status>
<midino>0x3D</midino>
<on>0x00</on>
<off>0x7F</off>
<maximum>0</maximum>
</output>
<output>
<group>[Channel1]</group>
<key>play_latched</key>
<description>SIESTAPLAY</description>
<status>0x90</status>
<midino>0x41</midino>
<on>0x00</on>
<off>0x7F</off>
<maximum>0</maximum>
</output>
</outputs>
</controller>
</MixxxControllerPreset>