diff options
author | Robin Gareus <robin@gareus.org> | 2017-03-30 22:05:55 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-03-30 22:07:06 +0200 |
commit | 7807869a68d3e27d0d088a1c005c25869b4ce2f3 (patch) | |
tree | 96d2f63f14ce18662c960dc3b10814243144d155 /libs/ardour/session_transport.cc | |
parent | 478f26b2adfa236e7f2ac3cafd92b249f0af3008 (diff) |
Fix count-in for non 4/4 time signatures
Diffstat (limited to 'libs/ardour/session_transport.cc')
-rw-r--r-- | libs/ardour/session_transport.cc | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 4556dfa7f3..e80978a805 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -1702,19 +1702,20 @@ Session::start_transport () const Tempo& tempo = _tempo_map->tempo_at_frame (_transport_frame); const Meter& meter = _tempo_map->meter_at_frame (_transport_frame); - double div = meter.divisions_per_bar (); - double pulses = _tempo_map->exact_qn_at_frame (_transport_frame, 0) * div / 4.0; - double beats_left = fmod (pulses, div); + const double num = meter.divisions_per_bar (); + const double den = meter.note_divisor (); + const double barbeat = _tempo_map->exact_qn_at_frame (_transport_frame, 0) * den / (4. * num); + const double bar_fract = fmod (barbeat, 1.0); // fraction of bar elapsed. _count_in_samples = meter.frames_per_bar (tempo, _current_frame_rate); - double dt = _count_in_samples / div; - if (beats_left == 0) { + double dt = _count_in_samples / num; + if (bar_fract == 0) { /* at bar boundary, count-in 2 bars before start. */ _count_in_samples *= 2; } else { /* beats left after full bar until roll position */ - _count_in_samples += meter.frames_per_grid (tempo, _current_frame_rate) * beats_left; + _count_in_samples *= 1. + bar_fract; } int clickbeat = 0; @@ -1722,7 +1723,7 @@ Session::start_transport () while (cf < _transport_frame) { add_click (cf - _worst_track_latency, clickbeat == 0); cf += dt; - clickbeat = fmod (clickbeat + 1, div); + clickbeat = fmod (clickbeat + 1, num); } } } |