Express follower AR in seconds

This commit is contained in:
Jean Pierre Cimalando 2020-08-27 09:39:41 +02:00
parent b1f1fc4042
commit 298befa753
2 changed files with 8 additions and 10 deletions

View file

@ -58,8 +58,8 @@ namespace config {
constexpr float A440 { 440.0 }; constexpr float A440 { 440.0 };
constexpr size_t powerHistoryLength { 16 }; constexpr size_t powerHistoryLength { 16 };
constexpr size_t powerFollowerStep { 512 }; constexpr size_t powerFollowerStep { 512 };
constexpr float powerFollowerAttackFactor { 100 }; constexpr float powerFollowerAttackTime { 5e-3f };
constexpr float powerFollowerReleaseFactor { 10 }; constexpr float powerFollowerReleaseTime { 200e-3f };
constexpr uint16_t numCCs { 512 }; constexpr uint16_t numCCs { 512 };
constexpr int maxCurves { 256 }; constexpr int maxCurves { 256 };
constexpr int chunkSize { 1024 }; constexpr int chunkSize { 1024 };

View file

@ -32,7 +32,6 @@ void PowerFollower::setSamplesPerBlock(unsigned samplesPerBlock)
if (samplesPerBlock_ != samplesPerBlock) { if (samplesPerBlock_ != samplesPerBlock) {
tempBuffer_.reset(new float[samplesPerBlock]); tempBuffer_.reset(new float[samplesPerBlock]);
samplesPerBlock_ = samplesPerBlock; samplesPerBlock_ = samplesPerBlock;
updateTrackingFactor();
} }
} }
@ -48,8 +47,8 @@ void PowerFollower::process(AudioSpan<float> buffer) noexcept
float currentSum = currentSum_; float currentSum = currentSum_;
size_t currentCount = currentCount_; size_t currentCount = currentCount_;
const float attackFactor = static_cast<float>(numFrames) * attackTrackingFactor_; const float attackFactor = attackTrackingFactor_;
const float releaseFactor = static_cast<float>(numFrames) * releaseTrackingFactor_; const float releaseFactor = releaseTrackingFactor_;
/// ///
size_t index = 0; size_t index = 0;
@ -67,8 +66,8 @@ void PowerFollower::process(AudioSpan<float> buffer) noexcept
if (currentCount == step) { if (currentCount == step) {
const float meanPower = currentSum / step; const float meanPower = currentSum / step;
currentPower = max( currentPower = max(
currentPower * (1 - attackFactor) + meanPower * attackFactor, currentPower * attackFactor + meanPower * (1 - attackFactor),
currentPower * (1 - releaseFactor) + meanPower * releaseFactor); currentPower * releaseFactor + meanPower * (1 - releaseFactor));
currentSum = 0; currentSum = 0;
currentCount = 0; currentCount = 0;
} }
@ -92,9 +91,8 @@ void PowerFollower::clear() noexcept
void PowerFollower::updateTrackingFactor() noexcept void PowerFollower::updateTrackingFactor() noexcept
{ {
// Protect the envelope follower against blowups // Protect the envelope follower against blowups
const auto maxTrackingFactor = sampleRate_ / samplesPerBlock_; attackTrackingFactor_ = std::exp(-1.0f / ((config::powerFollowerAttackTime / config::powerFollowerStep) * sampleRate_));
attackTrackingFactor_ = min(config::powerFollowerAttackFactor, maxTrackingFactor) / sampleRate_; releaseTrackingFactor_ = std::exp(-1.0f / ((config::powerFollowerReleaseTime / config::powerFollowerStep) * sampleRate_));
releaseTrackingFactor_ = min(config::powerFollowerReleaseFactor, maxTrackingFactor) / sampleRate_;
} }
} // namespace sfz } // namespace sfz