From 868c5eda827b6062e52291ae38176f761963063c Mon Sep 17 00:00:00 2001 From: Ashley Strahle Date: Fri, 3 Jul 2026 08:32:03 +0000 Subject: [PATCH] Auto-detect time signature from SPP deltas (bar boundaries) --- src/midi_transport.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/midi_transport.cpp b/src/midi_transport.cpp index 0d03d24..9521e0e 100644 --- a/src/midi_transport.cpp +++ b/src/midi_transport.cpp @@ -5,6 +5,7 @@ volatile uint32_t midi_tick_count = 0; volatile uint16_t last_spp_position = 0; volatile bool spp_valid = false; +extern volatile uint8_t beats_per_bar; static Adafruit_USBD_MIDI usb_midi; @@ -80,9 +81,22 @@ void UsbMidiTransport::update() { } } else if (cin == 0x03 && packet[1] == 0xF2) { // Song Position Pointer + uint16_t prev_spp = last_spp_position; last_spp_position = (packet[3] << 7) | packet[2]; spp_valid = true; Serial.printf("[CLK] SPP=%d\n", last_spp_position); + + // Auto-detect time signature from SPP delta (sent at bar boundaries) + if (prev_spp > 0 && last_spp_position > prev_spp) { + uint16_t delta = last_spp_position - prev_spp; + if (delta >= 8 && delta <= 64 && delta % 4 == 0) { + uint8_t detected = delta / 4; + if (detected >= 2 && detected <= 16 && detected != beats_per_bar) { + beats_per_bar = detected; + Serial.printf("[CLK] Auto-detected %d/4 time from SPP delta=%d\n", detected, delta); + } + } + } } else { MidiEvent event; parse_midi_packet(packet, 4, event);