13
0

Revert "tempo map: use lookup tables to speed up time conversions"

This reverts commit 644ebe37a8.

Adding entries to the lookup table is (a) not thread safe (b) not appropriate
from RT context.
This commit is contained in:
Paul Davis 2023-02-16 18:24:42 -07:00
parent cfb31e3257
commit 5b6bc3f358

View File

@ -489,13 +489,6 @@ TempoPoint::superclock_at (Temporal::Beats const & qn) const
assert (qn >= _quarters); assert (qn >= _quarters);
} }
bool found;
superclock_t sc = _map->superclock_lookup (qn, found);
if (found) {
return sc;
}
if (!actually_ramped()) { if (!actually_ramped()) {
/* not ramped, use linear */ /* not ramped, use linear */
const Beats delta = qn - _quarters; const Beats delta = qn - _quarters;
@ -503,36 +496,36 @@ TempoPoint::superclock_at (Temporal::Beats const & qn) const
return _sclock + (spqn * delta.get_beats()) + int_div_round ((spqn * delta.get_ticks()), superclock_t (Temporal::ticks_per_beat)); return _sclock + (spqn * delta.get_beats()) + int_div_round ((spqn * delta.get_ticks()), superclock_t (Temporal::ticks_per_beat));
} }
superclock_t r;
const double log_expr = superclocks_per_quarter_note() * _omega * DoubleableBeats (qn - _quarters).to_double(); const double log_expr = superclocks_per_quarter_note() * _omega * DoubleableBeats (qn - _quarters).to_double();
if (log_expr < -1) { if (log_expr < -1) {
sc = _sclock + llrint (log (-log_expr - 1.0) / -_omega); r = _sclock + llrint (log (-log_expr - 1.0) / -_omega);
if (sc < 0) { if (r < 0) {
std::cerr << "CASE 1: " << *this << endl << " scpqn = " << superclocks_per_quarter_note() << std::endl; std::cerr << "CASE 1: " << *this << endl << " scpqn = " << superclocks_per_quarter_note() << std::endl;
std::cerr << " for " << qn << " @ " << _quarters << " | " << _sclock << " + log (" << log_expr << ") " std::cerr << " for " << qn << " @ " << _quarters << " | " << _sclock << " + log (" << log_expr << ") "
<< log (-log_expr - 1.0) << log (-log_expr - 1.0)
<< " - omega = " << -_omega << " - omega = " << -_omega
<< " => " << " => "
<< sc << std::endl; << r << std::endl;
abort (); abort ();
} }
} else { } else {
sc = _sclock + llrint (log1p (log_expr) / _omega); r = _sclock + llrint (log1p (log_expr) / _omega);
if (sc < 0) { if (r < 0) {
std::cerr << "CASE 2: scpqn = " << superclocks_per_quarter_note() << std::endl; std::cerr << "CASE 2: scpqn = " << superclocks_per_quarter_note() << std::endl;
std::cerr << " for " << qn << " @ " << _quarters << " | " << _sclock << " + log1p (" << superclocks_per_quarter_note() * _omega * DoubleableBeats (qn - _quarters).to_double() << " = " std::cerr << " for " << qn << " @ " << _quarters << " | " << _sclock << " + log1p (" << superclocks_per_quarter_note() * _omega * DoubleableBeats (qn - _quarters).to_double() << " = "
<< log1p (superclocks_per_quarter_note() * _omega * DoubleableBeats (qn - _quarters).to_double()) << log1p (superclocks_per_quarter_note() * _omega * DoubleableBeats (qn - _quarters).to_double())
<< " => " << " => "
<< sc << std::endl; << r << std::endl;
abort (); abort ();
} }
} }
_map->beat_to_superclock_store (qn, sc); return r;
return sc;
} }
superclock_t superclock_t
@ -564,13 +557,6 @@ TempoPoint::quarters_at_superclock (superclock_t sc) const
return std::numeric_limits<Beats>::max(); return std::numeric_limits<Beats>::max();
} }
bool found;
Beats beats = _map->beat_lookup (sc, found);
if (found) {
return beats;
}
if (!actually_ramped()) { if (!actually_ramped()) {
// assert (sc >= _sclock); // assert (sc >= _sclock);
@ -603,16 +589,11 @@ TempoPoint::quarters_at_superclock (superclock_t sc) const
return std::numeric_limits<Beats>::max(); return std::numeric_limits<Beats>::max();
} }
_map->superclock_to_beat_store (sc, ret);
return ret; return ret;
} }
const double b = (exp (_omega * (sc - _sclock)) - 1) / (superclocks_per_quarter_note() * _omega); const double b = (exp (_omega * (sc - _sclock)) - 1) / (superclocks_per_quarter_note() * _omega);
beats = _quarters + Beats::from_double (b); return _quarters + Beats::from_double (b);
_map->superclock_to_beat_store (sc, beats);
return beats;
} }
MeterPoint::MeterPoint (TempoMap const & map, XMLNode const & node) MeterPoint::MeterPoint (TempoMap const & map, XMLNode const & node)
@ -644,9 +625,7 @@ MeterPoint::quarters_at (Temporal::BBT_Time const & bbt) const
Temporal::BBT_Time Temporal::BBT_Time
MeterPoint::bbt_at (Temporal::Beats const & qn) const MeterPoint::bbt_at (Temporal::Beats const & qn) const
{ {
BBT_Time bbt (bbt_add (_bbt, Temporal::BBT_Offset (0, 0, (qn - _quarters).to_ticks()))); return bbt_add (_bbt, Temporal::BBT_Offset (0, 0, (qn - _quarters).to_ticks()));
_map->beat_to_bbt_store (qn, bbt);
return bbt;
} }
XMLNode& XMLNode&
@ -695,13 +674,6 @@ TempoMetric::bbt_at (timepos_t const & pos) const
superclock_t sc = pos.superclocks(); superclock_t sc = pos.superclocks();
bool found;
BBT_Time bbt = _meter->map().bbt_lookup (sc, found);
if (found) {
return BBT_Argument (reftime(), bbt);
}
/* Use the later of the tempo or meter as the reference point to /* Use the later of the tempo or meter as the reference point to
* compute the BBT distance. All map points are fully defined by all 3 * compute the BBT distance. All map points are fully defined by all 3
* time types, but we need the latest one to avoid incorrect * time types, but we need the latest one to avoid incorrect
@ -732,10 +704,9 @@ TempoMetric::bbt_at (timepos_t const & pos) const
DEBUG_TRACE (DEBUG::TemporalMap, string_compose ("BBT offset from %3 @ %1: %2\n", (_tempo->beats() < _meter->beats() ? _meter->bbt() : _tempo->bbt()), bbt_offset, DEBUG_TRACE (DEBUG::TemporalMap, string_compose ("BBT offset from %3 @ %1: %2\n", (_tempo->beats() < _meter->beats() ? _meter->bbt() : _tempo->bbt()), bbt_offset,
(_tempo->beats() < _meter->beats() ? "meter" : "tempo"))); (_tempo->beats() < _meter->beats() ? "meter" : "tempo")));
timepos_t ref (std::min (_meter->sclock(), _tempo->sclock()));
bbt = _meter->bbt_add (reference_point->bbt(), bbt_offset); return BBT_Argument (ref, _meter->bbt_add (reference_point->bbt(), bbt_offset));
_meter->map().superclock_to_bbt_store (sc, bbt);
return BBT_Argument (reftime(), bbt);
} }
superclock_t superclock_t
@ -896,8 +867,6 @@ TempoMap::set_tempo (Tempo const & t, timepos_t const & time)
DEBUG_TRACE (DEBUG::TemporalMap, string_compose ("Set tempo @ %1 to %2\n", time, t)); DEBUG_TRACE (DEBUG::TemporalMap, string_compose ("Set tempo @ %1 to %2\n", time, t));
drop_lookup_table ();
if (time.is_beats()) { if (time.is_beats()) {
@ -948,8 +917,6 @@ TempoMap::set_tempo (Tempo const & t, timepos_t const & time)
void void
TempoMap::core_add_point (Point* pp) TempoMap::core_add_point (Point* pp)
{ {
drop_lookup_table ();
Points::iterator p; Points::iterator p;
const Beats beats_limit = pp->beats(); const Beats beats_limit = pp->beats();
@ -960,8 +927,6 @@ TempoMap::core_add_point (Point* pp)
TempoPoint* TempoPoint*
TempoMap::core_add_tempo (TempoPoint* tp, bool& replaced) TempoMap::core_add_tempo (TempoPoint* tp, bool& replaced)
{ {
drop_lookup_table ();
Tempos::iterator t; Tempos::iterator t;
const superclock_t sclock_limit = tp->sclock(); const superclock_t sclock_limit = tp->sclock();
const Beats beats_limit = tp->beats (); const Beats beats_limit = tp->beats ();
@ -988,8 +953,6 @@ TempoMap::core_add_tempo (TempoPoint* tp, bool& replaced)
MeterPoint* MeterPoint*
TempoMap::core_add_meter (MeterPoint* mp, bool& replaced) TempoMap::core_add_meter (MeterPoint* mp, bool& replaced)
{ {
drop_lookup_table ();
Meters::iterator m; Meters::iterator m;
const superclock_t sclock_limit = mp->sclock(); const superclock_t sclock_limit = mp->sclock();
const Beats beats_limit = mp->beats (); const Beats beats_limit = mp->beats ();
@ -1013,8 +976,6 @@ TempoMap::core_add_meter (MeterPoint* mp, bool& replaced)
MusicTimePoint* MusicTimePoint*
TempoMap::core_add_bartime (MusicTimePoint* mtp, bool& replaced) TempoMap::core_add_bartime (MusicTimePoint* mtp, bool& replaced)
{ {
drop_lookup_table ();
MusicTimes::iterator m; MusicTimes::iterator m;
const superclock_t sclock_limit = mtp->sclock(); const superclock_t sclock_limit = mtp->sclock();
@ -1060,8 +1021,6 @@ TempoMap::remove_tempo (TempoPoint const & tp, bool with_reset)
return; return;
} }
drop_lookup_table ();
superclock_t sc (tp.sclock()); superclock_t sc (tp.sclock());
Tempos::iterator t; Tempos::iterator t;
@ -1179,8 +1138,6 @@ TempoMap::remove_bartime (MusicTimePoint const & tp, bool with_reset)
return; return;
} }
drop_lookup_table ();
_bartimes.erase (m); _bartimes.erase (m);
remove_point (*m); remove_point (*m);
if (with_reset) { if (with_reset) {
@ -1214,8 +1171,6 @@ TempoMap::remove_point (Point const & point)
void void
TempoMap::reset_starting_at (superclock_t sc) TempoMap::reset_starting_at (superclock_t sc)
{ {
drop_lookup_table ();
DEBUG_TRACE (DEBUG::MapReset, string_compose ("reset starting at %1\n", sc)); DEBUG_TRACE (DEBUG::MapReset, string_compose ("reset starting at %1\n", sc));
#ifndef NDEBUG #ifndef NDEBUG
if (DEBUG_ENABLED(DEBUG::MapReset)) { if (DEBUG_ENABLED(DEBUG::MapReset)) {
@ -1461,8 +1416,6 @@ TempoMap::move_meter (MeterPoint const & mp, timepos_t const & when, bool earlie
return false; return false;
} }
drop_lookup_table ();
const superclock_t old_sc = mp.sclock(); const superclock_t old_sc = mp.sclock();
/* reset position of this meter */ /* reset position of this meter */
@ -1565,8 +1518,6 @@ TempoMap::move_tempo (TempoPoint const & tp, timepos_t const & when, bool push)
return false; return false;
} }
drop_lookup_table ();
/* If the previous tempo is ramped, we need to recompute its omega /* If the previous tempo is ramped, we need to recompute its omega
* constant to cover the (new) duration of the ramp. * constant to cover the (new) duration of the ramp.
*/ */
@ -1754,13 +1705,11 @@ TempoMap::bbt_at (timepos_t const & pos) const
} }
Temporal::BBT_Argument Temporal::BBT_Argument
TempoMap::bbt_at (superclock_t sc) const TempoMap::bbt_at (superclock_t s) const
{ {
TempoMetric metric (metric_at (sc)); TempoMetric metric (metric_at (s));
timepos_t ref (std::min (metric.tempo().sclock(), metric.meter().sclock())); timepos_t ref (std::min (metric.tempo().sclock(), metric.meter().sclock()));
BBT_Time bbt (metric.bbt_at (timepos_t::from_superclock (sc))); return BBT_Argument (ref, metric.bbt_at (timepos_t::from_superclock (s)));
superclock_to_bbt_store (sc, bbt);
return BBT_Argument (ref, bbt);
} }
Temporal::BBT_Argument Temporal::BBT_Argument
@ -1768,9 +1717,7 @@ TempoMap::bbt_at (Temporal::Beats const & qn) const
{ {
TempoMetric metric (metric_at (qn)); TempoMetric metric (metric_at (qn));
timepos_t ref (std::min (metric.tempo().sclock(), metric.meter().sclock())); timepos_t ref (std::min (metric.tempo().sclock(), metric.meter().sclock()));
BBT_Time bbt (metric.bbt_at (qn)); return BBT_Argument (ref, metric.bbt_at (qn));
beat_to_bbt_store (qn, bbt);
return BBT_Argument (ref, bbt);
} }
#if 0 #if 0