Fix CC feedback: route to correct pixel by LED index

This commit is contained in:
ash
2026-06-30 04:04:43 +00:00
parent 3dc9e445be
commit a4131adf2a
3 changed files with 23 additions and 4 deletions
+2 -2
View File
@@ -7,7 +7,7 @@ public:
virtual ~LedStub() {}
virtual void begin() = 0;
virtual void set_led_state(uint8_t note, uint8_t channel, uint8_t velocity) = 0;
virtual void set_led_state(uint8_t note, uint8_t channel, uint8_t velocity, int8_t led_index = -1) = 0;
virtual void clear_all() = 0;
virtual void set_led_brightness(uint8_t brightness) = 0;
virtual void flash_activity() {}
@@ -39,7 +39,7 @@ private:
public:
DefaultLedStub();
void begin() override;
void set_led_state(uint8_t note, uint8_t channel, uint8_t velocity) override;
void set_led_state(uint8_t note, uint8_t channel, uint8_t velocity, int8_t led_index = -1) override;
void clear_all() override;
void set_led_brightness(uint8_t brightness) override;
void flash_activity() override;
+2 -1
View File
@@ -112,7 +112,8 @@ void AppTask::process_midi_event(const MidiEvent& event) {
led_driver->set_led_state(
pad_mapping[led_index].midi_note,
pad_mapping[led_index].midi_channel,
cc_val
cc_val,
led_index
);
Serial.printf("[APP] CC -> LED: Ch%d CC%d Val%d -> LED%d\n",
midi_channel, cc_num, cc_val, led_index);
+19 -1
View File
@@ -200,9 +200,27 @@ void DefaultLedStub::begin() {
Serial.println("[LED] Startup complete");
}
void DefaultLedStub::set_led_state(uint8_t note, uint8_t channel, uint8_t velocity) {
void DefaultLedStub::set_led_state(uint8_t note, uint8_t channel, uint8_t velocity, int8_t led_index) {
if (!initialized || !mux_ptr) return;
// Direct index mode (used by CC feedback)
if (led_index >= 0 && led_index < NUM_LEDS) {
led_states[led_index].active = (velocity > 0);
led_states[led_index].note = note;
led_states[led_index].channel = channel;
led_states[led_index].velocity = velocity;
led_states[led_index].timestamp = millis();
uint32_t color = velocity_to_color(velocity);
uint8_t r = (color >> 16) & 0xFF;
uint8_t g = (color >> 8) & 0xFF;
uint8_t b = color & 0xFF;
mux_ptr->set_led_color(led_index, r, g, b);
mux_ptr->show();
Serial.printf("[LED] Set LED %d: note=%d ch=%d vel=%d\n", led_index, note, channel, velocity);
return;
}
// Note-match mode (used by NOTE_ON/OFF)
for (int i = 0; i < NUM_LEDS; i++) {
if (led_states[i].active && led_states[i].note == note) {
led_states[i].channel = channel;