AudioEffect refactor

pull/764/head
Javier Nonis 6 months ago
parent 17f6fc9ccf
commit 38f9f5f05c
  1. 1
      src/Makefile
  2. 11
      src/effect_audio/effect_3bandeq.h
  3. 11
      src/effect_audio/effect_aphaser.h
  4. 113
      src/effect_audio/effect_base.cpp
  5. 108
      src/effect_audio/effect_base.h
  6. 7
      src/effect_audio/effect_bigmuff.cpp
  7. 5
      src/effect_audio/effect_bigmuff.h
  8. 7
      src/effect_audio/effect_chorus.cpp
  9. 5
      src/effect_audio/effect_chorus.h
  10. 7
      src/effect_audio/effect_delay.cpp
  11. 4
      src/effect_audio/effect_delay.h
  12. 7
      src/effect_audio/effect_ds1.cpp
  13. 4
      src/effect_audio/effect_ds1.h
  14. 10
      src/effect_audio/effect_lpf.h
  15. 4
      src/effect_audio/effect_mverb.cpp
  16. 11
      src/effect_audio/effect_mverb.h
  17. 11
      src/effect_audio/effect_phaser.h
  18. 11
      src/effect_audio/effect_platervbstereo.h
  19. 11
      src/effect_audio/effect_talreverb3.h
  20. 142
      src/effects.h
  21. 18
      src/midi_effects.h
  22. 21
      src/minidexed.cpp
  23. 3
      src/minidexed.h
  24. 137
      src/uimenu.cpp
  25. 3
      src/uimenu.h

@ -10,7 +10,6 @@ OBJS = main.o kernel.o minidexed.o config.o userinterface.o uimenu.o \
mididevice.o midikeyboard.o serialmididevice.o pckeyboard.o \ mididevice.o midikeyboard.o serialmididevice.o pckeyboard.o \
sysexfileloader.o performanceconfig.o perftimer.o \ sysexfileloader.o performanceconfig.o perftimer.o \
uibuttons.o midipin.o effect_compressor.o \ uibuttons.o midipin.o effect_compressor.o \
effect_audio/effect_base.o \
effect_audio/effect_chorus.o \ effect_audio/effect_chorus.o \
effect_audio/effect_delay.o \ effect_audio/effect_delay.o \
effect_audio/effect_platervbstereo.o \ effect_audio/effect_platervbstereo.o \

@ -13,6 +13,10 @@
class AudioEffect3BandEQ : public AudioEffect class AudioEffect3BandEQ : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 9;
static constexpr const char* NAME = "3Band EQ";
static constexpr float kAMP_DB = 8.656170245f; static constexpr float kAMP_DB = 8.656170245f;
static constexpr float kDC_ADD = 1e-30f; static constexpr float kDC_ADD = 1e-30f;
static constexpr float kPI = 3.141592654f; static constexpr float kPI = 3.141592654f;
@ -64,7 +68,12 @@ public:
virtual unsigned getId() virtual unsigned getId()
{ {
return EFFECT_3BANDEQ; return AudioEffect3BandEQ::ID;
}
virtual std::string getName()
{
return AudioEffect3BandEQ::NAME;
} }
virtual void setParameter(unsigned param, unsigned value) virtual void setParameter(unsigned param, unsigned value)

@ -13,6 +13,10 @@
class AudioEffectAPhaser : public AudioEffect class AudioEffectAPhaser : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 11;
static constexpr const char* NAME = "A Phaser";
enum Param enum Param
{ {
BYPASS, BYPASS,
@ -60,7 +64,12 @@ public:
virtual unsigned getId() virtual unsigned getId()
{ {
return EFFECT_APHASER; return AudioEffectAPhaser::ID;
}
virtual std::string getName()
{
return AudioEffectAPhaser::NAME;
} }
virtual void initializeSendFX() virtual void initializeSendFX()

@ -1,113 +0,0 @@
/*
* Base AudioEffect interface
* Javier Nonis (https://github.com/jnonis) - 2024
*/
#include <circle/logger.h>
#include "effect_base.h"
LOGMODULE ("AudioEffect");
AudioEffect::AudioEffect(float32_t samplerate)
{
this->samplerate = samplerate;
}
AudioEffect::~AudioEffect()
{
}
void AudioEffect::setBypass(bool bypass)
{
this->bypass = bypass;
}
bool AudioEffect::getBypass()
{
return bypass;
}
unsigned AudioEffect::getId()
{
return EFFECT_NONE;
}
void AudioEffect::setParameters(std::vector<unsigned> params)
{
for (size_t i = 0; i < params.size(); i++)
{
this->setParameter(i, params[i]);
}
}
std::vector<unsigned> AudioEffect::getParameters()
{
size_t len = this->getParametersSize();
std::vector<unsigned> params;
for (size_t i = 0; i < len; i++)
{
params.push_back(getParameter(i));
}
return params;
}
void AudioEffect::process(const float32_t* inblock, float32_t* outblock, uint16_t len)
{
// Mono process
// Dummy buffer for right channel
float32_t dummyBuffer[len];
memset(dummyBuffer, 0, len * sizeof(float32_t));
process(inblock, dummyBuffer, outblock, dummyBuffer, len);
}
void AudioEffect::process(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len)
{
if (bypass) {
if (inblockL != outblockL)
{
memcpy(outblockL, inblockL, len * sizeof(float32_t));
}
if (inblockR != outblockR) {
memcpy(outblockR, inblockR, len * sizeof(float32_t));
}
/*
if (inblockL != outblockL || inblockR != outblockR) {
// if input and output buffers are different we should copy the content
for (uint16_t i=0; i < len; i++)
{
outblockL[i] = inblockL[i];
if (inblockL == inblockR) {
outblockR[i] = inblockL[i];
}
else
{
outblockR[i] = inblockR[i];
}
}
}
*/
return;
}
doProcess(inblockL, inblockR, outblockL, outblockR, len);
}
void AudioEffect::doProcess(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len) {
}
AudioEffectNone::AudioEffectNone(float32_t samplerate) : AudioEffect(samplerate)
{
setBypass(true);
}
AudioEffectNone::~AudioEffectNone()
{
}
void AudioEffectNone::doProcess(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len)
{
}
unsigned AudioEffectNone::getId()
{
return EFFECT_NONE;
}

@ -7,30 +7,43 @@
#include <arm_math.h> #include <arm_math.h>
#include <vector> #include <vector>
#include <string>
#define EFFECT_NONE 0
#define EFFECT_CHORUS 1
#define EFFECT_DELAY 2
#define EFFECT_LPF 3
#define EFFECT_DS1 4
#define EFFECT_BIGMUFF 5
#define EFFECT_TALREVERB3 6
#define EFFECT_REVERB 7
#define EFFECT_MVERB 8
#define EFFECT_3BANDEQ 9
#define EFFECT_PHASER 10
#define EFFECT_APHASER 11
class AudioEffect class AudioEffect
{ {
public: public:
AudioEffect(float32_t samplerate); // ID must be unique for each AudioEffect
virtual ~AudioEffect(); static const unsigned ID = 0;
static constexpr const char* NAME = "None";
AudioEffect(float32_t samplerate)
{
this->samplerate = samplerate;
}
void setBypass(bool bypass); virtual ~AudioEffect()
bool getBypass(); {
}
virtual unsigned getId(); void setBypass(bool bypass)
{
this->bypass = bypass;
}
bool getBypass()
{
return this->getId() == AudioEffect::ID ? true : this->bypass;
}
virtual unsigned getId()
{
return AudioEffect::ID;
}
virtual std::string getName()
{
return AudioEffect::NAME;
}
/** /**
* Set default parameters for the FX when is used as Send FX. * Set default parameters for the FX when is used as Send FX.
@ -55,10 +68,49 @@ public:
return 0; return 0;
} }
void setParameters(std::vector<unsigned> params); void setParameters(std::vector<unsigned> params)
std::vector<unsigned> getParameters(); {
void process(const float32_t* inblockL, float32_t* outblockL, uint16_t len); for (size_t i = 0; i < params.size(); i++)
void process(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len); {
this->setParameter(i, params[i]);
}
}
std::vector<unsigned> getParameters()
{
size_t len = this->getParametersSize();
std::vector<unsigned> params;
for (size_t i = 0; i < len; i++)
{
params.push_back(getParameter(i));
}
return params;
}
void process(const float32_t* inblock, float32_t* outblock, uint16_t len)
{
// Mono process
// Dummy buffer for right channel
float32_t dummyBuffer[len];
memset(dummyBuffer, 0, len * sizeof(float32_t));
process(inblock, dummyBuffer, outblock, dummyBuffer, len);
}
void process(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len)
{
if (this->getBypass()) {
if (inblockL != outblockL)
{
memcpy(outblockL, inblockL, len * sizeof(float32_t));
}
if (inblockR != outblockR) {
memcpy(outblockR, inblockR, len * sizeof(float32_t));
}
return;
}
doProcess(inblockL, inblockR, outblockL, outblockR, len);
}
protected: protected:
bool bypass = false; bool bypass = false;
float32_t samplerate; float32_t samplerate;
@ -67,18 +119,10 @@ protected:
{ {
return 0; return 0;
} }
virtual void doProcess(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len);
};
class AudioEffectNone : public AudioEffect virtual void doProcess(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len)
{ {
public: }
AudioEffectNone(float32_t samplerate);
virtual ~AudioEffectNone();
virtual unsigned getId();
protected:
virtual void doProcess(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len);
}; };
#endif // _EFFECT_BASE_H #endif // _EFFECT_BASE_H

@ -74,7 +74,12 @@ AudioEffectBigMuff::~AudioEffectBigMuff()
unsigned AudioEffectBigMuff::getId() unsigned AudioEffectBigMuff::getId()
{ {
return EFFECT_BIGMUFF; return AudioEffectBigMuff::ID;
}
std::string AudioEffectBigMuff::getName()
{
return AudioEffectBigMuff::NAME;
} }
void AudioEffectBigMuff::setParameter(unsigned param, unsigned value) void AudioEffectBigMuff::setParameter(unsigned param, unsigned value)

@ -13,6 +13,10 @@
class AudioEffectBigMuff : public AudioEffect class AudioEffectBigMuff : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 5;
static constexpr const char* NAME = "Big Muff";
static const unsigned TAMANHO_DO_BUFFER = 256; static const unsigned TAMANHO_DO_BUFFER = 256;
static constexpr float32_t INPUT_GAIN = 1; static constexpr float32_t INPUT_GAIN = 1;
static constexpr float32_t OUTPUT_GAIN = 1; static constexpr float32_t OUTPUT_GAIN = 1;
@ -30,6 +34,7 @@ public:
virtual ~AudioEffectBigMuff(); virtual ~AudioEffectBigMuff();
virtual unsigned getId(); virtual unsigned getId();
virtual std::string getName();
virtual void setParameter(unsigned param, unsigned value); virtual void setParameter(unsigned param, unsigned value);
virtual unsigned getParameter(unsigned param); virtual unsigned getParameter(unsigned param);
protected: protected:

@ -25,7 +25,12 @@ AudioEffectChorus::~AudioEffectChorus()
unsigned AudioEffectChorus::getId() unsigned AudioEffectChorus::getId()
{ {
return EFFECT_CHORUS; return AudioEffectChorus::ID;
}
std::string AudioEffectChorus::getName()
{
return AudioEffectChorus::NAME;
} }
void AudioEffectChorus::setParameter(unsigned param, unsigned value) void AudioEffectChorus::setParameter(unsigned param, unsigned value)

@ -13,6 +13,10 @@
class AudioEffectChorus : public AudioEffect class AudioEffectChorus : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 1;
static constexpr const char* NAME = "YKChorus";
enum Param enum Param
{ {
BYPASS, BYPASS,
@ -27,6 +31,7 @@ public:
virtual ~AudioEffectChorus(); virtual ~AudioEffectChorus();
virtual unsigned getId(); virtual unsigned getId();
virtual std::string getName();
virtual void setParameter(unsigned param, unsigned value); virtual void setParameter(unsigned param, unsigned value);
virtual unsigned getParameter(unsigned param); virtual unsigned getParameter(unsigned param);

@ -37,7 +37,12 @@ AudioEffectDelay::~AudioEffectDelay()
unsigned AudioEffectDelay::getId() unsigned AudioEffectDelay::getId()
{ {
return EFFECT_DELAY; return AudioEffectDelay::ID;
}
std::string AudioEffectDelay::getName()
{
return AudioEffectDelay::NAME;
} }
void AudioEffectDelay::initializeSendFX() void AudioEffectDelay::initializeSendFX()

@ -15,6 +15,9 @@
class AudioEffectDelay : public AudioEffect class AudioEffectDelay : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 2;
static constexpr const char* NAME = "Delay";
static const unsigned MAX_DELAY_TIME = 1; static const unsigned MAX_DELAY_TIME = 1;
enum Param enum Param
@ -53,6 +56,7 @@ public:
virtual ~AudioEffectDelay(); virtual ~AudioEffectDelay();
virtual unsigned getId(); virtual unsigned getId();
virtual std::string getName();
virtual void initializeSendFX(); virtual void initializeSendFX();
virtual void setTempo(unsigned tempo); virtual void setTempo(unsigned tempo);

@ -69,7 +69,12 @@ AudioEffectDS1::~AudioEffectDS1()
unsigned AudioEffectDS1::getId() unsigned AudioEffectDS1::getId()
{ {
return EFFECT_DS1; return AudioEffectDS1::ID;
}
std::string AudioEffectDS1::getName()
{
return AudioEffectDS1::NAME;
} }
void AudioEffectDS1::setParameter(unsigned param, unsigned value) void AudioEffectDS1::setParameter(unsigned param, unsigned value)

@ -13,6 +13,9 @@
class AudioEffectDS1 : public AudioEffect class AudioEffectDS1 : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 4;
static constexpr const char* NAME = "DS1";
static const unsigned TAMANHO_DO_BUFFER = 256; static const unsigned TAMANHO_DO_BUFFER = 256;
static constexpr float32_t INPUT_GAIN = 1; static constexpr float32_t INPUT_GAIN = 1;
static constexpr float32_t OUTPUT_GAIN = 1; static constexpr float32_t OUTPUT_GAIN = 1;
@ -30,6 +33,7 @@ public:
virtual ~AudioEffectDS1(); virtual ~AudioEffectDS1();
virtual unsigned getId(); virtual unsigned getId();
virtual std::string getName();
virtual void setParameter(unsigned param, unsigned value); virtual void setParameter(unsigned param, unsigned value);
virtual unsigned getParameter(unsigned param); virtual unsigned getParameter(unsigned param);
protected: protected:

@ -10,6 +10,9 @@
class AudioEffectLPF : public AudioEffect class AudioEffectLPF : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 3;
static constexpr const char* NAME = "LP Filter";
static constexpr float32_t MIN_CUTOFF = 0.00001f; static constexpr float32_t MIN_CUTOFF = 0.00001f;
static constexpr float32_t MAX_CUTOFF = 8000.0f; static constexpr float32_t MAX_CUTOFF = 8000.0f;
static constexpr float32_t MIN_RES = 0.0f; static constexpr float32_t MIN_RES = 0.0f;
@ -51,7 +54,12 @@ public:
virtual unsigned getId() virtual unsigned getId()
{ {
return EFFECT_LPF; return AudioEffectLPF::ID;
}
virtual std::string getName()
{
return AudioEffectLPF::NAME;
} }
virtual void setParameter(unsigned param, unsigned value) virtual void setParameter(unsigned param, unsigned value)

@ -105,11 +105,11 @@ unsigned AudioEffectMVerb::getParameter(unsigned param)
void AudioEffectMVerb::doProcess(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len) 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]; const float* inputs[2];
inputs[0] = inblockL; inputs[0] = inblockL;
inputs[1] = inblockR; inputs[1] = inblockR;
float32_t* outputs[2]; float* outputs[2];
outputs[0] = outblockL; outputs[0] = outblockL;
outputs[1] = outblockR; outputs[1] = outblockR;

@ -14,6 +14,10 @@
class AudioEffectMVerb : public AudioEffect class AudioEffectMVerb : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 8;
static constexpr const char* NAME = "MVerb";
enum Param enum Param
{ {
BYPASS, BYPASS,
@ -34,7 +38,12 @@ public:
virtual unsigned getId() virtual unsigned getId()
{ {
return EFFECT_MVERB; return AudioEffectMVerb::ID;
}
virtual std::string getName()
{
return AudioEffectMVerb::NAME;
} }
virtual void initializeSendFX(); virtual void initializeSendFX();

@ -13,6 +13,10 @@
class AudioEffectPhaser : public AudioEffect class AudioEffectPhaser : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 10;
static constexpr const char* NAME = "Phaser";
enum Param enum Param
{ {
BYPASS, BYPASS,
@ -60,7 +64,12 @@ public:
virtual unsigned getId() virtual unsigned getId()
{ {
return EFFECT_PHASER; return AudioEffectPhaser::ID;
}
virtual std::string getName()
{
return AudioEffectPhaser::NAME;
} }
virtual void initializeSendFX() virtual void initializeSendFX()

@ -60,6 +60,10 @@
class AudioEffectPlateReverb : public AudioEffect class AudioEffectPlateReverb : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 7;
static constexpr const char* NAME = "Reverb";
enum Param enum Param
{ {
BYPASS, BYPASS,
@ -78,7 +82,12 @@ public:
virtual unsigned getId() virtual unsigned getId()
{ {
return EFFECT_REVERB; return AudioEffectPlateReverb::ID;
}
virtual std::string getName()
{
return AudioEffectPlateReverb::NAME;
} }
virtual void initializeSendFX(); virtual void initializeSendFX();

@ -14,6 +14,10 @@
class AudioEffectTalReverb3 : public AudioEffect class AudioEffectTalReverb3 : public AudioEffect
{ {
public: public:
// ID must be unique for each AudioEffect
static const unsigned ID = 6;
static constexpr const char* NAME = "TalRvrb3";
enum Param enum Param
{ {
BYPASS, BYPASS,
@ -34,7 +38,12 @@ public:
virtual unsigned getId() virtual unsigned getId()
{ {
return EFFECT_TALREVERB3; return AudioEffectTalReverb3::ID;
}
virtual std::string getName()
{
return AudioEffectTalReverb3::NAME;
} }
virtual void initializeSendFX(); virtual void initializeSendFX();

@ -19,55 +19,143 @@
#include "effect_audio/effect_phaser.h" #include "effect_audio/effect_phaser.h"
#include "effect_audio/effect_aphaser.h" #include "effect_audio/effect_aphaser.h"
class AudioEffects
{
public:
enum Types
{
NONE = AudioEffect::ID,
CHORUS = AudioEffectChorus::ID,
DELAY = AudioEffectDelay::ID,
LPF = AudioEffectLPF::ID,
DS1 = AudioEffectDS1::ID,
BIGMUFF = AudioEffectBigMuff::ID,
TALREVERB3 = AudioEffectTalReverb3::ID,
REVERB = AudioEffectPlateReverb::ID,
MVERB = AudioEffectMVerb::ID,
EQ3BAND = AudioEffect3BandEQ::ID,
PHASER = AudioEffectPhaser::ID,
APHASER = AudioEffectAPhaser::ID,
UNKNOWN
};
};
inline AudioEffect* newAudioEffect(unsigned type, float32_t samplerate) inline AudioEffect* newAudioEffect(unsigned type, float32_t samplerate)
{ {
switch (type) switch (type)
{ {
case EFFECT_CHORUS: case AudioEffects::Types::CHORUS:
return new AudioEffectChorus(samplerate); return new AudioEffectChorus(samplerate);
case EFFECT_DELAY: case AudioEffects::Types::DELAY:
return new AudioEffectDelay(samplerate); return new AudioEffectDelay(samplerate);
case EFFECT_LPF: case AudioEffects::Types::LPF:
return new AudioEffectLPF(samplerate); return new AudioEffectLPF(samplerate);
case EFFECT_DS1: case AudioEffects::Types::DS1:
return new AudioEffectDS1(samplerate); return new AudioEffectDS1(samplerate);
case EFFECT_BIGMUFF: case AudioEffects::Types::BIGMUFF:
return new AudioEffectBigMuff(samplerate); return new AudioEffectBigMuff(samplerate);
case EFFECT_TALREVERB3: case AudioEffects::Types::TALREVERB3:
return new AudioEffectTalReverb3(samplerate); return new AudioEffectTalReverb3(samplerate);
case EFFECT_REVERB: case AudioEffects::Types::REVERB:
return new AudioEffectPlateReverb(samplerate); return new AudioEffectPlateReverb(samplerate);
case EFFECT_MVERB: case AudioEffects::Types::MVERB:
return new AudioEffectMVerb(samplerate); return new AudioEffectMVerb(samplerate);
case EFFECT_3BANDEQ: case AudioEffects::Types::EQ3BAND:
return new AudioEffect3BandEQ(samplerate); return new AudioEffect3BandEQ(samplerate);
case EFFECT_PHASER: case AudioEffects::Types::PHASER:
return new AudioEffectPhaser(samplerate); return new AudioEffectPhaser(samplerate);
case EFFECT_APHASER: case AudioEffects::Types::APHASER:
return new AudioEffectAPhaser(samplerate); return new AudioEffectAPhaser(samplerate);
case EFFECT_NONE: case AudioEffects::Types::NONE:
default: default:
return new AudioEffectNone(samplerate); return new AudioEffect(samplerate);
} }
} }
inline std::string getFXTypeName(int nValue) inline std::string ToFXType(int nValue)
{ {
switch (nValue) switch (nValue)
{ {
case EFFECT_CHORUS: return "YKChorus"; case AudioEffects::Types::CHORUS:
case EFFECT_DELAY: return "Delay"; return AudioEffectChorus::NAME;
case EFFECT_LPF: return "LP Filter"; case AudioEffects::Types::DELAY:
case EFFECT_DS1: return "DS1"; return AudioEffectDelay::NAME;
case EFFECT_BIGMUFF: return "Big Muff"; case AudioEffects::Types::LPF:
case EFFECT_TALREVERB3: return "TalRvrb3"; return AudioEffectLPF::NAME;
case EFFECT_REVERB: return "Reverb"; case AudioEffects::Types::DS1:
case EFFECT_MVERB: return "MVerb"; return AudioEffectDS1::NAME;
case EFFECT_3BANDEQ: return "3Band EQ"; case AudioEffects::Types::BIGMUFF:
case EFFECT_PHASER: return "Phaser"; return AudioEffectBigMuff::NAME;
case EFFECT_APHASER: return "A Phaser"; case AudioEffects::Types::TALREVERB3:
case EFFECT_NONE: return AudioEffectTalReverb3::NAME;
default: return "None"; case AudioEffects::Types::REVERB:
return AudioEffectPlateReverb::NAME;
case AudioEffects::Types::MVERB:
return AudioEffectMVerb::NAME;
case AudioEffects::Types::EQ3BAND:
return AudioEffect3BandEQ::NAME;
case AudioEffects::Types::PHASER:
return AudioEffectPhaser::NAME;
case AudioEffects::Types::APHASER:
return AudioEffectAPhaser::NAME;
case AudioEffects::Types::NONE:
default:
return AudioEffect::NAME;
}
}
inline std::string ToMix (int nValue)
{
switch (nValue)
{
case 0:
return "Dry";
case 100:
return "Wet";
default:
return std::to_string (nValue);
}
}
inline std::string ToDelayTime (int nValue)
{
if (nValue < (int) (AudioEffectDelay::MAX_DELAY_TIME * 1000)) {
return std::to_string (nValue);
}
switch (nValue - AudioEffectDelay::MAX_DELAY_TIME * 1000)
{
case AudioEffectDelay::SyncTime::T_1_32:
return "1/32";
case AudioEffectDelay::SyncTime::T_1_24:
return "1/24";
case AudioEffectDelay::SyncTime::T_1_16:
return "1/16";
case AudioEffectDelay::SyncTime::T_1_12:
return "1/12";
case AudioEffectDelay::SyncTime::T_3_32:
return "3/32";
case AudioEffectDelay::SyncTime::T_1_8:
return "1/8";
case AudioEffectDelay::SyncTime::T_1_6:
return "1/6";
case AudioEffectDelay::SyncTime::T_3_16:
return "3/16";
case AudioEffectDelay::SyncTime::T_1_4:
return "1/4";
case AudioEffectDelay::SyncTime::T_1_3:
return "1/3";
case AudioEffectDelay::SyncTime::T_3_8:
return "3/8";
case AudioEffectDelay::SyncTime::T_1_2:
return "1/2";
case AudioEffectDelay::SyncTime::T_2_3:
return "2/3";
case AudioEffectDelay::SyncTime::T_3_4:
return "3/4";
case AudioEffectDelay::SyncTime::T_1_1:
default:
return "1/1";
} }
} }

@ -4,11 +4,23 @@
#include "effect_midi/midi_effect_base.h" #include "effect_midi/midi_effect_base.h"
#include "effect_midi/midi_arp.h" #include "effect_midi/midi_arp.h"
class MidiEffects
{
public:
enum Types
{
NONE = MidiEffect::ID,
ARP = MidiArp::ID,
UNKNOWN
};
};
inline MidiEffect* newMidiEffect(unsigned type, float32_t samplerate, CDexedAdapter* synth) inline MidiEffect* newMidiEffect(unsigned type, float32_t samplerate, CDexedAdapter* synth)
{ {
switch (type) switch (type)
{ {
case MidiArp::ID: case MidiEffects::Types::ARP:
return new MidiArp(samplerate, synth); return new MidiArp(samplerate, synth);
default: default:
return new MidiEffect(samplerate, synth); return new MidiEffect(samplerate, synth);
@ -19,9 +31,9 @@ inline std::string getMidiFXTypeName(int type)
{ {
switch (type) switch (type)
{ {
case MidiArp::ID: case MidiEffects::Types::ARP:
return MidiArp::NAME; return MidiArp::NAME;
case MidiEffect::ID: case MidiEffects::Types::NONE:
default: default:
return MidiEffect::NAME; return MidiEffect::NAME;
} }

@ -102,7 +102,7 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
#endif #endif
m_InsertFXSpinLock[i] = new CSpinLock(); m_InsertFXSpinLock[i] = new CSpinLock();
m_InsertFX[i] = new AudioEffectNone(pConfig->GetSampleRate ()); m_InsertFX[i] = new AudioEffect(pConfig->GetSampleRate ());
m_nReverbSend[i] = 0; m_nReverbSend[i] = 0;
m_uchOPMask[i] = 0b111111; // All operators on m_uchOPMask[i] = 0b111111; // All operators on
@ -181,7 +181,7 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
// END setup tgmixer // END setup tgmixer
// BEGIN setup reverb // BEGIN setup reverb
SetParameter (ParameterSendFXType, EFFECT_REVERB); SetParameter (ParameterSendFXType, AudioEffectPlateReverb::ID);
reverb_send_mixer = new AudioStereoMixer<CConfig::ToneGenerators>(pConfig->GetChunkSize()/2); reverb_send_mixer = new AudioStereoMixer<CConfig::ToneGenerators>(pConfig->GetChunkSize()/2);
reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate()); reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate());
SetParameter (ParameterReverbEnable, 1); SetParameter (ParameterReverbEnable, 1);
@ -626,6 +626,12 @@ void CMiniDexed::setInsertFXType (unsigned nType, unsigned nTG)
m_UI.ParameterChanged (); m_UI.ParameterChanged ();
} }
std::string CMiniDexed::getInsertFXName (unsigned nTG)
{
assert (nTG < CConfig::ToneGenerators);
return m_InsertFX[nTG]->getName();
}
void CMiniDexed::setMidiFXType (unsigned nType, unsigned nTG) void CMiniDexed::setMidiFXType (unsigned nType, unsigned nTG)
{ {
assert (nTG < CConfig::ToneGenerators); assert (nTG < CConfig::ToneGenerators);
@ -644,6 +650,12 @@ void CMiniDexed::setMidiFXType (unsigned nType, unsigned nTG)
m_UI.ParameterChanged (); m_UI.ParameterChanged ();
} }
std::string CMiniDexed::getMidiFXName (unsigned nTG)
{
assert (nTG < CConfig::ToneGenerators);
return m_MidiArp[nTG]->getName();
}
void CMiniDexed::setSendFXType (unsigned nType) void CMiniDexed::setSendFXType (unsigned nType)
{ {
m_SendFXSpinLock.Acquire(); m_SendFXSpinLock.Acquire();
@ -659,6 +671,11 @@ void CMiniDexed::setSendFXType (unsigned nType)
m_UI.ParameterChanged (); m_UI.ParameterChanged ();
} }
std::string CMiniDexed::getSendFXName ()
{
return m_SendFX->getName();
}
void CMiniDexed::setSendFXLevel (unsigned nValue) void CMiniDexed::setSendFXLevel (unsigned nValue)
{ {
nValue = constrain((int)nValue, 0, 100); nValue = constrain((int)nValue, 0, 100);

@ -103,8 +103,11 @@ public:
void setAftertouch (uint8_t value, unsigned nTG); void setAftertouch (uint8_t value, unsigned nTG);
void setInsertFXType (unsigned nType, unsigned nTG); void setInsertFXType (unsigned nType, unsigned nTG);
std::string getInsertFXName (unsigned nTG);
void setMidiFXType (unsigned nType, unsigned nTG); void setMidiFXType (unsigned nType, unsigned nTG);
std::string getMidiFXName (unsigned nTG);
void setSendFXType (unsigned nType); void setSendFXType (unsigned nType);
std::string getSendFXName ();
void setSendFXLevel (unsigned nValue); void setSendFXLevel (unsigned nValue);
void SetReverbSend (unsigned nReverbSend, unsigned nTG); // 0 .. 127 void SetReverbSend (unsigned nReverbSend, unsigned nTG); // 0 .. 127

@ -399,7 +399,7 @@ const CUIMenu::TMenuItem CUIMenu::s_SaveMenu[] =
const CUIMenu::TParameter CUIMenu::s_GlobalParameter[CMiniDexed::ParameterUnknown] = const CUIMenu::TParameter CUIMenu::s_GlobalParameter[CMiniDexed::ParameterUnknown] =
{ {
{0, 1, 1, ToOnOff}, // ParameterCompressorEnable {0, 1, 1, ToOnOff}, // ParameterCompressorEnable
{0, 11, 1, ToFXType}, // ParameterSendFXType {0, AudioEffects::Types::UNKNOWN - 1, 1, ToFXType}, // ParameterSendFXType
{0, 100, 1}, // ParameterSendFXLevel {0, 100, 1}, // ParameterSendFXLevel
{0, 1, 1, ToOnOff}, // ParameterReverbEnable {0, 1, 1, ToOnOff}, // ParameterReverbEnable
{0, 99, 1}, // ParameterReverbSize {0, 99, 1}, // ParameterReverbSize
@ -422,8 +422,8 @@ const CUIMenu::TParameter CUIMenu::s_TGParameter[CMiniDexed::TGParameterUnknown]
{0, CSysExFileLoader::VoicesPerBank-1, 1}, // TGParameterProgram {0, CSysExFileLoader::VoicesPerBank-1, 1}, // TGParameterProgram
{0, 127, 8, ToVolume}, // TGParameterVolume {0, 127, 8, ToVolume}, // TGParameterVolume
{0, 127, 8, ToPan}, // TGParameterPan {0, 127, 8, ToPan}, // TGParameterPan
{0, 11, 1, ToFXType}, // TGParameterInsertFXType {0, AudioEffects::Types::UNKNOWN - 1, 1, ToFXType}, // TGParameterInsertFXType
{0, 1, 1, ToMidiFXType}, // TGParameterMidiFXType {0, MidiEffects::Types::UNKNOWN - 1, 1, ToMidiFXType}, // TGParameterMidiFXType
{-99, 99, 1}, // TGParameterMasterTune {-99, 99, 1}, // TGParameterMasterTune
{0, 99, 1}, // TGParameterCutoff {0, 99, 1}, // TGParameterCutoff
{0, 99, 1}, // TGParameterResonance {0, 99, 1}, // TGParameterResonance
@ -1065,13 +1065,13 @@ void CUIMenu::MenuHandlerInsertFX (CUIMenu *pUIMenu, TMenuEvent Event)
string TG ("TG"); string TG ("TG");
TG += to_string (nTG+1); TG += to_string (nTG+1);
// Get current FX type // Get current FX Name
int fxType = pUIMenu->m_pMiniDexed->GetTGParameter(CMiniDexed::TGParameterInsertFXType, nTG); std::string fxName = pUIMenu->m_pMiniDexed->getInsertFXName(nTG);
// Create Paramter with type label // Create Paramter with type label
std::string value; std::string value;
value.append(pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name); value.append(pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name);
value.append(getFXTypeName(fxType)); value.append(fxName);
pUIMenu->m_pUI->DisplayWrite ( pUIMenu->m_pUI->DisplayWrite (
TG.c_str (), TG.c_str (),
@ -1146,15 +1146,15 @@ void CUIMenu::MenuHandlerSendFX (CUIMenu *pUIMenu, TMenuEvent Event)
if (pUIMenu->m_pCurrentMenu) // if this is another menu? if (pUIMenu->m_pCurrentMenu) // if this is another menu?
{ {
// Get current FX type // Get current FX Name
int fxType = pUIMenu->m_pMiniDexed->GetParameter(CMiniDexed::ParameterSendFXType); std::string fxName = pUIMenu->m_pMiniDexed->getSendFXName();
// Create Paramter with type label // Create Paramter with type label
std::string value; std::string value;
value.append(pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name); value.append(pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name);
if (pUIMenu->m_nCurrentSelection < 2) if (pUIMenu->m_nCurrentSelection < 2)
{ {
value.append(getFXTypeName(fxType)); value.append(fxName);
} }
pUIMenu->m_pUI->DisplayWrite ( pUIMenu->m_pUI->DisplayWrite (
@ -1639,9 +1639,11 @@ void CUIMenu::EditInsertFX (CUIMenu *pUIMenu, TMenuEvent Event)
string TG ("TG"); string TG ("TG");
TG += to_string (nTG+1); TG += to_string (nTG+1);
string fxName = pUIMenu->m_pMiniDexed->getInsertFXName(nTG);
pUIMenu->m_pUI->DisplayWrite ( pUIMenu->m_pUI->DisplayWrite (
TG.c_str (), TG.c_str (),
getFXTypeName(nFXType).c_str(), fxName.c_str(),
pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name, pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name,
pUIMenu->m_nCurrentSelection > 0, pUIMenu->m_nCurrentSelection > 0,
!!pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection+1].Name); !!pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection+1].Name);
@ -1776,8 +1778,10 @@ void CUIMenu::EditSendFX (CUIMenu *pUIMenu, TMenuEvent Event)
if (pUIMenu->m_pCurrentMenu) // if this is another menu? if (pUIMenu->m_pCurrentMenu) // if this is another menu?
{ {
string fxName = pUIMenu->m_pMiniDexed->getSendFXName();
pUIMenu->m_pUI->DisplayWrite ( pUIMenu->m_pUI->DisplayWrite (
getFXTypeName(nFXType).c_str(), fxName.c_str(),
"", "",
pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name, pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name,
pUIMenu->m_nCurrentSelection > 0, pUIMenu->m_nCurrentSelection > 0,
@ -2245,65 +2249,6 @@ string CUIMenu::ToPolyMono (int nValue)
} }
} }
string CUIMenu::ToFXType (int nValue)
{
return getFXTypeName(nValue);
}
string CUIMenu::ToMix (int nValue)
{
switch (nValue)
{
case 0:
return "Dry";
case 100:
return "Wet";
default:
return to_string (nValue);
}
}
string CUIMenu::ToDelayTime (int nValue)
{
if (nValue < (int) (AudioEffectDelay::MAX_DELAY_TIME * 1000)) {
return to_string (nValue);
}
switch (nValue - AudioEffectDelay::MAX_DELAY_TIME * 1000)
{
case AudioEffectDelay::SyncTime::T_1_32:
return "1/32";
case AudioEffectDelay::SyncTime::T_1_24:
return "1/24";
case AudioEffectDelay::SyncTime::T_1_16:
return "1/16";
case AudioEffectDelay::SyncTime::T_1_12:
return "1/12";
case AudioEffectDelay::SyncTime::T_3_32:
return "3/32";
case AudioEffectDelay::SyncTime::T_1_8:
return "1/8";
case AudioEffectDelay::SyncTime::T_1_6:
return "1/6";
case AudioEffectDelay::SyncTime::T_3_16:
return "3/16";
case AudioEffectDelay::SyncTime::T_1_4:
return "1/4";
case AudioEffectDelay::SyncTime::T_1_3:
return "1/3";
case AudioEffectDelay::SyncTime::T_3_8:
return "3/8";
case AudioEffectDelay::SyncTime::T_1_2:
return "1/2";
case AudioEffectDelay::SyncTime::T_2_3:
return "2/3";
case AudioEffectDelay::SyncTime::T_3_4:
return "3/4";
case AudioEffectDelay::SyncTime::T_1_1:
default:
return "1/1";
}
}
void CUIMenu::TGShortcutHandler (TMenuEvent Event) void CUIMenu::TGShortcutHandler (TMenuEvent Event)
{ {
assert (m_nCurrentMenuDepth >= 2); assert (m_nCurrentMenuDepth >= 2);
@ -3010,40 +2955,40 @@ CUIMenu::TMenuItem* CUIMenu::getFXMenuItem(unsigned type)
CUIMenu::TMenuItem* menu; CUIMenu::TMenuItem* menu;
switch (type) switch (type)
{ {
case EFFECT_CHORUS: case AudioEffects::Types::CHORUS:
menu = s_FXChorus; menu = s_FXChorus;
break; break;
case EFFECT_DELAY: case AudioEffects::Types::DELAY:
menu = s_FXDelay; menu = s_FXDelay;
break; break;
case EFFECT_LPF: case AudioEffects::Types::LPF:
menu = s_FXLPFilter; menu = s_FXLPFilter;
break; break;
case EFFECT_DS1: case AudioEffects::Types::DS1:
menu = s_FXDS1; menu = s_FXDS1;
break; break;
case EFFECT_BIGMUFF: case AudioEffects::Types::BIGMUFF:
menu = s_FXBigMuff; menu = s_FXBigMuff;
break; break;
case EFFECT_TALREVERB3: case AudioEffects::Types::TALREVERB3:
menu = s_FXTalReverb3; menu = s_FXTalReverb3;
break; break;
case EFFECT_REVERB: case AudioEffects::Types::REVERB:
menu = s_FXReverb; menu = s_FXReverb;
break; break;
case EFFECT_MVERB: case AudioEffects::Types::MVERB:
menu = s_FXMVerb; menu = s_FXMVerb;
break; break;
case EFFECT_3BANDEQ: case AudioEffects::Types::EQ3BAND:
menu = s_FX3BandEQ; menu = s_FX3BandEQ;
break; break;
case EFFECT_PHASER: case AudioEffects::Types::PHASER:
menu = s_FXPhaser; menu = s_FXPhaser;
break; break;
case EFFECT_APHASER: case AudioEffects::Types::APHASER:
menu = s_FXAPhaser; menu = s_FXAPhaser;
break; break;
case EFFECT_NONE: case AudioEffects::Types::NONE:
default: default:
menu = s_FXNone; menu = s_FXNone;
break; break;
@ -3080,37 +3025,37 @@ CUIMenu::TParameter CUIMenu::getFXParameter(unsigned type, unsigned nParam)
TParameter pParam; TParameter pParam;
switch (type) switch (type)
{ {
case EFFECT_CHORUS: case AudioEffects::Types::CHORUS:
pParam = s_TGFXChorusParam[nParam]; pParam = s_TGFXChorusParam[nParam];
break; break;
case EFFECT_DELAY: case AudioEffects::Types::DELAY:
pParam = s_TGFXDelayParam[nParam]; pParam = s_TGFXDelayParam[nParam];
break; break;
case EFFECT_LPF: case AudioEffects::Types::LPF:
pParam = s_TGFXLPFParam[nParam]; pParam = s_TGFXLPFParam[nParam];
break; break;
case EFFECT_DS1: case AudioEffects::Types::DS1:
pParam = s_TGFXDS1Param[nParam]; pParam = s_TGFXDS1Param[nParam];
break; break;
case EFFECT_BIGMUFF: case AudioEffects::Types::BIGMUFF:
pParam = s_TGFXBigMuffParam[nParam]; pParam = s_TGFXBigMuffParam[nParam];
break; break;
case EFFECT_TALREVERB3: case AudioEffects::Types::TALREVERB3:
pParam = s_TGFXTalReverb3Param[nParam]; pParam = s_TGFXTalReverb3Param[nParam];
break; break;
case EFFECT_REVERB: case AudioEffects::Types::REVERB:
pParam = s_TGFXReverbParam[nParam]; pParam = s_TGFXReverbParam[nParam];
break; break;
case EFFECT_MVERB: case AudioEffects::Types::MVERB:
pParam = s_TGFXMVerbParam[nParam]; pParam = s_TGFXMVerbParam[nParam];
break; break;
case EFFECT_3BANDEQ: case AudioEffects::Types::EQ3BAND:
pParam = s_TGFX3BandEQParam[nParam]; pParam = s_TGFX3BandEQParam[nParam];
break; break;
case EFFECT_PHASER: case AudioEffects::Types::PHASER:
pParam = s_TGFXPhaserParam[nParam]; pParam = s_TGFXPhaserParam[nParam];
break; break;
case EFFECT_APHASER: case AudioEffects::Types::APHASER:
pParam = s_TGFXAPhaserParam[nParam]; pParam = s_TGFXAPhaserParam[nParam];
break; break;
default: default:
@ -3124,10 +3069,10 @@ CUIMenu::TMenuItem* CUIMenu::getMidiFXMenuItem(unsigned type)
CUIMenu::TMenuItem* menu; CUIMenu::TMenuItem* menu;
switch (type) switch (type)
{ {
case MidiArp::ID: case MidiEffects::Types::ARP:
menu = s_MidiFXArp; menu = s_MidiFXArp;
break; break;
case MidiEffect::ID: case MidiEffects::Types::NONE:
default: default:
menu = s_MidiFXNone; menu = s_MidiFXNone;
break; break;
@ -3140,7 +3085,7 @@ CUIMenu::TParameter CUIMenu::getMidiFXParameter(unsigned type, unsigned nParam)
TParameter pParam; TParameter pParam;
switch (type) switch (type)
{ {
case MidiArp::ID: case MidiEffects::Types::ARP:
pParam = s_TGMidiFXArpParam[nParam]; pParam = s_TGMidiFXArpParam[nParam];
default: default:
break; break;

@ -133,9 +133,6 @@ private:
static std::string ToPortaMode (int nValue); static std::string ToPortaMode (int nValue);
static std::string ToPortaGlissando (int nValue); static std::string ToPortaGlissando (int nValue);
static std::string ToPolyMono (int nValue); static std::string ToPolyMono (int nValue);
static std::string ToFXType (int nValue);
static std::string ToMix (int nValue);
static std::string ToDelayTime (int nValue);
void TGShortcutHandler (TMenuEvent Event); void TGShortcutHandler (TMenuEvent Event);
void OPShortcutHandler (TMenuEvent Event); void OPShortcutHandler (TMenuEvent Event);

Loading…
Cancel
Save