wip: State Variable Filter (FILTER LFO WORKS NOW!!!)

This commit is contained in:
2024-01-17 08:56:58 +07:00
parent 4fd0cb279d
commit 29ceabca74
10 changed files with 166 additions and 26 deletions

View File

@@ -11,10 +11,3 @@ public:
void SetFreq(float freq) { m_phase_dt = (this->*m_dt_function)(freq); }
};
LFO::LFO(/* args */): Oscillator(Sine, 0.f, 0.5f)
{
}
LFO::~LFO()
{
}

View File

@@ -0,0 +1,15 @@
#pragma once
#include "StateVariableFilter.h"
class LowPassStateVariableFilter : StateVariableFilter {
protected:
float GetSampleForFilterType() override;
public:
LowPassStateVariableFilter();
LowPassStateVariableFilter(StateVariableFilter* filter);
LowPassStateVariableFilter(float freq, float res, float q);
~LowPassStateVariableFilter();
bool IsSameFilterType(FilterType type) override { return type == LowPass; };
};

35
inc/StateVariableFilter.h Normal file
View File

@@ -0,0 +1,35 @@
#pragma once
#include "Filter.h"
#include "IEffect.h"
#include "Settings.h"
class StateVariableFilter : public IEffect {
protected:
// float* m_output; // output buffer
float m_fs = SAMPLE_RATE; // sampling frequency;
float m_fc; // cutoff frequency normally something like: 440.0*pow(2.0,
// (midi_note - 69.0)/12.0);
float m_res; // resonance 0 to 1;
float m_drive; // internal distortion 0 to 0.1
float m_freq;
float m_damp;
float m_notcho; // notch output
float m_lowo; // low pass output
float m_higho; // high pass output
float m_bando; // band pass output
float m_peako; // peaking output = low - high
virtual float GetSampleForFilterType(){ return 0.0; };
public:
StateVariableFilter(/* args */);
virtual ~StateVariableFilter();
void Trigger() override final;
void Release() override final;
float Process(float in);
void Process(std::vector<float>& samples) override final;
void SetParameters(float freq, float res, float drive);
float GetFreq() { return m_fc; }
float GetRes() { return m_res; }
float GetPeakGain() { return m_drive; }
virtual bool IsSameFilterType(FilterType type) { return false; };
};

View File

@@ -1,13 +1,14 @@
#pragma once
#include "ADSR.h"
#include "Filter.h"
#include "StateVariableFilter.h"
#include "Adder.h"
#include "IEffect.h"
#include "Note.h"
#include "Oscillator.h"
#include "Settings.h"
#include <vector>
#include "LFO.h"
class Synth {
private:
@@ -15,7 +16,7 @@ class Synth {
std::vector<Oscillator*> m_oscillators;
std::vector<IEffect*> m_effects;
std::vector<float> m_out_signal;
Oscillator* m_lfo;
LFO* m_lfo;
void ZeroSignal();
void GetNote();
void TriggerNoteOnEffects();
@@ -34,6 +35,6 @@ class Synth {
const std::vector<Oscillator*>& GetOscillators() { return m_oscillators; }
const bool& GetIsNoteTriggered() { return is_note_triggered; }
ADSR* GetADSR() { return (ADSR*)m_effects[0]; }
Filter* GetFilter() { return (Filter*)m_effects[1]; }
StateVariableFilter* GetFilter() { return (StateVariableFilter*)m_effects[1]; }
void SetFilter(FilterType type);
};