From bf4bdad6567dcdb358a6f549bff2ee20acd6ced8 Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Tue, 31 Mar 2020 10:36:41 +0200 Subject: [PATCH] Handle pitch_cc and tune_cc --- src/sfizz/Defaults.h | 1 + src/sfizz/Region.cpp | 9 +++++++++ src/sfizz/Region.h | 1 + tests/RegionT.cpp | 14 ++++++++++++++ 4 files changed, 25 insertions(+) diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index ef899329..7b24ba47 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -189,6 +189,7 @@ namespace Default constexpr Range transposeRange { -127, 127 }; constexpr int tune { 0 }; constexpr Range tuneRange { -9600, 9600 }; // ±100 in SFZv1, more in ARIA + constexpr Range tuneCCRange { -9600, 9600 }; constexpr Range bendBoundRange { -9600, 9600 }; constexpr Range bendStepRange { 1, 1200 }; constexpr int bendUp { 200 }; // No range here because the bounds can be inverted diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 7a2aea2c..cde42750 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -719,6 +719,15 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) case hash("pitch"): setValueFromOpcode(opcode, tune, Default::tuneRange); break; + case hash("tune_cc&"): + case hash("tune_oncc&"): + case hash("pitch_cc&"): + case hash("pitch_oncc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::tuneCCRange)) + tuneCC[opcode.parameters.back()] = *value; + break; case hash("bend_up"): setValueFromOpcode(opcode, bendUp, Default::bendBoundRange); break; diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index 2e2a81ca..a7a4e710 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -308,6 +308,7 @@ struct Region { int pitchVeltrack { Default::pitchVeltrack }; // pitch_veltrack int transpose { Default::transpose }; // transpose int tune { Default::tune }; // tune + CCMap tuneCC { Default::tune }; int bendUp { Default::bendUp }; int bendDown { Default::bendDown }; int bendStep { Default::bendStep }; diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index ab1baaea..8e8bf851 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -1467,6 +1467,20 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.volumeCC.contains(4)); REQUIRE(region.volumeCC[4] == -1.0_a); } + + SECTION("tune_cc/pitch_cc") + { + REQUIRE(region.tuneCC.empty()); + region.parseOpcode({ "pitch_cc1", "40" }); + REQUIRE(region.tuneCC.contains(1)); + REQUIRE(region.tuneCC[1] == 40); + region.parseOpcode({ "tune_oncc2", "-76" }); + REQUIRE(region.tuneCC.contains(2)); + REQUIRE(region.tuneCC[2] == -76.0); + region.parseOpcode({ "pitch_oncc4", "-1" }); + REQUIRE(region.tuneCC.contains(4)); + REQUIRE(region.tuneCC[4] == -1.0); + } } // Specific region bugs