Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,18 @@ CMSIS_DIR = ../CMSIS_5/CMSIS
OBJS = main.o kernel.o minidexed.o config.o userinterface.o uimenu.o \
mididevice.o midikeyboard.o serialmididevice.o pckeyboard.o \
sysexfileloader.o performanceconfig.o perftimer.o \
effect_base.o effect_chorus.o effect_delay.o \
effect_base.o effect_chorus.o effect_delay.o effect_mverb.o \
effect_talreverb3.o effect_ds1.o effect_bigmuff.o \
moddistortion/Distortion_DS1.o moddistortion/Distortion_BigMuff.o \
moddistortion/HyperbolicTables.o moddistortion/OverSample.o \
effect_compressor.o effect_platervbstereo.o uibuttons.o midipin.o
effect_compressor.o effect_platervbstereo.o uibuttons.o midipin.o \
midi_arp.o modarpeggiator/common/clock.o \
modarpeggiator/common/midiHandler.o modarpeggiator/common/pattern.o \
modarpeggiator/utils.o modarpeggiator/arpeggiator.o

OPTIMIZE = -O3

include ./Synth_Dexed.mk
include ./Rules.mk

EXTRACLEAN += moddistortion/*.[od]
EXTRACLEAN += moddistortion/*.[od] modarpeggiator/*.[od] modarpeggiator/common/*.[od]
176 changes: 176 additions & 0 deletions src/effect_3bandeq.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
/*
* DISTHRO 3 Band EQ
* Ported from https://github.com/DISTRHO/Mini-Series/blob/master/plugins/3BandEQ
*
* Javier Nonis (https://github.com/jnonis) - 2024
*/
#ifndef _EFFECT_3BANDEQ_H
#define _EFFECT_3BANDEQ_H

#include <cmath>
#include "effect_base.h"

class AudioEffect3BandEQ : public AudioEffect
{
public:
static constexpr float kAMP_DB = 8.656170245f;
static constexpr float kDC_ADD = 1e-30f;
static constexpr float kPI = 3.141592654f;

enum Param
{
BYPASS,
EQ_LOW,
EQ_MID,
EQ_HIGH,
MASTER,
LOW_MID_FQ,
MID_HIGH_FQ,
UNKNOWN
};

AudioEffect3BandEQ(float32_t samplerate) : AudioEffect(samplerate)
{
// Default values
fLow = 0.0f;
fMid = 0.0f;
fHigh = 0.0f;
fMaster = 0.0f;
fLowMidFreq = 440.0f;
fMidHighFreq = 2000.0f;

// Internal stuff
lowVol = midVol = highVol = outVol = 1.0f;
freqLP = 200.0f;
freqHP = 2000.0f;

// reset filter values
xLP = std::exp(-2.0f * kPI * freqLP / samplerate);

a0LP = 1.0f - xLP;
b1LP = -xLP;

xHP = std::exp(-2.0f * kPI * freqHP / samplerate);
a0HP = 1.0f - xHP;
b1HP = -xHP;

out1LP = out2LP = out1HP = out2HP = 0.0f;
tmp1LP = tmp2LP = tmp1HP = tmp2HP = 0.0f;
}

virtual ~AudioEffect3BandEQ()
{
}

virtual unsigned getId()
{
return EFFECT_3BANDEQ;
}

virtual void setParameter(unsigned param, unsigned value)
{
switch (param)
{
case AudioEffect3BandEQ::Param::BYPASS:
this->setBypass(value == 1);
break;
case AudioEffect3BandEQ::Param::EQ_LOW:
fLow = (value / 100.0f) * 48.0f - 24.0f;
lowVol = std::exp( (fLow/48.0f) * 48.0f / kAMP_DB);
break;
case AudioEffect3BandEQ::Param::EQ_MID:
fMid = (value / 100.0f) * 48.0f - 24.0f;
midVol = std::exp( (fMid/48.0f) * 48.0f / kAMP_DB);
break;
case AudioEffect3BandEQ::Param::EQ_HIGH:
fHigh = (value / 100.0f) * 48.0f - 24.0f;
highVol = std::exp( (fHigh/48.0f) * 48.0f / kAMP_DB);
break;
case AudioEffect3BandEQ::Param::MASTER:
fMaster = (value / 100.0f) * 48.0f - 24.0f;
outVol = std::exp( (fMaster/48.0f) * 48.0f / kAMP_DB);
break;
case AudioEffect3BandEQ::Param::LOW_MID_FQ:
fLowMidFreq = std::min((float) value, fMidHighFreq);
freqLP = fLowMidFreq;
xLP = std::exp(-2.0f * kPI * freqLP / (float)samplerate);
a0LP = 1.0f - xLP;
b1LP = -xLP;
break;
case AudioEffect3BandEQ::Param::MID_HIGH_FQ:
fMidHighFreq = std::max((float) value, fLowMidFreq);
freqHP = fMidHighFreq;
xHP = std::exp(-2.0f * kPI * freqHP / (float)samplerate);
a0HP = 1.0f - xHP;
b1HP = -xHP;
break;
default:
break;
}
}

virtual unsigned getParameter(unsigned param)
{
switch (param)
{
case AudioEffect3BandEQ::Param::BYPASS:
return this->getBypass() ? 1 : 0;
case AudioEffect3BandEQ::Param::EQ_LOW:
return roundf(((fLow + 24.0f) / 48.0f) * 100.0f);
case AudioEffect3BandEQ::Param::EQ_MID:
return roundf(((fMid + 24.0f) / 48.0f) * 100.0f);
case AudioEffect3BandEQ::Param::EQ_HIGH:
return roundf(((fHigh + 24.0f) / 48.0f) * 100.0f);
case AudioEffect3BandEQ::Param::MASTER:
return roundf(((fMaster + 24.0f) / 48.0f) * 100.0f);
case AudioEffect3BandEQ::Param::LOW_MID_FQ:
return fLowMidFreq;
case AudioEffect3BandEQ::Param::MID_HIGH_FQ:
return fMidHighFreq;
default:
return 0;
}
}

protected:
virtual size_t getParametersSize()
{
return AudioEffect3BandEQ::Param::UNKNOWN;
}
virtual void doProcess(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len)
{
const float* in1 = inblockL;
const float* in2 = inblockR;
float* out1 = outblockL;
float* out2 = outblockR;

for (uint32_t i=0; i < len; ++i)
{
tmp1LP = a0LP * in1[i] - b1LP * tmp1LP + kDC_ADD;
tmp2LP = a0LP * in2[i] - b1LP * tmp2LP + kDC_ADD;
out1LP = tmp1LP - kDC_ADD;
out2LP = tmp2LP - kDC_ADD;

tmp1HP = a0HP * in1[i] - b1HP * tmp1HP + kDC_ADD;
tmp2HP = a0HP * in2[i] - b1HP * tmp2HP + kDC_ADD;
out1HP = in1[i] - tmp1HP - kDC_ADD;
out2HP = in2[i] - tmp2HP - kDC_ADD;

out1[i] = (out1LP*lowVol + (in1[i] - out1LP - out1HP)*midVol + out1HP*highVol) * outVol;
out2[i] = (out2LP*lowVol + (in2[i] - out2LP - out2HP)*midVol + out2HP*highVol) * outVol;
}
}
private:
float fLow, fMid, fHigh, fMaster, fLowMidFreq, fMidHighFreq;

float lowVol, midVol, highVol, outVol;
float freqLP, freqHP;

float xLP, a0LP, b1LP;
float xHP, a0HP, b1HP;

float out1LP, out2LP, out1HP, out2HP;
float tmp1LP, tmp2LP, tmp1HP, tmp2HP;
};

#endif // _EFFECT_3BANDEQ_H
2 changes: 2 additions & 0 deletions src/effect_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
#define EFFECT_BIGMUFF 5
#define EFFECT_TALREVERB3 6
#define EFFECT_REVERB 7
#define EFFECT_MVERB 8
#define EFFECT_3BANDEQ 9

class AudioEffect
{
Expand Down
116 changes: 116 additions & 0 deletions src/effect_mverb.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/*
* MVerb Reverb Port
* Ported from https://github.com/DISTRHO/MVerb
* Original https://github.com/martineastwood/mverb/
*
* Javier Nonis (https://github.com/jnonis) - 2024
*/
#include "effect_mverb.h"

AudioEffectMVerb::AudioEffectMVerb(float32_t samplerate) : AudioEffect(samplerate)
{
fVerb.setSampleRate(samplerate);

fVerb.setParameter(MVerb<float>::DAMPINGFREQ, 0.5f);
fVerb.setParameter(MVerb<float>::DENSITY, 0.5f);
fVerb.setParameter(MVerb<float>::BANDWIDTHFREQ, 0.5f);
fVerb.setParameter(MVerb<float>::DECAY, 0.5f);
fVerb.setParameter(MVerb<float>::PREDELAY, 0.5f);
fVerb.setParameter(MVerb<float>::SIZE, 0.75f);
fVerb.setParameter(MVerb<float>::GAIN, 1.0f);
fVerb.setParameter(MVerb<float>::MIX, 0.5f);
fVerb.setParameter(MVerb<float>::EARLYMIX, 0.5f);
fVerb.reset();
}

AudioEffectMVerb::~AudioEffectMVerb()
{
}

void AudioEffectMVerb::initializeSendFX()
{
this->setParameter(AudioEffectMVerb::Param::MIX, 100);
}

void AudioEffectMVerb::setParameter(unsigned param, unsigned value)
{
switch (param)
{
case AudioEffectMVerb::Param::BYPASS:
this->setBypass(value == 1);
break;
case AudioEffectMVerb::Param::DAMPINGFREQ:
fVerb.setParameter(MVerb<float>::DAMPINGFREQ, (float) value / 100.0f);
break;
case AudioEffectMVerb::Param::DENSITY:
fVerb.setParameter(MVerb<float>::DENSITY, (float) value / 100.0f);
break;
case AudioEffectMVerb::Param::BANDWIDTHFREQ:
fVerb.setParameter(MVerb<float>::BANDWIDTHFREQ, (float) value / 100.0f);
break;
case AudioEffectMVerb::Param::DECAY:
fVerb.setParameter(MVerb<float>::DECAY, (float) value / 100.0f);
break;
case AudioEffectMVerb::Param::PREDELAY:
fVerb.setParameter(MVerb<float>::PREDELAY, (float) value / 100.0f);
break;
case AudioEffectMVerb::Param::SIZE:
fVerb.setParameter(MVerb<float>::SIZE, (float) value / 100.0f);
break;
case AudioEffectMVerb::Param::GAIN:
fVerb.setParameter(MVerb<float>::GAIN, (float) value / 100.0f);
break;
case AudioEffectMVerb::Param::MIX:
fVerb.setParameter(MVerb<float>::MIX, (float) value / 100.0f);
break;
case AudioEffectMVerb::Param::EARLYMIX:
fVerb.setParameter(MVerb<float>::EARLYMIX, (float) value / 100.0f);
break;
default:
break;
}
}

unsigned AudioEffectMVerb::getParameter(unsigned param)
{
switch (param)
{
case AudioEffectMVerb::Param::BYPASS:
return this->getBypass() ? 1 : 0;
case AudioEffectMVerb::Param::DAMPINGFREQ:
return roundf(fVerb.getParameter(MVerb<float>::DAMPINGFREQ) * 100);
case AudioEffectMVerb::Param::DENSITY:
return roundf(fVerb.getParameter(MVerb<float>::DENSITY) * 100);
case AudioEffectMVerb::Param::BANDWIDTHFREQ:
return roundf(fVerb.getParameter(MVerb<float>::BANDWIDTHFREQ) * 100);
case AudioEffectMVerb::Param::DECAY:
return roundf(fVerb.getParameter(MVerb<float>::DECAY) * 100);
case AudioEffectMVerb::Param::PREDELAY:
return roundf(fVerb.getParameter(MVerb<float>::PREDELAY) * 100);
case AudioEffectMVerb::Param::SIZE:
return roundf(fVerb.getParameter(MVerb<float>::SIZE) * 100);
case AudioEffectMVerb::Param::GAIN:
return roundf(fVerb.getParameter(MVerb<float>::GAIN) * 100);
case AudioEffectMVerb::Param::MIX:
return roundf(fVerb.getParameter(MVerb<float>::MIX) * 100);
case AudioEffectMVerb::Param::EARLYMIX:
return roundf(fVerb.getParameter(MVerb<float>::EARLYMIX) * 100);
default:
return 0;
}
}


void AudioEffectMVerb::doProcess(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len)
{
const float32_t* inputs[2];
inputs[0] = inblockL;
inputs[1] = inblockR;

float32_t* outputs[2];
outputs[0] = outblockL;
outputs[1] = outblockR;

fVerb.process(inputs, outputs, static_cast<int>(len));
}

54 changes: 54 additions & 0 deletions src/effect_mverb.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* MVerb Reverb Port
* Ported from https://github.com/DISTRHO/MVerb
* Original https://github.com/martineastwood/mverb/
*
* Javier Nonis (https://github.com/jnonis) - 2024
*/
#ifndef _EFFECT_MVERB_H
#define _EFFECT_MVERB_H

#include "effect_base.h"
#include "mverb/MVerb.h"

class AudioEffectMVerb : public AudioEffect
{
public:
enum Param
{
BYPASS,
DAMPINGFREQ,
DENSITY,
BANDWIDTHFREQ,
DECAY,
PREDELAY,
SIZE,
GAIN,
MIX,
EARLYMIX,
UNKNOWN
};

AudioEffectMVerb(float32_t samplerate);
virtual ~AudioEffectMVerb();

virtual unsigned getId()
{
return EFFECT_MVERB;
}

virtual void initializeSendFX();
virtual void setParameter(unsigned param, unsigned value);
virtual unsigned getParameter(unsigned param);
protected:
virtual size_t getParametersSize()
{
return AudioEffectMVerb::Param::UNKNOWN;
}
virtual void doProcess(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len);

private:
MVerb<float> fVerb;
};

#endif // _EFFECT_MVERB_H
3 changes: 2 additions & 1 deletion src/effect_talreverb3.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
/*
* Tal Reverb 3 Port
* Ported from https://github.com/DISTRHO/DISTRHO-Ports/tree/master/ports-juce5/tal-reverb-3
*
* Original https://tal-software.com/
*
* Javier Nonis (https://github.com/jnonis) - 2024
*/
#include <circle/logger.h>
Expand Down
Loading