Skip to content

Commit

Permalink
Used different filter algorithms
Browse files Browse the repository at this point in the history
  • Loading branch information
AugsEU committed Jul 6, 2020
1 parent 7edeccb commit 6714240
Show file tree
Hide file tree
Showing 20 changed files with 377 additions and 104 deletions.
33 changes: 10 additions & 23 deletions Augs Synth.jucer
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@
<FILE id="DFcVxV" name="ParameterInterpolator.h" compile="0" resource="0"
file="Source/ParameterInterpolator.h"/>
<GROUP id="{3AB4B9AA-2A1D-6F00-4D3F-E467A4223398}" name="Filters">
<FILE id="Gy8Pom" name="AbstractFilter.cpp" compile="1" resource="0"
file="Source/AbstractFilter.cpp"/>
<FILE id="W5yDqF" name="AbstractFilter.h" compile="0" resource="0"
file="Source/AbstractFilter.h"/>
<FILE id="HnrN2G" name="NarrowBand.cpp" compile="1" resource="0" file="Source/NarrowBand.cpp"/>
<FILE id="e7w5dQ" name="NarrowBand.h" compile="0" resource="0" file="Source/NarrowBand.h"/>
<FILE id="sRoDGU" name="NthOrderFilter.cpp" compile="1" resource="0"
file="Source/NthOrderFilter.cpp"/>
<FILE id="xbtrTu" name="NthOrderFilter.h" compile="0" resource="0"
file="Source/NthOrderFilter.h"/>
<FILE id="Z0ZzTb" name="RecursiveFilter.cpp" compile="1" resource="0"
file="Source/RecursiveFilter.cpp"/>
<FILE id="X4NMww" name="RecursiveFilter.h" compile="0" resource="0"
Expand All @@ -18,29 +28,6 @@
<FILE id="eQfowu" name="SinglePoleFilter.h" compile="0" resource="0"
file="Source/SinglePoleFilter.h"/>
</GROUP>
<GROUP id="{0C05AEFD-8CA5-8AA9-0683-1EDB5F03BAC8}" name="Maximilian">
<GROUP id="{5A28147C-CF13-2CA7-D3D8-1653BA8BEA6E}" name="libs">
<FILE id="cRPRsx" name="fft.cpp" compile="1" resource="0" file="../../Lib/cpp/Maximilian/libs/fft.cpp"/>
<FILE id="WLsj3c" name="fft.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/libs/fft.h"/>
<FILE id="SvAHpj" name="maxiAtoms.cpp" compile="1" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiAtoms.cpp"/>
<FILE id="SYGNA6" name="maxiAtoms.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiAtoms.h"/>
<FILE id="Vozmc1" name="maxiBark.cpp" compile="1" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiBark.cpp"/>
<FILE id="S7F8n6" name="maxiBark.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiBark.h"/>
<FILE id="vhjBBJ" name="maxiFFT.cpp" compile="1" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiFFT.cpp"/>
<FILE id="UqZbWA" name="maxiFFT.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiFFT.h"/>
<FILE id="v0wAoo" name="maxiGrains.cpp" compile="1" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiGrains.cpp"/>
<FILE id="svlDYE" name="maxiGrains.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiGrains.h"/>
<FILE id="IQ9hnY" name="maxim.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/libs/maxim.h"/>
<FILE id="RZcB5P" name="maxiMFCC.cpp" compile="1" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiMFCC.cpp"/>
<FILE id="M0X3PS" name="maxiMFCC.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/libs/maxiMFCC.h"/>
<FILE id="V9L9Zs" name="sineTable.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/libs/sineTable.h"/>
</GROUP>
<FILE id="Udkpw7" name="main.cpp" compile="1" resource="0" file="../../Lib/cpp/Maximilian/main.cpp"/>
<FILE id="ndNLrp" name="maximilian.cpp" compile="1" resource="0" file="../../Lib/cpp/Maximilian/maximilian.cpp"/>
<FILE id="KAI0Ab" name="maximilian.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/maximilian.h"/>
<FILE id="KJrcZj" name="stb_vorbis.c" compile="1" resource="0" file="../../Lib/cpp/Maximilian/stb_vorbis.c"/>
<FILE id="hzI9Xo" name="stb_vorbis.h" compile="0" resource="0" file="../../Lib/cpp/Maximilian/stb_vorbis.h"/>
</GROUP>
<FILE id="KWIsBS" name="Constants.h" compile="0" resource="0" file="Source/Constants.h"/>
<FILE id="e7qASm" name="AugsFilter.h" compile="0" resource="0" file="Source/AugsFilter.h"/>
<FILE id="lZayIM" name="AugsFilter.cpp" compile="1" resource="0" file="Source/AugsFilter.cpp"/>
Expand Down
2 changes: 2 additions & 0 deletions Source/AbstractFilter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#include "AbstractFilter.h"
double AbstractFilter::sampleRate = 44100.0;
32 changes: 32 additions & 0 deletions Source/AbstractFilter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
==============================================================================
Filter.h
Created: 5 Jul 2020 7:20:18pm
Author: August
==============================================================================
*/

#pragma once
class AbstractFilter
{
public:
AbstractFilter() : OldFreq(0.0), OldRes(0.0)
{ }
~AbstractFilter()
{}
inline static void SetSampleRate(double Rate) { sampleRate = Rate; };
void UpdateValues(double CutOff, double Res)
{
if (CutOff == OldFreq && Res == OldRes) return;
OldFreq = CutOff; OldRes = Res;
UpdateParameters(CutOff, Res);
}
private:
double OldFreq;
double OldRes;
protected:
virtual void UpdateParameters(double CutOff, double Res) = 0;
static double sampleRate;
};
82 changes: 73 additions & 9 deletions Source/AugsFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@

void AugsFilter::ProcessSample(double& Sample)
{
//if (Sample == 0.0) return;
double LowPassSample = mFilter.ProcessSample(Sample);

switch (mMode)
{
case FILTER_LOW_PASS:
Sample = LowPassSample;
LowPass(Sample);
break;
case FILTER_HIGH_PASS:
Sample = Sample - LowPassSample;//subtract low frequences
HighPass(Sample);
break;
case FILTER_BAND_PASS:
return;
BandPass(Sample);
break;
case FILTER_BAND_REJECT:
BandReject(Sample);
break;
case FILTER_OFF:
return;
Expand All @@ -35,8 +35,72 @@ void AugsFilter::ProcessSample(double& Sample)

void AugsFilter::setFreqAndRes(double newFreq, double newRes)
{
if (mFreq == newFreq && mRes == newRes) return;//don't bother calculating if there are no changes
mFreq = newFreq; mRes = newRes;//set new values
//update the filters
switch (mLowType)
{
case LowFilterType::LOW_SINGLEPOLE:
mSPFilter.UpdateValues(newFreq, newRes);
break;
case LowFilterType::LOW_THIRD_ORDER:
mThirdOrderFilter.UpdateValues(newFreq, newRes);
break;
default:
break;
}

switch (mBandType)
{
case BandFilterType::BAND_NARROWBAND:
mNBFilter.UpdateValues(newFreq, newRes);
break;
case BandFilterType::BAND_THIRD_ORDER:
mThirdOrderFilter.UpdateValues(newFreq, newRes);
break;
default:
break;
}
}

mFilter.CalculateCoefs(newFreq, newRes);//update the filter
void AugsFilter::LowPass(double& Sample)
{
switch (mLowType)
{
case LowFilterType::LOW_SINGLEPOLE:
Sample = mSPFilter.ProcessSample(Sample);
break;
case LowFilterType::LOW_THIRD_ORDER:
Sample = mThirdOrderFilter.ProcessSample(Sample, FILTER_LOW_PASS);
break;
default:
break;
}
}

void AugsFilter::HighPass(double& Sample)
{
double OldSampleValue = Sample;
LowPass(Sample);
Sample = OldSampleValue - Sample;
}

void AugsFilter::BandPass(double& Sample)
{
switch (mBandType)
{
case BandFilterType::BAND_NARROWBAND:
Sample = mNBFilter.ProcessSample(Sample);
break;
case BandFilterType::BAND_THIRD_ORDER:
Sample = mThirdOrderFilter.ProcessSample(Sample, FILTER_BAND_PASS);
break;
default:
break;
}
}

void AugsFilter::BandReject(double& Sample)
{
double OldSampleValue = Sample;
BandPass(Sample);
Sample = OldSampleValue - Sample;
}
47 changes: 36 additions & 11 deletions Source/AugsFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,53 @@

#pragma once
#include "SinglePoleFilter.h"

#include "NarrowBand.h"
#include "NthOrderFilter.h"

class AugsFilter
{
public:
enum FilterMode
enum LowFilterType
{
FILTER_LOW_PASS = 0,
FILTER_HIGH_PASS,
FILTER_BAND_PASS,
FILTER_OFF,
kNumOscillatorModes
LOW_SINGLEPOLE = 0,
LOW_THIRD_ORDER,
kNumLowFilterTypes
};

enum BandFilterType
{
BAND_NARROWBAND = 0,
BAND_THIRD_ORDER,
kNumBandFilterTypes
};

void setFreqAndRes(double newFreq, double newRes);
void setMode(FilterMode newMode) { mMode = newMode; }
void ProcessSample(double& Sample);

AugsFilter() : mMode(FILTER_OFF), mFreq(0.0), mRes(1.0) {}
AugsFilter() :
mMode(FILTER_OFF),
mLowType(LowFilterType::LOW_THIRD_ORDER),
mBandType(BandFilterType::BAND_THIRD_ORDER),
mThirdOrderFilter(3)
{}
~AugsFilter() {}
private:
void LowPass(double& Sample);
void HighPass(double& Sample);
void BandPass(double& Sample);
void BandReject(double& Sample);

FilterMode mMode;
double mFreq;
double mRes;
SinglePoleFilter mFilter;
LowFilterType mLowType;
BandFilterType mBandType;

//Multi-type filters
NthOrderFilter mThirdOrderFilter;

//Low pass filters
SinglePoleFilter mSPFilter;

//Band pass filters
NarrowBand mNBFilter;
};
15 changes: 15 additions & 0 deletions Source/AugsVoice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ void AugsVoice::stopNote(float /*velocity*/, bool allowTailOff)

}


void AugsVoice::pitchWheelMoved(int newPitchWheelValue) {}

void AugsVoice::controllerMoved(int controllerNumber, int newControllerValue) {}
Expand All @@ -43,6 +44,20 @@ void AugsVoice::renderNextBlock(AudioBuffer<float>& outputBuffer, int startSampl
{
for (int sample = 0; sample < numSamples; sample++)
{
double Attack = rInterpolator.GetFloat(0, sample);
double Decay = rInterpolator.GetFloat(1, sample);
double Sustain = rInterpolator.GetFloat(2, sample);
double Release = rInterpolator.GetFloat(3, sample);
setEnvelope(Attack, Decay, Sustain, Release);

int OscMode = (int)rInterpolator.GetFloatOld(5);
setOsc(static_cast<Oscillator::OscillatorMode>(OscMode));

int FilterMode = (int)rInterpolator.GetFloatOld(8);
float FilterCut = rInterpolator.GetFloat(9,sample);
float FilterRes = rInterpolator.GetFloat(10, sample);
setFilter(FilterCut, FilterRes, FilterMode);

double SampleVal = mOsc.nextSample();
double EnvValue = mEnv.nextSample();
SampleVal = SampleVal * EnvValue * mVelocity;
Expand Down
25 changes: 14 additions & 11 deletions Source/AugsVoice.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

#include <JuceHeader.h>
#include <cmath>

#include "Oscillator.h"
#include "PolyBLEPOscillator.h"
#include "EnvelopeGenerator.h"
#include "AugsSound.h"
#include "Defs.h"
#include "AugsFilter.h"
#include "ParameterInterpolator.h"

class AugsVoice : public SynthesiserVoice
{
Expand All @@ -19,23 +19,26 @@ class AugsVoice : public SynthesiserVoice
void pitchWheelMoved(int newPitchWheelValue) override;
void controllerMoved(int controllerNumber, int newControllerValue) override;
void renderNextBlock(AudioBuffer< float >& outputBuffer, int startSample, int numSamples) override;
void setEnvelope(double a, double d, double s, double r);
inline void setOsc(Oscillator::OscillatorMode mode) { mOsc.setMode(mode); }
inline void setFilter(double Freq, double Res, int Mode)
{
mFilter.setFreqAndRes(Freq, Res);
mFilter.setMode(static_cast<AugsFilter::FilterMode>(Mode));
}
AugsVoice() :mVelocity(0.0), minimumValue(0.0000001)

AugsVoice(ParameterInterpolator& Interpolator) :mVelocity(0.0), minimumValue(0.0000001), rInterpolator(Interpolator)
{}
~AugsVoice()
{}
private:
ParameterInterpolator& rInterpolator;
const double minimumValue;
double mVelocity;

PolyBLEPOscillator mOsc;

AugsFilter mFilter;
EnvelopeGenerator mEnv;

void setEnvelope(double a, double d, double s, double r);
inline void setOsc(Oscillator::OscillatorMode mode) { mOsc.setMode(mode); }
inline void setFilter(double Freq, double Res, int Mode)
{
mFilter.setFreqAndRes(Freq, Res);
mFilter.setMode(static_cast<FilterMode>(Mode));
}


};
16 changes: 13 additions & 3 deletions Source/Defs.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#pragma once
#include <string>

#define NUM_VOICES 1
#define NUM_VOICES 8

typedef struct
{
Expand All @@ -23,7 +23,17 @@ const FloatParam_Properties FloatParamProps[NUM_FLOAT_PARAMS] =
{"Osc_select", "Wave form",0.0, 3.0, 0.0, 1.0},//5
{"PowDist", "Pow dist", 0.4, 5.0, 1.0, 0.7},
{"TrimDist", "Trim dist",0.0, 0.99, 0.0, 2.3},
{"FilterSel", "Filter type",0.0, 3.0, 3.0, 1.0},//8
{"FilterTyp", "Filter type",0.0, 4.0, 3.0, 1.0},//8
{"CutOff", "Cut Off", 50.0, 20000.0,0.0, 0.2},
{"FiltRes", "Res", 1.0, 10.0, 1.0, 0.7}, };
{"FiltRes", "Res", 1.0, 10.0, 1.0, 0.7}, };

//Filter Enums
enum FilterMode
{
FILTER_LOW_PASS = 0,
FILTER_HIGH_PASS,
FILTER_BAND_PASS,
FILTER_BAND_REJECT,
FILTER_OFF,
kNumFilterModes
};
30 changes: 30 additions & 0 deletions Source/NarrowBand.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
==============================================================================
NarrowBand.cpp
Created: 26 Jun 2020 6:56:00pm
Author: August
==============================================================================
*/

#include "NarrowBand.h"

void NarrowBand::UpdateParameters(double CutOff, double Res)//Here the res actually controls the band width. This is a band reject filter
{
double Freq = CutOff / sampleRate;
if (Freq > 0.5) Freq = 0.5; if (Freq < 0.0) Freq = 0.0;
double BW = 1.0 / (2.0 * Res);
if (BW < 0.0) BW = 0.0; if (BW > 0.5) BW = 0.5;

double CPF = 2.0 * cos(TWO_PI * Freq);
double R = 1.0 - (3.0 * BW);
double R2 = R * R;
double K = (1.0 - (R * CPF) + R2) / (2.0 - CPF);

aCoefs[0] = 1.0-K;
aCoefs[1] = (K-R) * CPF;
aCoefs[2] = R2-K;
bCoefs[0] = R * CPF;
bCoefs[1] = -R2;
}
Loading

0 comments on commit 6714240

Please sign in to comment.