From 881149e11901a52ea44c9aa4eafb7f5adf1670b6 Mon Sep 17 00:00:00 2001 From: jnonis Date: Wed, 3 Jul 2024 04:36:32 +0000 Subject: [PATCH] Process TG in stereo --- src/config.h | 1 + src/effect_base.cpp | 19 ++++++++++++++++++- src/effect_base.h | 1 - src/effect_mixer.hpp | 2 ++ src/minidexed.cpp | 25 ++++++++++++++----------- src/minidexed.h | 2 +- 6 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/config.h b/src/config.h index 71bb5ad..1a39d9c 100644 --- a/src/config.h +++ b/src/config.h @@ -49,6 +49,7 @@ public: static const unsigned MaxNotes = 16; #endif + static const unsigned TGChannels = 2; static const unsigned MaxChunkSize = 4096; #if RASPPI <= 3 diff --git a/src/effect_base.cpp b/src/effect_base.cpp index 1aff46b..b9fc84d 100644 --- a/src/effect_base.cpp +++ b/src/effect_base.cpp @@ -58,14 +58,30 @@ void AudioEffect::process(const float32_t* inblock, float32_t* outblock, uint16_ 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]; - outblockR[i] = inblockR[i]; + if (inblockL == inblockR) { + outblockR[i] = inblockL[i]; + } + else + { + outblockR[i] = inblockR[i]; + } + } } + */ return; } doProcess(inblockL, inblockR, outblockL, outblockR, len); @@ -76,6 +92,7 @@ void AudioEffect::doProcess(const float32_t* inblockL, const float32_t* inblockR AudioEffectNone::AudioEffectNone(float32_t samplerate) : AudioEffect(samplerate) { + setBypass(true); } AudioEffectNone::~AudioEffectNone() diff --git a/src/effect_base.h b/src/effect_base.h index 2b151c2..5a47ef8 100644 --- a/src/effect_base.h +++ b/src/effect_base.h @@ -1,7 +1,6 @@ #ifndef _EFFECT_BASE_H #define _EFFECT_BASE_H -//#include #include #include diff --git a/src/effect_mixer.hpp b/src/effect_mixer.hpp index 44184ab..c4f1156 100644 --- a/src/effect_mixer.hpp +++ b/src/effect_mixer.hpp @@ -143,10 +143,12 @@ public: assert(inR); // left + arm_scale_f32(inL, panorama[channel][0], tmp, buffer_length); if(multiplier[channel]!=UNITY_GAIN) arm_scale_f32(inL,multiplier[channel],tmp,buffer_length); arm_add_f32(sumbufL, tmp, sumbufL, buffer_length); // right + arm_scale_f32(inR, panorama[channel][1], tmp, buffer_length); if(multiplier[channel]!=UNITY_GAIN) arm_scale_f32(inR,multiplier[channel],tmp,buffer_length); arm_add_f32(sumbufR, tmp, sumbufR, buffer_length); diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 90a9ef2..fc4db58 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -90,6 +90,9 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, m_nBreathControlTarget[i]=0; m_nAftertouchRange[i]=99; m_nAftertouchTarget[i]=0; + + memset(m_OutputLevel[i][0], 0, CConfig::MaxChunkSize * sizeof(float32_t)); + memset(m_OutputLevel[i][1], 0, CConfig::MaxChunkSize * sizeof(float32_t)); m_InsertFXSpinLock[i] = new CSpinLock(); m_InsertFX[i] = new AudioEffectNone(pConfig->GetSampleRate ()); @@ -405,10 +408,10 @@ void CMiniDexed::Run (unsigned nCore) for (unsigned i = 0; i < CConfig::TGsCore23; i++, nTG++) { assert (m_pTG[nTG]); - m_pTG[nTG]->getSamples (m_OutputLevel[nTG],m_nFramesToProcess); - m_InsertFXSpinLock[i]->Acquire(); - m_InsertFX[nTG]->process(m_OutputLevel[nTG], m_OutputLevel[nTG], m_nFramesToProcess); - m_InsertFXSpinLock[i]->Release(); + m_pTG[nTG]->getSamples (m_OutputLevel[nTG][0],m_nFramesToProcess); + m_InsertFXSpinLock[nTG]->Acquire(); + m_InsertFX[nTG]->process(m_OutputLevel[nTG][0], m_OutputLevel[nTG][0], m_OutputLevel[nTG][0], m_OutputLevel[nTG][1], m_nFramesToProcess); + m_InsertFXSpinLock[nTG]->Release(); } } } @@ -1100,10 +1103,10 @@ void CMiniDexed::ProcessSound (void) m_GetChunkTimer.Start (); } - float32_t SampleBuffer[nFrames]; - m_pTG[0]->getSamples (SampleBuffer, nFrames); + float32_t SampleBuffer[2][nFrames]; + m_pTG[0]->getSamples (SampleBuffer[0], nFrames); m_InsertFXSpinLock[0]->Acquire(); - m_InsertFX[0]->process(SampleBuffer, SampleBuffer, nFrames); + m_InsertFX[0]->process(SampleBuffer[0], SampleBuffer[0], SampleBuffer[0], SampleBuffer[1], nFrames); m_InsertFXSpinLock[0]->Release(); // Convert single float array (mono) to int16 array @@ -1150,9 +1153,9 @@ void CMiniDexed::ProcessSound (void) for (unsigned i = 0; i < CConfig::TGsCore1; i++) { assert (m_pTG[i]); - m_pTG[i]->getSamples (m_OutputLevel[i], nFrames); + m_pTG[i]->getSamples (m_OutputLevel[i][0], nFrames); m_InsertFXSpinLock[i]->Acquire(); - m_InsertFX[i]->process(m_OutputLevel[i], m_OutputLevel[i], nFrames); + m_InsertFX[i]->process(m_OutputLevel[i][0], m_OutputLevel[i][0], m_OutputLevel[i][0], m_OutputLevel[i][1], nFrames); m_InsertFXSpinLock[i]->Release(); } @@ -1181,8 +1184,8 @@ void CMiniDexed::ProcessSound (void) { for (uint8_t i = 0; i < CConfig::ToneGenerators; i++) { - tg_mixer->doAddMix(i,m_OutputLevel[i]); - reverb_send_mixer->doAddMix(i,m_OutputLevel[i]); + tg_mixer->doAddMix(i, m_OutputLevel[i][0], m_OutputLevel[i][1]); + reverb_send_mixer->doAddMix(i, m_OutputLevel[i][0], m_OutputLevel[i][1]); } // END TG mixing diff --git a/src/minidexed.h b/src/minidexed.h index 0772af8..b11f094 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -324,7 +324,7 @@ private: unsigned m_nActiveTGsLog2; volatile TCoreStatus m_CoreStatus[CORES]; volatile unsigned m_nFramesToProcess; - float32_t m_OutputLevel[CConfig::ToneGenerators][CConfig::MaxChunkSize]; + float32_t m_OutputLevel[CConfig::ToneGenerators][CConfig::TGChannels][CConfig::MaxChunkSize]; #endif CPerformanceTimer m_GetChunkTimer;