Compare commits

..

1 Commits

Author SHA1 Message Date
Martin Felis
3dd1ce42df 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-21 21:30:54 +01:00
2 changed files with 15 additions and 14 deletions

View File

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

View File

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