ardour
framewalk_to_beats_test.cc
Go to the documentation of this file.
2 #include "ardour/tempo.h"
3 #include "timecode/bbt_time.h"
4 
6 
7 using namespace std;
8 using namespace ARDOUR;
9 using namespace Timecode;
10 
11 void
13 {
14  int const sampling_rate = 48000;
15  int const bpm = 120;
16 
17  double const frames_per_beat = (60 / double (bpm)) * double (sampling_rate);
18 
19  TempoMap map (sampling_rate);
20  Tempo tempo (bpm);
21  Meter meter (4, 4);
22 
23  map.add_meter (meter, BBT_Time (1, 1, 0));
24  map.add_tempo (tempo, BBT_Time (1, 1, 0));
25 
26  /* Walk 1 beats-worth of frames from beat 3 */
27  double r = map.framewalk_to_beats (frames_per_beat * 2, frames_per_beat * 1).to_double();
28  CPPUNIT_ASSERT_EQUAL (1.0, r);
29 
30  /* Walk 6 beats-worth of frames from beat 4 */
31  r = map.framewalk_to_beats (frames_per_beat * 3, frames_per_beat * 6).to_double();
32  CPPUNIT_ASSERT_EQUAL (6.0, r);
33 
34  /* Walk 1.5 beats-worth of frames from beat 3 */
35  r = map.framewalk_to_beats (frames_per_beat * 2, frames_per_beat * 1.5).to_double();
36  CPPUNIT_ASSERT_EQUAL (1.5, r);
37 
38  /* Walk 1.5 beats-worth of frames from beat 2.5 */
39  r = map.framewalk_to_beats (frames_per_beat * 2.5, frames_per_beat * 1.5).to_double();
40  CPPUNIT_ASSERT_EQUAL (1.5, r);
41 }
42 
43 void
45 {
46  int const sampling_rate = 48000;
47 
48  TempoMap map (sampling_rate);
49  Meter meter (4, 4);
50  map.add_meter (meter, BBT_Time (1, 1, 0));
51 
52  /*
53  120bpm at bar 1, 240bpm at bar 4
54 
55  120bpm = 24e3 samples per beat
56  240bpm = 12e3 samples per beat
57  */
58 
59 
60  /*
61 
62  120bpm 240bpm
63  0 beats 12 beats
64  0 frames 288e3 frames
65  24e3 frames per beat 12e3 frames per beat
66  | | | | |
67  1.1 1.2 1.3 1.4 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 4.1 4.2 4.3 4.4 5.1
68  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
69 
70  */
71 
72  Tempo tempoA (120);
73  map.add_tempo (tempoA, BBT_Time (1, 1, 0));
74  Tempo tempoB (240);
75  map.add_tempo (tempoB, BBT_Time (4, 1, 0));
76 
77  /* Now some tests */
78 
79  /* Walk 1 beat from 1|2 */
80  double r = map.framewalk_to_beats (24e3, 24e3).to_double();
81  CPPUNIT_ASSERT_EQUAL (1.0, r);
82 
83  /* Walk 2 beats from 3|3 to 4|1 (over the tempo change) */
84  r = map.framewalk_to_beats (240e3, (24e3 + 24e3)).to_double();
85  CPPUNIT_ASSERT_EQUAL (2.0, r);
86 
87  /* Walk 2.5 beats from 3|3.5 to 4.2 (over the tempo change) */
88  r = map.framewalk_to_beats (264e3 - 12e3, (24e3 + 12e3 + 12e3)).to_double();
89  CPPUNIT_ASSERT_EQUAL (2.5, r);
90  /* Walk 3 beats from 3|4.5 to 4|3.5 (over the tempo change) */
91  r = map.framewalk_to_beats (264e3 - 12e3, (24e3 + 12e3 + 12e3 + 6e3)).to_double();
92  CPPUNIT_ASSERT_EQUAL (3.0, r);
93 
94  /* Walk 3.5 beats from 3|4.5 to 4.4 (over the tempo change) */
95  r = map.framewalk_to_beats (264e3 - 12e3, (24e3 + 12e3 + 12e3 + 12e3)).to_double();
96  CPPUNIT_ASSERT_EQUAL (3.5, r);
97 }
98 
99 void
101 {
102  int const sampling_rate = 48000;
103 
104  TempoMap map (sampling_rate);
105  Meter meter (4, 4);
106  map.add_meter (meter, BBT_Time (1, 1, 0));
107 
108  /*
109  120bpm at bar 1, 240bpm at bar 2, 160bpm at bar 3
110 
111  120bpm = 24e3 samples per beat
112  160bpm = 18e3 samples per beat
113  240bpm = 12e3 samples per beat
114  */
115 
116 
117  /*
118 
119  120bpm 240bpm 160bpm
120  0 beats 4 beats 8 beats
121  0 frames 96e3 frames 144e3 frames
122  | | | | |
123  | 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 4.4 |
124 
125  */
126 
127  Tempo tempoA (120);
128  map.add_tempo (tempoA, BBT_Time (1, 1, 0));
129  Tempo tempoB (240);
130  map.add_tempo (tempoB, BBT_Time (2, 1, 0));
131  Tempo tempoC (160);
132  map.add_tempo (tempoC, BBT_Time (3, 1, 0));
133 
134  /* Walk from 1|3 to 4|1 */
135  double r = map.framewalk_to_beats (2 * 24e3, (2 * 24e3) + (4 * 12e3) + (4 * 18e3)).to_double();
136  CPPUNIT_ASSERT_EQUAL (10.0, r);
137 }
Evoral::Beats framewalk_to_beats(framepos_t pos, framecnt_t distance) const
Definition: tempo.cc:2303
void add_tempo(const Tempo &, Timecode::BBT_Time where)
Definition: tempo.cc:513
Definition: Beats.hpp:239
CPPUNIT_TEST_SUITE_REGISTRATION(FramewalkToBeatsTest)
void add_meter(const Meter &, Timecode::BBT_Time where)
Definition: tempo.cc:590
Definition: amp.h:29
double to_double() const
Definition: Beats.hpp:185