Fix clock latency: process one USB packet per update() — no more batch-processing 0xF8 bursts
This commit is contained in:
+19
-20
@@ -50,7 +50,7 @@ void UsbMidiTransport::update() {
|
|||||||
TinyUSBDevice.mounted() ? "YES" : "NO");
|
TinyUSBDevice.mounted() ? "YES" : "NO");
|
||||||
}
|
}
|
||||||
|
|
||||||
while (usb_midi.available()) {
|
if (usb_midi.available()) {
|
||||||
uint8_t packet[4];
|
uint8_t packet[4];
|
||||||
if (usb_midi.readPacket(packet)) {
|
if (usb_midi.readPacket(packet)) {
|
||||||
uint8_t cin = packet[0] & 0x0F;
|
uint8_t cin = packet[0] & 0x0F;
|
||||||
@@ -58,28 +58,27 @@ void UsbMidiTransport::update() {
|
|||||||
if (packet[1] == 0xF8) {
|
if (packet[1] == 0xF8) {
|
||||||
midi_tick_count++;
|
midi_tick_count++;
|
||||||
} else if (packet[1] == 0xFA) {
|
} else if (packet[1] == 0xFA) {
|
||||||
midi_tick_count = 0;
|
midi_tick_count = 0xFFFFFFFF;
|
||||||
Serial.println("[CLK] START - reset tick to 0");
|
Serial.println("[CLK] START - next F8 = tick 0");
|
||||||
}
|
}
|
||||||
continue;
|
} else {
|
||||||
}
|
MidiEvent event;
|
||||||
|
parse_midi_packet(packet, 4, event);
|
||||||
|
|
||||||
MidiEvent event;
|
const char* type_str = "UNK";
|
||||||
parse_midi_packet(packet, 4, event);
|
switch (event.type) {
|
||||||
|
case MidiEvent::NOTE_ON: type_str = "NOTE_ON"; break;
|
||||||
|
case MidiEvent::NOTE_OFF: type_str = "NOTE_OFF"; break;
|
||||||
|
case MidiEvent::CONTROL_CHANGE: type_str = "CC"; break;
|
||||||
|
case MidiEvent::PROGRAM_CHANGE: type_str = "PC"; break;
|
||||||
|
case MidiEvent::PITCH_BEND: type_str = "PB"; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
Serial.printf("[MIDI IN] Ch:%d %s:%d:%d\n", event.channel, type_str, event.data1, event.data2);
|
||||||
|
|
||||||
const char* type_str = "UNK";
|
if (receive_callback) {
|
||||||
switch (event.type) {
|
receive_callback(event);
|
||||||
case MidiEvent::NOTE_ON: type_str = "NOTE_ON"; break;
|
}
|
||||||
case MidiEvent::NOTE_OFF: type_str = "NOTE_OFF"; break;
|
|
||||||
case MidiEvent::CONTROL_CHANGE: type_str = "CC"; break;
|
|
||||||
case MidiEvent::PROGRAM_CHANGE: type_str = "PC"; break;
|
|
||||||
case MidiEvent::PITCH_BEND: type_str = "PB"; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
Serial.printf("[MIDI IN] Ch:%d %s:%d:%d\n", event.channel, type_str, event.data1, event.data2);
|
|
||||||
|
|
||||||
if (receive_callback) {
|
|
||||||
receive_callback(event);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user