13template <
typename SampleType =
float>
17 SampleType
attack = SampleType{0.01f};
18 SampleType
decay = SampleType{0.1f};
38 level_ = SampleType{0.0f};
44 return SampleType{0.0f};
47 SampleType rate = rate_for(params_.attack);
49 if (level_ >= SampleType{1.0f}) {
50 level_ = SampleType{1.0f};
57 SampleType rate = rate_for(params_.decay);
59 if (level_ <= params_.sustain) {
60 level_ = params_.sustain;
70 SampleType rate = rate_for(params_.release);
72 if (level_ <= SampleType{0.0f}) {
73 level_ = SampleType{0.0f};
79 return SampleType{0.0f};
95 for (
int i = 0;
i < num_samples; ++
i)
103 int start_sample,
int num_samples) {
104 for (
int i = 0;
i < num_samples; ++
i) {
105 const SampleType env =
next();
106 for (
int ch = 0; ch < num_channels; ++ch)
107 channels[ch][start_sample +
i] *= env;
113 SampleType sample_rate_ = SampleType{44100.0f};
114 SampleType level_ = SampleType{0.0f};
117 SampleType rate_for(SampleType time_seconds)
const {
118 if (time_seconds <= SampleType{0.0f})
return SampleType{1.0f};
119 return SampleType{1.0f} / (time_seconds * sample_rate_);
void reset()
Definition adsr.hpp:36
void note_off()
Definition adsr.hpp:31
void apply_to_buffer(SampleType *buffer, int start_sample, int num_samples)
Multiply num_samples of buffer (starting at start_sample) by successive envelope values.
Definition adsr.hpp:94
void set_sample_rate(SampleType sr)
Definition adsr.hpp:24
void apply_to_buffer(SampleType *const *channels, int num_channels, int start_sample, int num_samples)
Multiply each channel of a planar multi-channel buffer by the same envelope.
Definition adsr.hpp:102
SampleType next()
Definition adsr.hpp:41
void note_on()
Definition adsr.hpp:26
Stage stage() const
Definition adsr.hpp:85
bool is_active() const
Definition adsr.hpp:82
Stage
Definition adsr.hpp:84
@ sustain
Definition adsr.hpp:84
@ release
Definition adsr.hpp:84
@ decay
Definition adsr.hpp:84
@ idle
Definition adsr.hpp:84
@ attack
Definition adsr.hpp:84
void set_params(const Params &p)
Definition adsr.hpp:23
Definition additive_bank.hpp:218
@ buffer
A borrowed static buffer with a traversable playhead.
Definition granular.hpp:110
AdsrT< float > Adsr
Definition adsr.hpp:123
@ i
Definition formant_filter_bank.hpp:20
AdsrT< double > Adsr64
Definition adsr.hpp:124
SampleType release
Definition adsr.hpp:20
SampleType attack
Definition adsr.hpp:17
SampleType sustain
Definition adsr.hpp:19
SampleType decay
Definition adsr.hpp:18