Fixes for float signal path.

pull/73/head
Holger Wirtz 3 years ago
parent 1942cc95ad
commit a5fb30c0c2
  1. 15
      src/effect_platervbstereo.cpp
  2. 11
      src/effect_platervbstereo.h
  3. 27
      src/minidexed.cpp
  4. 1
      src/minidexed.h

@ -153,14 +153,13 @@ AudioEffectPlateReverb::AudioEffectPlateReverb(float32_t samplerate)
lfo2_phase_acc = 0; lfo2_phase_acc = 0;
lfo2_adder = (UINT32_MAX + 1)/(samplerate * LFO2_FREQ_HZ); lfo2_adder = (UINT32_MAX + 1)/(samplerate * LFO2_FREQ_HZ);
reverb_level = 0.0; reverb_level = 0.0f;
} }
// #define sat16(n, rshift) signed_saturate_rshift((n), 16, (rshift)) // #define sat16(n, rshift) signed_saturate_rshift((n), 16, (rshift))
void AudioEffectPlateReverb::doReverb(float32_t* audioblockL, float32_t* audioblockR, uint16_t len) void AudioEffectPlateReverb::doReverb(float32_t* blockL, float32_t* blockR, uint16_t len)
{ {
int i;
float32_t input, acc, temp1, temp2; float32_t input, acc, temp1, temp2;
uint16_t temp16; uint16_t temp16;
float32_t rv_time; float32_t rv_time;
@ -203,7 +202,7 @@ void AudioEffectPlateReverb::doReverb(float32_t* audioblockL, float32_t* audiobl
rv_time = rv_time_k; rv_time = rv_time_k;
for (i=0; i < len; i++) for (uint16_t i=0; i < len; i++)
{ {
// do the LFOs // do the LFOs
lfo1_phase_acc += lfo1_adder; lfo1_phase_acc += lfo1_adder;
@ -236,7 +235,7 @@ void AudioEffectPlateReverb::doReverb(float32_t* audioblockL, float32_t* audiobl
y += (int64_t)y1 * idx; y += (int64_t)y1 * idx;
lfo2_out_cos = (int32_t) (y >> (32-8)); // 16bit output lfo2_out_cos = (int32_t) (y >> (32-8)); // 16bit output
input = audioblockL[i] * input_attn; input = blockL[i] * input_attn;
// chained input allpasses, channel L // chained input allpasses, channel L
acc = in_allp1_bufL[in_allp1_idxL] + input * in_allp_k; acc = in_allp1_bufL[in_allp1_idxL] + input * in_allp_k;
@ -259,7 +258,7 @@ void AudioEffectPlateReverb::doReverb(float32_t* audioblockL, float32_t* audiobl
in_allp_out_L = acc; in_allp_out_L = acc;
if (++in_allp4_idxL >= sizeof(in_allp4_bufL)/sizeof(float32_t)) in_allp4_idxL = 0; if (++in_allp4_idxL >= sizeof(in_allp4_bufL)/sizeof(float32_t)) in_allp4_idxL = 0;
input = audioblockR[i] * input_attn; input = blockR[i] * input_attn;
// chained input allpasses, channel R // chained input allpasses, channel R
acc = in_allp1_bufR[in_allp1_idxR] + input * in_allp_k; acc = in_allp1_bufR[in_allp1_idxR] + input * in_allp_k;
@ -406,7 +405,7 @@ void AudioEffectPlateReverb::doReverb(float32_t* audioblockL, float32_t* audiobl
temp1 = acc - master_lowpass_l; temp1 = acc - master_lowpass_l;
master_lowpass_l += temp1 * master_lowpass_f; master_lowpass_l += temp1 * master_lowpass_f;
audioblockL[i]+=master_lowpass_l * reverb_level; blockL[i] = blockL[i] + (master_lowpass_l * reverb_level);
// Channel R // Channel R
#ifdef TAP1_MODULATED #ifdef TAP1_MODULATED
@ -450,6 +449,6 @@ void AudioEffectPlateReverb::doReverb(float32_t* audioblockL, float32_t* audiobl
temp1 = acc - master_lowpass_r; temp1 = acc - master_lowpass_r;
master_lowpass_r += temp1 * master_lowpass_f; master_lowpass_r += temp1 * master_lowpass_f;
audioblockR[i]+=master_lowpass_r * reverb_level; blockR[i] = blockR[i] + (master_lowpass_r * reverb_level);
} }
} }

@ -61,34 +61,28 @@ class AudioEffectPlateReverb
{ {
public: public:
AudioEffectPlateReverb(float32_t samplerate); AudioEffectPlateReverb(float32_t samplerate);
void doReverb(float32_t* audioblockL, float32_t* audioblockR, uint16_t len); void doReverb(float32_t* blockL, float32_t* blockR, uint16_t len);
void size(float n) void size(float n)
{ {
n = constrain(n, 0.0f, 1.0f); n = constrain(n, 0.0f, 1.0f);
n = mapfloat(n, 0.0f, 1.0f, 0.2f, rv_time_k_max); n = mapfloat(n, 0.0f, 1.0f, 0.2f, rv_time_k_max);
float32_t attn = mapfloat(n, 0.0f, rv_time_k_max, 0.5f, 0.25f); float32_t attn = mapfloat(n, 0.0f, rv_time_k_max, 0.5f, 0.25f);
//__disable_irq();
rv_time_k = n; rv_time_k = n;
input_attn = attn; input_attn = attn;
//__enable_irq();
} }
void hidamp(float n) void hidamp(float n)
{ {
n = constrain(n, 0.0f, 1.0f); n = constrain(n, 0.0f, 1.0f);
//__disable_irq();
lp_hidamp_k = 1.0f - n; lp_hidamp_k = 1.0f - n;
//__enable_irq();
} }
void lodamp(float n) void lodamp(float n)
{ {
n = constrain(n, 0.0f, 1.0f); n = constrain(n, 0.0f, 1.0f);
//__disable_irq();
lp_lodamp_k = -n; lp_lodamp_k = -n;
rv_time_scaler = 1.0f - n * 0.12f; // limit the max reverb time, otherwise it will clip rv_time_scaler = 1.0f - n * 0.12f; // limit the max reverb time, otherwise it will clip
//__enable_irq();
} }
void lowpass(float n) void lowpass(float n)
@ -102,10 +96,8 @@ public:
{ {
n = constrain(n, 0.0f, 1.0f); n = constrain(n, 0.0f, 1.0f);
n = mapfloat(n, 0.0f, 1.0f, 0.005f, 0.65f); n = mapfloat(n, 0.0f, 1.0f, 0.005f, 0.65f);
//__disable_irq();
in_allp_k = n; in_allp_k = n;
loop_allp_k = n; loop_allp_k = n;
//__enable_irq();
} }
void level(float n) void level(float n)
@ -117,6 +109,7 @@ public:
bool get_bypass(void) {return bypass;} bool get_bypass(void) {return bypass;}
void set_bypass(bool state) {bypass = state;}; void set_bypass(bool state) {bypass = state;};
void tgl_bypass(void) {bypass ^=1;} void tgl_bypass(void) {bypass ^=1;}
float32_t get_level(void) {return reverb_level;}
private: private:
bool bypass = false; bool bypass = false;
float32_t reverb_level; float32_t reverb_level;

@ -115,7 +115,7 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
#endif #endif
// BEGIN setup tg_mixer // BEGIN setup tg_mixer
tg_mixer = new AudioStereoMixer<8>(); //tg_mixer = new AudioStereoMixer<8>();
// END setup tg_mixer // END setup tg_mixer
// BEGIN setup reverb // BEGIN setup reverb
@ -124,7 +124,7 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
SetParameter (ParameterReverbHighDamp, 50); SetParameter (ParameterReverbHighDamp, 50);
SetParameter (ParameterReverbLowDamp, 50); SetParameter (ParameterReverbLowDamp, 50);
SetParameter (ParameterReverbLowPass, 30); SetParameter (ParameterReverbLowPass, 30);
SetParameter (ParameterReverbDiffusion, 65); SetParameter (ParameterReverbDiffusion, 20);
SetParameter (ParameterReverbLevel, 80); SetParameter (ParameterReverbLevel, 80);
// END setup reverb // END setup reverb
}; };
@ -702,18 +702,19 @@ void CMiniDexed::ProcessSound (void)
assert (CConfig::ToneGenerators == 8); assert (CConfig::ToneGenerators == 8);
for (uint16_t i = 0; i < nFrames; i++) // BEGIN stereo panorama
{ for (uint8_t i = 0; i < CConfig::ToneGenerators; i++)
for(uint8_t n=0; n<CConfig::ToneGenerators; n++)
{ {
SampleBuffer[indexL][i] += m_OutputLevel[n][i] * 1.0f-pan_float[n]; m_PanoramaSpinLock.Acquire ();
SampleBuffer[indexR][i] += m_OutputLevel[n][i] * pan_float[n]; 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);
m_PanoramaSpinLock.Release ();
} }
// END stereo panorama
// BEGIN adding reverb // BEGIN adding reverb
m_ReverbSpinLock.Acquire (); m_ReverbSpinLock.Acquire ();
reverb->doReverb(SampleBuffer[0],SampleBuffer[1],nFrames); reverb->doReverb(SampleBuffer[indexL],SampleBuffer[indexR],nFrames);
m_ReverbSpinLock.Release (); m_ReverbSpinLock.Release ();
// END adding reverb // END adding reverb
@ -722,12 +723,12 @@ void CMiniDexed::ProcessSound (void)
int16_t tmp_int[nFrames*2]; int16_t tmp_int[nFrames*2];
for(uint16_t i=0; i<nFrames;i++) for(uint16_t i=0; i<nFrames;i++)
{ {
tmp_float[i*2]=SampleBuffer[0][i]; tmp_float[i*2]=SampleBuffer[indexL][i];
tmp_float[(i*2)+1]=SampleBuffer[1][i]; tmp_float[(i*2)+1]=SampleBuffer[indexR][i];
} }
arm_float_to_q15(tmp_float,(q15_t*)tmp_int,nFrames*2); arm_float_to_q15(tmp_float,tmp_int,nFrames*2);
if (m_pSoundDevice->Write (tmp_int, sizeof tmp_int) != (int) sizeof tmp_int) if (m_pSoundDevice->Write (tmp_int, sizeof(tmp_int)) != (int) sizeof(tmp_int))
{ {
LOGERR ("Sound data dropped"); LOGERR ("Sound data dropped");
} }

@ -173,6 +173,7 @@ private:
AudioEffectPlateReverb* reverb; AudioEffectPlateReverb* reverb;
AudioStereoMixer<8>* tg_mixer; AudioStereoMixer<8>* tg_mixer;
CSpinLock m_PanoramaSpinLock;
CSpinLock m_ReverbSpinLock; CSpinLock m_ReverbSpinLock;
}; };

Loading…
Cancel
Save