Add miditest and mapping commands for LED layout debugging

This commit is contained in:
2026-06-24 03:56:30 +00:00
parent e5e546ed39
commit 6c64c91e55
2 changed files with 121 additions and 11 deletions
+1 -1
View File
@@ -18,6 +18,7 @@ public:
void begin(); void begin();
void update(); void update();
void process_midi_event(const MidiEvent& event); // public for test commands
private: private:
LedStub* led_driver; LedStub* led_driver;
@@ -28,6 +29,5 @@ private:
PadMapping pad_mapping[NUM_PADS]; PadMapping pad_mapping[NUM_PADS];
bool last_switch_state[NUM_PADS]; bool last_switch_state[NUM_PADS];
void process_midi_event(const MidiEvent& event);
void process_switch_event(uint8_t switch_id, bool pressed); void process_switch_event(uint8_t switch_id, bool pressed);
}; };
+110
View File
@@ -130,6 +130,8 @@ void handle_serial_command(const String& cmd) {
Serial.println(" gpiotest - raw GPIO pin diagnostic"); Serial.println(" gpiotest - raw GPIO pin diagnostic");
Serial.println(" rawled - bit-bang WS2812 (no library)"); Serial.println(" rawled - bit-bang WS2812 (no library)");
Serial.println(" anim - re-run startup animation from loop"); Serial.println(" anim - re-run startup animation from loop");
Serial.println(" miditest - simulate MIDI IN for common Launchpad layouts");
Serial.println(" mapping - show current pad->note mapping");
} else if (cmd == "anim") { } else if (cmd == "anim") {
Serial.println("[CMD] Running animation..."); Serial.println("[CMD] Running animation...");
uint32_t colors[] = {0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF}; uint32_t colors[] = {0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF};
@@ -168,6 +170,114 @@ void handle_serial_command(const String& cmd) {
Serial.println("[CMD] Sent. Wait 2 sec..."); Serial.println("[CMD] Sent. Wait 2 sec...");
delay(2000); delay(2000);
Serial.println("[CMD] Done"); Serial.println("[CMD] Done");
} else if (cmd == "miditest") {
Serial.println("[CMD] Simulating MIDI IN for common Launchpad layouts...");
// Test 1: Launchpad X bottom row (notes 36-45, channel 1)
Serial.println("[CMD] Test 1: Launchpad X bottom row (notes 36-45, ch1)");
for (int i = 0; i < 10; i++) {
MidiEvent event;
event.type = MidiEvent::NOTE_ON;
event.channel = 1;
event.data1 = 36 + i;
event.data2 = 64; // Medium velocity (yellow)
controller.process_midi_event(event);
delay(200);
}
for (int i = 0; i < 10; i++) {
MidiEvent event;
event.type = MidiEvent::NOTE_OFF;
event.channel = 1;
event.data1 = 36 + i;
event.data2 = 0;
controller.process_midi_event(event);
}
// Test 2: Launchpad Mini Mk3 (notes 0-9, channel 1)
Serial.println("[CMD] Test 2: Launchpad Mini Mk3 (notes 0-9, ch1)");
for (int i = 0; i < 10; i++) {
MidiEvent event;
event.type = MidiEvent::NOTE_ON;
event.channel = 1;
event.data1 = i;
event.data2 = 64;
controller.process_midi_event(event);
delay(200);
}
for (int i = 0; i < 10; i++) {
MidiEvent event;
event.type = MidiEvent::NOTE_OFF;
event.channel = 1;
event.data1 = i;
event.data2 = 0;
controller.process_midi_event(event);
}
// Test 3: Channel 2 (flashing) notes 36-45
Serial.println("[CMD] Test 3: Channel 2 flashing (notes 36-45, ch2)");
for (int i = 0; i < 10; i++) {
MidiEvent event;
event.type = MidiEvent::NOTE_ON;
event.channel = 2;
event.data1 = 36 + i;
event.data2 = 64;
controller.process_midi_event(event);
delay(200);
}
for (int i = 0; i < 10; i++) {
MidiEvent event;
event.type = MidiEvent::NOTE_OFF;
event.channel = 2;
event.data1 = 36 + i;
event.data2 = 0;
controller.process_midi_event(event);
}
// Test 4: Channel 3 (pulsing) notes 36-45
Serial.println("[CMD] Test 4: Channel 3 pulsing (notes 36-45, ch3)");
for (int i = 0; i < 10; i++) {
MidiEvent event;
event.type = MidiEvent::NOTE_ON;
event.channel = 3;
event.data1 = 36 + i;
event.data2 = 64;
controller.process_midi_event(event);
delay(200);
}
for (int i = 0; i < 10; i++) {
MidiEvent event;
event.type = MidiEvent::NOTE_OFF;
event.channel = 3;
event.data1 = 36 + i;
event.data2 = 0;
controller.process_midi_event(event);
}
// Test 5: Full velocity sweep on pad 0
Serial.println("[CMD] Test 5: Velocity sweep on pad 0 (note 36)");
for (int v = 1; v <= 127; v += 8) {
MidiEvent event;
event.type = MidiEvent::NOTE_ON;
event.channel = 1;
event.data1 = 36;
event.data2 = v;
controller.process_midi_event(event);
delay(100);
}
MidiEvent event;
event.type = MidiEvent::NOTE_OFF;
event.channel = 1;
event.data1 = 36;
event.data2 = 0;
controller.process_midi_event(event);
Serial.println("[CMD] MIDI test complete");
} else if (cmd == "mapping") {
Serial.println("[CMD] Current pad mapping:");
for (int i = 0; i < 10; i++) {
// Can't access private pad_mapping directly, so just show defaults
Serial.printf(" Pad %d: note=%d ch=%d\n", i, 36+i, 1);
}
} else { } else {
Serial.println("[CMD] Unknown command. Type 'help'"); Serial.println("[CMD] Unknown command. Type 'help'");
} }