From f21864cdc780f17063c48dcb9b03e76879a5e981 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Fri, 30 Oct 2020 19:27:46 +0100 Subject: [PATCH] Reinsert default hdcc --- src/sfizz/Synth.cpp | 40 +++++++++++++++++++++++++++++++++------- src/sfizz/Synth.h | 7 +++++++ tests/SynthT.cpp | 11 +++++++++++ 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 43fac9bb..70816935 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -278,6 +278,14 @@ struct Synth::Impl : public Voice::StateListener, public Parser::Listener { static void updateUsedCCsFromRegion(std::bitset& usedCCs, const Region& region); static void updateUsedCCsFromModulations(std::bitset& usedCCs, const ModMatrix& mm); + /** + * @brief Set the default value for a CC + * + * @param ccNumber + * @param value + */ + void setDefaultHdcc(int ccNumber, float value); + int numGroups_ { 0 }; int numMasters_ { 0 }; @@ -374,6 +382,8 @@ struct Synth::Impl : public Voice::StateListener, public Parser::Listener { Parser parser_; fs::file_time_type modificationTime_ { }; + + std::array defaultCCValues_; }; Synth::Synth() @@ -609,9 +619,11 @@ void Synth::Impl::clear() modificationTime_ = fs::file_time_type::min(); // set default controllers - resources_.midiState.ccEvent(0, 7, normalizeCC(100)); // volume - resources_.midiState.ccEvent(0, 10, 0.5f); // pan - resources_.midiState.ccEvent(0, 11, 1.0f); // expression + resources_.midiState.resetAllControllers(0); + fill(absl::MakeSpan(defaultCCValues_), 0.0f); + setDefaultHdcc(7, normalizeCC(100)); + setDefaultHdcc(10, 0.5f); + setDefaultHdcc(11, 1.0f); // set default controller labels insertPairUniquely(ccLabels_, 7, "Volume"); @@ -706,16 +718,14 @@ void Synth::Impl::handleControlOpcodes(const std::vector& members) if (Default::ccNumberRange.containsWithEnd(member.parameters.back())) { const auto ccValue = readOpcode(member.value, Default::midi7Range); if (ccValue) - resources_.midiState.ccEvent( - 0, member.parameters.back(), normalizeCC(*ccValue)); + setDefaultHdcc(member.parameters.back(), normalizeCC(*ccValue)); } break; case hash("set_hdcc&"): if (Default::ccNumberRange.containsWithEnd(member.parameters.back())) { const auto ccValue = readOpcode(member.value, Default::normalizedRange); if (ccValue) - resources_.midiState.ccEvent( - 0, member.parameters.back(), *ccValue); + setDefaultHdcc(member.parameters.back(), *ccValue); } break; case hash("label_cc&"): @@ -1632,6 +1642,14 @@ void Synth::hdcc(int delay, int ccNumber, float normValue) noexcept impl.ccDispatch(delay, ccNumber, normValue); } +void Synth::Impl::setDefaultHdcc(int ccNumber, float value) +{ + ASSERT(ccNumber >= 0); + ASSERT(ccNumber < config::numCCs); + defaultCCValues_[ccNumber] = value; + resources_.midiState.ccEvent(0, ccNumber, value); +} + float Synth::getHdcc(int ccNumber) { ASSERT(ccNumber >= 0); @@ -1640,6 +1658,14 @@ float Synth::getHdcc(int ccNumber) return impl.resources_.midiState.getCCValue(ccNumber); } +float Synth::getDefaultHdcc(int ccNumber) +{ + ASSERT(ccNumber >= 0); + ASSERT(ccNumber < config::numCCs); + Impl& impl = *impl_; + return impl.defaultCCValues_[ccNumber]; +} + void Synth::pitchWheel(int delay, int pitch) noexcept { ASSERT(pitch <= 8192); diff --git a/src/sfizz/Synth.h b/src/sfizz/Synth.h index 37e095d2..bb93ab6c 100644 --- a/src/sfizz/Synth.h +++ b/src/sfizz/Synth.h @@ -344,6 +344,13 @@ public: * @return the current value */ float getHdcc(int ccNumber); + /** + * @brief Get the default value of a controller under the current instrument + * + * @param ccNumber the cc number + * @return the default value + */ + float getDefaultHdcc(int ccNumber); /** * @brief Send a pitch bend event to the synth * diff --git a/tests/SynthT.cpp b/tests/SynthT.cpp index f03efda0..71303217 100644 --- a/tests/SynthT.cpp +++ b/tests/SynthT.cpp @@ -1361,8 +1361,17 @@ TEST_CASE("[Synth] Initial values of CC") )"); REQUIRE(synth.getHdcc(111) == 0.0f); + REQUIRE(synth.getDefaultHdcc(111) == 0.0f); REQUIRE(synth.getHdcc(7) == Approx(100.0f / 127)); // default volume + REQUIRE(synth.getDefaultHdcc(7) == Approx(100.0f / 127)); REQUIRE(synth.getHdcc(10) == 0.5f); // default pan + REQUIRE(synth.getDefaultHdcc(10) == 0.5f); + REQUIRE(synth.getHdcc(11) == 1.0f); // default expression + REQUIRE(synth.getDefaultHdcc(11) == 1.0f); + + synth.hdcc(0, 10, 0.7f); + REQUIRE(synth.getHdcc(10) == 0.7f); + REQUIRE(synth.getDefaultHdcc(10) == 0.5f); synth.loadSfzString(fs::current_path() / "init_cc.sfz", R"( set_hdcc111=0.1234 set_cc112=77 @@ -1370,7 +1379,9 @@ TEST_CASE("[Synth] Initial values of CC") )"); REQUIRE(synth.getHdcc(111) == Approx(0.1234f)); + REQUIRE(synth.getDefaultHdcc(111) == Approx(0.1234f)); REQUIRE(synth.getHdcc(112) == Approx(77.0f / 127)); + REQUIRE(synth.getDefaultHdcc(112) == Approx(77.0f / 127)); } TEST_CASE("[Synth] Default ampeg_release")