Skip to content

Commit e965730

Browse files
committed
LaunchQuantisation: Fixed fractional bar quantisation amounts
1 parent fda8e33 commit e965730

File tree

2 files changed

+66
-52
lines changed

2 files changed

+66
-52
lines changed

modules/tracktion_engine/model/edit/tracktion_LaunchQuantisation.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,12 @@ BeatPosition getNext (LaunchQType q, const tempo::Sequence& ts, BeatPosition pos
126126
barsBeats.bars = static_cast<int> (qFraction * (int) std::floor (barsPlusBeats / qFraction + adjustment));
127127
barsBeats.beats = {};
128128
}
129-
130-
// Fractional bars
131-
barsBeats.beats = BeatDuration::fromBeats (qFraction * std::floor ((barsBeats.beats.inBeats() / qFraction) + adjustment));
129+
else
130+
{
131+
// Fractional bars
132+
const auto beatFraction = barsBeats.numerator * qFraction;
133+
barsBeats.beats = BeatDuration::fromBeats (beatFraction * std::floor ((barsBeats.beats.inBeats() / beatFraction) + adjustment));
134+
}
132135

133136
return ts.toBeats (barsBeats);
134137
}

modules/tracktion_engine/model/edit/tracktion_LaunchQuantisation.test.cpp

Lines changed: 60 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -68,20 +68,32 @@ class LaunchQuantisationTests : public juce::UnitTest
6868
expectWithinAbsoluteError (n.inBeats(), next.inBeats(), 0.000001);
6969
};
7070

71-
beginTest ("Bar");
71+
beginTest ("Eight Bars");
7272
{
73-
auto expectQ = [&] (auto c, auto n) { expectNext (c, n, LaunchQType::bar); };
73+
auto expectQ = [&] (auto c, auto n) { expectNext (c, n, LaunchQType::eightBars); };
7474

7575
expectQ (0_bp, 0_bp);
76-
expectQ (1_bp, 4_bp);
77-
expectQ (2_bp, 4_bp);
78-
expectQ (3_bp, 4_bp);
79-
expectQ (4_bp, 4_bp);
80-
expectQ (5_bp, 8_bp);
81-
expectQ (6_bp, 8_bp);
82-
expectQ (7_bp, 8_bp);
83-
expectQ (8_bp, 8_bp);
84-
expectQ (9_bp, 12_bp);
76+
expectQ (1_bp, 32_bp);
77+
expectQ (8_bp, 32_bp);
78+
expectQ (16_bp, 32_bp);
79+
expectQ (32_bp, 32_bp);
80+
expectQ (33_bp, 64_bp);
81+
expectQ (63_bp, 64_bp);
82+
expectQ (64_bp, 64_bp);
83+
expectQ (65_bp, 96_bp);
84+
}
85+
86+
beginTest ("Four Bars");
87+
{
88+
auto expectQ = [&] (auto c, auto n) { expectNext (c, n, LaunchQType::fourBars); };
89+
90+
expectQ (0_bp, 0_bp);
91+
expectQ (1_bp, 16_bp);
92+
expectQ (8_bp, 16_bp);
93+
expectQ (15_bp, 16_bp);
94+
expectQ (16_bp, 16_bp);
95+
expectQ (17_bp, 32_bp);
96+
expectQ (32_bp, 32_bp);
8597
}
8698

8799
beginTest ("Two Bars");
@@ -100,69 +112,68 @@ class LaunchQuantisationTests : public juce::UnitTest
100112
expectQ (9_bp, 16_bp);
101113
}
102114

103-
beginTest ("Four Bars");
104-
{
105-
auto expectQ = [&] (auto c, auto n) { expectNext (c, n, LaunchQType::fourBars); };
106-
107-
expectQ (0_bp, 0_bp);
108-
expectQ (1_bp, 16_bp);
109-
expectQ (8_bp, 16_bp);
110-
expectQ (15_bp, 16_bp);
111-
expectQ (16_bp, 16_bp);
112-
expectQ (17_bp, 32_bp);
113-
expectQ (32_bp, 32_bp);
114-
}
115-
116-
beginTest ("Eight Bars");
115+
beginTest ("Bar");
117116
{
118-
auto expectQ = [&] (auto c, auto n) { expectNext (c, n, LaunchQType::eightBars); };
117+
auto expectQ = [&] (auto c, auto n) { expectNext (c, n, LaunchQType::bar); };
119118

120119
expectQ (0_bp, 0_bp);
121-
expectQ (1_bp, 32_bp);
122-
expectQ (8_bp, 32_bp);
123-
expectQ (16_bp, 32_bp);
124-
expectQ (32_bp, 32_bp);
125-
expectQ (33_bp, 64_bp);
126-
expectQ (63_bp, 64_bp);
127-
expectQ (64_bp, 64_bp);
128-
expectQ (65_bp, 96_bp);
120+
expectQ (1_bp, 4_bp);
121+
expectQ (2_bp, 4_bp);
122+
expectQ (3_bp, 4_bp);
123+
expectQ (4_bp, 4_bp);
124+
expectQ (5_bp, 8_bp);
125+
expectQ (6_bp, 8_bp);
126+
expectQ (7_bp, 8_bp);
127+
expectQ (8_bp, 8_bp);
128+
expectQ (9_bp, 12_bp);
129129
}
130130

131131
beginTest ("Half");
132132
{
133133
auto expectQ = [&] (auto c, auto n) { expectNext (c, n, LaunchQType::half); };
134134

135-
expectQ (0_bp, 0_bp);
136-
expectQ (0.1_bp, 0.5_bp);
137-
expectQ (0.5_bp, 0.5_bp);
135+
expectQ (0_bp, 0_bp);
138136

139-
expectQ (0.9_bp, 1_bp);
140-
expectQ (1.0_bp, 1_bp);
137+
expectQ (0.1_bp, 2_bp);
138+
expectQ (1_bp, 2_bp);
139+
expectQ (1.5_bp, 2_bp);
140+
expectQ (2_bp, 2_bp);
141141

142-
expectQ (1.1_bp, 1.5_bp);
143-
expectQ (1.5_bp, 1.5_bp);
142+
expectQ (3_bp, 4_bp);
143+
expectQ (4_bp, 4_bp);
144144

145-
expectQ (1.9_bp, 2_bp);
146-
expectQ (2.0_bp, 2_bp);
145+
expectQ (5_bp, 6_bp);
146+
expectQ (6_bp, 6_bp);
147+
148+
expectQ (7_bp, 8_bp);
149+
expectQ (8_bp, 8_bp);
150+
151+
expectQ (8.01_bp, 10_bp);
152+
expectQ (9_bp, 10_bp);
147153
}
148154

149155
beginTest ("Quarter");
150156
{
151157
auto expectQ = [&] (auto c, auto n) { expectNext (c, n, LaunchQType::quarter); };
152158

153159
expectQ (0_bp, 0_bp);
154-
expectQ (0.1_bp, 0.25_bp);
155-
expectQ (0.5_bp, 0.5_bp);
156-
expectQ (0.6_bp, 0.75_bp);
157160

161+
expectQ (0.1_bp, 1_bp);
162+
expectQ (0.5_bp, 1_bp);
163+
expectQ (0.6_bp, 1_bp);
158164
expectQ (0.9_bp, 1_bp);
159165
expectQ (1.0_bp, 1_bp);
160166

161-
expectQ (1.1_bp, 1.25_bp);
162-
expectQ (1.5_bp, 1.5_bp);
163-
167+
expectQ (1.1_bp, 2_bp);
168+
expectQ (1.5_bp, 2_bp);
164169
expectQ (1.9_bp, 2_bp);
165170
expectQ (2.0_bp, 2_bp);
171+
172+
expectQ (2.1_bp, 3_bp);
173+
expectQ (2.9_bp, 3_bp);
174+
175+
expectQ (3.1_bp, 4_bp);
176+
expectQ (3.9_bp, 4_bp);
166177
}
167178
}
168179
};

0 commit comments

Comments
 (0)