diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index 7a26a609e3..402dc7fa2e 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -178,19 +178,15 @@ class LIBARDOUR_API TempoSection : public MetricSection, public Tempo { }; TempoSection (const double& beat, double qpm, double note_type, Type tempo_type) - : MetricSection (beat), Tempo (qpm, note_type), _bar_offset (-1.0), _type (tempo_type), _c_func (0.0), _active (true) {} + : MetricSection (beat), Tempo (qpm, note_type), _type (tempo_type), _c_func (0.0), _active (true) {} TempoSection (framepos_t frame, double qpm, double note_type, Type tempo_type) - : MetricSection (frame), Tempo (qpm, note_type), _bar_offset (-1.0), _type (tempo_type), _c_func (0.0), _active (true) {} + : MetricSection (frame), Tempo (qpm, note_type), _type (tempo_type), _c_func (0.0), _active (true) {} TempoSection (const XMLNode&); static const std::string xml_state_node_name; XMLNode& get_state() const; - void update_bar_offset_from_bbt (const Meter&); - void update_bbt_time_from_bar_offset (const Meter&); - double bar_offset() const { return _bar_offset; } - bool active () const { return _active; } void set_active (bool yn) { _active = yn; } @@ -243,7 +239,6 @@ class LIBARDOUR_API TempoSection : public MetricSection, public Tempo { this enables us to keep the tempo change at the same relative position within the bar if/when the meter changes. */ - double _bar_offset; Type _type; double _c_func; bool _active; diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 2f979535e8..c2572ee077 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -73,7 +73,10 @@ Meter::frames_per_bar (const Tempo& tempo, framecnt_t sr) const const string TempoSection::xml_state_node_name = "Tempo"; TempoSection::TempoSection (const XMLNode& node) - : MetricSection (0.0), Tempo (TempoMap::default_tempo()) + : MetricSection (0.0) + , Tempo (TempoMap::default_tempo()) + , _c_func (0.0) + , _active (true) { const XMLProperty *prop; LocaleGuard lg; @@ -145,15 +148,6 @@ TempoSection::TempoSection (const XMLNode& node) set_active (string_is_affirmative (prop->value())); } - if ((prop = node.property ("bar-offset")) == 0) { - _bar_offset = -1.0; - } else { - if (sscanf (prop->value().c_str(), "%lf", &_bar_offset) != 1 || _bar_offset < 0.0) { - error << _("TempoSection XML node has an illegal \"bar-offset\" value") << endmsg; - throw failed_constructor(); - } - } - if ((prop = node.property ("tempo-type")) == 0) { _type = Constant; } else { @@ -182,8 +176,6 @@ TempoSection::get_state() const root->add_property ("beats-per-minute", buf); snprintf (buf, sizeof (buf), "%f", _note_type); root->add_property ("note-type", buf); - // snprintf (buf, sizeof (buf), "%f", _bar_offset); - // root->add_property ("bar-offset", buf); snprintf (buf, sizeof (buf), "%s", movable()?"yes":"no"); root->add_property ("movable", buf); snprintf (buf, sizeof (buf), "%s", active()?"yes":"no"); @@ -194,16 +186,6 @@ TempoSection::get_state() const return *root; } -void - -TempoSection::update_bar_offset_from_bbt (const Meter& m) -{ - _bar_offset = (pulse() * BBT_Time::ticks_per_beat) / - (m.divisions_per_bar() * BBT_Time::ticks_per_beat); - - DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Tempo set bar offset to %1 from %2 w/%3\n", _bar_offset, pulse(), m.divisions_per_bar())); -} - void TempoSection::set_type (Type type) { @@ -370,7 +352,7 @@ double TempoSection::compute_c_func_pulse (const double& end_bpm, const double& end_pulse, const framecnt_t& frame_rate) { double const log_tempo_ratio = log (end_bpm / pulses_per_minute()); - return pulses_per_minute() * (exp (log_tempo_ratio) - 1) / (end_pulse - pulse()); + return pulses_per_minute() * (expm1 (log_tempo_ratio)) / (end_pulse - pulse()); } /* compute the function constant from some later tempo section, given tempo (whole pulses/min.) and distance (in frames) from session origin */ @@ -438,36 +420,14 @@ TempoSection::pulse_tempo_at_pulse (const double& pulse) const double TempoSection::pulse_at_time (const double& time) const { - return ((exp (_c_func * time)) - 1) * (pulses_per_minute() / _c_func); + return expm1 (_c_func * time) * (pulses_per_minute() / _c_func); } /* time in minutes at pulse */ double TempoSection::time_at_pulse (const double& pulse) const { - return log (((_c_func * pulse) / pulses_per_minute()) + 1) / _c_func; -} - - -void -TempoSection::update_bbt_time_from_bar_offset (const Meter& meter) -{ - double new_beat; - - if (_bar_offset < 0.0) { - /* not set yet */ - return; - } - - new_beat = pulse(); - - double ticks = BBT_Time::ticks_per_beat * meter.divisions_per_bar() * _bar_offset; - new_beat = ticks / BBT_Time::ticks_per_beat; - - DEBUG_TRACE (DEBUG::TempoMath, string_compose ("from bar offset %1 and dpb %2, ticks = %3->%4 beats = %5\n", - _bar_offset, meter.divisions_per_bar(), ticks, new_beat, new_beat)); - - set_pulse (new_beat); + return log1p ((_c_func * pulse) / pulses_per_minute()) / _c_func; } /***********************************************************************/ @@ -2026,7 +1986,7 @@ TempoMap::check_solved (Metrics& metrics, bool by_frame) return false; } /* precision check ensures pulses and frames align independent of lock style.*/ - if (t->frame() != prev_ts->frame_at_pulse (t->pulse(), _frame_rate)) { + if (by_frame && t->frame() != prev_ts->frame_at_pulse (t->pulse(), _frame_rate)) { return false; } } @@ -2811,7 +2771,6 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) XMLNodeList nlist; XMLNodeConstIterator niter; Metrics old_metrics (_metrics); - MeterSection* last_meter = 0; _metrics.clear(); nlist = node.children(); @@ -2824,12 +2783,6 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) try { TempoSection* ts = new TempoSection (*child); _metrics.push_back (ts); - - if (ts->bar_offset() < 0.0) { - if (last_meter) { - //ts->update_bar_offset_from_bbt (*last_meter); - } - } } catch (failed_constructor& err){ @@ -2843,7 +2796,6 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) try { MeterSection* ms = new MeterSection (*child); _metrics.push_back (ms); - last_meter = ms; } catch (failed_constructor& err) { @@ -2931,7 +2883,7 @@ TempoMap::dump (const Metrics& metrics, std::ostream& o) const for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((t = dynamic_cast(*i)) != 0) { - o << "Tempo @ " << *i << " (Bar-offset: " << t->bar_offset() << ") " << t->beats_per_minute() << " BPM (pulse = 1/" << t->note_type() << ") at " << t->pulse() << " frame= " << t->frame() << " (movable? " + o << "Tempo @ " << *i << t->beats_per_minute() << " BPM (pulse = 1/" << t->note_type() << ") at " << t->pulse() << " frame= " << t->frame() << " (movable? " << t->movable() << ')' << " pos lock: " << enum_2_string (t->position_lock_style()) << std::endl; o << "current : " << t->beats_per_minute() << " | " << t->pulse() << " | " << t->frame() << std::endl; if (prev_ts) { @@ -3241,7 +3193,7 @@ operator<< (std::ostream& o, const MetricSection& section) { if ((ts = dynamic_cast (§ion)) != 0) { o << *((const Tempo*) ts); } else if ((ms = dynamic_cast (§ion)) != 0) { - //o << *((const Meter*) ms); + o << *((const Meter*) ms); } return o;