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:
Paul Lipscomb
2026-07-06 22:17:37 -04:00
parent d6201c59b4
commit 0c7b6b4442
34 changed files with 4815 additions and 208 deletions
+512 -64
View File
@@ -1,55 +1,58 @@
{
"__last_used__": "rename whatever",
"__last_used__": "preset5",
"presets": {
"preset1": {
"faders": [
{
"uid": "c98d2009-d186-489a-8883-ccbd612cb4af",
"label": "Fader 1",
"label": "fuckin a",
"cc": 1,
"ch": 1,
"value": 69,
"value": 117,
"color": "Red",
"pickup": false,
"last_sent": 69,
"last_sent": 117,
"hw_cc": null,
"hw_channel": null,
"zone": null,
"center_index": null,
"zone_index": null,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "7bf9e219-b7a6-4d8e-b317-da9eb18a8095",
"label": "Fader 2",
"cc": 1,
"ch": 1,
"value": 96,
"value": 107,
"color": "Gray",
"pickup": false,
"last_sent": 96,
"last_sent": 107,
"hw_cc": null,
"hw_channel": null,
"zone": "right",
"center_index": 1,
"zone_index": -1,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "bd0c9b6a-db81-411d-88b0-5ebae3c4e790",
"label": "Fader 3",
"cc": 1,
"ch": 1,
"value": 56,
"value": 83,
"color": "Orange",
"pickup": false,
"last_sent": 56,
"last_sent": 83,
"hw_cc": null,
"hw_channel": null,
"zone": "left",
"center_index": 2,
"zone_index": -1,
"remote": true
"remote": true,
"dest_id": 1
}
],
"toggles": [
@@ -66,14 +69,15 @@
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "toggle",
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "73962e37-53b3-400f-a7e2-25ef7f1ea583",
"label": "Toggle 2",
"cc": 20,
"ch": 1,
"state": true,
"state": false,
"color": "Blue",
"zone": "left",
"center_index": 1,
@@ -81,7 +85,8 @@
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "toggle",
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "b3cf419a-5183-4272-bd6f-44f858afbec8",
@@ -96,7 +101,8 @@
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "momentary",
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "c179bfea-deec-416a-b4aa-74e81b5cbe03",
@@ -111,14 +117,15 @@
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "toggle",
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "a5a50618-fc4c-446e-868e-e4eafa6254e7",
"label": "Toggle 6",
"cc": 20,
"ch": 1,
"state": true,
"state": false,
"color": "Gray",
"zone": null,
"center_index": null,
@@ -126,7 +133,8 @@
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "toggle",
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "f1775380-3390-4fbb-bd8b-8c30ff18f72a",
@@ -141,7 +149,8 @@
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "toggle",
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "2064f2ca-6d18-468b-bf45-9bcb1fa1247d",
@@ -156,7 +165,8 @@
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "toggle",
"remote": true
"remote": true,
"dest_id": 1
}
],
"browser": {
@@ -207,18 +217,44 @@
"center_index": null,
"zone_index": null,
"hw_cc": null,
"hw_channel": null
"hw_channel": null,
"trigger_mode": "toggle",
"remote": true,
"dest_id": 1
}
],
"browser": {
"back_cc": 22,
"fwd_cc": 23
"back": {
"label": "Back",
"cc": 22,
"ch": 1,
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "momentary"
},
"fwd": {
"label": "Fwd",
"cc": 23,
"ch": 1,
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "momentary"
}
},
"big_title": "",
"preset_uuid": "30ff84d1-9240-41f6-b499-1d18ef7ab2eb",
"show_hide": {
"fader": false,
"toggle": false,
"transport": false
"transport": false,
"browser": false
},
"sections": {
"preset_browser": true,
"big_title": true,
"fader_row": true,
"toggle_row": true,
"transport_row": true
}
},
"preset3": {
@@ -237,7 +273,8 @@
"zone": "left",
"center_index": 0,
"zone_index": -1,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "7bf9e219-b7a6-4d8e-b317-da9eb18a8095",
@@ -253,23 +290,25 @@
"zone": null,
"center_index": null,
"zone_index": null,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "bd0c9b6a-db81-411d-88b0-5ebae3c4e790",
"label": "Fader 3",
"cc": 1,
"ch": 1,
"value": 93,
"value": 48,
"color": "Yellow",
"pickup": false,
"last_sent": 93,
"last_sent": 48,
"hw_cc": null,
"hw_channel": null,
"zone": "right",
"center_index": 2,
"zone_index": -1,
"remote": true
"remote": true,
"dest_id": 1
}
],
"toggles": [
@@ -286,7 +325,8 @@
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "toggle",
"remote": true
"remote": true,
"dest_id": 1
}
],
"browser": {
@@ -311,7 +351,7 @@
"preset_uuid": "7483fb5b-f47f-49e4-bccb-e8d20195078c",
"show_hide": {
"fader": false,
"toggle": false,
"toggle": true,
"transport": true,
"browser": true
},
@@ -367,118 +407,132 @@
"label": "Fader 1",
"cc": 90,
"ch": 15,
"value": 103,
"color": "Gray",
"value": 50,
"color": "Yellow",
"pickup": false,
"last_sent": 103,
"last_sent": 50,
"hw_cc": null,
"hw_channel": null,
"touch_sense_mode": "off",
"zone": null,
"center_index": null,
"zone_index": null,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "5aaecf41-3455-4fa2-bef1-ca02f5933a69",
"label": "Fader 2",
"label": "VERB",
"cc": 1,
"ch": 1,
"value": 89,
"color": "Gray",
"value": 57,
"color": "Orange",
"pickup": false,
"last_sent": 89,
"last_sent": 57,
"hw_cc": null,
"hw_channel": null,
"touch_sense_mode": "off",
"zone": null,
"center_index": null,
"zone_index": null,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "e8e8cca8-3bad-49a5-8c91-d3a78d25a1eb",
"label": "Fader 3",
"label": "VELOCITY",
"cc": 1,
"ch": 1,
"value": 64,
"color": "Gray",
"color": "Yellow",
"pickup": false,
"last_sent": 64,
"hw_cc": null,
"hw_channel": null,
"touch_sense_mode": "off",
"zone": null,
"center_index": null,
"zone_index": null,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "ae9cd47a-96af-45a4-83e6-816916a65e0e",
"label": "Fader 4",
"label": "oh shit",
"cc": 1,
"ch": 1,
"value": 64,
"value": 76,
"color": "Gray",
"pickup": false,
"last_sent": 64,
"last_sent": 76,
"hw_cc": null,
"hw_channel": null,
"touch_sense_mode": "off",
"zone": null,
"center_index": null,
"zone_index": null,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "fee53fde-2f59-4800-8873-3d75ca619366",
"label": "Fader 5",
"cc": 1,
"ch": 1,
"value": 64,
"value": 0,
"color": "Gray",
"pickup": false,
"last_sent": 64,
"last_sent": 0,
"hw_cc": null,
"hw_channel": null,
"touch_sense_mode": "off",
"zone": null,
"center_index": null,
"zone_index": null,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "1783a98d-16c9-4a06-ae4d-0f6ab36d4421",
"label": "WOOOOW",
"cc": 1,
"ch": 1,
"value": 64,
"value": 36,
"color": "Gray",
"pickup": false,
"last_sent": 64,
"last_sent": 36,
"hw_cc": null,
"hw_channel": null,
"touch_sense_mode": "off",
"zone": null,
"center_index": null,
"zone_index": null,
"remote": true
"remote": true,
"dest_id": 1
},
{
"uid": "2a55bdef-83aa-458f-a37d-e12a61e3e6a0",
"label": "Fader 7",
"cc": 1,
"ch": 1,
"value": 64,
"value": 18,
"color": "Gray",
"pickup": false,
"last_sent": 64,
"last_sent": 18,
"hw_cc": null,
"hw_channel": null,
"touch_sense_mode": "off",
"zone": null,
"center_index": null,
"zone_index": null,
"remote": true
"remote": true,
"dest_id": 1
}
],
"toggles": [
{
"uid": "46f17f40-1bb2-4527-b6c5-fd26e535beed",
"label": "Toggle 1",
"label": "whatever tap",
"cc": 20,
"ch": 1,
"state": false,
@@ -489,7 +543,8 @@
"hw_cc": null,
"hw_channel": null,
"trigger_mode": "toggle",
"remote": true
"remote": true,
"dest_id": 1
}
],
"browser": {
@@ -515,7 +570,7 @@
"show_hide": {
"fader": false,
"toggle": true,
"transport": true,
"transport": false,
"browser": true
},
"sections": {
@@ -789,6 +844,7 @@
"output_mode": "osc",
"osc_addr": "t/1/play",
"trigger_mode": "momentary",
"remote": true,
"dest_id": 1
},
{
@@ -804,6 +860,7 @@
"output_mode": "osc",
"osc_addr": "t/1/stop",
"trigger_mode": "momentary",
"remote": true,
"dest_id": 1
},
{
@@ -819,6 +876,7 @@
"output_mode": "osc",
"osc_addr": "t/1/record",
"trigger_mode": "momentary",
"remote": true,
"dest_id": 1
},
{
@@ -834,16 +892,406 @@
"output_mode": "osc",
"osc_addr": "t/1/recenable/1/@",
"trigger_mode": "momentary",
"remote": true,
"dest_id": 1
},
{
"uid": "4208c3e3-c0b0-4c51-a426-be90568c904a",
"label": "<",
"cc": 20,
"state": false,
"color": "Gray",
"zone": null,
"center_index": null,
"zone_index": null,
"hw_cc": null,
"output_mode": "osc",
"osc_addr": "/3/track-",
"trigger_mode": "momentary",
"remote": true,
"dest_id": 1
},
{
"uid": "7a029b92-9cc0-4534-8657-6abe24c592e0",
"label": ">",
"cc": 20,
"state": false,
"color": "Gray",
"zone": null,
"center_index": null,
"zone_index": null,
"hw_cc": null,
"output_mode": "osc",
"osc_addr": "/3/track+",
"trigger_mode": "momentary",
"remote": true,
"dest_id": 1
}
],
"transport_show_hide": true,
"transport_show_hide": false,
"io_config": {
"midi_out": "IAC Driver Bus 5",
"midi_out": "USB MIDI Port 1",
"midi_in": "Not Connected",
"midi_controller_in": "USB MIDI Port 1",
"transport_out": "Not Connected",
"osc_ip": "127.0.0.1",
"osc_listen_port": 9000,
"osc_send_port": 8000
}
"osc_listen_port": 9001,
"osc_send_port": 8000,
"osc_running": true,
"tablet_running": true
},
"focus_toggles": [
{
"uid": "6aa50c87-25fa-45a9-8b21-22ca6823bfef",
"label": "MUTE",
"state": false,
"color": "Red",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/3/mute",
"osc_addr_out": "/3/mute",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "01d26539-51b9-4413-b180-5b012f212e66",
"label": "SOLO",
"state": false,
"color": "Yellow",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/3/solo",
"osc_addr_out": "/3/solo",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "888310d7-efd8-4ca7-b5e6-9d62a2ba7d5c",
"label": "WRITE",
"state": false,
"color": "Red",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/3/atmwrite",
"osc_addr_out": "/3/atmwrite",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "21f875c2-d49e-484f-b0cd-5a9a5f89b0f9",
"label": "OFF",
"state": true,
"color": "White",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/3/atmoff",
"osc_addr_out": "/3/atmoff",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "180759b7-e68b-4b8a-aa11-ee19d2a87fa3",
"label": "TOUCH",
"state": false,
"color": "Yellow",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/3/atmtouch",
"osc_addr_out": "/3/atmtouch",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "5d9b7b3a-2429-4dd1-bcf2-043a6db9135d",
"label": "LISTEN",
"state": false,
"color": "Green",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/3/input",
"osc_addr_out": "/3/input",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "0916bf53-ac82-4fb2-9842-835aea39e7d5",
"label": "ARM",
"state": true,
"color": "Red",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/3/recenable",
"osc_addr_out": "/3/recenable",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "5433708f-5566-40a8-9333-f3061a07c217",
"label": "READ",
"state": false,
"color": "Green",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/3/atmread",
"osc_addr_out": "/3/atmread",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "d8741393-ec45-4bc2-a9a0-6dd7dbbe04dd",
"label": "<",
"state": false,
"color": "Gray",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "",
"osc_addr_out": "/3/track-",
"hardware_enabled": true,
"feedback_enabled": false,
"hw_cc": 39,
"hw_channel": 16,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "5f951196-c69a-43f2-b5c3-0bf263128c69",
"label": ">",
"state": false,
"color": "Gray",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "",
"osc_addr_out": "/3/track+",
"hardware_enabled": true,
"feedback_enabled": false,
"hw_cc": 40,
"hw_channel": 16,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "47a463c5-83c9-4e93-ace7-a488e0a20647",
"label": "Play",
"state": true,
"color": "Green",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/track/mute",
"osc_addr_out": "t/1/play",
"hardware_enabled": true,
"feedback_enabled": false,
"hw_cc": 48,
"hw_channel": 16,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "64a0aa02-4d41-4da2-b35d-c32a04d95157",
"label": "Stop",
"state": false,
"color": "White",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/track/mute",
"osc_addr_out": "t/1/stop",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
},
{
"uid": "c0cb0422-b095-4d2d-bafa-b3c48da537d3",
"label": "Record",
"state": false,
"color": "Red",
"zone": null,
"center_index": null,
"zone_index": null,
"trigger_mode": "momentary",
"osc_addr_in": "/track/mute",
"osc_addr_out": "t/1/record",
"hardware_enabled": false,
"feedback_enabled": false,
"hw_cc": null,
"hw_channel": null,
"hw_out_cc": 7,
"hw_out_ch": 1
}
],
"focus_feedbacks": [
{
"uid": "f61354e9-96f7-4826-975b-faea732c487c",
"label": "track name",
"text": "piano",
"color": "Gray",
"osc_addr_in": "/3/trackname",
"custom_enabled": false,
"custom_text": ""
},
{
"uid": "8e77be47-8d5a-4eda-906e-db978cd2207e",
"label": "track number",
"text": "6",
"color": "Gray",
"osc_addr_in": "/3/track#",
"custom_enabled": false,
"custom_text": ""
},
{
"uid": "c97ec8c9-1b97-48f4-9744-62f8a2faec28",
"label": "fader val",
"text": "-7.13dB",
"color": "Gray",
"osc_addr_in": "/3/trkvolval",
"custom_enabled": false,
"custom_text": ""
},
{
"uid": "28956bcf-b147-4e5b-a8c9-ec07d7be70e3",
"label": "time",
"text": "15:29.000",
"color": "Gray",
"osc_addr_in": "/1/time",
"custom_enabled": false,
"custom_text": ""
},
{
"uid": "0916a793-6adf-43b9-a2ea-8fca7ddafc57",
"label": "bar | beat",
"text": "465.3.00",
"color": "Gray",
"osc_addr_in": "/3/bar",
"custom_enabled": false,
"custom_text": ""
},
{
"uid": "7085f9f7-31dd-4214-9e4d-84b9618850ae",
"label": "Send 1 Val",
"text": "-10.3dB",
"color": "Gray",
"osc_addr_in": "/3/sendval1",
"custom_enabled": false,
"custom_text": ""
},
{
"uid": "506eaa2e-8ff4-4e86-a445-f00a46c037df",
"label": "2MX Send",
"text": "2MX SEND",
"color": "Gray",
"osc_addr_in": "/3/trackname",
"custom_enabled": true,
"custom_text": "2MX SEND"
},
{
"uid": "5259b459-4ba4-478d-b35e-4785bb6d75b0",
"label": "Feedback 8",
"text": "Track",
"color": "Gray",
"osc_addr_in": "/3/trackname",
"custom_enabled": true,
"custom_text": "Track"
}
],
"focus_faders": [
{
"uid": "18558185-7cd4-4c2a-995e-4524e69d99e1",
"label": "piano",
"value": 73,
"color": "Green",
"pickup": false,
"last_sent": 62,
"osc_addr_in": "/3/volume",
"osc_addr_out": "/3/volume",
"osc_addr_name": "/3/trackname",
"zone": null,
"center_index": null,
"zone_index": null,
"hardware_enabled": true,
"feedback_enabled": true,
"hw_cc": 8,
"hw_channel": 16,
"hw_out_cc": 8,
"hw_out_ch": 16,
"touch_sense_mode": "jl_cooper"
},
{
"uid": "279a2c81-6548-422e-bf6d-75119c81b9c3",
"label": "2MX",
"value": 65,
"color": "Gray",
"pickup": false,
"last_sent": 42,
"osc_addr_in": "/3/sendlevel1",
"osc_addr_out": "/3/sendlevel1",
"osc_addr_name": "/track/name",
"zone": null,
"center_index": null,
"zone_index": null,
"hardware_enabled": true,
"feedback_enabled": true,
"hw_cc": 7,
"hw_channel": 16,
"hw_out_cc": 7,
"hw_out_ch": 16,
"touch_sense_mode": "jl_cooper"
}
]
}