From 4057bf5d42b3ab5afb04efa38e2dbe67a64f00d6 Mon Sep 17 00:00:00 2001 From: HiveBeats Date: Fri, 8 Sep 2023 15:40:31 +0400 Subject: [PATCH] wip: filter lfo --- inc/Adder.h | 2 +- inc/Oscillator.h | 2 +- inc/Synth.h | 3 ++- src/Filter.cpp | 3 ++- src/LowPassFilter.cpp | 2 +- src/Oscillator.cpp | 2 +- src/Synth.cpp | 12 ++++++++++++ 7 files changed, 20 insertions(+), 6 deletions(-) diff --git a/inc/Adder.h b/inc/Adder.h index 3052b15..186bf9d 100644 --- a/inc/Adder.h +++ b/inc/Adder.h @@ -13,7 +13,7 @@ struct Adder { for (size_t i = 0; i < sample_count; i++) { float sample = 0.0f; for (Oscillator* osc : oscillators) { - sample += osc->GenerateSample(1.f); + sample += osc->GenerateSample(); } signal[i] = sample; diff --git a/inc/Oscillator.h b/inc/Oscillator.h index 1e33fa8..6944653 100644 --- a/inc/Oscillator.h +++ b/inc/Oscillator.h @@ -31,5 +31,5 @@ class Oscillator { float GetFreq() { return m_freq; } void SetFreq(float freq); void Reset(); - float GenerateSample(float duration); + float GenerateSample(); }; diff --git a/inc/Synth.h b/inc/Synth.h index 4c1ffbd..b1609ce 100644 --- a/inc/Synth.h +++ b/inc/Synth.h @@ -15,13 +15,14 @@ class Synth { std::vector m_oscillators; std::vector m_effects; std::vector m_out_signal; + Oscillator* m_lfo; void zero_signal(); void get_note(); void trigger_note_on_effects(); void untrigger_note_on_effects(); void apply_effects(); void add_oscillator(); - + void apply_filter_lfo(); public: Synth(/* args */); ~Synth(); diff --git a/src/Filter.cpp b/src/Filter.cpp index 386f8f2..181f72e 100644 --- a/src/Filter.cpp +++ b/src/Filter.cpp @@ -18,6 +18,7 @@ void Filter::Trigger() {} void Filter::Release() {} float Filter::Process(float in) { + calculate_coefficients(); float out = in * m_a0 + m_z1; m_z1 = in * m_a1 + m_z2 - m_b1 * out; m_z2 = in * m_a2 - m_b2 * out; @@ -28,7 +29,7 @@ void Filter::Process(std::vector& samples) { // todo: that will not work for ADSR-controlled filter. So, let's calculate // all the possible frequency values into array/dictionary then just lookup // for each sample - calculate_coefficients(); + for (std::size_t i = 0; i < samples.size(); i++) { samples[i] = Process(samples[i]); } diff --git a/src/LowPassFilter.cpp b/src/LowPassFilter.cpp index ca4a776..9d43e56 100644 --- a/src/LowPassFilter.cpp +++ b/src/LowPassFilter.cpp @@ -4,7 +4,7 @@ LowPassFilter::LowPassFilter() { // todo: defaults m_freq = 200.f / SAMPLE_RATE; - m_q = 0.707f; + m_q = 1.0f;//0.707f; m_order = 0; } diff --git a/src/Oscillator.cpp b/src/Oscillator.cpp index cf6e940..ce1f78a 100644 --- a/src/Oscillator.cpp +++ b/src/Oscillator.cpp @@ -45,7 +45,7 @@ void Oscillator::SetFreq(float freq) { m_phase_dt = (this->*m_dt_function)(freq); } -float Oscillator::GenerateSample(float duration) { +float Oscillator::GenerateSample() { return (this->*m_osc_function)() * m_volume; } diff --git a/src/Synth.cpp b/src/Synth.cpp index 1ea0484..d4b2591 100644 --- a/src/Synth.cpp +++ b/src/Synth.cpp @@ -6,6 +6,7 @@ #include "LowPassFilter.h" Synth::Synth(/* args */) { + m_lfo = new Oscillator(OscillatorType::Sine, 5.f, VOLUME); add_oscillator(); add_oscillator(); AddEffect(new ADSR()); @@ -69,7 +70,18 @@ void Synth::Trigger(Note input) { trigger_note_on_effects(); } +void Synth::apply_filter_lfo() { + float dt = m_lfo->GenerateSample(); + Filter* filter = (Filter*)m_effects[1]; + float freq = filter->GetFreq(); + //todo: check formula + //filter->SetParameters(freq + dt * 0.2f, filter->GetRes(), filter->GetPeakGain()); +} + void Synth::Process() { + //todo: on each sample. + //in order to do that, we need to move to per-sample processing + apply_filter_lfo(); get_note(); apply_effects(); }