diff --git a/src/Makefile b/src/Makefile index fc914ad..66487bd 100644 --- a/src/Makefile +++ b/src/Makefile @@ -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 \ diff --git a/src/effect_audio/effect_3bandeq.h b/src/effect_audio/effect_3bandeq.h index 2d604b3..954b668 100644 --- a/src/effect_audio/effect_3bandeq.h +++ b/src/effect_audio/effect_3bandeq.h @@ -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) diff --git a/src/effect_audio/effect_aphaser.h b/src/effect_audio/effect_aphaser.h index 0cd8f1f..764a882 100644 --- a/src/effect_audio/effect_aphaser.h +++ b/src/effect_audio/effect_aphaser.h @@ -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() diff --git a/src/effect_audio/effect_base.cpp b/src/effect_audio/effect_base.cpp deleted file mode 100644 index d034f88..0000000 --- a/src/effect_audio/effect_base.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Base AudioEffect interface - * Javier Nonis (https://github.com/jnonis) - 2024 - */ -#include -#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 params) -{ - for (size_t i = 0; i < params.size(); i++) - { - this->setParameter(i, params[i]); - } -} - -std::vector AudioEffect::getParameters() -{ - size_t len = this->getParametersSize(); - std::vector 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; -} \ No newline at end of file diff --git a/src/effect_audio/effect_base.h b/src/effect_audio/effect_base.h index d92cce3..c49295a 100644 --- a/src/effect_audio/effect_base.h +++ b/src/effect_audio/effect_base.h @@ -7,30 +7,43 @@ #include #include - -#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 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 params); - std::vector 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 params) + { + for (size_t i = 0; i < params.size(); i++) + { + this->setParameter(i, params[i]); + } + } + + std::vector getParameters() + { + size_t len = this->getParametersSize(); + std::vector 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 \ No newline at end of file +#endif // _EFFECT_BASE_H diff --git a/src/effect_audio/effect_bigmuff.cpp b/src/effect_audio/effect_bigmuff.cpp index 090274d..199e5d8 100644 --- a/src/effect_audio/effect_bigmuff.cpp +++ b/src/effect_audio/effect_bigmuff.cpp @@ -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) diff --git a/src/effect_audio/effect_bigmuff.h b/src/effect_audio/effect_bigmuff.h index 6ebae9d..2f6507b 100644 --- a/src/effect_audio/effect_bigmuff.h +++ b/src/effect_audio/effect_bigmuff.h @@ -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: diff --git a/src/effect_audio/effect_chorus.cpp b/src/effect_audio/effect_chorus.cpp index aa6f13f..cc162e1 100644 --- a/src/effect_audio/effect_chorus.cpp +++ b/src/effect_audio/effect_chorus.cpp @@ -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) diff --git a/src/effect_audio/effect_chorus.h b/src/effect_audio/effect_chorus.h index c03a6ab..551fe2b 100644 --- a/src/effect_audio/effect_chorus.h +++ b/src/effect_audio/effect_chorus.h @@ -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); diff --git a/src/effect_audio/effect_delay.cpp b/src/effect_audio/effect_delay.cpp index 9088aac..fbcb60c 100644 --- a/src/effect_audio/effect_delay.cpp +++ b/src/effect_audio/effect_delay.cpp @@ -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() diff --git a/src/effect_audio/effect_delay.h b/src/effect_audio/effect_delay.h index ec72475..76f5883 100644 --- a/src/effect_audio/effect_delay.h +++ b/src/effect_audio/effect_delay.h @@ -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); diff --git a/src/effect_audio/effect_ds1.cpp b/src/effect_audio/effect_ds1.cpp index 996918f..f17b5e1 100644 --- a/src/effect_audio/effect_ds1.cpp +++ b/src/effect_audio/effect_ds1.cpp @@ -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) diff --git a/src/effect_audio/effect_ds1.h b/src/effect_audio/effect_ds1.h index 173c767..501ebad 100644 --- a/src/effect_audio/effect_ds1.h +++ b/src/effect_audio/effect_ds1.h @@ -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: diff --git a/src/effect_audio/effect_lpf.h b/src/effect_audio/effect_lpf.h index 984afd3..53c8090 100644 --- a/src/effect_audio/effect_lpf.h +++ b/src/effect_audio/effect_lpf.h @@ -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) diff --git a/src/effect_audio/effect_mverb.cpp b/src/effect_audio/effect_mverb.cpp index 7a8eafd..0c50d9a 100644 --- a/src/effect_audio/effect_mverb.cpp +++ b/src/effect_audio/effect_mverb.cpp @@ -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; diff --git a/src/effect_audio/effect_mverb.h b/src/effect_audio/effect_mverb.h index 0f20e8b..c6e025b 100644 --- a/src/effect_audio/effect_mverb.h +++ b/src/effect_audio/effect_mverb.h @@ -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(); diff --git a/src/effect_audio/effect_phaser.h b/src/effect_audio/effect_phaser.h index d2722dc..7d8227b 100644 --- a/src/effect_audio/effect_phaser.h +++ b/src/effect_audio/effect_phaser.h @@ -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() diff --git a/src/effect_audio/effect_platervbstereo.h b/src/effect_audio/effect_platervbstereo.h index cddd5c5..b3539c3 100644 --- a/src/effect_audio/effect_platervbstereo.h +++ b/src/effect_audio/effect_platervbstereo.h @@ -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(); diff --git a/src/effect_audio/effect_talreverb3.h b/src/effect_audio/effect_talreverb3.h index 0504ceb..55b420e 100644 --- a/src/effect_audio/effect_talreverb3.h +++ b/src/effect_audio/effect_talreverb3.h @@ -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(); diff --git a/src/effects.h b/src/effects.h index 223a2bb..56b5691 100644 --- a/src/effects.h +++ b/src/effects.h @@ -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"; } } diff --git a/src/midi_effects.h b/src/midi_effects.h index 1aa89f4..745ece4 100644 --- a/src/midi_effects.h +++ b/src/midi_effects.h @@ -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; } diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 6c2816a..4fb12d9 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -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(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); diff --git a/src/minidexed.h b/src/minidexed.h index 29ccb8b..f5da64a 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -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 diff --git a/src/uimenu.cpp b/src/uimenu.cpp index a88c6b7..4f4c9b1 100644 --- a/src/uimenu.cpp +++ b/src/uimenu.cpp @@ -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; diff --git a/src/uimenu.h b/src/uimenu.h index c210f92..f7714dd 100644 --- a/src/uimenu.h +++ b/src/uimenu.h @@ -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);