summaryrefslogtreecommitdiff
path: root/libs/ardour/session_transport.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-03-30 22:05:55 +0200
committerRobin Gareus <robin@gareus.org>2017-03-30 22:07:06 +0200
commit7807869a68d3e27d0d088a1c005c25869b4ce2f3 (patch)
tree96d2f63f14ce18662c960dc3b10814243144d155 /libs/ardour/session_transport.cc
parent478f26b2adfa236e7f2ac3cafd92b249f0af3008 (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.cc15
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);
}
}
}