From 32c7904ea08408979fac91d37969d8357142e5b3 Mon Sep 17 00:00:00 2001 From: mjoes Date: Wed, 13 Mar 2024 22:27:55 +0100 Subject: [PATCH] Bassdrum: Use lookup table for envelope --- drums/bass_drum.h | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/drums/bass_drum.h b/drums/bass_drum.h index 48fb6c8..7c085f6 100644 --- a/drums/bass_drum.h +++ b/drums/bass_drum.h @@ -3,6 +3,7 @@ #include #include #include +#include "../envelopes.h" using namespace std; @@ -44,8 +45,8 @@ class BassDrum { } void set_decay(uint16_t decay) { - BD.decay_ = 52-(decay/20+1); - length_decay_ = static_cast(log(1e-4)) / -BD.decay_ * sample_rate_; + length_decay_ = decay * sample_rate_ / 400; + lookup_table_ = exp_env; } void set_attack(uint16_t attack) { @@ -86,7 +87,7 @@ class BassDrum { sample = GenerateSample(t); sample += GenerateHarmonics(t); sample *= BD.velocity_; - sample *= GenerateEnv(t); + sample *= interpolate_env(); int16_t output = Overdrive(sample, 1); // Apply distortion rel_pos_ += 1; @@ -101,6 +102,7 @@ class BassDrum { uint32_t rel_pos_, end_i_, length_decay_; uint16_t length_attack_; const uint16_t sample_rate_; + const uint16_t* lookup_table_; vector flutter_; bool running_; BassDrumSculpt BD; @@ -153,13 +155,12 @@ class BassDrum { return sample; } - float GenerateEnv(float t) { - float out_; - if ( rel_pos_ >= length_attack_ ) { - out_ = 1.0f * exp(-BD.decay_ * (t-length_attack_t_)); - } else { - out_ = BD.attack_ * t; - } - return out_; + float interpolate_env(){ + float pos = static_cast(rel_pos_) / length_decay_ * 256.0; + float frac = pos - int(pos); + uint16_t a = lookup_table_[int(pos)]; + uint16_t b = lookup_table_[int(pos) + 1]; + uint16_t output = a + frac * (b - a); + return output / 65535.0; } };