From 58f95623d79811bc0cc9b525fd4cc99d94e61f54 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Thu, 7 Apr 2022 16:59:06 +0200 Subject: [PATCH] Several fixes for float signal path. --- src/.minidexed.cpp.swp | Bin 0 -> 36864 bytes src/effect_platervbstereo.cpp | 10 ++++----- src/effect_platervbstereo.h | 2 +- src/minidexed.cpp | 39 ++++++++++++++++++++++++++-------- src/minidexed.h | 2 +- 5 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 src/.minidexed.cpp.swp diff --git a/src/.minidexed.cpp.swp b/src/.minidexed.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..0a3b9ee9c939574f15f8620af6b58620711d337a GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/src/effect_platervbstereo.cpp b/src/effect_platervbstereo.cpp index be92e6e..ce2af1e 100644 --- a/src/effect_platervbstereo.cpp +++ b/src/effect_platervbstereo.cpp @@ -158,7 +158,7 @@ AudioEffectPlateReverb::AudioEffectPlateReverb(float32_t samplerate) // #define sat16(n, rshift) signed_saturate_rshift((n), 16, (rshift)) -void AudioEffectPlateReverb::doReverb(float32_t* blockL, float32_t* blockR, uint16_t len) +void AudioEffectPlateReverb::doReverb(const float32_t* inblockL, const float32_t* inblockR, float32_t* rvbblockL, float32_t* rvbblockR, uint16_t len) { float32_t input, acc, temp1, temp2; uint16_t temp16; @@ -235,7 +235,7 @@ void AudioEffectPlateReverb::doReverb(float32_t* blockL, float32_t* blockR, uint y += (int64_t)y1 * idx; lfo2_out_cos = (int32_t) (y >> (32-8)); // 16bit output - input = blockL[i] * input_attn; + input = inblockL[i] * input_attn; // chained input allpasses, channel L acc = in_allp1_bufL[in_allp1_idxL] + input * in_allp_k; @@ -258,7 +258,7 @@ void AudioEffectPlateReverb::doReverb(float32_t* blockL, float32_t* blockR, uint in_allp_out_L = acc; if (++in_allp4_idxL >= sizeof(in_allp4_bufL)/sizeof(float32_t)) in_allp4_idxL = 0; - input = blockR[i] * input_attn; + input = inblockR[i] * input_attn; // chained input allpasses, channel R acc = in_allp1_bufR[in_allp1_idxR] + input * in_allp_k; @@ -405,7 +405,7 @@ void AudioEffectPlateReverb::doReverb(float32_t* blockL, float32_t* blockR, uint temp1 = acc - master_lowpass_l; master_lowpass_l += temp1 * master_lowpass_f; - blockL[i] = blockL[i] + (master_lowpass_l * reverb_level); + rvbblockL[i] = master_lowpass_l; // Channel R #ifdef TAP1_MODULATED @@ -449,6 +449,6 @@ void AudioEffectPlateReverb::doReverb(float32_t* blockL, float32_t* blockR, uint temp1 = acc - master_lowpass_r; master_lowpass_r += temp1 * master_lowpass_f; - blockR[i] = blockR[i] + (master_lowpass_r * reverb_level); + rvbblockR[i] = master_lowpass_r; } } diff --git a/src/effect_platervbstereo.h b/src/effect_platervbstereo.h index 19a7baf..b7af531 100644 --- a/src/effect_platervbstereo.h +++ b/src/effect_platervbstereo.h @@ -61,7 +61,7 @@ class AudioEffectPlateReverb { public: AudioEffectPlateReverb(float32_t samplerate); - void doReverb(float32_t* blockL, float32_t* blockR, uint16_t len); + void doReverb(const float32_t* inblockL, const float32_t* inblockR, float32_t* rvbblockL, float32_t* rvbblockR,uint16_t len); void size(float n) { diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 3701833..d0c3e26 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -689,36 +689,57 @@ void CMiniDexed::ProcessSound (void) float32_t SampleBuffer[2][nFrames]; uint8_t indexL=0, indexR=1; - assert (SampleBuffer[0]!=NULL); - arm_fill_f32(0.0, SampleBuffer[0], nFrames); - assert (SampleBuffer[1]!=NULL); - arm_fill_f32(0.0, SampleBuffer[1], nFrames); - if (m_bChannelsSwapped) { indexL=1; indexR=0; } + // 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); + assert (CConfig::ToneGenerators == 8); // BEGIN stereo panorama for (uint8_t i = 0; i < CConfig::ToneGenerators; i++) { + float32_t tmpBuffer[nFrames]; + m_PanoramaSpinLock.Acquire (); - arm_scale_f32(m_OutputLevel[0], 1.0f-pan_float[i], SampleBuffer[indexL], nFrames); - arm_scale_f32(m_OutputLevel[1], pan_float[i], SampleBuffer[indexR], nFrames); + // calculate left panorama of this TG + arm_scale_f32(m_OutputLevel[i], 1.0f-pan_float[i], tmpBuffer, nFrames); + // add left panorama output of this TG to sum output + arm_add_f32(SampleBuffer[indexL], tmpBuffer, SampleBuffer[indexL], nFrames); + + // calculate right panorama of this TG + arm_scale_f32(m_OutputLevel[i], pan_float[i], tmpBuffer, nFrames); + // add right panaorama output of this TG to sum output + arm_add_f32(SampleBuffer[indexR], tmpBuffer, SampleBuffer[indexR], nFrames); + m_PanoramaSpinLock.Release (); } // END stereo panorama // BEGIN adding reverb + float32_t ReverbBuffer[2][nFrames]; + m_ReverbSpinLock.Acquire (); - reverb->doReverb(SampleBuffer[indexL],SampleBuffer[indexR],nFrames); + reverb->doReverb(SampleBuffer[indexL],SampleBuffer[indexR],ReverbBuffer[0], ReverbBuffer[1],nFrames); m_ReverbSpinLock.Release (); + + // scale down and add left reverb buffer by reverb level + arm_scale_f32(ReverbBuffer[0], reverb->get_level(), ReverbBuffer[0], nFrames); + arm_add_f32(SampleBuffer[indexL], ReverbBuffer[0], SampleBuffer[indexL], nFrames); + // scale down and add right reverb buffer by reverb level + arm_scale_f32(ReverbBuffer[1], reverb->get_level(), ReverbBuffer[1], nFrames); + arm_add_f32(SampleBuffer[indexR], ReverbBuffer[1], SampleBuffer[indexR], nFrames); // END adding reverb - // Convert float to int16 array + // Convert dual float array (left, right) to single int16 array (left/right) float32_t tmp_float[nFrames*2]; int16_t tmp_int[nFrames*2]; for(uint16_t i=0; i