From 298befa753ad91c189c94bcbf93d04343b0b1d5c Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 27 Aug 2020 09:39:41 +0200 Subject: [PATCH] Express follower AR in seconds --- src/sfizz/Config.h | 4 ++-- src/sfizz/PowerFollower.cpp | 14 ++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/sfizz/Config.h b/src/sfizz/Config.h index 67821b02..e56548fc 100644 --- a/src/sfizz/Config.h +++ b/src/sfizz/Config.h @@ -58,8 +58,8 @@ namespace config { constexpr float A440 { 440.0 }; constexpr size_t powerHistoryLength { 16 }; constexpr size_t powerFollowerStep { 512 }; - constexpr float powerFollowerAttackFactor { 100 }; - constexpr float powerFollowerReleaseFactor { 10 }; + constexpr float powerFollowerAttackTime { 5e-3f }; + constexpr float powerFollowerReleaseTime { 200e-3f }; constexpr uint16_t numCCs { 512 }; constexpr int maxCurves { 256 }; constexpr int chunkSize { 1024 }; diff --git a/src/sfizz/PowerFollower.cpp b/src/sfizz/PowerFollower.cpp index 06807c7a..f2eb05e5 100644 --- a/src/sfizz/PowerFollower.cpp +++ b/src/sfizz/PowerFollower.cpp @@ -32,7 +32,6 @@ void PowerFollower::setSamplesPerBlock(unsigned samplesPerBlock) if (samplesPerBlock_ != samplesPerBlock) { tempBuffer_.reset(new float[samplesPerBlock]); samplesPerBlock_ = samplesPerBlock; - updateTrackingFactor(); } } @@ -48,8 +47,8 @@ void PowerFollower::process(AudioSpan buffer) noexcept float currentSum = currentSum_; size_t currentCount = currentCount_; - const float attackFactor = static_cast(numFrames) * attackTrackingFactor_; - const float releaseFactor = static_cast(numFrames) * releaseTrackingFactor_; + const float attackFactor = attackTrackingFactor_; + const float releaseFactor = releaseTrackingFactor_; /// size_t index = 0; @@ -67,8 +66,8 @@ void PowerFollower::process(AudioSpan buffer) noexcept if (currentCount == step) { const float meanPower = currentSum / step; currentPower = max( - currentPower * (1 - attackFactor) + meanPower * attackFactor, - currentPower * (1 - releaseFactor) + meanPower * releaseFactor); + currentPower * attackFactor + meanPower * (1 - attackFactor), + currentPower * releaseFactor + meanPower * (1 - releaseFactor)); currentSum = 0; currentCount = 0; } @@ -92,9 +91,8 @@ void PowerFollower::clear() noexcept void PowerFollower::updateTrackingFactor() noexcept { // Protect the envelope follower against blowups - const auto maxTrackingFactor = sampleRate_ / samplesPerBlock_; - attackTrackingFactor_ = min(config::powerFollowerAttackFactor, maxTrackingFactor) / sampleRate_; - releaseTrackingFactor_ = min(config::powerFollowerReleaseFactor, maxTrackingFactor) / sampleRate_; + attackTrackingFactor_ = std::exp(-1.0f / ((config::powerFollowerAttackTime / config::powerFollowerStep) * sampleRate_)); + releaseTrackingFactor_ = std::exp(-1.0f / ((config::powerFollowerReleaseTime / config::powerFollowerStep) * sampleRate_)); } } // namespace sfz