From 6e2d34df2d8066bccd011ba26482e09b4d8a452f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 29 Dec 2024 15:56:42 +0100 Subject: [PATCH] Fix MIDI Clock generator (rounding issues) This broke in f67029bd0 and notably bcc1aeeb8615. next_tick needs to accommodate for sub-sample accuracy when PPQN are not integer samples. e.g. 110 bpm @ 48kHz PS. Instead of `double` we could use superclock next_tick, and `one_ppqn_in_superclocks` respectively. This would provide us with 62 bit significand (instead of 52 bit using double). Yet for the case of MIDI clock, this will have no real world effect. --- libs/ardour/ardour/ticker.h | 2 +- libs/ardour/ticker.cc | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/ardour/ardour/ticker.h b/libs/ardour/ardour/ticker.h index 405cdaf627..f3fbb0c37d 100644 --- a/libs/ardour/ardour/ticker.h +++ b/libs/ardour/ardour/ticker.h @@ -47,7 +47,7 @@ private: ARDOUR::Session& _session; std::shared_ptr _midi_port; bool _rolling; - samplepos_t _next_tick; + double _next_tick; uint32_t _beat_pos; uint32_t _clock_cnt; samplepos_t _transport_pos; diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc index 5fdb7bdf12..c2d27ee44e 100644 --- a/libs/ardour/ticker.cc +++ b/libs/ardour/ticker.cc @@ -219,7 +219,8 @@ double MidiClockTicker::one_ppqn_in_samples (samplepos_t transport_position) const { TempoPoint const & tempo (TempoMap::use()->metric_at (timepos_t (transport_position)).tempo()); - const double samples_per_quarter_note = superclock_to_samples (tempo.superclocks_per_note_type_at (timepos_t (transport_position)), _session.nominal_sample_rate()); + /* un-rounded superclock_to_samples (tempo.superclocks_per_note_type_at (timepos_t (transport_position)), _session.nominal_sample_rate()) */ + const double samples_per_quarter_note = tempo.superclocks_per_note_type_at (timepos_t (transport_position)) * _session.nominal_sample_rate() / (double)superclock_ticks_per_second (); return samples_per_quarter_note / 24.0; }