From 4d7d0ce62714d6a798f57221eb00cdece9ed4159 Mon Sep 17 00:00:00 2001 From: Gergo Koteles Date: Wed, 9 Jul 2025 18:22:58 +0200 Subject: [PATCH 1/5] reverb: do not use the reverb mixer if reverb is disabled --- src/minidexed.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 51e6444..0e1c283 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -1409,7 +1409,6 @@ void CMiniDexed::ProcessSound (void) for (uint8_t i = 0; i < m_nToneGenerators; i++) { tg_mixer->doAddMix(i,m_OutputLevel[i]); - reverb_send_mixer->doAddMix(i,m_OutputLevel[i]); } // END TG mixing @@ -1425,6 +1424,11 @@ void CMiniDexed::ProcessSound (void) { float32_t ReverbBuffer[2][nFrames]; float32_t ReverbSendBuffer[2][nFrames]; + + for (uint8_t i = 0; i < m_nToneGenerators; i++) + { + reverb_send_mixer->doAddMix(i,m_OutputLevel[i]); + } arm_fill_f32(0.0f, ReverbBuffer[indexL], nFrames); arm_fill_f32(0.0f, ReverbBuffer[indexR], nFrames); From 6e4cae79743d23d2a6f918681a37d21ae69f6ee8 Mon Sep 17 00:00:00 2001 From: Gergo Koteles Date: Wed, 9 Jul 2025 18:24:59 +0200 Subject: [PATCH 2/5] reverb: do not fill the reverb buffers unnecessarily they will be overwritten later --- src/minidexed.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 0e1c283..1b5b4f6 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -1430,11 +1430,6 @@ void CMiniDexed::ProcessSound (void) reverb_send_mixer->doAddMix(i,m_OutputLevel[i]); } - arm_fill_f32(0.0f, ReverbBuffer[indexL], nFrames); - arm_fill_f32(0.0f, ReverbBuffer[indexR], nFrames); - arm_fill_f32(0.0f, ReverbSendBuffer[indexR], nFrames); - arm_fill_f32(0.0f, ReverbSendBuffer[indexL], nFrames); - m_ReverbSpinLock.Acquire (); reverb_send_mixer->getMix(ReverbSendBuffer[indexL], ReverbSendBuffer[indexR]); From d7fd8727860664ea0ba5b735321dcf0d1b73185b Mon Sep 17 00:00:00 2001 From: Gergo Koteles Date: Wed, 9 Jul 2025 19:15:03 +0200 Subject: [PATCH 3/5] mixer: use the buffer directly, do not copy --- src/effect_mixer.hpp | 14 ++++++++++++++ src/minidexed.cpp | 22 ++++++++++++---------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/effect_mixer.hpp b/src/effect_mixer.hpp index 44184ab..78efbb4 100644 --- a/src/effect_mixer.hpp +++ b/src/effect_mixer.hpp @@ -168,6 +168,20 @@ public: arm_fill_f32(0.0f, sumbufR, buffer_length); } + void getBuffers(float32_t (*buffers[2])) + { + buffers[0] = sumbufL; + buffers[1] = sumbufR; + } + + void zeroFill() + { + if(sumbufL) + arm_fill_f32(0.0f, sumbufL, buffer_length); + if(sumbufR) + arm_fill_f32(0.0f, sumbufR, buffer_length); + } + protected: using AudioMixer::sumbufL; using AudioMixer::multiplier; diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 1b5b4f6..c4aa1b8 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -1406,25 +1406,28 @@ void CMiniDexed::ProcessSound (void) if(nMasterVolume > 0.0) { + // get the mix buffer of all TGs + float32_t (*SampleBuffer[2]); + tg_mixer->getBuffers(SampleBuffer); + + tg_mixer->zeroFill(); + for (uint8_t i = 0; i < m_nToneGenerators; i++) { tg_mixer->doAddMix(i,m_OutputLevel[i]); } // END TG mixing - // BEGIN create SampleBuffer for holding audio data - float32_t SampleBuffer[2][nFrames]; - // END create SampleBuffer for holding audio data - - // get the mix of all TGs - tg_mixer->getMix(SampleBuffer[indexL], SampleBuffer[indexR]); - // BEGIN adding reverb if (m_nParameter[ParameterReverbEnable]) { float32_t ReverbBuffer[2][nFrames]; - float32_t ReverbSendBuffer[2][nFrames]; - + + float32_t (*ReverbSendBuffer[2]); + reverb_send_mixer->getBuffers(ReverbSendBuffer); + + reverb_send_mixer->zeroFill(); + for (uint8_t i = 0; i < m_nToneGenerators; i++) { reverb_send_mixer->doAddMix(i,m_OutputLevel[i]); @@ -1432,7 +1435,6 @@ void CMiniDexed::ProcessSound (void) m_ReverbSpinLock.Acquire (); - reverb_send_mixer->getMix(ReverbSendBuffer[indexL], ReverbSendBuffer[indexR]); reverb->doReverb(ReverbSendBuffer[indexL],ReverbSendBuffer[indexR],ReverbBuffer[indexL], ReverbBuffer[indexR],nFrames); // scale down and add left reverb buffer by reverb level From 71fa4cc2f58c99c0553430506e5c39038d2dd082 Mon Sep 17 00:00:00 2001 From: Gergo Koteles Date: Wed, 9 Jul 2025 20:47:53 +0200 Subject: [PATCH 4/5] mixer: remove the unused and buggy 3 parameter doAddMix() It doesn't work well if multiplier[channel]==UNITY_GAIN --- src/effect_mixer.hpp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/effect_mixer.hpp b/src/effect_mixer.hpp index 78efbb4..2cf3586 100644 --- a/src/effect_mixer.hpp +++ b/src/effect_mixer.hpp @@ -135,23 +135,6 @@ public: arm_add_f32(sumbufR, tmp, sumbufR, buffer_length); } - void doAddMix(uint8_t channel, float32_t* inL, float32_t* inR) - { - float32_t tmp[buffer_length]; - - assert(inL); - assert(inR); - - // left - if(multiplier[channel]!=UNITY_GAIN) - 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,multiplier[channel],tmp,buffer_length); - arm_add_f32(sumbufR, tmp, sumbufR, buffer_length); - } - void getMix(float32_t* bufferL, float32_t* bufferR) { assert(bufferR); From a538a7dc894075f09c8aeace8181223814270010 Mon Sep 17 00:00:00 2001 From: Gergo Koteles Date: Wed, 9 Jul 2025 20:52:56 +0200 Subject: [PATCH 5/5] mixer: prescale the scale parameter so one scale per element is enough --- src/effect_mixer.hpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/effect_mixer.hpp b/src/effect_mixer.hpp index 2cf3586..9cf5070 100644 --- a/src/effect_mixer.hpp +++ b/src/effect_mixer.hpp @@ -124,14 +124,10 @@ public: assert(in); // left - arm_scale_f32(in, panorama[channel][0], tmp, buffer_length); - if(multiplier[channel]!=UNITY_GAIN) - arm_scale_f32(tmp,multiplier[channel],tmp,buffer_length); + arm_scale_f32(in, panorama[channel][0] * multiplier[channel], tmp, buffer_length); arm_add_f32(sumbufL, tmp, sumbufL, buffer_length); // right - arm_scale_f32(in, panorama[channel][1], tmp, buffer_length); - if(multiplier[channel]!=UNITY_GAIN) - arm_scale_f32(tmp,multiplier[channel],tmp,buffer_length); + arm_scale_f32(in, panorama[channel][1] * multiplier[channel], tmp, buffer_length); arm_add_f32(sumbufR, tmp, sumbufR, buffer_length); }