1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
#include "ardour/tempo.h"
#include "tempo_test.h"
CPPUNIT_TEST_SUITE_REGISTRATION (TempoTest);
using namespace std;
using namespace ARDOUR;
using namespace Timecode;
void
TempoTest::recomputeMapTest ()
{
int const sampling_rate = 48000;
TempoMap map (sampling_rate);
Meter meterA (4, 4);
map.add_meter (meterA, 0.0, BBT_Time (1, 1, 0));
/*
120bpm at bar 1, 240bpm at bar 4
120bpm = 24e3 samples per beat
240bpm = 12e3 samples per beat
*/
/*
120bpm 240bpm
0 beats 12 beats
0 frames 288e3 frames
0 pulses 4 pulses
| | | | |
| 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 |
*/
Tempo tempoA (120);
map.add_tempo (tempoA, 0.0, TempoSection::Constant);
Tempo tempoB (240);
map.add_tempo (tempoB, 12.0, TempoSection::Constant);
Meter meterB (3, 4);
map.add_meter (meterB, 12.0, BBT_Time (4, 1, 0));
list<MetricSection*>::iterator i = map._metrics.begin();
CPPUNIT_ASSERT_EQUAL (framepos_t (0), (*i)->frame ());
i = map._metrics.end();
--i;
CPPUNIT_ASSERT_EQUAL (framepos_t (288e3), (*i)->frame ());
}
void
TempoTest::rampTest ()
{
int const sampling_rate = 48000;
TempoMap map (sampling_rate);
Meter meterA (4, 4);
Tempo tempoA (77.0, 4.0);
Tempo tempoB (217.0, 4.0);
map.add_tempo (tempoA, 0.0, TempoSection::Ramp);
map.add_tempo (tempoB, 100.0, TempoSection::Ramp);
map.add_meter (meterA, 0.0, BBT_Time (1, 1, 0));
/*
120bpm 240bpm
0 beats 12 beats
0 frames 288e3 frames
0 pulses 4 pulses
| | | | |
| 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 |
*/
TempoSection* tA = 0;
TempoSection* tB;
list<MetricSection*>::iterator i;
for (i = map._metrics.begin(); i != map._metrics.end(); ++i) {
if ((tB = dynamic_cast<TempoSection*> (*i)) != 0) {
if (tA) {
break;
}
tA = tB;
}
}
map.recompute_map (map._metrics);
CPPUNIT_ASSERT_EQUAL (tB->frame(), tA->frame_at_tempo (tB->beats_per_minute() / tB->note_type(), 100.0, sampling_rate));
CPPUNIT_ASSERT_EQUAL (tB->frame(), tA->frame_at_pulse (tB->pulse(), sampling_rate));
}
|