Clamp the tracking factors to avoid blowups

This commit is contained in:
Paul Ferrand 2020-08-21 11:36:09 +02:00
parent afc9d72c89
commit dd8134277c
2 changed files with 16 additions and 2 deletions

View file

@ -237,6 +237,14 @@ void sfz::Voice::registerTempo(int delay, float secondsPerQuarter) noexcept
UNUSED(secondsPerQuarter);
}
void sfz::Voice::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;
}
void sfz::Voice::setSampleRate(float sampleRate) noexcept
{
this->sampleRate = sampleRate;
@ -249,13 +257,13 @@ void sfz::Voice::setSampleRate(float sampleRate) noexcept
for (auto& lfo : lfos)
lfo->setSampleRate(sampleRate);
attackTrackingFactor = config::powerFollowerAttackFactor / sampleRate;
releaseTrackingFactor = config::powerFollowerReleaseFactor / sampleRate;
updateTrackingFactor();
}
void sfz::Voice::setSamplesPerBlock(int samplesPerBlock) noexcept
{
this->samplesPerBlock = samplesPerBlock;
updateTrackingFactor();
}
void sfz::Voice::renderBlock(AudioSpan<float> buffer) noexcept

View file

@ -485,6 +485,12 @@ private:
Smoother xfadeSmoother;
void resetSmoothers() noexcept;
/**
* @brief Update and clamp the tracking factors to ensure the power
* follower does not blow up.
*
*/
void updateTrackingFactor() noexcept;
float attackTrackingFactor { config::powerFollowerAttackFactor / config::defaultSampleRate };
float releaseTrackingFactor { config::powerFollowerReleaseFactor / config::defaultSampleRate };
float meanChannelPower;