refactor: IEffect interface
This commit is contained in:
14
inc/ADSR.h
14
inc/ADSR.h
@@ -1,9 +1,9 @@
|
||||
#pragma once
|
||||
#include "Effect.h"
|
||||
#include "IEffect.h"
|
||||
#include "Ramp.h"
|
||||
#include <cstddef>
|
||||
|
||||
class ADSR : public Effect {
|
||||
class ADSR : public IEffect {
|
||||
enum ADSRState { sOff, sAttack, sDecay, sSustain, sRelease };
|
||||
|
||||
private:
|
||||
@@ -14,11 +14,11 @@ class ADSR : public Effect {
|
||||
ADSRState m_state;
|
||||
Ramp* m_ramp;
|
||||
|
||||
void process_sample(float* sample);
|
||||
bool is_attack_elapsed();
|
||||
bool is_decay_elapsed();
|
||||
bool is_release_elapsed();
|
||||
void recheck_state();
|
||||
void ProcessSample(float* sample);
|
||||
bool IsAttackElapsed();
|
||||
bool IsDecayElapsed();
|
||||
bool IsReleaseElapsed();
|
||||
void RecheckState();
|
||||
|
||||
public:
|
||||
ADSR(/* args */);
|
||||
|
||||
12
inc/Effect.h
12
inc/Effect.h
@@ -1,12 +0,0 @@
|
||||
#pragma once
|
||||
#include <vector>
|
||||
class Effect {
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
Effect(/* args */){};
|
||||
~Effect(){};
|
||||
virtual void Trigger(){};
|
||||
virtual void Release(){};
|
||||
virtual void Process(std::vector<float>& samples){};
|
||||
};
|
||||
10
inc/Filter.h
10
inc/Filter.h
@@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
#include "Effect.h"
|
||||
#include "IEffect.h"
|
||||
|
||||
enum FilterType {
|
||||
LowPass,
|
||||
@@ -7,7 +7,7 @@ enum FilterType {
|
||||
HighPass
|
||||
};
|
||||
|
||||
class Filter : public Effect {
|
||||
class Filter : public IEffect {
|
||||
protected:
|
||||
float m_freq; // cutoff frequency
|
||||
float m_q; // filter quantity (resonance)
|
||||
@@ -23,10 +23,10 @@ class Filter : public Effect {
|
||||
public:
|
||||
Filter(/* args */);
|
||||
virtual ~Filter();
|
||||
void Trigger() override;
|
||||
void Release() override;
|
||||
void Trigger() override final;
|
||||
void Release() override final;
|
||||
float Process(float in);
|
||||
void Process(std::vector<float>& samples) override;
|
||||
void Process(std::vector<float>& samples) override final;
|
||||
void SetParameters(float freq, float res, float q);
|
||||
float GetFreq() { return m_freq; }
|
||||
float GetRes() { return m_q; }
|
||||
|
||||
10
inc/IEffect.h
Normal file
10
inc/IEffect.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
#include <vector>
|
||||
class IEffect {
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
virtual void Trigger() = 0;
|
||||
virtual void Release() = 0;
|
||||
virtual void Process(std::vector<float>& samples) = 0;
|
||||
};
|
||||
20
inc/Synth.h
20
inc/Synth.h
@@ -3,7 +3,7 @@
|
||||
#include "ADSR.h"
|
||||
#include "Filter.h"
|
||||
#include "Adder.h"
|
||||
#include "Effect.h"
|
||||
#include "IEffect.h"
|
||||
#include "Note.h"
|
||||
#include "Oscillator.h"
|
||||
#include "Settings.h"
|
||||
@@ -13,23 +13,23 @@ class Synth {
|
||||
private:
|
||||
bool is_note_triggered;
|
||||
std::vector<Oscillator*> m_oscillators;
|
||||
std::vector<Effect*> m_effects;
|
||||
std::vector<IEffect*> m_effects;
|
||||
std::vector<float> 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();
|
||||
void ZeroSignal();
|
||||
void GetNote();
|
||||
void TriggerNoteOnEffects();
|
||||
void UntriggerNoteOnEffects();
|
||||
void ApplyEffects();
|
||||
void AddOscillator();
|
||||
void ApplyFilterLfo();
|
||||
public:
|
||||
Synth(/* args */);
|
||||
~Synth();
|
||||
void Trigger(Note input);
|
||||
void Process();
|
||||
void Release();
|
||||
void AddEffect(Effect* fx);
|
||||
void AddEffect(IEffect* fx);
|
||||
const std::vector<float>& GetOutSignal() { return m_out_signal; }
|
||||
const std::vector<Oscillator*>& GetOscillators() { return m_oscillators; }
|
||||
const bool& GetIsNoteTriggered() { return is_note_triggered; }
|
||||
|
||||
Reference in New Issue
Block a user