ash
00337559ac
Add BLE diagnostics: controller status, MAC, advertising result
...
Remove getMinInterval/getMaxInterval (not available in v1.4.0).
Add esp_bt_controller_get_status() before/after init.
Add esp_bt_dev_get_address() for MAC address.
Print adv->start() return value.
Add explicit advertising interval settings (100-200ms).
2026-07-01 07:09:30 +00:00
ash
9ba48b3f9c
Roll back to 2d3a5a9 + CONFIG_BT_ENABLED + double-init patch
2026-07-01 07:06:45 +00:00
ash
01eaf9ce80
Fix enable-after-Arduino-init: always try to enable
...
Arduino framework inits BT controller but does NOT enable it.
Previous patch skipped both init AND enable when init returned
ESP_ERR_INVALID_STATE, leaving controller in init'd-but-not-enabled
state. Now we always try to enable regardless of init outcome.
2026-07-01 07:01:39 +00:00
ash
c26116a7ef
Set CONFIG_BT_ENABLED + re-add double-init patch
...
Without CONFIG_BT_ENABLED in sdkconfig.h, NimBLEDevice.cpp lines
are excluded by #if defined(CONFIG_BT_ENABLED) preprocessor guard,
making NimBLEDevice::init() a no-op. No BT controller init ever
occurs -> no RF calibration -> invisible BLE advertising.
With CONFIG_BT_ENABLED: Arduino framework pre-inits BT controller,
then NimBLEDevice::init() double-inits -> ESP_ERROR_CHECK abort.
Fix: patch NimBLEDevice.cpp to check return code and skip init if
already running.
2026-07-01 06:57:19 +00:00
ash
fec2ea1db2
Move all MIDI processing to Core 0
...
Move controller.update() inside midi_task on Core 0 to eliminate
TinyUSB cross-core race condition. Previously:
- Core 1 (loop()): usb_midi.writePacket() in controller.update()
- Core 0 (midi_task): usb_midi.available()/readPacket()
This race condition causes crashes on button press.
Now:
- Core 0 (midi_task): midi_transport.update() + controller.update()
- Core 1 (loop()): led_driver.update() + serial commands only
2026-07-01 06:51:48 +00:00
ash
762500e227
Fix BLE crash: move all NimBLE calls to Core 0
...
Root cause: Arduino Core 3.x breaks cross-core NimBLE API calls.
Calling BLEMidiServer.controlChange() from loop() on Core 1 while
NimBLE host runs on Core 0 causes immediate crash.
Fix:
- Move ble_midi_transport.begin() to ble_init_task on Core 0
- All BLE MIDI sends use queue_cc() (cross-core safe flag setter)
- ble_midi_transport.update() processes queued sends on Core 0
- Pin NimBLE-Arduino to v1.4.3 (stable LTS for BLE MIDI)
- Keep CONFIG_BT_ENABLED out of sdkconfig.h (causes double-init)
2026-07-01 06:46:15 +00:00
ash
62d1e430d5
Switch from NimBLE-Arduino to ESP32-BLE-MIDI library
...
Replace direct NimBLE-Arduino dependency with max22/ESP32-BLE-MIDI
wrapper library (v0.3.2). Rewrite ble_midi_transport to use
BLEMidiServer API instead of raw NimBLEDevice calls.
Removes patch_nimble_device() from pre_build.py — no longer needed
since BT controller init is managed by the library internally.
The library uses NimBLE v1.4.1 internally and configures advertising
without setScanResponse() or setName(), which may resolve the invisible
BLE advertising issue on ESP32-S3.
2026-07-01 06:34:36 +00:00
ash
1517eda13e
add CONFIG_BT_ENABLED to sdkconfig.h for proper BT RF calibration; patch NimBLEDevice.cpp to skip controller init if already done by Arduino framework
2026-07-01 06:11:28 +00:00
ash
855c97d8c6
revert to NimBLE-Arduino v1.4.0 (v2.2.3 caused button crash regression); restore v1.4.0 callback signatures, service->start(), and setScanResponse
2026-07-01 04:47:22 +00:00
ash
993a09fa7c
fix v2.2.3 API: update callback signatures (onConnect, onDisconnect, onWrite) and remove deprecated service->start()
2026-07-01 04:30:50 +00:00
ash
18844c17c0
upgrade NimBLE-Arduino to v2.2.3 for proper ESP32-S3 support; fix setScanResponse->enableScanResponse API change
2026-07-01 04:27:22 +00:00
ash
7530772acd
add adv->setName, remove diagnostics and ext adv flag; revert to stable
2026-07-01 04:18:00 +00:00
ash
94567e3485
fix: NimBLEDevice::init() returns void, remove bool check
2026-07-01 04:02:04 +00:00
ash
beb59da3e0
add init() return check, controller status, and MAC address debug
2026-06-30 22:07:06 +00:00
ash
2d3a5a9031
queue MIDI sends with delay(1) to avoid race; force legacy advertising
2026-06-30 21:59:55 +00:00
ash
72a10fa13a
add TinyUSBDevice.ready() guard in send_cc to prevent crash
2026-06-30 13:55:53 +00:00
ash
d8c109d9e5
remove setName and health check (caused crashes), add isAdvertising() check
2026-06-30 13:14:19 +00:00
ash
5ee5949420
add adv->setName(JOC Midi) and health check to restart advertising
2026-06-30 12:55:29 +00:00
ash
8515963e07
pre_build.py: remove CONFIG_BT_ENABLED from sdkconfig patching (fixes BT pre-init conflict with USB)
2026-06-30 12:34:00 +00:00
ash
e2db658037
TEST: disable BLE init to isolate button press crash
2026-06-30 12:12:50 +00:00
ash
8833e08c0a
add debug prints before switch read and in process_switch_event; skip MIDI sends
2026-06-30 08:54:00 +00:00
ash
3e92d6bb7c
swap init order (USB before BLE), add USB ready check and debug prints
2026-06-30 08:48:04 +00:00
ash
be8b0dc22d
add debug prints around button press to find crash location
2026-06-30 08:35:47 +00:00
ash
6038b3bf58
remove health check - back to exact source of working commit 6e3173c
2026-06-30 07:59:07 +00:00
ash
1f7bdc1e3a
revert setName, keep health check
2026-06-30 07:55:10 +00:00
ash
af6fd2dc26
fix: add adv->setName, add periodic health check to diagnose invisible BLE device
2026-06-30 07:44:04 +00:00
ash
6e3173c9b8
fix: remove manual 0x2902/CCCD descriptor creation - NimBLE auto-creates it for NOTIFY characteristics; asserts on manual create
2026-06-30 07:37:48 +00:00
ash
d19d1acbdd
chore: add granular debug prints around BLE characteristic/descriptor creation to pinpoint crash
2026-06-30 07:31:34 +00:00
ash
a21c7bf4d3
fix: remove manual BT controller pre-init - NimBLE-Arduino 1.4.0 already handles ESP32-S3 internally; double-init caused ESP_ERROR_CHECK abort
2026-06-30 07:24:34 +00:00
ash
6a737bcee2
fix: patch nimconfig.h with #ifndef guards for ROLE defines to eliminate redefinition warnings
2026-06-30 07:15:14 +00:00
ash
323bc072ee
fix: remove redundant ROLE defines from pre_build.py, suppress -Wno-macro-redefined
2026-06-30 07:09:15 +00:00
ash
13aef3b2a0
Init BT controller with ESP_BT_MODE_BLE before NimBLEDevice::init to avoid BTDM crash on ESP32-S3
2026-06-30 06:59:32 +00:00
ash
68efe30682
Remove redundant manual BT controller init; let NimBLEDevice::init handle it internally with BLE-only mode
2026-06-30 06:49:43 +00:00
ash
2db09b76bf
Add BT controller diagnostics, init BLE before USB MIDI
2026-06-30 06:43:58 +00:00
ash
8a36296043
Add sdkconfig.defaults for BLE, remove bad CONFIG flags, increase stack
2026-06-30 06:36:40 +00:00
ash
eab0b76c9d
Fix: NimBLEDevice::init returns void, remove bool check
2026-06-30 06:30:58 +00:00
ash
95d182cda6
Replace NimBLE2902 with createDescriptor for CCCD
2026-06-30 06:29:30 +00:00
ash
c3bbf08768
Fix: use just NimBLEDevice.h, remove missing NimBLE2902.h
2026-06-30 06:25:25 +00:00
ash
f5eca2c7bc
Switch to NimBLE stack, add BT build flags, add error checking
2026-06-30 06:24:19 +00:00
ash
892e4fe061
Fix: on_receive public, explicit casts for narrowing
2026-06-30 06:19:10 +00:00
ash
aea3a28206
Add BLE MIDI transport (feature_bluetooth)
2026-06-30 06:13:36 +00:00
ash
ae2891fca8
Fix palette: entries 121-127 now visible (was black). Remove local flash.
2026-06-30 05:05:06 +00:00
ash
d59e36a9a5
Add direct local LED feedback on button press
2026-06-30 04:58:22 +00:00
ash
063fa2065d
Send visible palette index 21 (yellow) instead of 127 (black) so feedback is visible
2026-06-30 04:49:30 +00:00
ash
62b0604508
Map buttons to custom CC values with reverse-map feedback
2026-06-30 04:43:42 +00:00
ash
3389cc9403
Send CC instead of NOTE_ON for Loopy Pro generic mirror. Clean up flash_activity.
2026-06-30 04:38:28 +00:00
ash
1728413cb8
Fix NOTE_ON feedback: pass led_index to set_led_state
2026-06-30 04:17:18 +00:00
ash
c57847db78
Remove flash_activity that was stealing focus to LED 0
2026-06-30 04:14:07 +00:00
ash
a4131adf2a
Fix CC feedback: route to correct pixel by LED index
2026-06-30 04:04:43 +00:00
ash
1c1fc4d372
Remove heartbeat, relabel USB to JOC Midi
2026-06-30 03:46:31 +00:00
ash
ac83ba269f
USB name: JOC / JOC Midi (VID/PID still Launchpad X for Loopy Pro recognition)
2026-06-26 00:13:41 +00:00
ash
17c630f850
Fix update(): remove old sysex_flash_active logic
2026-06-26 00:07:50 +00:00
ash
268b793d87
Fix compilation: remove unused flash_sysex/flash_all/flash_one methods and member vars
2026-06-25 23:54:30 +00:00
ash
a281eaa46e
Clean up LED driver + rename USB to JOC Midi
...
- Removed flash_sysex/flash_all/flash_one (conflicted with heartbeat)
- Simplified flash_activity: LED 0 white 50ms, restores properly
- Heartbeat only on LED 9 when no activity
- USB renamed: Manufacturer=JOC, Product=JOC Midi
2026-06-25 23:47:39 +00:00
ash
6ccd28362f
Add Generic mode CC value visualization
...
- LED 1 green = CC received
- LED 2 color shows CC value range:
- Red (0-31) = recording?
- Amber (32-63) = queued?
- Green (64-95) = playing?
- Blue (96-127) = other?
- Helps map Loopy Pro Generic mode values to Launchpad palette
2026-06-25 23:32:24 +00:00
ash
90bbfa7b84
Revert to single MIDI interface (working USB detection)
...
- Dual interface broke USB enumeration
- Back to working single interface with Novation Launchpad X VID/PID
- Buttons work, MIDI OUT works
2026-06-25 23:17:18 +00:00
ash
a209b48720
Add second USB MIDI interface (LPX MIDI) for Programmer mode
...
- Interface 1 (DAW): Button presses -> Loopy Pro
- Interface 2 (MIDI): SysEx + LED control <- Loopy Pro
- Both interfaces polled in update()
- Sends on DAW interface (like real Launchpad X)
2026-06-25 22:51:44 +00:00
ash
c20f1dec2c
Add visual MIDI type indicators
...
- SysEx: ALL LEDs flash white 200ms
- Note: LED 0 flashes red 100ms
- CC: LED 1 flashes green 100ms
- Helps diagnose what MIDI arrives without serial
2026-06-25 22:39:37 +00:00
ash
c02121cd09
Add pre-build script to patch core's pins_arduino.h with Launchpad X VID/PID
...
- pre_build.py patches framework-arduinoespressif32/variants/esp32s3_devkitc/pins_arduino.h
- Replaces USB_VID 0x303a -> 0x1235, USB_PID 0x1001 -> 0x0103
- Adds USB_MANUFACTURER/PRODUCT
2026-06-25 22:21:51 +00:00
ash
109106f1f1
Add custom pins_arduino.h variant with Launchpad X VID/PID
...
- variants/esp32s3/pins_arduino.h overrides USB_VID/USB_PID
- Included via -I in build_flags before core variant
- This should force USB descriptors at hardware level
2026-06-25 22:03:15 +00:00
ash
75f583b3c4
Revert to standard board, try VID/PID via board_build.arduino.vid/pid
2026-06-25 10:57:12 +00:00
ash
fc9b7688c0
Fix board definition: add espidf framework for Arduino core
2026-06-25 08:57:24 +00:00
ash
b380133b3e
Add custom board definition with Launchpad X VID/PID (0x1235/0x0103)
...
- boards/launchpad_x_variant.json defines custom board
- platformio.ini uses custom board
- Board sets VID/PID at hardware level
2026-06-25 08:27:47 +00:00
ash
25713707aa
Revert to working USB mode (ARDUINO_USB_MODE=0 + CDC)
2026-06-25 08:20:19 +00:00
ash
7558082e7b
Try ARDUINO_USB_MODE=2 (native MIDI only)
...
Disable CDC, use ESP32 core native USB MIDI stack
2026-06-25 08:12:07 +00:00
ash
dee60c7d27
Fix compilation: declare 'now' in flash_sysex
2026-06-25 07:54:35 +00:00
ash
1676bbb044
Fix LED flash/restore logic, heartbeat only on LED 9
...
- flash_activity: only LED 0, restores properly
- flash_sysex: saves ALL LED states, restores all properly
- heartbeat: only LED 9, only when no activity flash active
- Added sysex_saved arrays to track all LED states
2026-06-25 07:48:05 +00:00
ash
0d738a6e5e
Fix compilation: add flash_sysex to interface + remove conflicting build flags
2026-06-25 07:40:10 +00:00
ash
399c4341ed
Add VID/PID to build flags for ESP32 core + stronger visual indicators
...
- Set USB VID/PID via ESP32 core build flags (may work better than TinyUSB API)
- Heartbeat on LED 9 (amber pulse every 2s) confirms device is alive
- SysEx flashes ALL LEDs white for 200ms
- Regular MIDI flashes LED 0 white for 50ms
2026-06-25 07:33:12 +00:00
ash
b5bbe24977
Add SysEx handling for Launchpad X Programmer mode
...
- Parse all SysEx CIN types (start, continue, end)
- Reassemble multi-packet SysEx messages
- Handle layout select (Programmer mode = 0x7F)
- Handle Programmer/Live mode switch
2026-06-25 07:20:47 +00:00
ash
8d859ce0af
Fix: use setID(vid, pid) not setVID/setPID
2026-06-25 06:53:02 +00:00
ash
edb86bf49a
Spoof Novation Launchpad X USB VID/PID
...
Change USB device descriptor to VID 0x1235 PID 0x0103
so Loopy Pro recognizes the device as a Launchpad X
and sends LED control MIDI in Launchpad mode.
2026-06-25 06:51:39 +00:00
ash
500720dadf
Add visual MIDI activity indicator
...
Flash LED 0 white for 30ms on any MIDI input.
Visible without serial - helps diagnose whether MIDI
is arriving when connected to iPad with Loopy Pro.
2026-06-25 06:43:00 +00:00
ash
40dfe775ea
Fix Launchpad mode MIDI receive and color palette
...
- Fixed note matching bug: removed channel check so notes 36-45 match
across channels 1-3 (Launchpad static/flashing/pulsing)
- Simplified LED lookup to match by note only (channel stored for mode)
- Replaced sparse palette with proper RGB gradients between key
breakpoints (Red, Orange, Yellow, Green, Cyan, Blue, Purple, Off)
2026-06-25 06:31:16 +00:00
ash
fee8ab5b94
Focus on Launchpad X mode: NOTE 36-45 ch1-3, send NOTE_ON/OFF for buttons
2026-06-24 06:43:16 +00:00
ash
4f6ff39af4
Add run_palette_test() declaration to header
2026-06-24 06:32:57 +00:00
ash
6aa3579317
Add palette test mode (hold pad 0+9 for 2s), comprehensive MIDI handling
2026-06-24 06:29:08 +00:00
ash
840bcf9a1e
Fix MidiEvent::SYSTEM -> SYSEX
2026-06-24 06:23:42 +00:00
ash
37c6e66584
Add visual MIDI activity indicator (flashes pad 0 on any MIDI receive)
2026-06-24 06:03:27 +00:00
ash
296611ce52
Send CC2-11 for button presses (match Loopy Pro)
2026-06-24 05:58:10 +00:00
ash
b5a1710ebd
Map CC 2-11 to pads 0-9 for Loopy Pro LED feedback
2026-06-24 05:56:58 +00:00
ash
550fb7616e
Add CC (Control Change) handling for Loopy Pro LED control
2026-06-24 05:52:21 +00:00
ash
0e5cbeb73d
Clean up: remove boot layout test (Launchpad X mapping confirmed working)
2026-06-24 05:47:09 +00:00
ash
e2997a595d
Simplify boot layout test to single quick pass (Launchpad X only)
2026-06-24 05:39:39 +00:00
ash
5df74b28e2
Add run_layout_test() declaration to header
2026-06-24 05:32:49 +00:00
ash
26c86be7ea
Add boot-time layout test (no serial input needed)
2026-06-24 04:33:02 +00:00
ash
83e9e29520
Add padtest command - tests each pad individually with 3s delay
2026-06-24 04:22:34 +00:00
ash
6ec306bbf7
Replace delay() with vTaskDelay() in miditest to avoid watchdog reset
2026-06-24 04:05:25 +00:00
ash
6c64c91e55
Add miditest and mapping commands for LED layout debugging
2026-06-24 03:56:30 +00:00
ash
e5e546ed39
Update pad_mapping to Launchpad X standard notes 36-45 (C2-A2) on channel 1
2026-06-24 03:37:29 +00:00
ash
7f061aecbf
Fix palette to 128 entries (3 purple at end)
2026-06-24 03:20:40 +00:00
ash
efaec9df71
Fix palette to exactly 128 entries (0-127)
2026-06-24 03:16:50 +00:00
ash
6503799875
Fix palette array size (128) and remove duplicate clear_all()
2026-06-24 01:41:14 +00:00
ash
bd20d1938b
Fix duplicate set_led_state, add set_led_brightness to interface
2026-06-24 01:28:56 +00:00
ash
b2d726a953
Add Launchpad X velocity->color palette and matching startup animation
2026-06-24 01:25:45 +00:00
ash
2eced5c007
Add debug logging for incoming MIDI events
2026-06-24 01:07:00 +00:00
ash
ec0834ed48
Remove isInitialized() check - not in v3.1.0 API
2026-06-24 00:56:44 +00:00
ash
9c95225a37
Back to Adafruit TinyUSB Library v3.1.0 with full init ownership (no USE_TINYUSB=1 conflict)
2026-06-24 00:53:13 +00:00
ash
65d8120abb
Fix USB diagnostic command to use native USB API
2026-06-24 00:47:00 +00:00
ash
10f5117a15
Try USB.h only for USB MIDI
2026-06-24 00:45:53 +00:00