1 #include "framewalk_to_beats_test.h"
2 #include "ardour/tempo.h"
3 #include "timecode/bbt_time.h"
5 CPPUNIT_TEST_SUITE_REGISTRATION (FramewalkToBeatsTest);
8 using namespace ARDOUR;
9 using namespace Timecode;
12 FramewalkToBeatsTest::singleTempoTest ()
14 int const sampling_rate = 48000;
17 double const frames_per_beat = (60 / double (bpm)) * double (sampling_rate);
19 TempoMap map (sampling_rate);
23 map.replace_meter (map.meter_section_at_frame (0), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
24 map.replace_tempo (map.tempo_section_at_frame (0), tempo, 0.0, 0, TempoSection::Constant, AudioTime);
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);
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);
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);
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);
44 FramewalkToBeatsTest::doubleTempoTest ()
46 int const sampling_rate = 48000;
48 TempoMap map (sampling_rate);
50 map.replace_meter (map.meter_section_at_frame (0), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
53 120bpm at bar 1, 240bpm at bar 4
55 120bpm = 24e3 samples per beat
56 240bpm = 12e3 samples per beat
65 24e3 frames per beat 12e3 frames per beat
68 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
69 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
74 map.replace_tempo (map.tempo_section_at_frame (0), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
76 map.add_tempo (tempoB, 12.0 / tempoB.note_type(), 0, TempoSection::Constant, MusicTime);
80 /* Walk 1 beat from 1|2 */
81 double r = map.framewalk_to_beats (24e3, 24e3).to_double();
82 CPPUNIT_ASSERT_EQUAL (1.0, r);
84 /* Walk 2 beats from 3|3 to 4|1 (over the tempo change) */
85 r = map.framewalk_to_beats (240e3, (24e3 + 24e3)).to_double();
86 CPPUNIT_ASSERT_EQUAL (2.0, r);
88 /* Walk 2.5 beats from 3|3.5 to 4.2 (over the tempo change) */
89 r = map.framewalk_to_beats (264e3 - 12e3, (24e3 + 12e3 + 12e3)).to_double();
90 CPPUNIT_ASSERT_EQUAL (2.5, r);
91 /* Walk 3 beats from 3|4.5 to 4|3.5 (over the tempo change) */
92 r = map.framewalk_to_beats (264e3 - 12e3, (24e3 + 12e3 + 12e3 + 6e3)).to_double();
93 CPPUNIT_ASSERT_EQUAL (3.0, r);
95 /* Walk 3.5 beats from 3|4.5 to 4.4 (over the tempo change) */
96 r = map.framewalk_to_beats (264e3 - 12e3, (24e3 + 12e3 + 12e3 + 12e3)).to_double();
97 CPPUNIT_ASSERT_EQUAL (3.5, r);
101 FramewalkToBeatsTest::tripleTempoTest ()
103 int const sampling_rate = 48000;
105 TempoMap map (sampling_rate);
107 map.replace_meter (map.meter_section_at_frame (0), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
110 120bpm at bar 1, 240bpm at bar 2, 160bpm at bar 3
112 120bpm = 24e3 samples per beat
113 160bpm = 18e3 samples per beat
114 240bpm = 12e3 samples per beat
121 0 beats 4 beats 8 beats
122 0 frames 96e3 frames 144e3 frames
123 0 pulses 1 pulse 2 pulses
125 | 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 |
130 map.replace_tempo (map.tempo_section_at_frame (0), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
132 map.add_tempo (tempoB, 4.0 / tempoB.note_type(), 0, TempoSection::Constant, MusicTime);
134 map.add_tempo (tempoC, 8.0 / tempoB.note_type(), 0, TempoSection::Constant, MusicTime);
136 /* Walk from 1|3 to 4|1 */
137 double r = map.framewalk_to_beats (2 * 24e3, (2 * 24e3) + (4 * 12e3) + (4 * 18e3)).to_double();
138 CPPUNIT_ASSERT_EQUAL (10.0, r);