From ac8d2d24a34696c14ec6962539aca3a4dc6f1c7e Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Sat, 16 May 2020 20:15:51 +0200 Subject: [PATCH] Adapt start_lohdccN to match ARIA: float 0-127 range --- src/sfizz/Range.h | 14 ++++++++++++++ src/sfizz/Region.cpp | 8 ++++---- src/sfizz/SfzHelpers.h | 10 ++++++++++ tests/RegionT.cpp | 8 ++++---- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/sfizz/Range.h b/src/sfizz/Range.h index 9f339565..3b548535 100644 --- a/src/sfizz/Range.h +++ b/src/sfizz/Range.h @@ -102,6 +102,20 @@ public: _start = value; } + /** + * @brief Convert the range to a different value type + * + * @return Range + */ + template + Range to() const noexcept + { + return Range { + static_cast(_start), + static_cast(_end), + }; + } + private: Type _start { static_cast(0.0) }; Type _end { static_cast(0.0) }; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index b6613c69..9e705904 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -324,14 +324,14 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) case hash("start_lohdcc&"): // also on_lohdcc& if (opcode.parameters.back() >= config::numCCs) return false; - if (auto value = readOpcode(opcode.value, Default::normalizedRange)) - ccTriggers[opcode.parameters.back()].setStart(*value); + if (auto value = readOpcode(opcode.value, Default::midi7Range.to())) + ccTriggers[opcode.parameters.back()].setStart(normalizeCC(*value)); break; case hash("start_hihdcc&"): // also on_hihdcc& if (opcode.parameters.back() >= config::numCCs) return false; - if (auto value = readOpcode(opcode.value, Default::normalizedRange)) - ccTriggers[opcode.parameters.back()].setEnd(*value); + if (auto value = readOpcode(opcode.value, Default::midi7Range.to())) + ccTriggers[opcode.parameters.back()].setEnd(normalizeCC(*value)); break; // Performance parameters: amplifier diff --git a/src/sfizz/SfzHelpers.h b/src/sfizz/SfzHelpers.h index 5cd49aad..3d017980 100644 --- a/src/sfizz/SfzHelpers.h +++ b/src/sfizz/SfzHelpers.h @@ -194,6 +194,16 @@ namespace literals { return normalize7Bits(value); } + + inline float operator""_norm(long double value) + { + if (value < 0) + value = 0; + if (value > 127) + value = 127; + + return normalize7Bits(value); + } } /** diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index 4884274b..b7f88d92 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -501,14 +501,14 @@ TEST_CASE("[Region] Parsing opcodes") for (int ccIdx = 1; ccIdx < 128; ++ccIdx) { REQUIRE(!region.ccTriggers.contains(ccIdx)); } - region.parseOpcode({ "on_lohdcc46", "0.15" }); + region.parseOpcode({ "on_lohdcc46", "15.9" }); REQUIRE(region.ccTriggers.contains(46)); - REQUIRE(region.ccTriggers[46].getStart() == Approx(0.15f)); + REQUIRE(region.ccTriggers[46].getStart() == Approx(15.9_norm)); REQUIRE(region.ccTriggers[46].getEnd() == 1.0f); - region.parseOpcode({ "on_hihdcc5", "0.47" }); + region.parseOpcode({ "on_hihdcc5", "47.3" }); REQUIRE(region.ccTriggers.contains(5)); REQUIRE(region.ccTriggers[5].getStart() == 0.0f); - REQUIRE(region.ccTriggers[5].getEnd() == Approx(0.47f)); + REQUIRE(region.ccTriggers[5].getEnd() == Approx(47.3_norm)); } SECTION("volume")