From 70d1a4f6f90a638a8be95b7ad5a7880a0e075df6 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Sun, 14 Mar 2021 15:35:20 +0100 Subject: [PATCH] MidiBeatClockReceiver: Use the average interval over the last 24 ticks --- .../midi/midibeatclockreceiver.cpp | 22 ++++++++++++++----- src/controllers/midi/midibeatclockreceiver.h | 3 +++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/controllers/midi/midibeatclockreceiver.cpp b/src/controllers/midi/midibeatclockreceiver.cpp index 59360e14ac59..b5cfd93f41b0 100644 --- a/src/controllers/midi/midibeatclockreceiver.cpp +++ b/src/controllers/midi/midibeatclockreceiver.cpp @@ -2,10 +2,6 @@ #include "controllers/midi/midimessage.h" -namespace { -constexpr int kPulsesPerQuarterNote = 24; -} - namespace mixxx { MidiBeatClockReceiver::MidiBeatClockReceiver() @@ -37,8 +33,22 @@ void MidiBeatClockReceiver::receive(unsigned char status, Duration timestamp) { break; case MidiOpCode::MIDI_TIMING_CLK: if (m_lastTimestamp != Duration::empty() && timestamp != Duration::empty()) { - Duration interval = timestamp - m_lastTimestamp; - m_bpm = Bpm(1000000000.0 / interval.toDoubleNanos() / kPulsesPerQuarterNote * 60.0); + m_intervalRingBuffer[m_clockTickIndex] = timestamp - m_lastTimestamp; + + int numValues = 0; + Duration sumIntervals; + for (int i = 0; i < kPulsesPerQuarterNote; i++) { + if (m_intervalRingBuffer[i] != Duration::empty()) { + sumIntervals += m_intervalRingBuffer[i]; + numValues++; + } + } + DEBUG_ASSERT(numValues >= 1); + + m_bpm = Bpm(1000000000.0 / + (sumIntervals.toDoubleNanos() / numValues) / + kPulsesPerQuarterNote * 60.0); + qWarning() << m_bpm; } m_clockTickIndex = (m_clockTickIndex + 1) % kPulsesPerQuarterNote; m_lastTimestamp = timestamp; diff --git a/src/controllers/midi/midibeatclockreceiver.h b/src/controllers/midi/midibeatclockreceiver.h index aa7fb3a055de..7a5cee68c102 100644 --- a/src/controllers/midi/midibeatclockreceiver.h +++ b/src/controllers/midi/midibeatclockreceiver.h @@ -5,6 +5,8 @@ namespace mixxx { class MidiBeatClockReceiver { public: + static constexpr int kPulsesPerQuarterNote = 24; + MidiBeatClockReceiver(); static bool canReceiveMidiStatus(unsigned char status); void receive(unsigned char status, Duration timestamp); @@ -24,6 +26,7 @@ class MidiBeatClockReceiver { bool m_isPlaying; Duration m_lastTimestamp; int m_clockTickIndex; + Duration m_intervalRingBuffer[kPulsesPerQuarterNote]; }; } // namespace mixxx