diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index a66b126d82..a91b2e91a5 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -1397,12 +1397,25 @@ TempoMap::recompute_meters (Metrics& metrics) if (meter->position_lock_style() == AudioTime) { pair bt = make_pair (accumulated_beats, BBT_Time (accumulated_bars + 1, 1, 0)); meter->set_beat (bt); - meter->set_pulse (pulse_at_frame_locked (metrics, meter->frame())); + if (prev_m) { + const double pulse = prev_m->pulse() + (meter->beat() - prev_m->beat()) / prev_m->note_divisor(); + meter->set_pulse (pulse); + } else { + const double pulse = pulse_at_frame_locked (metrics, meter->frame()); + meter->set_pulse (pulse); + } } else { - const double pulse = prev_m->pulse() + (meter->beat() - prev_m->beat()) / prev_m->note_divisor(); - meter->set_frame (frame_at_pulse_locked (metrics, pulse)); - meter->set_pulse (pulse); + if (prev_m) { + const double pulse = prev_m->pulse() + (meter->beat() - prev_m->beat()) / prev_m->note_divisor(); + meter->set_frame (frame_at_pulse_locked (metrics, pulse)); + meter->set_pulse (pulse); + } else { + const double pulse = pulse_at_beat_locked (metrics, meter->beat()); + meter->set_frame (frame_at_pulse_locked (metrics, pulse)); + meter->set_pulse (pulse); + } } + prev_m = meter; } } @@ -1562,8 +1575,7 @@ TempoMap::bbt_time (framepos_t frame, BBT_Time& bbt) return; } Glib::Threads::RWLock::ReaderLock lm (lock); - frameoffset_t const frame_off = frame_offset_at (_metrics, frame); - double const beat = beat_at_pulse_locked (_metrics, pulse_at_frame_locked (_metrics, frame + frame_off)); + double const beat = beat_at_frame_locked (_metrics, frame); bbt = beats_to_bbt_locked (_metrics, beat); } @@ -2120,7 +2132,8 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const Meter& mt, } else { pair b_bbt = make_pair (accumulated_beats, BBT_Time (accumulated_bars + 1, 1, 0)); m->set_beat (b_bbt); - m->set_pulse (pulse_at_frame_locked (imaginary, m->frame())); + const double pulse = prev_ms->pulse() + (m->beat() - prev_ms->beat()) / prev_ms->note_divisor(); + m->set_pulse (pulse); } } prev_ms = m; @@ -2175,7 +2188,8 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const Meter& mt, } else { pair b_bbt = make_pair (accumulated_beats, BBT_Time (accumulated_bars + 1, 1, 0)); m->set_beat (b_bbt); - m->set_pulse (pulse_at_frame_locked (imaginary, m->frame())); + const double pulse = prev_ms->pulse() + (m->beat() - prev_ms->beat()) / prev_ms->note_divisor(); + m->set_pulse (pulse); } } prev_ms = m;