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. 112
      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. 5
      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 \
sysexfileloader.o performanceconfig.o perftimer.o \
uibuttons.o midipin.o effect_compressor.o \
effect_audio/effect_base.o \
effect_audio/effect_chorus.o \
effect_audio/effect_delay.o \
effect_audio/effect_platervbstereo.o \

@ -13,6 +13,10 @@
class AudioEffect3BandEQ : public AudioEffect
{
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 kDC_ADD = 1e-30f;
static constexpr float kPI = 3.141592654f;
@ -64,7 +68,12 @@ public:
virtual unsigned getId()
{
return EFFECT_3BANDEQ;
return AudioEffect3BandEQ::ID;
}
virtual std::string getName()
{
return AudioEffect3BandEQ::NAME;
}
virtual void setParameter(unsigned param, unsigned value)

@ -13,6 +13,10 @@
class AudioEffectAPhaser : public AudioEffect
{
public:
// ID must be unique for each AudioEffect
static const unsigned ID = 11;
static constexpr const char* NAME = "A Phaser";
enum Param
{
BYPASS,
@ -60,7 +64,12 @@ public:
virtual unsigned getId()
{
return EFFECT_APHASER;
return AudioEffectAPhaser::ID;
}
virtual std::string getName()
{
return AudioEffectAPhaser::NAME;
}
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 <vector>
#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
#include <string>
class AudioEffect
{
public:
AudioEffect(float32_t samplerate);
virtual ~AudioEffect();
// ID must be unique for each AudioEffect
static const unsigned ID = 0;
static constexpr const char* NAME = "None";
AudioEffect(float32_t samplerate)
{
this->samplerate = samplerate;
}
virtual ~AudioEffect()
{
}
void setBypass(bool bypass)
{
this->bypass = bypass;
}
void setBypass(bool bypass);
bool getBypass();
bool getBypass()
{
return this->getId() == AudioEffect::ID ? true : this->bypass;
}
virtual unsigned getId();
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.
@ -55,10 +68,49 @@ public:
return 0;
}
void setParameters(std::vector<unsigned> params);
std::vector<unsigned> getParameters();
void process(const float32_t* inblockL, float32_t* outblockL, uint16_t len);
void process(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len);
void setParameters(std::vector<unsigned> params)
{
for (size_t i = 0; i < params.size(); i++)
{
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:
bool bypass = false;
float32_t samplerate;
@ -67,18 +119,10 @@ protected:
{
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
{
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);
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()
{
return EFFECT_BIGMUFF;
return AudioEffectBigMuff::ID;
}
std::string AudioEffectBigMuff::getName()
{
return AudioEffectBigMuff::NAME;
}
void AudioEffectBigMuff::setParameter(unsigned param, unsigned value)

@ -13,6 +13,10 @@
class AudioEffectBigMuff : public AudioEffect
{
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 constexpr float32_t INPUT_GAIN = 1;
static constexpr float32_t OUTPUT_GAIN = 1;
@ -30,6 +34,7 @@ public:
virtual ~AudioEffectBigMuff();
virtual unsigned getId();
virtual std::string getName();
virtual void setParameter(unsigned param, unsigned value);
virtual unsigned getParameter(unsigned param);
protected:

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

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

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

@ -15,6 +15,9 @@
class AudioEffectDelay : public AudioEffect
{
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;
enum Param
@ -53,6 +56,7 @@ public:
virtual ~AudioEffectDelay();
virtual unsigned getId();
virtual std::string getName();
virtual void initializeSendFX();
virtual void setTempo(unsigned tempo);

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

@ -13,6 +13,9 @@
class AudioEffectDS1 : public AudioEffect
{
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 constexpr float32_t INPUT_GAIN = 1;
static constexpr float32_t OUTPUT_GAIN = 1;
@ -30,6 +33,7 @@ public:
virtual ~AudioEffectDS1();
virtual unsigned getId();
virtual std::string getName();
virtual void setParameter(unsigned param, unsigned value);
virtual unsigned getParameter(unsigned param);
protected:

@ -10,6 +10,9 @@
class AudioEffectLPF : public AudioEffect
{
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 MAX_CUTOFF = 8000.0f;
static constexpr float32_t MIN_RES = 0.0f;
@ -51,9 +54,14 @@ public:
virtual unsigned getId()
{
return EFFECT_LPF;
return AudioEffectLPF::ID;
}
virtual std::string getName()
{
return AudioEffectLPF::NAME;
}
virtual void setParameter(unsigned param, unsigned value)
{
switch (param)

@ -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)
{
const float32_t* inputs[2];
const float* inputs[2];
inputs[0] = inblockL;
inputs[1] = inblockR;
float32_t* outputs[2];
float* outputs[2];
outputs[0] = outblockL;
outputs[1] = outblockR;

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

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

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

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

@ -19,55 +19,143 @@
#include "effect_audio/effect_phaser.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)
{
switch (type)
{
case EFFECT_CHORUS:
case AudioEffects::Types::CHORUS:
return new AudioEffectChorus(samplerate);
case EFFECT_DELAY:
case AudioEffects::Types::DELAY:
return new AudioEffectDelay(samplerate);
case EFFECT_LPF:
case AudioEffects::Types::LPF:
return new AudioEffectLPF(samplerate);
case EFFECT_DS1:
case AudioEffects::Types::DS1:
return new AudioEffectDS1(samplerate);
case EFFECT_BIGMUFF:
case AudioEffects::Types::BIGMUFF:
return new AudioEffectBigMuff(samplerate);
case EFFECT_TALREVERB3:
case AudioEffects::Types::TALREVERB3:
return new AudioEffectTalReverb3(samplerate);
case EFFECT_REVERB:
case AudioEffects::Types::REVERB:
return new AudioEffectPlateReverb(samplerate);
case EFFECT_MVERB:
case AudioEffects::Types::MVERB:
return new AudioEffectMVerb(samplerate);
case EFFECT_3BANDEQ:
case AudioEffects::Types::EQ3BAND:
return new AudioEffect3BandEQ(samplerate);
case EFFECT_PHASER:
case AudioEffects::Types::PHASER:
return new AudioEffectPhaser(samplerate);
case EFFECT_APHASER:
case AudioEffects::Types::APHASER:
return new AudioEffectAPhaser(samplerate);
case EFFECT_NONE:
case AudioEffects::Types::NONE:
default:
return new AudioEffectNone(samplerate);
return new AudioEffect(samplerate);
}
}
inline std::string getFXTypeName(int nValue)
inline std::string ToFXType(int nValue)
{
switch (nValue)
{
case EFFECT_CHORUS: return "YKChorus";
case EFFECT_DELAY: return "Delay";
case EFFECT_LPF: return "LP Filter";
case EFFECT_DS1: return "DS1";
case EFFECT_BIGMUFF: return "Big Muff";
case EFFECT_TALREVERB3: return "TalRvrb3";
case EFFECT_REVERB: return "Reverb";
case EFFECT_MVERB: return "MVerb";
case EFFECT_3BANDEQ: return "3Band EQ";
case EFFECT_PHASER: return "Phaser";
case EFFECT_APHASER: return "A Phaser";
case EFFECT_NONE:
default: return "None";
case AudioEffects::Types::CHORUS:
return AudioEffectChorus::NAME;
case AudioEffects::Types::DELAY:
return AudioEffectDelay::NAME;
case AudioEffects::Types::LPF:
return AudioEffectLPF::NAME;
case AudioEffects::Types::DS1:
return AudioEffectDS1::NAME;
case AudioEffects::Types::BIGMUFF:
return AudioEffectBigMuff::NAME;
case AudioEffects::Types::TALREVERB3:
return AudioEffectTalReverb3::NAME;
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_arp.h"
class MidiEffects
{
public:
enum Types
{
NONE = MidiEffect::ID,
ARP = MidiArp::ID,
UNKNOWN
};
};
inline MidiEffect* newMidiEffect(unsigned type, float32_t samplerate, CDexedAdapter* synth)
{
switch (type)
{
case MidiArp::ID:
case MidiEffects::Types::ARP:
return new MidiArp(samplerate, synth);
default:
return new MidiEffect(samplerate, synth);
@ -19,9 +31,9 @@ inline std::string getMidiFXTypeName(int type)
{
switch (type)
{
case MidiArp::ID:
case MidiEffects::Types::ARP:
return MidiArp::NAME;
case MidiEffect::ID:
case MidiEffects::Types::NONE:
default:
return MidiEffect::NAME;
}

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

@ -103,8 +103,11 @@ public:
void setAftertouch (uint8_t value, unsigned nTG);
void setInsertFXType (unsigned nType, unsigned nTG);
std::string getInsertFXName (unsigned nTG);
void setMidiFXType (unsigned nType, unsigned nTG);
std::string getMidiFXName (unsigned nTG);
void setSendFXType (unsigned nType);
std::string getSendFXName ();
void setSendFXLevel (unsigned nValue);
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] =
{
{0, 1, 1, ToOnOff}, // ParameterCompressorEnable
{0, 11, 1, ToFXType}, // ParameterSendFXType
{0, AudioEffects::Types::UNKNOWN - 1, 1, ToFXType}, // ParameterSendFXType
{0, 100, 1}, // ParameterSendFXLevel
{0, 1, 1, ToOnOff}, // ParameterReverbEnable
{0, 99, 1}, // ParameterReverbSize
@ -422,8 +422,8 @@ const CUIMenu::TParameter CUIMenu::s_TGParameter[CMiniDexed::TGParameterUnknown]
{0, CSysExFileLoader::VoicesPerBank-1, 1}, // TGParameterProgram
{0, 127, 8, ToVolume}, // TGParameterVolume
{0, 127, 8, ToPan}, // TGParameterPan
{0, 11, 1, ToFXType}, // TGParameterInsertFXType
{0, 1, 1, ToMidiFXType}, // TGParameterMidiFXType
{0, AudioEffects::Types::UNKNOWN - 1, 1, ToFXType}, // TGParameterInsertFXType
{0, MidiEffects::Types::UNKNOWN - 1, 1, ToMidiFXType}, // TGParameterMidiFXType
{-99, 99, 1}, // TGParameterMasterTune
{0, 99, 1}, // TGParameterCutoff
{0, 99, 1}, // TGParameterResonance
@ -1065,13 +1065,13 @@ void CUIMenu::MenuHandlerInsertFX (CUIMenu *pUIMenu, TMenuEvent Event)
string TG ("TG");
TG += to_string (nTG+1);
// Get current FX type
int fxType = pUIMenu->m_pMiniDexed->GetTGParameter(CMiniDexed::TGParameterInsertFXType, nTG);
// Get current FX Name
std::string fxName = pUIMenu->m_pMiniDexed->getInsertFXName(nTG);
// Create Paramter with type label
std::string value;
value.append(pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name);
value.append(getFXTypeName(fxType));
value.append(fxName);
pUIMenu->m_pUI->DisplayWrite (
TG.c_str (),
@ -1146,15 +1146,15 @@ void CUIMenu::MenuHandlerSendFX (CUIMenu *pUIMenu, TMenuEvent Event)
if (pUIMenu->m_pCurrentMenu) // if this is another menu?
{
// Get current FX type
int fxType = pUIMenu->m_pMiniDexed->GetParameter(CMiniDexed::ParameterSendFXType);
// Get current FX Name
std::string fxName = pUIMenu->m_pMiniDexed->getSendFXName();
// Create Paramter with type label
std::string value;
value.append(pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name);
if (pUIMenu->m_nCurrentSelection < 2)
{
value.append(getFXTypeName(fxType));
value.append(fxName);
}
pUIMenu->m_pUI->DisplayWrite (
@ -1638,10 +1638,12 @@ void CUIMenu::EditInsertFX (CUIMenu *pUIMenu, TMenuEvent Event)
{
string TG ("TG");
TG += to_string (nTG+1);
string fxName = pUIMenu->m_pMiniDexed->getInsertFXName(nTG);
pUIMenu->m_pUI->DisplayWrite (
TG.c_str (),
getFXTypeName(nFXType).c_str(),
fxName.c_str(),
pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name,
pUIMenu->m_nCurrentSelection > 0,
!!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?
{
string fxName = pUIMenu->m_pMiniDexed->getSendFXName();
pUIMenu->m_pUI->DisplayWrite (
getFXTypeName(nFXType).c_str(),
fxName.c_str(),
"",
pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name,
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)
{
assert (m_nCurrentMenuDepth >= 2);
@ -3010,40 +2955,40 @@ CUIMenu::TMenuItem* CUIMenu::getFXMenuItem(unsigned type)
CUIMenu::TMenuItem* menu;
switch (type)
{
case EFFECT_CHORUS:
case AudioEffects::Types::CHORUS:
menu = s_FXChorus;
break;
case EFFECT_DELAY:
case AudioEffects::Types::DELAY:
menu = s_FXDelay;
break;
case EFFECT_LPF:
case AudioEffects::Types::LPF:
menu = s_FXLPFilter;
break;
case EFFECT_DS1:
case AudioEffects::Types::DS1:
menu = s_FXDS1;
break;
case EFFECT_BIGMUFF:
case AudioEffects::Types::BIGMUFF:
menu = s_FXBigMuff;
break;
case EFFECT_TALREVERB3:
case AudioEffects::Types::TALREVERB3:
menu = s_FXTalReverb3;
break;
case EFFECT_REVERB:
case AudioEffects::Types::REVERB:
menu = s_FXReverb;
break;
case EFFECT_MVERB:
case AudioEffects::Types::MVERB:
menu = s_FXMVerb;
break;
case EFFECT_3BANDEQ:
case AudioEffects::Types::EQ3BAND:
menu = s_FX3BandEQ;
break;
case EFFECT_PHASER:
case AudioEffects::Types::PHASER:
menu = s_FXPhaser;
break;
case EFFECT_APHASER:
case AudioEffects::Types::APHASER:
menu = s_FXAPhaser;
break;
case EFFECT_NONE:
case AudioEffects::Types::NONE:
default:
menu = s_FXNone;
break;
@ -3080,37 +3025,37 @@ CUIMenu::TParameter CUIMenu::getFXParameter(unsigned type, unsigned nParam)
TParameter pParam;
switch (type)
{
case EFFECT_CHORUS:
case AudioEffects::Types::CHORUS:
pParam = s_TGFXChorusParam[nParam];
break;
case EFFECT_DELAY:
case AudioEffects::Types::DELAY:
pParam = s_TGFXDelayParam[nParam];
break;
case EFFECT_LPF:
case AudioEffects::Types::LPF:
pParam = s_TGFXLPFParam[nParam];
break;
case EFFECT_DS1:
case AudioEffects::Types::DS1:
pParam = s_TGFXDS1Param[nParam];
break;
case EFFECT_BIGMUFF:
case AudioEffects::Types::BIGMUFF:
pParam = s_TGFXBigMuffParam[nParam];
break;
case EFFECT_TALREVERB3:
case AudioEffects::Types::TALREVERB3:
pParam = s_TGFXTalReverb3Param[nParam];
break;
case EFFECT_REVERB:
case AudioEffects::Types::REVERB:
pParam = s_TGFXReverbParam[nParam];
break;
case EFFECT_MVERB:
case AudioEffects::Types::MVERB:
pParam = s_TGFXMVerbParam[nParam];
break;
case EFFECT_3BANDEQ:
case AudioEffects::Types::EQ3BAND:
pParam = s_TGFX3BandEQParam[nParam];
break;
case EFFECT_PHASER:
case AudioEffects::Types::PHASER:
pParam = s_TGFXPhaserParam[nParam];
break;
case EFFECT_APHASER:
case AudioEffects::Types::APHASER:
pParam = s_TGFXAPhaserParam[nParam];
break;
default:
@ -3124,10 +3069,10 @@ CUIMenu::TMenuItem* CUIMenu::getMidiFXMenuItem(unsigned type)
CUIMenu::TMenuItem* menu;
switch (type)
{
case MidiArp::ID:
case MidiEffects::Types::ARP:
menu = s_MidiFXArp;
break;
case MidiEffect::ID:
case MidiEffects::Types::NONE:
default:
menu = s_MidiFXNone;
break;
@ -3140,7 +3085,7 @@ CUIMenu::TParameter CUIMenu::getMidiFXParameter(unsigned type, unsigned nParam)
TParameter pParam;
switch (type)
{
case MidiArp::ID:
case MidiEffects::Types::ARP:
pParam = s_TGMidiFXArpParam[nParam];
default:
break;

@ -133,10 +133,7 @@ private:
static std::string ToPortaMode (int nValue);
static std::string ToPortaGlissando (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 OPShortcutHandler (TMenuEvent Event);

Loading…
Cancel
Save