Fix button-to-MIDI latency: remove blocking serial, reduce debounce, faster loop
Latency sources fixed: - debounce 50ms -> 5ms (switch_stub.cpp:15) - Removed [MIDI OUT] Serial.printf from send_cc() (midi_transport.cpp:93-98) - Removed [APP] Switch pressed/released prints from update() (app_task.cpp:39,43) - Removed [APP] Switch -> CC print from process_switch_event() (app_task.cpp:140-143) - loop() delay 10ms -> 1ms (main.cpp:390) Serial output at 115200 baud was taking 2-5ms per printf call in the critical button-to-MIDI path, adding 7-15ms+ total latency per button press. All removed from hot path.
This commit is contained in:
@@ -36,11 +36,9 @@ void AppTask::update() {
|
|||||||
bool is_pressed = switch_driver->is_pressed(i);
|
bool is_pressed = switch_driver->is_pressed(i);
|
||||||
|
|
||||||
if (is_pressed && !last_switch_state[i]) {
|
if (is_pressed && !last_switch_state[i]) {
|
||||||
Serial.printf("[APP] Switch %d pressed\n", i);
|
|
||||||
process_switch_event(i, true);
|
process_switch_event(i, true);
|
||||||
last_switch_state[i] = true;
|
last_switch_state[i] = true;
|
||||||
} else if (!is_pressed && last_switch_state[i]) {
|
} else if (!is_pressed && last_switch_state[i]) {
|
||||||
Serial.printf("[APP] Switch %d released\n", i);
|
|
||||||
process_switch_event(i, false);
|
process_switch_event(i, false);
|
||||||
last_switch_state[i] = false;
|
last_switch_state[i] = false;
|
||||||
}
|
}
|
||||||
@@ -136,10 +134,6 @@ void AppTask::process_switch_event(uint8_t switch_id, bool pressed) {
|
|||||||
if (pressed) {
|
if (pressed) {
|
||||||
midi_transport->send_cc(channel, cc_num, value);
|
midi_transport->send_cc(channel, cc_num, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Serial.printf("[APP] Switch %d -> Ch%d CC%d Val%d (%s)\n",
|
|
||||||
switch_id, channel, cc_num, value,
|
|
||||||
pressed ? "PRESS" : "RELEASE");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -387,5 +387,5 @@ void loop() {
|
|||||||
handle_serial_command(cmd);
|
handle_serial_command(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
delay(10);
|
delay(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ void UsbMidiTransport::send_cc(uint8_t channel, uint8_t cc, uint8_t value) {
|
|||||||
if (!initialized) return;
|
if (!initialized) return;
|
||||||
uint8_t packet[4] = {0x0B, (uint8_t)(0xB0 | (channel - 1)), cc, value};
|
uint8_t packet[4] = {0x0B, (uint8_t)(0xB0 | (channel - 1)), cc, value};
|
||||||
usb_midi.writePacket(packet);
|
usb_midi.writePacket(packet);
|
||||||
Serial.printf("[MIDI OUT] Ch:%d CC:%d:%d\n", channel, cc, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UsbMidiTransport::is_connected() {
|
bool UsbMidiTransport::is_connected() {
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ DefaultSwitchStub::DefaultSwitchStub() : initialized(false) {
|
|||||||
switch_states[i].current_state = false;
|
switch_states[i].current_state = false;
|
||||||
switch_states[i].previous_state = false;
|
switch_states[i].previous_state = false;
|
||||||
switch_states[i].last_change_time = 0;
|
switch_states[i].last_change_time = 0;
|
||||||
switch_states[i].debounce_time = 50;
|
switch_states[i].debounce_time = 5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user