From 5fdfd536196df1a25b41bd50a215c47eedbc91f8 Mon Sep 17 00:00:00 2001 From: Juozas Gaigalas Date: Mon, 6 May 2024 15:55:02 +0300 Subject: [PATCH 1/2] bind all tracks solo/mute/arm MIDI notes --- .../keylab/mk2/ArturiaKeylab49MkII.java | 4 +- .../keylab/mk2/ArturiaKeylab61MkII.java | 4 +- .../keylab/mk2/ArturiaKeylab88MkII.java | 4 +- .../arturia/keylab/mk2/ArturiaKeylabMkII.java | 33 ++++++- .../arturia/keylab/mk2/ButtonId.java | 98 ++++++++++++++++--- 5 files changed, 120 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab49MkII.java b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab49MkII.java index f8959d61..fc162be9 100644 --- a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab49MkII.java +++ b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab49MkII.java @@ -37,8 +37,8 @@ protected void initHardwareLayout(final HardwareSurface surface) surface.hardwareElementWithId("PAD14").setBounds(108.75, 111.0, 24.0, 21.5); surface.hardwareElementWithId("PAD15").setBounds(143.0, 111.0, 24.0, 21.5); surface.hardwareElementWithId("PAD16").setBounds(175.25, 111.0, 24.0, 21.5); - surface.hardwareElementWithId("SOLO").setBounds(217.75, 47.25, 12.5, 6.0); - surface.hardwareElementWithId("MUTE").setBounds(242.0, 47.25, 12.5, 6.0); + surface.hardwareElementWithId("SOLO1").setBounds(217.75, 47.25, 12.5, 6.0); + surface.hardwareElementWithId("MUTE1").setBounds(242.0, 47.25, 12.5, 6.0); surface.hardwareElementWithId("READ").setBounds(292.0, 47.25, 12.5, 6.0); surface.hardwareElementWithId("WRITE").setBounds(315.25, 47.25, 12.5, 6.0); surface.hardwareElementWithId("SAVE").setBounds(217.0, 76.0, 12.5, 6.0); diff --git a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab61MkII.java b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab61MkII.java index de1b4997..93591ae9 100644 --- a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab61MkII.java +++ b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab61MkII.java @@ -37,8 +37,8 @@ protected void initHardwareLayout(final HardwareSurface surface) surface.hardwareElementWithId("PAD14").setBounds(168.25, 107.5, 24.0, 21.5); surface.hardwareElementWithId("PAD15").setBounds(202.5, 107.5, 24.0, 21.5); surface.hardwareElementWithId("PAD16").setBounds(234.75, 107.5, 24.0, 21.5); - surface.hardwareElementWithId("SOLO").setBounds(280.75, 45.75, 12.5, 6.0); - surface.hardwareElementWithId("MUTE").setBounds(305.0, 45.75, 12.5, 6.0); + surface.hardwareElementWithId("SOLO1").setBounds(280.75, 45.75, 12.5, 6.0); + surface.hardwareElementWithId("MUTE1").setBounds(305.0, 45.75, 12.5, 6.0); surface.hardwareElementWithId("READ").setBounds(355.0, 45.75, 12.5, 6.0); surface.hardwareElementWithId("WRITE").setBounds(378.25, 45.75, 12.5, 6.0); surface.hardwareElementWithId("SAVE").setBounds(280.0, 74.5, 12.5, 6.0); diff --git a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab88MkII.java b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab88MkII.java index e48e2982..75c9716f 100644 --- a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab88MkII.java +++ b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylab88MkII.java @@ -37,8 +37,8 @@ protected void initHardwareLayout(final HardwareSurface surface) surface.hardwareElementWithId("PAD14").setBounds(168.25, 107.5, 24.0, 21.5); surface.hardwareElementWithId("PAD15").setBounds(202.5, 107.5, 24.0, 21.5); surface.hardwareElementWithId("PAD16").setBounds(234.75, 107.5, 24.0, 21.5); - surface.hardwareElementWithId("SOLO").setBounds(280.75, 45.75, 12.5, 6.0); - surface.hardwareElementWithId("MUTE").setBounds(305.0, 45.75, 12.5, 6.0); + surface.hardwareElementWithId("SOLO1").setBounds(280.75, 45.75, 12.5, 6.0); + surface.hardwareElementWithId("MUTE1").setBounds(305.0, 45.75, 12.5, 6.0); surface.hardwareElementWithId("READ").setBounds(355.0, 45.75, 12.5, 6.0); surface.hardwareElementWithId("WRITE").setBounds(378.25, 45.75, 12.5, 6.0); surface.hardwareElementWithId("SAVE").setBounds(280.0, 74.5, 12.5, 6.0); diff --git a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylabMkII.java b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylabMkII.java index 6168fbc7..cbfcec44 100644 --- a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylabMkII.java +++ b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylabMkII.java @@ -334,9 +334,7 @@ private void initBaseLayer() layer.bindToggle(ButtonId.RECORD, mTransport.recordAction(), mTransport.isArrangerRecordEnabled()); layer.bindToggle(ButtonId.LOOP, mTransport.isArrangerLoopEnabled()); - layer.bindToggle(ButtonId.SOLO, mCursorTrack.solo()); - layer.bindToggle(ButtonId.MUTE, mCursorTrack.mute()); - layer.bindToggle(ButtonId.RECORD_ARM, mCursorTrack.arm()); + bindTrackButtons(layer); layer.bindToggle(ButtonId.READ, mTransport.isClipLauncherOverdubEnabled()); layer.bindToggle(ButtonId.WRITE, mTransport.isArrangerAutomationWriteEnabled()); @@ -347,6 +345,35 @@ private void initBaseLayer() layer.bindPressed(ButtonId.UNDO, mApplication.undoAction()); } + private void bindTrackButtons(final Layer layer) { + layer.bindToggle(ButtonId.SOLO1, mCursorTrack.solo()); + layer.bindToggle(ButtonId.SOLO2, mCursorTrack.solo()); + layer.bindToggle(ButtonId.SOLO3, mCursorTrack.solo()); + layer.bindToggle(ButtonId.SOLO4, mCursorTrack.solo()); + layer.bindToggle(ButtonId.SOLO5, mCursorTrack.solo()); + layer.bindToggle(ButtonId.SOLO6, mCursorTrack.solo()); + layer.bindToggle(ButtonId.SOLO7, mCursorTrack.solo()); + layer.bindToggle(ButtonId.SOLO8, mCursorTrack.solo()); + + layer.bindToggle(ButtonId.MUTE1, mCursorTrack.mute()); + layer.bindToggle(ButtonId.MUTE2, mCursorTrack.mute()); + layer.bindToggle(ButtonId.MUTE3, mCursorTrack.mute()); + layer.bindToggle(ButtonId.MUTE4, mCursorTrack.mute()); + layer.bindToggle(ButtonId.MUTE5, mCursorTrack.mute()); + layer.bindToggle(ButtonId.MUTE6, mCursorTrack.mute()); + layer.bindToggle(ButtonId.MUTE7, mCursorTrack.mute()); + layer.bindToggle(ButtonId.MUTE8, mCursorTrack.mute()); + + layer.bindToggle(ButtonId.RECORD_ARM1, mCursorTrack.arm()); + layer.bindToggle(ButtonId.RECORD_ARM2, mCursorTrack.arm()); + layer.bindToggle(ButtonId.RECORD_ARM3, mCursorTrack.arm()); + layer.bindToggle(ButtonId.RECORD_ARM4, mCursorTrack.arm()); + layer.bindToggle(ButtonId.RECORD_ARM5, mCursorTrack.arm()); + layer.bindToggle(ButtonId.RECORD_ARM6, mCursorTrack.arm()); + layer.bindToggle(ButtonId.RECORD_ARM7, mCursorTrack.arm()); + layer.bindToggle(ButtonId.RECORD_ARM8, mCursorTrack.arm()); + } + private void initDAWLayer() { final Layer layer = mDAWLayer; diff --git a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ButtonId.java b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ButtonId.java index bfe8398b..f7f213b8 100644 --- a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ButtonId.java +++ b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ButtonId.java @@ -3,20 +3,90 @@ public enum ButtonId { /*CHORD(0x12), TRANS(0x13), OCT_MINUS(0x10), OCT_PLUS(0x11), PAD(0x17), CHORD_MEMORY(0x16), CHORD_TRANSPOSE( - 0x15), MIDI_CH(0x14),*/ PAD1(0x70, 36, 9), PAD2(0x71, 37, 9), PAD3(0x72, 38, 9), PAD4(0x73, 39, - 9), PAD5(0x74, 40, 9), PAD6(0x75, 41, 9), PAD7(0x76, 42, 9), PAD8(0x77, 43, 9), PAD9(0x78, 44, - 9), PAD10(0x79, 45, 9), PAD11(0x7A, 46, 9), PAD12(0x7B, 47, 9), PAD13(0x7C, 48, 9), PAD14(0x7D, - 49, 9), PAD15(0x7E, 50, 9), PAD16(0x7F, 51, 9), SOLO(0x60, 0x08), MUTE(0x61, 0x10), - RECORD_ARM(0x62, 0x00), READ(0x63, 0x38), WRITE(0x64, 0x39), SAVE(0x65, - 0x4A), PUNCH_IN(0x66, 0x57), PUNCH_OUT(0x67, 0x58), METRO(0x68, 0x59), UNDO(0x69, - 0x51), REWIND(0x6A, 0x5B), FORWARD(0x6B, 0x5C), STOP(0x6C, 0x5D), PLAY_OR_PAUSE(0x6D, - 0x5E), RECORD(0x6E, 0x5F), LOOP(0x6F, 0x56), /*CATEGORY(0x18, 0x65), PRESET(0x19, - 0x64),*/ PRESET_PREVIOUS(0x1A, 0x62), PRESET_NEXT(0x1B, 0x63), WHEEL_CLICK(0, - 0x54), /*ANALOG_LAB(0x1C), DAW(0x1D), USER(0x1E),*/ NEXT(0x1F, - 0x31), PREVIOUS(0x20, 0x30), BANK(0x21, 0x21), SELECT1(0x22, - 0x18), SELECT2(0x23, 0x19), SELECT3(0x24, 0x1A), SELECT4(0x25, - 0x1B), SELECT5(0x26, 0x1C), SELECT6(0x27, 0x1D), SELECT7(0x28, - 0x1E), SELECT8(0x29, 0x1F), SELECT_MULTI(0x2A, 0x33); + 0x15), MIDI_CH(0x14),*/ + PAD1(0x70, 36, 9), + PAD2(0x71, 37, 9), + PAD3(0x72, 38, 9), + PAD4(0x73, 39, 9), + PAD5(0x74, 40, 9), + PAD6(0x75, 41, 9), + PAD7(0x76, 42, 9), + PAD8(0x77, 43, 9), + PAD9(0x78, 44, 9), + PAD10(0x79, 45, 9), + PAD11(0x7A, 46, 9), + PAD12(0x7B, 47, 9), + PAD13(0x7C, 48, 9), + PAD14(0x7D, 49, 9), + PAD15(0x7E, 50, 9), + PAD16(0x7F, 51, 9), + + SOLO1(0x60, 0x08), + SOLO2(0x60, 0x09), + SOLO3(0x60, 0x0A), + SOLO4(0x60, 0x0B), + SOLO5(0x60, 0x0C), + SOLO6(0x60, 0x0D), + SOLO7(0x60, 0x0E), + SOLO8(0x60, 0x0F), + + MUTE1(0x61, 0x10), + MUTE2(0x61, 0x11), + MUTE3(0x61, 0x12), + MUTE4(0x61, 0x13), + MUTE5(0x61, 0x14), + MUTE6(0x61, 0x15), + MUTE7(0x61, 0x16), + MUTE8(0x61, 0x17), + + RECORD_ARM1(0x62, 0x00), + RECORD_ARM2(0x62, 0x01), + RECORD_ARM3(0x62, 0x02), + RECORD_ARM4(0x62, 0x03), + RECORD_ARM5(0x62, 0x04), + RECORD_ARM6(0x62, 0x05), + RECORD_ARM7(0x62, 0x06), + RECORD_ARM8(0x62, 0x07), + + READ(0x63, 0x38), + WRITE(0x64, 0x39), + SAVE(0x65, 0x4A), + PUNCH_IN(0x66, 0x57), + PUNCH_OUT(0x67, 0x58), + METRO(0x68, 0x59), + UNDO(0x69, 0x51), + REWIND(0x6A, 0x5B), + FORWARD(0x6B, 0x5C), + STOP(0x6C, 0x5D), + PLAY_OR_PAUSE(0x6D, 0x5E), + RECORD(0x6E, 0x5F), + LOOP(0x6F, 0x56), + /*CATEGORY(0x18, 0x65), + PRESET(0x19, + 0x64), + */ + PRESET_PREVIOUS(0x1A, 0x62), + PRESET_NEXT(0x1B, 0x63), + WHEEL_CLICK(0, 0x54), + /*ANALOG_LAB(0x1C), + DAW(0x1D), + USER(0x1E), + */ + NEXT(0x1F, 0x31), + PREVIOUS(0x20, 0x30), + NEXT_BANK(0x1F, 0x2F), + PREVIOUS_BANK(0x20, 0x2E), + BANK(0x21, 0x21), + SELECT1(0x22, 0x18), + SELECT2(0x23, 0x19), + SELECT3(0x24, 0x1A), + SELECT4(0x25, 0x1B), + SELECT5(0x26, 0x1C), + SELECT6(0x27, 0x1D), + SELECT7(0x28, 0x1E), + SELECT8(0x29, 0x1F), + SELECT_MULTI(0x2A, 0x33); + ButtonId(final int SysexId) { From 5a3b70d4be72a2e2cee7c223e686f8b837a088c1 Mon Sep 17 00:00:00 2001 From: Juozas Gaigalas Date: Mon, 6 May 2024 16:17:13 +0300 Subject: [PATCH 2/2] select buttons banks and animation --- .../arturia/keylab/mk2/ArturiaKeylabMkII.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylabMkII.java b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylabMkII.java index cbfcec44..6975cc37 100644 --- a/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylabMkII.java +++ b/src/main/java/com/bitwig/extensions/controllers/arturia/keylab/mk2/ArturiaKeylabMkII.java @@ -97,6 +97,7 @@ public void init() mCursorTrack.hasNext().markInterested(); mCursorTrack.hasPrevious().markInterested(); mCursorTrack.position().markInterested(); + mCursorTrack.color().markInterested(); mDevice = mCursorTrack.createCursorDevice(); mDevice.exists().markInterested(); mDevice.hasNext().markInterested(); @@ -206,6 +207,13 @@ public void init() else mBrowserLayer.deactivate(); }); + + host.scheduleTask(this::handlePing, 50); + } + + private void handlePing() { + final ControllerHost host = getHost(); + host.scheduleTask(this::handlePing, 50); } private void initHardwareSurface() @@ -474,10 +482,20 @@ private void initBrowserLayer() private void initMultiLayer() { final Layer layer = mMultiLayer; - layer.bindToggle(ButtonId.PREVIOUS, mTrackBank.scrollBackwardsAction(), + + layer.bindToggle(ButtonId.NEXT, mTrackBank.scrollBackwardsAction(), + mTrackBank.canScrollBackwards()); + + + layer.bindToggle(ButtonId.PREVIOUS, mTrackBank.scrollForwardsAction(), + mTrackBank.canScrollForwards()); + + + layer.bindToggle(ButtonId.NEXT_BANK, mTrackBank.scrollPageBackwardsAction(), mTrackBank.canScrollBackwards()); - layer.bindToggle(ButtonId.NEXT, mTrackBank.scrollForwardsAction(), + + layer.bindToggle(ButtonId.PREVIOUS_BANK, mTrackBank.scrollPageForwardsAction(), mTrackBank.canScrollForwards()); for (int i = 0; i < 8; i++) @@ -488,7 +506,7 @@ private void initMultiLayer() layer.bindPressed(selectId, () -> mCursorTrack.selectChannel(mTrackBank.getItemAt(number))); layer.bind(() -> { - return isCursor.get() ? WHITE : mTrackBank.getItemAt(number).color().get(); + return isCursor.get() ? getBlinkColor() : mTrackBank.getItemAt(number).color().get(); }, selectId); } @@ -538,6 +556,11 @@ private void initMultiLayer() }); } + private Color getBlinkColor() { + final float blend = (float) Math.abs(Math.sin(System.currentTimeMillis() / 250.0)) * 0.8f; + return Color.mix(BLACK, mCursorTrack.color().get(), blend); + } + private void initAdjustingContinuousHardwareControlNotificationLayer() { mAdjustingContinuousHardwareControlNotificationLayer.showText(