JL Cooper MIDI Controller I/O, Focus widget hardware binding, iOS Channel Focus polish
Desktop:
- New dedicated MIDI Controller In port (separate from MIDI In), same CC learn/bind pipeline but never passes notes through; positioned first in the IO column order
- Fixed MIDI In "Not Connected" not persisting across restart (missing save_io_config call)
- Fixed MIDI Out/Transport Out mutual-exclusion incorrectly flagging "Not Connected" as an in-use port
- Renamed "Remote" checkbox to "App" on Fader/Toggle/Transport widgets
- FocusFaderWidget/FocusToggleWidget: new Hardware section (Learn + CC/CH bind) so a physical controller can drive a Channel Focus widget alongside the app/OSC, plus an independent Feedback checkbox that sends translated CC out (for motorized fader / LED sync)
- JL Cooper touch-sense profile ("No Profile" / "MIDI JL Cooper CC Mode") on FaderWidget/FocusFaderWidget: touch channel (value channel - 1, same CC) is filtered out of the value and gates incoming OSC/DAW feedback while touching
- FocusFeedbackWidget: "Custom" checkbox to show a manually-typed static string instead of live OSC feedback, disabling Learn/OSC input and suppressing the iPad broadcast while active
- New daw-config-reaper/ folder with reaper-osc-config-paul-custom.ReaperOSC
iOS:
- New FocusToggleWidget (dedicated Channel Focus toggle, split out of shared ToggleWidget) with colorName-aware darken/border and isMomentary handling — keeps Channel-Focus-only behavior off the regular ToggleWidget
- Arrange mode long-press menu: text alignment (left/center/right) and a 10-color named-palette Text Color picker for TitleWidget/FocusFeedbackWidget, persisted in the saved layout
- FocusFeedbackWidget: Reset Size action, monospaced-digit font fix for timestamp/counter jitter
- New "Cancel Changes" button in Arrange mode — reverts layout/hides/aligns to the state at Arrange-mode entry and restores desktop-side Remote/dest assignments
- Grid line brightness increased for visibility
- Bonjour discovery for desktop auto-connect
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+26
-9
@@ -137,6 +137,26 @@ class ToggleWidget(QWidget):
|
||||
|
||||
inner.addWidget(self.grp_cc)
|
||||
|
||||
# Group 3: Remote routing
|
||||
self.grp_remote = QFrame()
|
||||
self.grp_remote.setStyleSheet(_grp_style)
|
||||
_grp_remote_layout = QVBoxLayout(self.grp_remote)
|
||||
_grp_remote_layout.setContentsMargins(4, 4, 4, 4)
|
||||
_grp_remote_layout.setSpacing(3)
|
||||
|
||||
self.remote_checkbox = QCheckBox("App")
|
||||
self.remote_checkbox.setChecked(True)
|
||||
self.remote_checkbox.stateChanged.connect(lambda _: self.dest_spin.setEnabled(self.remote_checkbox.isChecked()))
|
||||
_grp_remote_layout.addWidget(self.remote_checkbox, alignment=Qt.AlignmentFlag.AlignHCenter)
|
||||
|
||||
self.dest_spin = QSpinBox()
|
||||
self.dest_spin.setRange(1, 9)
|
||||
self.dest_spin.setValue(1)
|
||||
self.dest_spin.setFixedWidth(52)
|
||||
_grp_remote_layout.addWidget(self.dest_spin, alignment=Qt.AlignmentFlag.AlignHCenter)
|
||||
|
||||
inner.addWidget(self.grp_remote)
|
||||
|
||||
# Toggle button with LED dot overlay
|
||||
btn_container = QWidget()
|
||||
btn_container.setFixedSize(60, 60)
|
||||
@@ -180,15 +200,6 @@ class ToggleWidget(QWidget):
|
||||
toggle_btn_row.addWidget(self.plus_btn)
|
||||
inner.addLayout(toggle_btn_row)
|
||||
|
||||
# Remote checkbox
|
||||
self.dest_spin = QSpinBox()
|
||||
self.dest_spin.setRange(0, 9)
|
||||
self.dest_spin.setSpecialValueText("Off")
|
||||
self.dest_spin.setPrefix("T:")
|
||||
self.dest_spin.setValue(1)
|
||||
self.dest_spin.setFixedWidth(52)
|
||||
inner.addWidget(self.dest_spin, alignment=Qt.AlignmentFlag.AlignHCenter)
|
||||
|
||||
# Zone button
|
||||
self.zone_btn = ZoneButton()
|
||||
self.zone_btn.left_callback = lambda active: self.on_zone_checked("left", active)
|
||||
@@ -379,6 +390,7 @@ class ToggleWidget(QWidget):
|
||||
"hw_cc": self.hw_cc,
|
||||
"hw_channel": self.hw_channel,
|
||||
"trigger_mode": self.trigger_mode,
|
||||
"remote": self.remote_checkbox.isChecked(),
|
||||
"dest_id": self.dest_spin.value(),
|
||||
}
|
||||
|
||||
@@ -404,9 +416,14 @@ class ToggleWidget(QWidget):
|
||||
self.hw_cc = state.get("hw_cc", None)
|
||||
self.hw_channel = state.get("hw_channel", None)
|
||||
self.set_trigger_mode(state.get("trigger_mode", "toggle"))
|
||||
remote = state.get("remote", True)
|
||||
self.remote_checkbox.blockSignals(True)
|
||||
self.remote_checkbox.setChecked(remote)
|
||||
self.remote_checkbox.blockSignals(False)
|
||||
self.dest_spin.blockSignals(True)
|
||||
self.dest_spin.setValue(state.get("dest_id", 1))
|
||||
self.dest_spin.blockSignals(False)
|
||||
self.dest_spin.setEnabled(remote)
|
||||
if self.hw_cc is not None:
|
||||
self.learn_btn.setText(f"HW: CC{self.hw_cc}")
|
||||
self.cc_input_lbl.setText(self._cc_input_label())
|
||||
|
||||
Reference in New Issue
Block a user