Fix MIDI clock phase: handle 0xFA START to reset tick counter to downbeat

This commit is contained in:
ash
2026-07-03 07:13:38 +00:00
parent 1a70cbe870
commit 72496d2daf
2 changed files with 10 additions and 4 deletions
+3 -2
View File
@@ -27,7 +27,7 @@ void midi_task(void* parameter) {
Serial.println("[TASK] MIDI task started on core 0"); Serial.println("[TASK] MIDI task started on core 0");
// Beat timing fixes for precise beat alignment - sync to real MIDI time, not hardcoded tempo // Beat timing fixes for precise beat alignment - sync to real MIDI time, not hardcoded tempo
uint32_t last_beat = 0; uint32_t last_beat = UINT32_MAX;
uint32_t flash_start = 0; uint32_t flash_start = 0;
while (true) { while (true) {
@@ -40,7 +40,8 @@ void midi_task(void* parameter) {
// Calculate beat using MIDI tick count (24 ticks per beat/PPQN) // Calculate beat using MIDI tick count (24 ticks per beat/PPQN)
uint32_t current_beat = tick / 24; uint32_t current_beat = tick / 24;
// Check if we've crossed a beat boundary // Check if we've crossed a beat boundary.
// last_beat starts as UINT32_MAX so tick 0 (START) always triggers
if (current_beat != last_beat) { if (current_beat != last_beat) {
last_beat = current_beat; last_beat = current_beat;
flash_start = now; flash_start = now;
+6 -1
View File
@@ -54,8 +54,13 @@ void UsbMidiTransport::update() {
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;
if (cin == 0x0F && packet[1] == 0xF8) { if (cin == 0x0F) {
if (packet[1] == 0xF8) {
midi_tick_count++; midi_tick_count++;
} else if (packet[1] == 0xFA) {
midi_tick_count = 0;
Serial.println("[CLK] START - reset tick to 0");
}
continue; continue;
} }