Express follower AR in seconds
This commit is contained in:
parent
b1f1fc4042
commit
298befa753
2 changed files with 8 additions and 10 deletions
|
|
@ -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 };
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue