From 64a591fb7a4ff9f12c322cf724c4c48b7c9c10d5 Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Tue, 7 Apr 2020 17:38:31 +0200 Subject: [PATCH] Parse offset_cc --- src/sfizz/Defaults.h | 1 + src/sfizz/Region.cpp | 6 ++++++ src/sfizz/Region.h | 1 + tests/RegionT.cpp | 13 +++++++++++++ 4 files changed, 21 insertions(+) diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index 8506d90f..34a43ba5 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -49,6 +49,7 @@ namespace Default constexpr uint32_t offset { 0 }; constexpr uint32_t offsetRandom { 0 }; constexpr Range offsetRange { 0, std::numeric_limits::max() }; + constexpr Range offsetCCRange = offsetRange; constexpr Range sampleEndRange { 0, std::numeric_limits::max() }; constexpr Range sampleCountRange { 0, std::numeric_limits::max() }; constexpr SfzLoopMode loopMode { SfzLoopMode::no_loop }; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 3411e915..a8ffa43f 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -59,6 +59,12 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) case hash("offset_random"): setValueFromOpcode(opcode, offsetRandom, Default::offsetRange); break; + case hash("offset_cc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::offsetCCRange)) + offsetCC[opcode.parameters.back()] = *value; + break; case hash("end"): setValueFromOpcode(opcode, sampleEnd, Default::sampleEndRange); break; diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index fa952675..6e93b96f 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -232,6 +232,7 @@ struct Region { float delayRandom { Default::delayRandom }; // delay_random uint32_t offset { Default::offset }; // offset uint32_t offsetRandom { Default::offsetRandom }; // offset_random + CCMap offsetCC { Default::offset }; uint32_t sampleEnd { Default::sampleEndRange.getEnd() }; // end absl::optional sampleCount {}; // count absl::optional loopMode {}; // loopmode diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index f982c424..c90ebc78 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -53,6 +53,19 @@ TEST_CASE("[Region] Parsing opcodes") region.parseOpcode({ "offset", "-1" }); REQUIRE(region.offset == 0); } + SECTION("offset_cc") + { + REQUIRE(region.offsetCC.empty()); + region.parseOpcode({ "offset_cc1", "1" }); + REQUIRE(region.offsetCC.contains(1)); + REQUIRE(region.offsetCC[1] == 1); + region.parseOpcode({ "offset_cc2", "15420" }); + REQUIRE(region.offsetCC.contains(2)); + REQUIRE(region.offsetCC[2] == 15420); + region.parseOpcode({ "offset_cc2", "-1" }); + REQUIRE(region.offsetCC[2] == 0); + } + SECTION("offset_random") {