Process TG in stereo

pull/764/head
jnonis 7 months ago
parent e034e66f87
commit 881149e119
  1. 1
      src/config.h
  2. 17
      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;
#endif
static const unsigned TGChannels = 2;
static const unsigned MaxChunkSize = 4096;
#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)
{
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];
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()

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

@ -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);

@ -91,6 +91,9 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
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 ());
m_nReverbSend[i] = 0;
@ -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

@ -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;

Loading…
Cancel
Save