Compare commits

..

1 Commits

Author SHA1 Message Date
Martin Felis
88b1caf885 Added initial support for blending of SyncTracks with differing numbers of intervals.
Not sure that the resulting blends are correct, but leave it for now.
2026-02-20 23:23:06 +01:00
2 changed files with 14 additions and 15 deletions

View File

@ -150,15 +150,15 @@ struct SyncTrack {
}
assert(result.num_intervals < cSyncTrackMaxIntervals);
float track_A_repeats = static_cast<float>(result.num_intervals / track_A.num_intervals);
float track_B_repeats = static_cast<float>(result.num_intervals / track_B.num_intervals);
int track_A_repeats = result.num_intervals / track_A.num_intervals;
int track_B_repeats = result.num_intervals / track_B.num_intervals;
result.duration = (1.0f - weight) * (track_A.duration * track_A_repeats) + weight * (track_B.duration * track_B_repeats);
result.interval_start_ratio[0] = 0.f;
for (int i = 0; i < result.num_intervals; i++) {
float interval_duration_A = track_A.interval_duration_ratio[i % track_A.num_intervals] / track_A_repeats;
float interval_duration_B = track_B.interval_duration_ratio[i % track_B.num_intervals] / track_B_repeats;
float interval_duration_A = track_A.interval_duration_ratio[i % track_A.num_intervals];
float interval_duration_B = track_B.interval_duration_ratio[i % track_B.num_intervals];
result.interval_duration_ratio[i] =
(1.0f - weight) * interval_duration_A + weight * interval_duration_B;

View File

@ -230,19 +230,18 @@ TEST_CASE("[Blendalot][SyncTrack] Sync Track blending non-matching interval coun
float weight = 0.2f;
SyncTrack blended = SyncTrack::blend(weight, track_a, track_b);
float track_a_repeats = static_cast<float>(blended.num_intervals / track_a.num_intervals);
float track_b_repeats = static_cast<float>(blended.num_intervals / track_b.num_intervals);
int track_b_repeats = 3;
CHECK(
blended.duration == doctest::Approx(2.5));
CHECK(
REQUIRE(
blended.duration == (1.0f - weight) * track_a.duration + weight * track_b.duration * track_b_repeats);
REQUIRE(
blended.interval_start_ratio[0] == 0.0);
CHECK(
blended.interval_duration_ratio[0] == doctest::Approx((1.0 - weight) * track_a.interval_duration_ratio[0] / track_a_repeats + weight * track_b.interval_duration_ratio[0] / track_b_repeats));
CHECK(
blended.interval_duration_ratio[1] == doctest::Approx((1.0 - weight) * track_a.interval_duration_ratio[1] / track_a_repeats + weight * track_b.interval_duration_ratio[0] / track_b_repeats));
CHECK(
blended.interval_duration_ratio[2] == doctest::Approx((1.0 - weight) * track_a.interval_duration_ratio[2] / track_a_repeats + weight * track_b.interval_duration_ratio[0] / track_b_repeats));
REQUIRE(
blended.interval_duration_ratio[0] == (1.0f - weight) * (track_a.interval_duration_ratio[0]) + weight * (track_b.interval_duration_ratio[0]));
REQUIRE(
blended.interval_duration_ratio[1] == (1.0f - weight) * (track_a.interval_duration_ratio[1]) + weight * (track_b.interval_duration_ratio[0]));
REQUIRE(
blended.interval_duration_ratio[2] == (1.0f - weight) * (track_a.interval_duration_ratio[2]) + weight * (track_b.interval_duration_ratio[0]));
}
}