From 938b429127f882865dead648a6cda2e976cec106 Mon Sep 17 00:00:00 2001 From: Rene Stange Date: Sun, 3 Apr 2022 17:54:02 +0200 Subject: [PATCH] uimenu: Add "Reverb" sub-menu * Map reverb float parameters to range 0 .. 99 * minidexed: Add global (non-TG) parameters * minidexed: Protect reverb module with spin lock --- src/minidexed.cpp | 48 +++++++++++++++++++++---- src/minidexed.h | 18 ++++++++++ src/uimenu.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++++++ src/uimenu.h | 4 +++ 4 files changed, 156 insertions(+), 6 deletions(-) diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 0d83697..8e0e86d 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -115,12 +115,12 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, // BEGIN setup reverb reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate()); - reverb->size(0.7); - reverb->hidamp(0.5); - reverb->lodamp(0.5); - reverb->lowpass(0.3); - reverb->diffusion(0.2); - reverb->send(0.8); + SetParameter (ParameterReverbSize, 70); + SetParameter (ParameterReverbHighDamp, 50); + SetParameter (ParameterReverbLowDamp, 50); + SetParameter (ParameterReverbLowPass, 30); + SetParameter (ParameterReverbDiffusion, 20); + SetParameter (ParameterReverbSend, 80); // END setup reverb }; @@ -484,6 +484,40 @@ void CMiniDexed::ControllersRefresh (unsigned nTG) m_pTG[nTG]->ControllersRefresh (); } +void CMiniDexed::SetParameter (TParameter Parameter, int nValue) +{ + assert (reverb); + + assert (Parameter < ParameterUnknown); + m_nParameter[Parameter] = nValue; + + float fValue = nValue / 99.0; + + m_ReverbSpinLock.Acquire (); + + switch (Parameter) + { + case ParameterReverbSize: reverb->size (fValue); break; + case ParameterReverbHighDamp: reverb->hidamp (fValue); break; + case ParameterReverbLowDamp: reverb->lodamp (fValue); break; + case ParameterReverbLowPass: reverb->lowpass (fValue); break; + case ParameterReverbDiffusion: reverb->diffusion (fValue); break; + case ParameterReverbSend: reverb->send (fValue); break; + + default: + assert (0); + break; + } + + m_ReverbSpinLock.Release (); +} + +int CMiniDexed::GetParameter (TParameter Parameter) +{ + assert (Parameter < ParameterUnknown); + return m_nParameter[Parameter]; +} + void CMiniDexed::SetTGParameter (TTGParameter Parameter, int nValue, unsigned nTG) { assert (nTG < CConfig::ToneGenerators); @@ -683,7 +717,9 @@ void CMiniDexed::ProcessSound (void) } // BEGIN adding reverb + m_ReverbSpinLock.Acquire (); reverb->doReverb(nFrames,SampleBuffer); + m_ReverbSpinLock.Release (); // END adding reverb if (m_pSoundDevice->Write (SampleBuffer, sizeof SampleBuffer) != (int) sizeof SampleBuffer) diff --git a/src/minidexed.h b/src/minidexed.h index 56d848e..2f991f0 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -38,6 +38,7 @@ #include #include #include +#include #include "effect_platervbstereo.h" class CMiniDexed @@ -74,6 +75,20 @@ public: void setPitchbend (int16_t value, unsigned nTG); void ControllersRefresh (unsigned nTG); + enum TParameter + { + ParameterReverbSize, + ParameterReverbHighDamp, + ParameterReverbLowDamp, + ParameterReverbLowPass, + ParameterReverbDiffusion, + ParameterReverbSend, + ParameterUnknown + }; + + void SetParameter (TParameter Parameter, int nValue); + int GetParameter (TParameter Parameter); + enum TTGParameter { TGParameterVoiceBank, @@ -114,6 +129,8 @@ private: private: CConfig *m_pConfig; + int m_nParameter[ParameterUnknown]; // global (non-TG) parameters + CDexedAdapter *m_pTG[CConfig::ToneGenerators]; unsigned m_nVoiceBankID[CConfig::ToneGenerators]; @@ -151,6 +168,7 @@ private: bool m_bProfileEnabled; AudioEffectPlateReverb* reverb; + CSpinLock m_ReverbSpinLock; }; #endif diff --git a/src/uimenu.cpp b/src/uimenu.cpp index 0f3ab2f..dceb7b2 100644 --- a/src/uimenu.cpp +++ b/src/uimenu.cpp @@ -48,6 +48,7 @@ const CUIMenu::TMenuItem CUIMenu::s_MainMenu[] = {"TG6", MenuHandler, s_TGMenu, 5}, {"TG7", MenuHandler, s_TGMenu, 6}, {"TG8", MenuHandler, s_TGMenu, 7}, + {"Reverb", MenuHandler, s_ReverbMenu}, #endif {0} }; @@ -66,6 +67,21 @@ const CUIMenu::TMenuItem CUIMenu::s_TGMenu[] = {0} }; +#ifdef ARM_ALLOW_MULTI_CORE + +const CUIMenu::TMenuItem CUIMenu::s_ReverbMenu[] = +{ + {"Size", EditGlobalParameter, 0, CMiniDexed::ParameterReverbSize}, + {"High damp", EditGlobalParameter, 0, CMiniDexed::ParameterReverbHighDamp}, + {"Low damp", EditGlobalParameter, 0, CMiniDexed::ParameterReverbLowDamp}, + {"Low pass", EditGlobalParameter, 0, CMiniDexed::ParameterReverbLowPass}, + {"Diffusion", EditGlobalParameter, 0, CMiniDexed::ParameterReverbDiffusion}, + {"Send", EditGlobalParameter, 0, CMiniDexed::ParameterReverbSend}, + {0} +}; + +#endif + const CUIMenu::TMenuItem CUIMenu::s_EditVoiceMenu[] = { {"OP1", MenuHandler, s_OperatorMenu, 0}, @@ -122,6 +138,17 @@ const CUIMenu::TMenuItem CUIMenu::s_OperatorMenu[] = {0} }; +// must match CMiniDexed::TParameter +const CUIMenu::TParameter CUIMenu::s_GlobalParameter[CMiniDexed::TGParameterUnknown] = +{ + {0, 99, 1}, // ParameterReverbSize + {0, 99, 1}, // ParameterReverbHighDamp + {0, 99, 1}, // ParameterReverbLowDamp + {0, 99, 1}, // ParameterReverbLowPass + {0, 99, 1}, // ParameterReverbDiffusion + {0, 99, 1}, // ParameterReverbSend +}; + // must match CMiniDexed::TTGParameter const CUIMenu::TParameter CUIMenu::s_TGParameter[CMiniDexed::TGParameterUnknown] = { @@ -308,6 +335,52 @@ void CUIMenu::MenuHandler (CUIMenu *pUIMenu, TMenuEvent Event) } } +void CUIMenu::EditGlobalParameter (CUIMenu *pUIMenu, TMenuEvent Event) +{ + CMiniDexed::TParameter Param = (CMiniDexed::TParameter) pUIMenu->m_nCurrentParameter; + const TParameter &rParam = s_GlobalParameter[Param]; + + int nValue = pUIMenu->m_pMiniDexed->GetParameter (Param); + + switch (Event) + { + case MenuEventUpdate: + break; + + case MenuEventStepDown: + nValue -= rParam.Increment; + if (nValue < rParam.Minimum) + { + nValue = rParam.Minimum; + } + pUIMenu->m_pMiniDexed->SetParameter (Param, nValue); + break; + + case MenuEventStepUp: + nValue += rParam.Increment; + if (nValue > rParam.Maximum) + { + nValue = rParam.Maximum; + } + pUIMenu->m_pMiniDexed->SetParameter (Param, nValue); + break; + + default: + return; + } + + const char *pMenuName = + pUIMenu->m_MenuStackParent[pUIMenu->m_nCurrentMenuDepth-1] + [pUIMenu->m_nMenuStackItem[pUIMenu->m_nCurrentMenuDepth-1]].Name; + + string Value = GetGlobalValueString (Param, pUIMenu->m_pMiniDexed->GetParameter (Param)); + + pUIMenu->m_pUI->DisplayWrite (pMenuName, + pUIMenu->m_pParentMenu[pUIMenu->m_nCurrentMenuItem].Name, + Value.c_str (), + nValue > rParam.Minimum, nValue < rParam.Maximum); +} + void CUIMenu::EditVoiceBankNumber (CUIMenu *pUIMenu, TMenuEvent Event) { unsigned nTG = pUIMenu->m_nMenuStackParameter[pUIMenu->m_nCurrentMenuDepth-1]; @@ -537,6 +610,25 @@ void CUIMenu::EditOPParameter (CUIMenu *pUIMenu, TMenuEvent Event) nValue > rParam.Minimum, nValue < rParam.Maximum); } +string CUIMenu::GetGlobalValueString (unsigned nParameter, int nValue) +{ + string Result; + + assert (nParameter < sizeof CUIMenu::s_GlobalParameter / sizeof CUIMenu::s_GlobalParameter[0]); + + CUIMenu::TToString *pToString = CUIMenu::s_GlobalParameter[nParameter].ToString; + if (pToString) + { + Result = (*pToString) (nValue); + } + else + { + Result = to_string (nValue); + } + + return Result; +} + string CUIMenu::GetTGValueString (unsigned nTGParameter, int nValue) { string Result; diff --git a/src/uimenu.h b/src/uimenu.h index 8bb449a..e6d9df4 100644 --- a/src/uimenu.h +++ b/src/uimenu.h @@ -73,12 +73,14 @@ private: private: static void MenuHandler (CUIMenu *pUIMenu, TMenuEvent Event); + static void EditGlobalParameter (CUIMenu *pUIMenu, TMenuEvent Event); static void EditVoiceBankNumber (CUIMenu *pUIMenu, TMenuEvent Event); static void EditProgramNumber (CUIMenu *pUIMenu, TMenuEvent Event); static void EditTGParameter (CUIMenu *pUIMenu, TMenuEvent Event); static void EditVoiceParameter (CUIMenu *pUIMenu, TMenuEvent Event); static void EditOPParameter (CUIMenu *pUIMenu, TMenuEvent Event); + static std::string GetGlobalValueString (unsigned nParameter, int nValue); static std::string GetTGValueString (unsigned nTGParameter, int nValue); static std::string GetVoiceValueString (unsigned nVoiceParameter, int nValue); static std::string GetOPValueString (unsigned nOPParameter, int nValue); @@ -116,9 +118,11 @@ private: static const TMenuItem s_MenuRoot[]; static const TMenuItem s_MainMenu[]; static const TMenuItem s_TGMenu[]; + static const TMenuItem s_ReverbMenu[]; static const TMenuItem s_EditVoiceMenu[]; static const TMenuItem s_OperatorMenu[]; + static const TParameter s_GlobalParameter[]; static const TParameter s_TGParameter[]; static const TParameter s_VoiceParameter[]; static const TParameter s_OPParameter[];