Skip to content

Commit b28e3ca

Browse files
committed
Merge remote-tracking branch 'upstream/2.6' into sync-branch-2.6-to-main
2 parents ff03f9d + b949b10 commit b28e3ca

18 files changed

+566
-38
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ jobs:
569569
570570
- name: "Upload GitHub Actions artifacts"
571571
if: matrix.artifacts_path != null
572-
uses: actions/upload-artifact@v4.6.2
572+
uses: actions/upload-artifact@v5.0.0
573573
with:
574574
name: ${{ matrix.artifacts_name }}
575575
path: ${{ matrix.artifacts_path }}

.github/workflows/pre-commit.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,14 @@ jobs:
6565

6666
- name: "Upload patch artifact"
6767
if: failure() && env.UPLOAD_PATCH_FILE != null
68-
uses: actions/upload-artifact@v4.6.2
68+
uses: actions/upload-artifact@v5.0.0
6969
with:
7070
name: ${{ env.UPLOAD_PATCH_FILE }}
7171
path: ${{ env.UPLOAD_PATCH_FILE }}
7272

7373
- name: "Upload pre-commit.log"
7474
if: failure() && env.UPLOAD_PATCH_FILE == null
75-
uses: actions/upload-artifact@v4.6.2
75+
uses: actions/upload-artifact@v5.0.0
7676
with:
7777
name: pre-commit.log
7878
path: /github/home/.cache/pre-commit/pre-commit.log

res/controllers/Pioneer-DDJ-FLX4-script.js

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
//
2828
// * 32 beat jump forward & back (Shift + </> CUE/LOOP CALL arrows)
2929
// * Toggle quantize (Shift + channel cue)
30+
// * Stems selection using PADs (using controller's KeyShift mode)
3031
//
3132
// Not implemented (after discussion and trial attempts):
3233
// * Loop Section:
@@ -204,6 +205,18 @@ PioneerDDJFLX4.beatjumpSizeForPad = {
204205
0x27: 8 // PAD 8
205206
};
206207

208+
// Stems (KEY SHIFT) pads mode status for deck 1 and 2, without or with SHIFT pressed
209+
PioneerDDJFLX4.stemsPadsModesStatus = {
210+
"[Channel1]": [0x97, 0x98],
211+
"[Channel2]": [0x99, 0x9a],
212+
};
213+
214+
// Stems (KEY SHIFT) pad 1 control (pad control = [this value] + [pad number] - 1)
215+
PioneerDDJFLX4.stemMutePadsFirstControl = 0x70;
216+
217+
// Stems (KEY SHIFT) pad 5 control (pad control = [this value] + [pad number] - 1)
218+
PioneerDDJFLX4.stemFxPadsFirstControl = 0x74;
219+
207220
PioneerDDJFLX4.quickJumpSize = 32;
208221

209222
// Used for tempo slider
@@ -270,6 +283,18 @@ PioneerDDJFLX4.init = function() {
270283
}
271284
engine.makeConnection("[EffectRack1_EffectUnit1]", "focused_effect", PioneerDDJFLX4.toggleFxLight);
272285

286+
// Register callbacks for each deck, when a file is loaded and the number of stems is available
287+
engine.makeConnection("[Channel1]", "stem_count", PioneerDDJFLX4.stemCountChanged);
288+
engine.makeConnection("[Channel2]", "stem_count", PioneerDDJFLX4.stemCountChanged);
289+
290+
// Register callbacks for each stems of each decks, to change pad lights when muted/unmuted/FX
291+
for (let stem=1; stem<=4; stem++) {
292+
for (let deck=1; deck<=2; deck++) {
293+
engine.makeConnection(`[Channel${deck}_Stem${stem}]`, "mute", PioneerDDJFLX4.stemMuteChanged);
294+
engine.makeConnection(`[QuickEffectRack1_[Channel${deck}_Stem${stem}]]`, "enabled", PioneerDDJFLX4.stemFxChanged);
295+
}
296+
}
297+
273298
PioneerDDJFLX4.keepAliveTimer = engine.beginTimer(200, PioneerDDJFLX4.sendKeepAlive);
274299

275300
// query the controller for current control positions on startup
@@ -790,6 +815,148 @@ PioneerDDJFLX4.quickJumpBack = function(_channel, _control, value, _status, grou
790815
}
791816
};
792817

818+
//
819+
// Stems mode
820+
//
821+
822+
PioneerDDJFLX4.stemMutePadPressed = function(_channel, control, value, _status, group) {
823+
if (value !== 0x7f) {
824+
return;
825+
}
826+
827+
const stemCount = Math.min(engine.getValue(group, "stem_count"), 4);
828+
829+
if (control - PioneerDDJFLX4.stemMutePadsFirstControl + 1 > stemCount) {
830+
return;
831+
}
832+
833+
const stemGroup = `[${group.substring(1, group.length-1)}_Stem${control - PioneerDDJFLX4.stemMutePadsFirstControl + 1}]`;
834+
835+
if (engine.getValue(stemGroup, "mute")) {
836+
engine.setValue(stemGroup, "mute", 0);
837+
} else {
838+
engine.setValue(stemGroup, "mute", 1);
839+
}
840+
};
841+
842+
PioneerDDJFLX4.stemMutePadShiftPressed = function(_channel, control, value, _status, group) {
843+
if (value !== 0x7f) {
844+
return;
845+
}
846+
847+
const stemCount = Math.min(engine.getValue(group, "stem_count"), 4);
848+
849+
if (control - PioneerDDJFLX4.stemMutePadsFirstControl + 1 > stemCount) {
850+
return;
851+
}
852+
853+
for (let stemIdx=1; stemIdx<=stemCount; stemIdx++) {
854+
const stemGroup = `[${group.substring(1, group.length-1)}_Stem${stemIdx}]`;
855+
856+
if (stemIdx + PioneerDDJFLX4.stemMutePadsFirstControl - 1 === control) {
857+
engine.setValue(stemGroup, "mute", 0);
858+
} else {
859+
engine.setValue(stemGroup, "mute", 1);
860+
}
861+
}
862+
};
863+
864+
PioneerDDJFLX4.stemFxPadPressed = function(_channel, control, value, _status, group) {
865+
if (value !== 0x7f) {
866+
return;
867+
}
868+
869+
if (control - PioneerDDJFLX4.stemFxPadsFirstControl + 1 > 4) {
870+
return;
871+
}
872+
873+
const stemGroup = `[QuickEffectRack1_[${group.substring(1, group.length-1)}_Stem${control - PioneerDDJFLX4.stemFxPadsFirstControl + 1}]]`;
874+
875+
if (engine.getValue(stemGroup, "enabled")) {
876+
engine.setValue(stemGroup, "enabled", 0);
877+
} else {
878+
engine.setValue(stemGroup, "enabled", 1);
879+
}
880+
};
881+
882+
PioneerDDJFLX4.stemFxPadShiftPressed = function(_channel, control, value, _status, group) {
883+
if (value !== 0x7f) {
884+
return;
885+
}
886+
887+
if (control - PioneerDDJFLX4.stemFxPadsFirstControl + 1 > 4) {
888+
return;
889+
}
890+
891+
const stemGroup = `[QuickEffectRack1_[${group.substring(1, group.length-1)}_Stem${control - PioneerDDJFLX4.stemFxPadsFirstControl + 1}]]`;
892+
893+
engine.setValue(stemGroup, "next_chain_preset", 1);
894+
};
895+
896+
PioneerDDJFLX4.stemCountChanged = function(_value, group, _control) {
897+
898+
for (let stem=1; stem<=4; stem++) {
899+
// Stem mute pads
900+
PioneerDDJFLX4.stemMuteChanged(
901+
engine.getValue(`[${group.substring(1, group.length-1)}_Stem${stem}]`, "mute"),
902+
`[${group.substring(1, group.length-1)}_Stem${stem}]`,
903+
_control,
904+
);
905+
906+
// Stem FX pads
907+
PioneerDDJFLX4.stemFxChanged(
908+
engine.getValue(`[QuickEffectRack1_[${group.substring(1, group.length-1)}_Stem${stem}]]`, "enabled"),
909+
`[QuickEffectRack1_[${group.substring(1, group.length-1)}_Stem${stem}]]`,
910+
_control,
911+
);
912+
}
913+
};
914+
915+
PioneerDDJFLX4.stemMuteChanged = function(value, group, _control) {
916+
const channelStem = group.match(/\[Channel(\d+)_Stem(\d+)\]/);
917+
const deck = Number(channelStem[1]);
918+
const stem = Number(channelStem[2]);
919+
const channel = `[Channel${deck}]`;
920+
921+
if (stem > 4) {
922+
return;
923+
}
924+
925+
const stemCount = engine.getValue(channel, "stem_count");
926+
927+
let code = 0x00;
928+
if (stem <= stemCount && value <= 0.5) {
929+
code = 0x7f;
930+
}
931+
932+
for (let i=0; i<PioneerDDJFLX4.stemsPadsModesStatus[channel].length; i++) {
933+
midi.sendShortMsg(
934+
PioneerDDJFLX4.stemsPadsModesStatus[channel][i],
935+
PioneerDDJFLX4.stemMutePadsFirstControl + stem -1,
936+
code,
937+
);
938+
}
939+
};
940+
941+
PioneerDDJFLX4.stemFxChanged = function(value, group, _control) {
942+
const channelStem = group.match(/\[QuickEffectRack1_\[Channel(\d+)_Stem(\d+)\]\]/);
943+
const deck = Number(channelStem[1]);
944+
const stem = Number(channelStem[2]);
945+
const channel = `[Channel${deck}]`;
946+
947+
if (stem > 4) {
948+
return;
949+
}
950+
951+
for (let i=0; i<PioneerDDJFLX4.stemsPadsModesStatus[channel].length; i++) {
952+
midi.sendShortMsg(
953+
PioneerDDJFLX4.stemsPadsModesStatus[channel][i],
954+
PioneerDDJFLX4.stemFxPadsFirstControl + stem -1,
955+
value <= 0.5 ? 0x00 : 0x7f,
956+
);
957+
}
958+
};
959+
793960
//
794961
// Shutdown
795962
//

0 commit comments

Comments
 (0)