Add CC (Control Change) handling for Loopy Pro LED control

This commit is contained in:
2026-06-24 05:52:21 +00:00
parent 0e5cbeb73d
commit 550fb7616e
+48 -18
View File
@@ -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);
}
}
}