From 8a61ff88c3fc6bb226f921b284843e5078d53502 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Sun, 10 Apr 2022 17:11:14 +0200 Subject: [PATCH] Added ReverbSend Parameter for each TG. --- src/effect_mixer.hpp | 18 ++++++++++++++-- src/minidexed.cpp | 45 +++++++++++++++++++++++++++++---------- src/minidexed.h | 8 +++++-- src/performance.ini | 9 ++++++++ src/performanceconfig.cpp | 15 +++++++++++++ src/performanceconfig.h | 3 +++ src/uimenu.cpp | 1 + 7 files changed, 84 insertions(+), 15 deletions(-) diff --git a/src/effect_mixer.hpp b/src/effect_mixer.hpp index 7974dbf..033545e 100644 --- a/src/effect_mixer.hpp +++ b/src/effect_mixer.hpp @@ -28,6 +28,12 @@ public: arm_fill_f32(0.0, sumbufL, len); } + ~AudioMixer() + { + if(sumbufL) + free(sumbufL); + } + void doAddMix(uint8_t channel, float32_t* in) { float32_t* tmp=(float32_t*)malloc(sizeof(float32_t)*buffer_length); @@ -93,6 +99,14 @@ public: arm_fill_f32(0.0, sumbufR, buffer_length); } + ~AudioStereoMixer() + { + if(sumbufL) + free(sumbufL); + if(sumbufR) + free(sumbufR); + } + void pan(uint8_t channel, float32_t pan) { if (channel >= NN) return; @@ -136,11 +150,11 @@ public: // left if(multiplier[channel]!=UNITY_GAIN) - arm_scale_f32(inL,AudioMixer::multiplier[channel],tmp,buffer_length); + arm_scale_f32(inL,multiplier[channel],tmp,buffer_length); arm_add_f32(sumbufL, tmp, sumbufL, buffer_length); // right if(multiplier[channel]!=UNITY_GAIN) - arm_scale_f32(inR,AudioMixer::multiplier[channel],tmp,buffer_length); + arm_scale_f32(inR,multiplier[channel],tmp,buffer_length); arm_add_f32(sumbufR, tmp, sumbufR, buffer_length); if(tmp) diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 80bee8b..7c287ed 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -58,7 +58,6 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, m_nProgram[i] = 0; m_nVolume[i] = 100; m_nPan[i] = 64; - m_fPan[i] = 0.5f; m_nMasterTune[i] = 0; m_nMIDIChannel[i] = CMIDIDevice::Disabled; @@ -66,6 +65,8 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, m_nNoteLimitHigh[i] = 127; m_nNoteShift[i] = 0; + m_nReverbSend[i] = 0; + m_pTG[i] = new CDexedAdapter (CConfig::MaxNotes, pConfig->GetSampleRate ()); assert (m_pTG[i]); @@ -119,6 +120,7 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, // END setup tgmixer // BEGIN setup reverb + reverb_send_mixer = new AudioStereoMixer<8>(pConfig->GetChunkSize()/2); reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate()); SetParameter (ParameterReverbEnable, 1); SetParameter (ParameterReverbSize, 70); @@ -163,7 +165,9 @@ bool CMiniDexed::Initialize (void) m_pTG[i]->setPBController (12, 1); m_pTG[i]->setMWController (99, 7, 0); - tg_mixer->pan(i,m_fPan[i]); + tg_mixer->pan(i,m_nPan[i]/127.0f); + reverb_send_mixer->pan(i,m_nPan[i]/127.0f); + reverb_send_mixer->gain(i,m_nReverbSend[i]/127.0f); } if (m_PerformanceConfig.Load ()) @@ -180,6 +184,8 @@ bool CMiniDexed::Initialize (void) m_nNoteLimitLow[nTG] = m_PerformanceConfig.GetNoteLimitLow (nTG); m_nNoteLimitHigh[nTG] = m_PerformanceConfig.GetNoteLimitHigh (nTG); m_nNoteShift[nTG] = m_PerformanceConfig.GetNoteShift (nTG); + + SetReverbSend (m_PerformanceConfig.GetReverbSend (nTG), nTG); } // Effects @@ -361,7 +367,7 @@ void CMiniDexed::SetVolume (unsigned nVolume, unsigned nTG) m_nVolume[nTG] = nVolume; assert (m_pTG[nTG]); - m_pTG[nTG]->setGain (nVolume / 127.0); + m_pTG[nTG]->setGain (nVolume / 127.0f); m_UI.ParameterChanged (); } @@ -375,7 +381,19 @@ void CMiniDexed::SetPan (unsigned nPan, unsigned nTG) assert (nTG < CConfig::ToneGenerators); m_nPan[nTG] = nPan; - m_fPan[nTG]=mapfloat(nPan,0,127,0.0,1.0); + + m_UI.ParameterChanged (); +} + +void CMiniDexed::SetReverbSend (unsigned nReverbSend, unsigned nTG) +{ + if (nReverbSend > 127) + { + return; + } + + assert (nTG < CConfig::ToneGenerators); + m_nReverbSend[nTG] = nReverbSend; m_UI.ParameterChanged (); } @@ -593,6 +611,8 @@ void CMiniDexed::SetTGParameter (TTGParameter Parameter, int nValue, unsigned nT SetMIDIChannel ((uint8_t) nValue, nTG); break; + case TGParameterReverbSend: SetReverbSend (nValue, nTG); break; + default: assert (0); break; @@ -611,6 +631,7 @@ int CMiniDexed::GetTGParameter (TTGParameter Parameter, unsigned nTG) case TGParameterPan: return m_nPan[nTG]; case TGParameterMasterTune: return m_nMasterTune[nTG]; case TGParameterMIDIChannel: return m_nMIDIChannel[nTG]; + case TGParameterReverbSend: return m_nReverbSend[nTG]; default: assert (0); @@ -761,17 +782,14 @@ void CMiniDexed::ProcessSound (void) // BEGIN TG mixing for (uint8_t i = 0; i < CConfig::ToneGenerators; i++) + { tg_mixer->doAddMix(i,m_OutputLevel[i]); + reverb_send_mixer->doAddMix(i,m_OutputLevel[i]); + } // END TG mixing // BEGIN create SampleBuffer for holding audio data float32_t SampleBuffer[2][nFrames]; - // init left sum output - assert (SampleBuffer[0]!=NULL); - arm_fill_f32(0.0, SampleBuffer[0], nFrames); - // init right sum output - assert (SampleBuffer[1]!=NULL); - arm_fill_f32(0.0, SampleBuffer[1], nFrames); // END create SampleBuffer for holding audio data // get the mix of all TGs @@ -781,9 +799,12 @@ void CMiniDexed::ProcessSound (void) if (m_nParameter[ParameterReverbEnable]) { float32_t ReverbBuffer[2][nFrames]; + float32_t ReverbSendBuffer[2][nFrames]; + + reverb_send_mixer->getMix(ReverbSendBuffer[indexL], ReverbSendBuffer[indexR]); m_ReverbSpinLock.Acquire (); - reverb->doReverb(SampleBuffer[indexL],SampleBuffer[indexR],ReverbBuffer[0], ReverbBuffer[1],nFrames); + reverb->doReverb(ReverbSendBuffer[indexL],ReverbSendBuffer[indexR],ReverbBuffer[0], ReverbBuffer[1],nFrames); m_ReverbSpinLock.Release (); // scale down and add left reverb buffer by reverb level @@ -833,6 +854,8 @@ bool CMiniDexed::SavePerformance (void) m_PerformanceConfig.SetNoteLimitLow (m_nNoteLimitLow[nTG], nTG); m_PerformanceConfig.SetNoteLimitHigh (m_nNoteLimitHigh[nTG], nTG); m_PerformanceConfig.SetNoteShift (m_nNoteShift[nTG], nTG); + + m_PerformanceConfig.SetReverbSend (m_nReverbSend[nTG], nTG); } m_PerformanceConfig.SetCompressorEnable (!!m_nParameter[ParameterCompressorEnable]); diff --git a/src/minidexed.h b/src/minidexed.h index 5d7e29b..1e9af25 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -78,6 +78,8 @@ public: void setPitchbend (int16_t value, unsigned nTG); void ControllersRefresh (unsigned nTG); + void SetReverbSend (unsigned nReverbSend, unsigned nTG); // 0 .. 127 + enum TParameter { ParameterCompressorEnable, @@ -102,6 +104,7 @@ public: TGParameterPan, TGParameterMasterTune, TGParameterMIDIChannel, + TGParameterReverbSend, TGParameterUnknown }; @@ -144,7 +147,6 @@ private: unsigned m_nProgram[CConfig::ToneGenerators]; unsigned m_nVolume[CConfig::ToneGenerators]; unsigned m_nPan[CConfig::ToneGenerators]; - float32_t m_fPan[CConfig::ToneGenerators]; int m_nMasterTune[CConfig::ToneGenerators]; unsigned m_nMIDIChannel[CConfig::ToneGenerators]; @@ -152,6 +154,8 @@ private: unsigned m_nNoteLimitHigh[CConfig::ToneGenerators]; int m_nNoteShift[CConfig::ToneGenerators]; + unsigned m_nReverbSend[CConfig::ToneGenerators]; + CUserInterface m_UI; CSysExFileLoader m_SysExFileLoader; CPerformanceConfig m_PerformanceConfig; @@ -177,8 +181,8 @@ private: AudioEffectPlateReverb* reverb; AudioStereoMixer<8>* tg_mixer; + AudioStereoMixer<8>* reverb_send_mixer; - CSpinLock m_PanoramaSpinLock; CSpinLock m_ReverbSpinLock; }; diff --git a/src/performance.ini b/src/performance.ini index 979c30c..de3dfba 100644 --- a/src/performance.ini +++ b/src/performance.ini @@ -12,6 +12,7 @@ #NoteLimitLow#=0 # 0 .. 127, C-2 .. G8 #NoteLimitHigh#=127 # 0 .. 127, C-2 .. G8 #NoteShift#=0 # -24 .. 24 +#ReverbSend=0 # 0 .. 127 # TG1 BankNumber1=0 @@ -23,6 +24,7 @@ Detune1=-11 NoteLimitLow1=0 NoteLimitHigh1=127 NoteShift1=0 +ReverbSend=0 # TG2 BankNumber2=0 @@ -34,6 +36,7 @@ Detune2=11 NoteLimitLow2=0 NoteLimitHigh2=127 NoteShift2=0 +ReverbSend=0 # TG3 BankNumber3=0 @@ -45,6 +48,7 @@ Detune3=-7 NoteLimitLow3=0 NoteLimitHigh3=127 NoteShift3=0 +ReverbSend=0 # TG4 BankNumber4=0 @@ -56,6 +60,7 @@ Detune4=7 NoteLimitLow4=0 NoteLimitHigh4=127 NoteShift4=0 +ReverbSend=0 # TG5 BankNumber5=0 @@ -67,6 +72,7 @@ Detune5=0 NoteLimitLow5=0 NoteLimitHigh5=127 NoteShift5=0 +ReverbSend=0 # TG6 BankNumber6=0 @@ -78,6 +84,7 @@ Detune6=0 NoteLimitLow6=0 NoteLimitHigh6=127 NoteShift6=0 +ReverbSend=0 # TG7 BankNumber7=0 @@ -89,6 +96,7 @@ Detune7=0 NoteLimitLow7=0 NoteLimitHigh7=127 NoteShift7=0 +ReverbSend=0 # TG8 BankNumber8=0 @@ -100,6 +108,7 @@ Detune8=0 NoteLimitLow8=0 NoteLimitHigh8=127 NoteShift8=0 +ReverbSend=0 # Effects #CompressorEnable=1 # 0: off, 1: on diff --git a/src/performanceconfig.cpp b/src/performanceconfig.cpp index b4241d4..0021b37 100644 --- a/src/performanceconfig.cpp +++ b/src/performanceconfig.cpp @@ -89,6 +89,9 @@ bool CPerformanceConfig::Load (void) PropertyName.Format ("NoteShift%u", nTG+1); m_nNoteShift[nTG] = m_Properties.GetSignedNumber (PropertyName, 0); + + PropertyName.Format ("ReverbSend%u", nTG+1); + m_nReverbSend[nTG] = m_Properties.GetNumber (PropertyName, 64); } m_bCompressorEnable = m_Properties.GetNumber ("CompressorEnable", 1) != 0; @@ -220,6 +223,12 @@ int CPerformanceConfig::GetNoteShift (unsigned nTG) const return m_nNoteShift[nTG]; } +unsigned CPerformanceConfig::GetReverbSend (unsigned nTG) const +{ + assert (nTG < CConfig::ToneGenerators); + return m_nReverbSend[nTG]; +} + void CPerformanceConfig::SetBankNumber (unsigned nValue, unsigned nTG) { assert (nTG < CConfig::ToneGenerators); @@ -274,6 +283,12 @@ void CPerformanceConfig::SetNoteShift (int nValue, unsigned nTG) m_nNoteShift[nTG] = nValue; } +void CPerformanceConfig::SetReverbSend (unsigned nValue, unsigned nTG) +{ + assert (nTG < CConfig::ToneGenerators); + m_nReverbSend[nTG] = nValue; +} + bool CPerformanceConfig::GetCompressorEnable (void) const { return m_bCompressorEnable; diff --git a/src/performanceconfig.h b/src/performanceconfig.h index c616e42..f7e8c05 100644 --- a/src/performanceconfig.h +++ b/src/performanceconfig.h @@ -47,6 +47,7 @@ public: unsigned GetNoteLimitLow (unsigned nTG) const; // 0 .. 127 unsigned GetNoteLimitHigh (unsigned nTG) const; // 0 .. 127 int GetNoteShift (unsigned nTG) const; // -24 .. 24 + unsigned GetReverbSend (unsigned nTG) const; // 0 .. 127 void SetBankNumber (unsigned nValue, unsigned nTG); void SetVoiceNumber (unsigned nValue, unsigned nTG); @@ -57,6 +58,7 @@ public: void SetNoteLimitLow (unsigned nValue, unsigned nTG); void SetNoteLimitHigh (unsigned nValue, unsigned nTG); void SetNoteShift (int nValue, unsigned nTG); + void SetReverbSend (unsigned nValue, unsigned nTG); // Effects bool GetCompressorEnable (void) const; @@ -89,6 +91,7 @@ private: unsigned m_nNoteLimitLow[CConfig::ToneGenerators]; unsigned m_nNoteLimitHigh[CConfig::ToneGenerators]; int m_nNoteShift[CConfig::ToneGenerators]; + int m_nReverbSend[CConfig::ToneGenerators]; bool m_bCompressorEnable; bool m_bReverbEnable; diff --git a/src/uimenu.cpp b/src/uimenu.cpp index 450023a..3ac9e80 100644 --- a/src/uimenu.cpp +++ b/src/uimenu.cpp @@ -63,6 +63,7 @@ const CUIMenu::TMenuItem CUIMenu::s_TGMenu[] = #ifdef ARM_ALLOW_MULTI_CORE {"Pan", EditTGParameter, 0, CMiniDexed::TGParameterPan}, #endif + {"Reverb-Send", EditTGParameter, 0, CMiniDexed::TGParameterReverbSend}, {"Detune", EditTGParameter, 0, CMiniDexed::TGParameterMasterTune}, {"Channel", EditTGParameter, 0, CMiniDexed::TGParameterMIDIChannel}, {"Edit Voice", MenuHandler, s_EditVoiceMenu},