Process TG in stereo

pull/764/head
jnonis 7 months ago
parent e034e66f87
commit 881149e119
  1. 1
      src/config.h
  2. 19
      src/effect_base.cpp
  3. 1
      src/effect_base.h
  4. 2
      src/effect_mixer.hpp
  5. 25
      src/minidexed.cpp
  6. 2
      src/minidexed.h

@ -49,6 +49,7 @@ public:
static const unsigned MaxNotes = 16; static const unsigned MaxNotes = 16;
#endif #endif
static const unsigned TGChannels = 2;
static const unsigned MaxChunkSize = 4096; static const unsigned MaxChunkSize = 4096;
#if RASPPI <= 3 #if RASPPI <= 3

@ -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) void AudioEffect::process(const float32_t* inblockL, const float32_t* inblockR, float32_t* outblockL, float32_t* outblockR, uint16_t len)
{ {
if (bypass) { 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 (inblockL != outblockL || inblockR != outblockR) {
// if input and output buffers are different we should copy the content // if input and output buffers are different we should copy the content
for (uint16_t i=0; i < len; i++) for (uint16_t i=0; i < len; i++)
{ {
outblockL[i] = inblockL[i]; outblockL[i] = inblockL[i];
outblockR[i] = inblockR[i]; if (inblockL == inblockR) {
outblockR[i] = inblockL[i];
}
else
{
outblockR[i] = inblockR[i];
}
} }
} }
*/
return; return;
} }
doProcess(inblockL, inblockR, outblockL, outblockR, len); 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) AudioEffectNone::AudioEffectNone(float32_t samplerate) : AudioEffect(samplerate)
{ {
setBypass(true);
} }
AudioEffectNone::~AudioEffectNone() AudioEffectNone::~AudioEffectNone()

@ -1,7 +1,6 @@
#ifndef _EFFECT_BASE_H #ifndef _EFFECT_BASE_H
#define _EFFECT_BASE_H #define _EFFECT_BASE_H
//#include <stdint.h>
#include <arm_math.h> #include <arm_math.h>
#include <vector> #include <vector>

@ -143,10 +143,12 @@ public:
assert(inR); assert(inR);
// left // left
arm_scale_f32(inL, panorama[channel][0], tmp, buffer_length);
if(multiplier[channel]!=UNITY_GAIN) if(multiplier[channel]!=UNITY_GAIN)
arm_scale_f32(inL,multiplier[channel],tmp,buffer_length); arm_scale_f32(inL,multiplier[channel],tmp,buffer_length);
arm_add_f32(sumbufL, tmp, sumbufL, buffer_length); arm_add_f32(sumbufL, tmp, sumbufL, buffer_length);
// right // right
arm_scale_f32(inR, panorama[channel][1], tmp, buffer_length);
if(multiplier[channel]!=UNITY_GAIN) if(multiplier[channel]!=UNITY_GAIN)
arm_scale_f32(inR,multiplier[channel],tmp,buffer_length); arm_scale_f32(inR,multiplier[channel],tmp,buffer_length);
arm_add_f32(sumbufR, tmp, sumbufR, buffer_length); arm_add_f32(sumbufR, tmp, sumbufR, buffer_length);

@ -90,6 +90,9 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
m_nBreathControlTarget[i]=0; m_nBreathControlTarget[i]=0;
m_nAftertouchRange[i]=99; m_nAftertouchRange[i]=99;
m_nAftertouchTarget[i]=0; 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_InsertFXSpinLock[i] = new CSpinLock();
m_InsertFX[i] = new AudioEffectNone(pConfig->GetSampleRate ()); 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++) for (unsigned i = 0; i < CConfig::TGsCore23; i++, nTG++)
{ {
assert (m_pTG[nTG]); assert (m_pTG[nTG]);
m_pTG[nTG]->getSamples (m_OutputLevel[nTG],m_nFramesToProcess); m_pTG[nTG]->getSamples (m_OutputLevel[nTG][0],m_nFramesToProcess);
m_InsertFXSpinLock[i]->Acquire(); m_InsertFXSpinLock[nTG]->Acquire();
m_InsertFX[nTG]->process(m_OutputLevel[nTG], m_OutputLevel[nTG], m_nFramesToProcess); m_InsertFX[nTG]->process(m_OutputLevel[nTG][0], m_OutputLevel[nTG][0], m_OutputLevel[nTG][0], m_OutputLevel[nTG][1], m_nFramesToProcess);
m_InsertFXSpinLock[i]->Release(); m_InsertFXSpinLock[nTG]->Release();
} }
} }
} }
@ -1100,10 +1103,10 @@ void CMiniDexed::ProcessSound (void)
m_GetChunkTimer.Start (); m_GetChunkTimer.Start ();
} }
float32_t SampleBuffer[nFrames]; float32_t SampleBuffer[2][nFrames];
m_pTG[0]->getSamples (SampleBuffer, nFrames); m_pTG[0]->getSamples (SampleBuffer[0], nFrames);
m_InsertFXSpinLock[0]->Acquire(); 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(); m_InsertFXSpinLock[0]->Release();
// Convert single float array (mono) to int16 array // Convert single float array (mono) to int16 array
@ -1150,9 +1153,9 @@ void CMiniDexed::ProcessSound (void)
for (unsigned i = 0; i < CConfig::TGsCore1; i++) for (unsigned i = 0; i < CConfig::TGsCore1; i++)
{ {
assert (m_pTG[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_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(); m_InsertFXSpinLock[i]->Release();
} }
@ -1181,8 +1184,8 @@ void CMiniDexed::ProcessSound (void)
{ {
for (uint8_t i = 0; i < CConfig::ToneGenerators; i++) for (uint8_t i = 0; i < CConfig::ToneGenerators; i++)
{ {
tg_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]); reverb_send_mixer->doAddMix(i, m_OutputLevel[i][0], m_OutputLevel[i][1]);
} }
// END TG mixing // END TG mixing

@ -324,7 +324,7 @@ private:
unsigned m_nActiveTGsLog2; unsigned m_nActiveTGsLog2;
volatile TCoreStatus m_CoreStatus[CORES]; volatile TCoreStatus m_CoreStatus[CORES];
volatile unsigned m_nFramesToProcess; volatile unsigned m_nFramesToProcess;
float32_t m_OutputLevel[CConfig::ToneGenerators][CConfig::MaxChunkSize]; float32_t m_OutputLevel[CConfig::ToneGenerators][CConfig::TGChannels][CConfig::MaxChunkSize];
#endif #endif
CPerformanceTimer m_GetChunkTimer; CPerformanceTimer m_GetChunkTimer;

Loading…
Cancel
Save