38 void set_times(
float attack_ms,
float release_ms, uint32_t sample_rate) {
39 float sr =
static_cast<float>(sample_rate);
43 float attack_samples = (attack_ms / 1000.0f) * sr;
44 float release_samples = (release_ms / 1000.0f) * sr;
46 if (attack_samples > 0.0f) {
47 float x = 1.0f / attack_samples;
48 attack_coeff_ = x / (1.0f + x);
53 if (release_samples > 0.0f) {
54 float x = 1.0f / release_samples;
55 release_coeff_ = x / (1.0f + x);
57 release_coeff_ = 1.0f;
71 attack_coeff_ = attack;
72 release_coeff_ = release;
87 float rectified = sample < 0.0f ? -sample : sample;
90 float coeff = rectified > envelope_ ? attack_coeff_ : release_coeff_;
91 envelope_ += coeff * (rectified - envelope_);
105 void process(
const float* in,
float* out, uint16_t frames) {
106 for (uint16_t i = 0; i < frames; ++i) {
112 float value()
const {
return envelope_; }
118 void reset(
float initial) { envelope_ = initial; }
121 float envelope_ = 0.0f;
122 float attack_coeff_ = 0.0f;
123 float release_coeff_ = 0.0f;
float process(float sample)
Process a single sample, return envelope value.
void reset()
Reset envelope state to zero.
void reset(float initial)
Reset envelope state to a specific value.
void set_coefficients(float attack, float release)
Set attack and release coefficients directly.
float value() const
Current envelope value (can be read without processing)
void set_times(float attack_ms, float release_ms, uint32_t sample_rate)
Set attack and release times in milliseconds.
void process(const float *in, float *out, uint16_t frames)
Process a block, write envelope to output buffer.
DSP atoms for audio signal processing.