From 0142c385dcc50733879db91f587ac525276a41b8 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Sat, 29 Aug 2020 14:21:25 +0200 Subject: [PATCH] Enable and disable the power follower depending on the chosen algorithm --- src/sfizz/Synth.cpp | 9 +++++++++ src/sfizz/Voice.cpp | 16 +++++++++++++++- src/sfizz/Voice.h | 14 ++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 0041ef7d..0243583a 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -366,12 +366,21 @@ void sfz::Synth::handleControlOpcodes(const std::vector& members) case hash("hint_stealing"): switch(hash(member.value)) { case hash("first"): + for (auto& voice : voices) + voice->disablePowerFollower(); + stealer.setStealingAlgorithm(VoiceStealing::StealingAlgorithm::First); break; case hash("oldest"): + for (auto& voice : voices) + voice->disablePowerFollower(); + stealer.setStealingAlgorithm(VoiceStealing::StealingAlgorithm::Oldest); break; case hash("envelope_and_age"): + for (auto& voice : voices) + voice->enablePowerFollower(); + stealer.setStealingAlgorithm(VoiceStealing::StealingAlgorithm::EnvelopeAndAge); break; default: diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index 27323c6d..1bc55580 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -848,7 +848,10 @@ void sfz::Voice::removeVoiceFromRing() noexcept float sfz::Voice::getAveragePower() const noexcept { - return powerFollower.getAveragePower(); + if (followPower) + return powerFollower.getAveragePower(); + else + return 0.0f; } bool sfz::Voice::releasedOrFree() const noexcept @@ -1030,3 +1033,14 @@ void sfz::Voice::saveModulationTargets(const Region* region) noexcept oscillatorDetuneTarget = mm.findTarget(ModKey::createNXYZ(ModId::OscillatorDetune, region->getId())); oscillatorModDepthTarget = mm.findTarget(ModKey::createNXYZ(ModId::OscillatorModDepth, region->getId())); } + +void sfz::Voice::enablePowerFollower() noexcept +{ + followPower = true; + powerFollower.clear(); +} + +void sfz::Voice::disablePowerFollower() noexcept +{ + followPower = false; +} diff --git a/src/sfizz/Voice.h b/src/sfizz/Voice.h index 70e5fb74..e9c41bf7 100644 --- a/src/sfizz/Voice.h +++ b/src/sfizz/Voice.h @@ -248,6 +248,19 @@ public: * @return float */ float getAveragePower() const noexcept; + + /** + * @brief Enable the power follower + * + */ + + void enablePowerFollower() noexcept; + /** + * @brief Disable the power follower + * + */ + void disablePowerFollower() noexcept; + /** * Returns the region that is currently playing. May be null if the voice is not active! * @@ -519,6 +532,7 @@ private: ModMatrix::TargetId oscillatorDetuneTarget; ModMatrix::TargetId oscillatorModDepthTarget; + bool followPower { false }; PowerFollower powerFollower; LEAK_DETECTOR(Voice);