diff --git a/src/app_task.cpp b/src/app_task.cpp index 89f12dd..4de368b 100644 --- a/src/app_task.cpp +++ b/src/app_task.cpp @@ -43,7 +43,7 @@ void AppTask::update() { } void AppTask::process_midi_event(const MidiEvent& event) { - Serial.printf("[APP] MIDI IN: Type=%d Ch=%d Note=%d Vel=%d\n", + Serial.printf("[APP] MIDI IN: Type=%d Ch=%d Data1=%d Data2=%d\n", event.type, event.channel, event.data1, event.data2); uint8_t led_index = 0xFF; @@ -51,26 +51,56 @@ void AppTask::process_midi_event(const MidiEvent& event) { uint8_t midi_note = event.data1; uint8_t midi_velocity = event.data2; - for (uint8_t i = 0; i < NUM_PADS; i++) { - if (pad_mapping[i].midi_channel == midi_channel && - pad_mapping[i].midi_note == midi_note) { - led_index = pad_mapping[i].led_index; - break; + // Handle NOTE_ON/NOTE_OFF for LED control (Launchpad standard) + if (event.type == MidiEvent::NOTE_ON || event.type == MidiEvent::NOTE_OFF) { + for (uint8_t i = 0; i < NUM_PADS; i++) { + if (pad_mapping[i].midi_channel == midi_channel && + pad_mapping[i].midi_note == midi_note) { + led_index = pad_mapping[i].led_index; + break; + } + } + + if (led_index < NUM_PADS) { + led_driver->set_led_state( + pad_mapping[led_index].midi_note, + pad_mapping[led_index].midi_channel, + event.type == MidiEvent::NOTE_ON ? midi_velocity : 0 + ); + + Serial.printf("[APP] MIDI -> LED: Ch%d Note%d Vel%d -> LED%d\n", + midi_channel, midi_note, midi_velocity, led_index); + } else { + Serial.printf("[APP] MIDI Ch%d Note%d Vel%d - no LED mapping\n", + midi_channel, midi_note, midi_velocity); } } - - if (led_index < NUM_PADS) { - led_driver->set_led_state( - pad_mapping[led_index].midi_note, - pad_mapping[led_index].midi_channel, - event.type == MidiEvent::NOTE_ON ? midi_velocity : 0 - ); + // Handle CC for LED control (Loopy Pro uses CC) + else if (event.type == MidiEvent::CONTROL_CHANGE) { + uint8_t cc_num = event.data1; + uint8_t cc_val = event.data2; - Serial.printf("[APP] MIDI -> LED: Ch%d Note%d Vel%d -> LED%d\n", - midi_channel, midi_note, midi_velocity, led_index); - } else { - Serial.printf("[APP] MIDI Ch%d Note%d Vel%d - no LED mapping\n", - midi_channel, midi_note, midi_velocity); + // Map CC number to pad index (CC 0-9 for pads 0-9, or CC 36-45 for notes 36-45) + // Try both mappings + if (cc_num < NUM_PADS) { + led_index = cc_num; // CC 0-9 + } else if (cc_num >= 36 && cc_num < 36 + NUM_PADS) { + led_index = cc_num - 36; // CC 36-45 + } + + if (led_index < NUM_PADS) { + led_driver->set_led_state( + pad_mapping[led_index].midi_note, + pad_mapping[led_index].midi_channel, + cc_val // CC value = velocity/color + ); + + Serial.printf("[APP] CC -> LED: Ch%d CC%d Val%d -> LED%d\n", + midi_channel, cc_num, cc_val, led_index); + } else { + Serial.printf("[APP] CC Ch%d CC%d Val%d - no LED mapping\n", + midi_channel, cc_num, cc_val); + } } }