rename Timecode::BBT_Time::ticks_per_beat to Timecode::BBT_Time::ticks_per_bar_divisi...
[ardour.git] / libs / timecode / src / bbt_time.cc
index 43b65c218b522c4b3b1da47e4a29b8bf0d29f85a..6de822524d3ffc35b5e5d5652879474de8bcdae5 100644 (file)
 */
 
 #include <cmath>
+#include <cassert>
 
 #include "timecode/bbt_time.h"
 
 using namespace Timecode;
 
-const double BBT_Time::ticks_per_beat = 1920.0;
+/* This number doesn't describe the smallest division of a "beat" (which is
+   only defined contextually anyway), but rather the smallest division of the the
+   divisions of a bar. If using a meter of 4/8, there are 4 divisions per bar, and
+   we can divide each one into ticks_per_bar_division pieces; in a separate meter
+   (section) of 3/8, there are 3 divisions per bar, each of which can be divided
+   into ticks_per_bar_division pieces.
 
-BBT_Time::BBT_Time (double beats)
+   The number is intended to have as many integer factors as possible so that
+   1/Nth divisions are integer numbers of ticks.
+
+   1920 is the largest legal value that be used inside an SMF file, and has many factors.
+*/
+
+const double BBT_Time::ticks_per_bar_division = 1920.0;
+
+BBT_Time::BBT_Time (double dbeats)
 {
         /* NOTE: this does not construct a BBT time in a canonical form,
            in that beats may be a very large number, and bars will
            always be zero.
         */
 
+       assert (dbeats >= 0);
+
         bars = 0;
-        beats = rint (floor (beats));
-        ticks = rint (floor (BBT_Time::ticks_per_beat * fmod (beats, 1.0)));
+        beats = rint (floor (dbeats));
+        ticks = rint (floor (BBT_Time::ticks_per_bar_division * fmod (dbeats, 1.0)));
 }