temporal: write down things that I have learned

This commit is contained in:
Paul Davis
2026-01-09 11:03:18 -07:00
parent c8ec52e707
commit 4232983809

View File

@@ -604,19 +604,30 @@ TempoPoint::superclock_at (Temporal::Beats const & qn) const
// std::cerr << "logexpr " << log_expr << " from " << superclocks_per_quarter_note() << " * " << _omega << " * " << (qn - _quarters) << std::endl;
if (log_expr < -1) {
if (log_expr < -1.) {
r = _sclock + llrint (log (-log_expr - 1.0) / -_omega);
/* The overwhelmingly likely reason for arriving here
* is using the wrong TempoMetric to compute
* superclocks at a BBT time. The omega value is only
* valid for the range over which a ramp was computed,
* so if the TempoPoint is "too early" and being used
* to compute superclocks_at() a BBT time that is
* further away than the ramp was long, we will end up
* here, despite the math being correct.
*
* So before revisiting all the math here (which has
* been checked many times), go back and investigate
* the TempoMetric being used, and how it was arrived
* at.
*/
if (r < 0) {
std::cerr << "CASE 1: " << *this << endl << " scpqn = " << superclocks_per_quarter_note() << std::endl;
std::cerr << " for " << qn << " @ " << _quarters << " | " << _sclock << " + log (" << log_expr << ") "
<< log (-log_expr - 1.0)
<< " - omega = " << -_omega
<< " => "
<< r << std::endl;
abort ();
}
std::cerr << "CASE 1: " << *this << endl << " scpqn = " << superclocks_per_quarter_note() << std::endl;
std::cerr << " for " << qn << " @ " << _quarters << " | " << _sclock << " + log (" << log_expr << ") "
<< log (-log_expr - 1.0)
<< " - omega = " << -_omega
<< " => "
<< r << std::endl;
abort ();
} else {
r = _sclock + llrint (log1p (log_expr) / _omega);