diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 8843ce5c..b64af303 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -1447,7 +1447,7 @@ uint64_t sfz::Region::getOffset(Oversampling factor) const noexcept uint64_t finalOffset = offset + offsetDistribution(Random::randomGenerator); for (const auto& mod: offsetCC) finalOffset += static_cast(mod.data * midiState.getCCValue(mod.cc)); - return Default::offsetCCRange.clamp(offset + offsetDistribution(Random::randomGenerator)) * static_cast(factor); + return Default::offsetRange.clamp(finalOffset) * static_cast(factor); } float sfz::Region::getDelay() const noexcept diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index 06828274..78b5ce97 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -1905,3 +1905,21 @@ TEST_CASE("[Region] Release and release key") REQUIRE( region.delayedReleases == expected ); } } + +TEST_CASE("[Region] Offsets with CCs") +{ + MidiState midiState; + Region region { 0, midiState }; + + region.parseOpcode({ "offset_cc4", "255" }); + region.parseOpcode({ "offset", "10" }); + REQUIRE( region.getOffset() == 10 ); + midiState.ccEvent(0, 4, 127_norm); + REQUIRE( region.getOffset() == 265 ); + midiState.ccEvent(0, 4, 100_norm); + REQUIRE( region.getOffset() == 210 ); + midiState.ccEvent(0, 4, 10_norm); + REQUIRE( region.getOffset() == 30 ); + midiState.ccEvent(0, 4, 0); + REQUIRE( region.getOffset() == 10 ); +}