34 sample_rate_ = sample_rate;
35 envelope_.set_sample_rate(sample_rate);
36 filter_.prepare(
static_cast<float>(sample_rate));
47 level_ = std::max(
level, 0.0);
48 if (level_ == 0.0)
reset();
51 cutoff_hz_ = std::clamp(hz, 20.0, 20000.0);
55 decay_ms_ = std::clamp(ms, 0.05, 200.0);
56 envelope_.set_decay_time_constant_ms(decay_ms_);
59 double level()
const {
return level_; }
65 if (level_ <= 0.0)
return;
66 brightness_ = std::max(brightness, 0.01);
72 envelope_.set_attack_ms(0.0);
73 envelope_.set_decay_time_constant_ms(decay_ms_);
82 bool is_active()
const {
return level_ > 0.0 && envelope_.is_active(); }
86 if (!envelope_.is_active() || level_ <= 0.0)
return 0.0;
87 const double filtered = filter_.process_lowpass(
static_cast<float>(noise));
88 return filtered * envelope_.process() * level_;
94 std::min(cutoff_hz_ * brightness_, 0.49 * sample_rate_)));
97 double sample_rate_ = 44100.0;
99 double cutoff_hz_ = 4000.0;
100 double decay_ms_ = 2.0;
101 double brightness_ = 1.0;
118 envelope_.set_sample_rate(sample_rate);
125 level_ = std::max(
level, 0.0);
126 if (level_ == 0.0)
reset();
129 decay_ms_ = std::clamp(ms, 0.5, 4000.0);
130 envelope_.set_decay_t60_ms(decay_ms_);
133 double level()
const {
return level_; }
136 if (level_ <= 0.0)
return;
137 envelope_.set_attack_ms(0.2);
138 envelope_.set_decay_t60_ms(decay_ms_);
143 bool is_active()
const {
return level_ > 0.0 && envelope_.is_active(); }
148 if (!envelope_.is_active() || level_ <= 0.0)
return 0.0;
149 return coloured * envelope_.process() * level_;
154 double decay_ms_ = 60.0;
168 sample_rate_ = sample_rate > 0.0 ? sample_rate : sample_rate_;
169 filter_.set_sample_rate(
static_cast<float>(sample_rate_));
170 filter_.set_mode(Svf::Mode::bandpass);
181 level_ = std::max(
level, 0.0);
182 if (level_ == 0.0)
reset();
185 frequency_hz_ = std::clamp(hz, 20.0, 20000.0);
189 resonance_ = std::clamp(q, 1.0, 30.0);
193 double level()
const {
return level_; }
197 return level_ > 0.0 && ring_level_ > kSilenceLevel;
205 const double resonance =
static_cast<double>(
206 filter_.process(
static_cast<float>(excitation)));
208 std::max(std::fabs(
resonance), ring_level_ * kLevelDecay);
215 std::min(frequency_hz_, 0.49 * sample_rate_)));
219 static constexpr double kSilenceLevel = 1.0e-6;
220 static constexpr double kLevelDecay = 0.999;
222 double sample_rate_ = 44100.0;
224 double frequency_hz_ = 180.0;
225 double resonance_ = 12.0;
226 double ring_level_ = 0.0;
242 sample_rate_ = sample_rate > 0.0 ? sample_rate : sample_rate_;
249 double level()
const {
return level_; }
254 double process(
double body_hz,
double body_envelope) {
255 if (level_ <= 0.0)
return 0.0;
256 phase_ += 0.5 * body_hz / sample_rate_;
257 if (phase_ >= 1.0) phase_ -= std::floor(phase_);
258 return std::sin(2.0 * 3.14159265358979323846 * phase_) * body_envelope * level_;
262 double sample_rate_ = 44100.0;
void set_frequency(SampleType hz)
Definition svf.hpp:21
void set_resonance(SampleType q)
Definition svf.hpp:22
void set_cutoff(SampleType hz)
Set cutoff frequency in Hz. Safe to modulate per-sample.
Definition tpt_filter.hpp:49
The transient: a burst of noise through a lowpass, decaying in a few milliseconds.
Definition layers.hpp:31
void set_cutoff_hz(double hz)
Definition layers.hpp:50
void set_level(double level)
Definition layers.hpp:46
void trigger(double brightness=1.0)
Starts a click.
Definition layers.hpp:64
void reset()
Definition layers.hpp:41
double process(double noise)
Next sample. noise is a raw white sample from the voice's generator.
Definition layers.hpp:85
double level() const
Definition layers.hpp:59
double cutoff_hz() const
Definition layers.hpp:60
bool is_active() const
A silent layer is never active.
Definition layers.hpp:82
void prepare(double sample_rate)
Definition layers.hpp:33
void set_decay_ms(double ms)
Definition layers.hpp:54
The air a strike moves: a longer, coloured noise layer under the body.
Definition layers.hpp:115
void trigger()
Definition layers.hpp:135
double process(double coloured)
Next sample.
Definition layers.hpp:147
void prepare(double sample_rate)
Definition layers.hpp:117
void reset()
Definition layers.hpp:122
double level() const
Definition layers.hpp:133
bool is_active() const
A silent layer is never active – see the note on ClickLayer.
Definition layers.hpp:143
void set_decay_ms(double ms)
Definition layers.hpp:128
void set_level(double level)
Definition layers.hpp:124
A high-Q body resonance mixed back into an excitation path.
Definition layers.hpp:165
void set_resonance(double q)
Definition layers.hpp:188
void reset()
Definition layers.hpp:175
double resonance() const
Definition layers.hpp:195
void set_level(double level)
Definition layers.hpp:180
double level() const
Definition layers.hpp:193
double frequency_hz() const
Definition layers.hpp:194
void prepare(double sample_rate)
Definition layers.hpp:167
void set_frequency_hz(double hz)
Definition layers.hpp:184
bool is_ringing() const
Definition layers.hpp:196
double process(double excitation)
Definition layers.hpp:200
A sine an octave below the body, gated by the body's own envelope.
Definition layers.hpp:239
void set_level(double level)
Definition layers.hpp:248
void reset()
Definition layers.hpp:246
void trigger()
Definition layers.hpp:251
double level() const
Definition layers.hpp:249
void prepare(double sample_rate)
Definition layers.hpp:241
double process(double body_hz, double body_envelope)
Next sample at half of body_hz, scaled by the body's envelope.
Definition layers.hpp:254
SvfT< float > Svf
Definition svf.hpp:148
TptFilterT< float > TptFilter
Definition tpt_filter.hpp:172
DecayEnvelopeT< double > DecayEnvelope64
Definition decay_envelope.hpp:201
First-order topology-preserving transform (TPT) filter.