From 970c8939d4db7683ad294f9fb7ae0db39fc696fd Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 8 Oct 2018 12:59:51 -0400 Subject: [PATCH] some rather simple code to allow MIDI Clock to set the tempo of the session. This is only allowed if the session has only 1 tempo marker --- libs/ardour/ardour/session.h | 1 + libs/ardour/midi_clock_slave.cc | 8 +++++++- libs/ardour/session.cc | 13 +++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 455a1d6337..e63c68f604 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -734,6 +734,7 @@ public: TempoMap& tempo_map() { return *_tempo_map; } const TempoMap& tempo_map() const { return *_tempo_map; } + void maybe_update_tempo_from_midiclock_tempo (float bpm); unsigned int get_xrun_count () const {return _xrun_count; } void reset_xrun_count () {_xrun_count = 0; } diff --git a/libs/ardour/midi_clock_slave.cc b/libs/ardour/midi_clock_slave.cc index d714eecac1..706032887d 100644 --- a/libs/ardour/midi_clock_slave.cc +++ b/libs/ardour/midi_clock_slave.cc @@ -36,6 +36,7 @@ #include "ardour/session.h" #include "ardour/tempo.h" #include "ardour/transport_master.h" +#include "ardour/transport_master_manager.h" #include "pbd/i18n.h" @@ -219,7 +220,6 @@ MIDIClock_TransportMaster::update_midi_clock (Parser& /*parser*/, samplepos_t ti const double samples_per_quarter = (timestamp - current.timestamp) * 24.0; const double instantaneous_bpm = (ENGINE->sample_rate() * 60.0) / samples_per_quarter; - const double lpf_coeff = 0.05; const double predicted_clock_interval_in_samples = (t1 - t0); @@ -233,6 +233,8 @@ MIDIClock_TransportMaster::update_midi_clock (Parser& /*parser*/, samplepos_t ti * change of more than 20% of the current tempo. */ + const double lpf_coeff = 0.063; + if (fabs (instantaneous_bpm - _bpm) > (0.20 * _bpm)) { _bpm = instantaneous_bpm; } else { @@ -250,6 +252,10 @@ MIDIClock_TransportMaster::update_midi_clock (Parser& /*parser*/, samplepos_t ti midi_clock_count++; current.update (current.position + one_ppqn_in_samples, timestamp, speed); + + if (TransportMasterManager::instance().current().get() == this) { + _session->maybe_update_tempo_from_midiclock_tempo (_bpm); + } } DEBUG_TRACE (DEBUG::MidiClock, string_compose ("clock #%1 @ %2 should-be %3 transport %4 error %5 appspeed %6 " diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index f8fc5639f7..064a929b43 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -7276,3 +7276,16 @@ Session::cancel_all_solo () set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup); clear_all_solo_state (routes.reader()); } + +void +Session::maybe_update_tempo_from_midiclock_tempo (float bpm) +{ + if (_tempo_map->n_tempos() == 1) { + TempoSection& ts (_tempo_map->tempo_section_at_sample (0)); + if (fabs (ts.note_types_per_minute() - bpm) > (0.01 * ts.note_types_per_minute())) { + const Tempo tempo (bpm, 4.0, bpm); + std::cerr << "new tempo " << bpm << " old " << ts.note_types_per_minute() << std::endl; + _tempo_map->replace_tempo (ts, tempo, 0.0, 0.0, AudioTime); + } + } +}