Fixes for reverb.

pull/59/head
Holger Wirtz 3 years ago
parent 52e51de63a
commit c0c62916bb
  1. 56
      src/effect_platervbstereo.cpp
  2. 22
      src/effect_platervbstereo.h
  3. 18
      src/minidexed.cpp
  4. 4
      src/minidexed.ini

@ -155,7 +155,7 @@ AudioEffectPlateReverb::AudioEffectPlateReverb(float32_t samplerate)
// #define sat16(n, rshift) signed_saturate_rshift((n), 16, (rshift)) // #define sat16(n, rshift) signed_saturate_rshift((n), 16, (rshift))
void AudioEffectPlateReverb::doReverb(uint16_t len, int16_t *inblockL, int16_t *inblockR, int16_t *outblockL, int16_t *outblockR) void AudioEffectPlateReverb::doReverb(uint16_t len, int16_t inblock[][2], int16_t outblock[][2])
{ {
int i; int i;
float32_t input, acc, temp1, temp2; float32_t input, acc, temp1, temp2;
@ -193,47 +193,16 @@ void AudioEffectPlateReverb::doReverb(uint16_t len, int16_t *inblockL, int16_t *
cleanup_done = true; cleanup_done = true;
} }
if (!inblockL) if (!inblock && outblock)
memset(inblockL,0,len); memset(outblock,0,len*sizeof(int16_t)*2);
if (!inblockR)
memset(inblockR,0,len);
return; return;
} }
cleanup_done = false; cleanup_done = false;
if(!outblockL)
{
printf("Cannot allocate memory for outblockL - stopping!");
while(1);
}
if(!outblockR)
{
printf("Cannot allocate memory for outblockR - stopping!");
while(1);
}
if (!inblockL)
memset(inblockL,0,len);
if (!inblockR)
memset(inblockR,0,len);
input_blockL=(float32_t*)malloc(sizeof(float32_t)*len);
if(!input_blockL)
{
printf("Cannot allocate memory for input_blockL - stopping!");
while(1);
}
input_blockR=(float32_t*)malloc(sizeof(float32_t)*len);
if(!input_blockR)
{
printf("Cannot allocate memory for input_blockR - stopping!");
while(1);
}
// convert data to float32 // convert data to float32
arm_q15_to_float((q15_t *)inblockL, input_blockL, len); //arm_q15_to_float((q15_t *)inblockL, input_blockL, len);
arm_q15_to_float((q15_t *)inblockR, input_blockR, len); //arm_q15_to_float((q15_t *)inblockR, input_blockR, len);
rv_time = rv_time_k; rv_time = rv_time_k;
@ -270,7 +239,7 @@ void AudioEffectPlateReverb::doReverb(uint16_t len, int16_t *inblockL, int16_t *
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 = input_blockL[i] * input_attn; input = (float32_t(inblock[i][0])/32768.0f) * 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;
in_allp1_bufL[in_allp1_idxL] = input - in_allp_k * acc; in_allp1_bufL[in_allp1_idxL] = input - in_allp_k * acc;
@ -292,8 +261,7 @@ void AudioEffectPlateReverb::doReverb(uint16_t len, int16_t *inblockL, int16_t *
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 = input_blockR[i] * input_attn; input = (float32_t(inblock[i][1])/32768.0f) * 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;
in_allp1_bufR[in_allp1_idxR] = input - in_allp_k * acc; in_allp1_bufR[in_allp1_idxR] = input - in_allp_k * acc;
@ -439,7 +407,7 @@ void AudioEffectPlateReverb::doReverb(uint16_t len, int16_t *inblockL, int16_t *
temp1 = acc - master_lowpass_l; temp1 = acc - master_lowpass_l;
master_lowpass_l += temp1 * master_lowpass_f; master_lowpass_l += temp1 * master_lowpass_f;
outblockL[i] =(int16_t)(master_lowpass_l * 32767.0f); //sat16(output * 30, 0); outblock[i][0]=(int16_t)(master_lowpass_l * 32767.0f); //sat16(output * 30, 0);
// Channel R // Channel R
#ifdef TAP1_MODULATED #ifdef TAP1_MODULATED
@ -482,12 +450,6 @@ void AudioEffectPlateReverb::doReverb(uint16_t len, int16_t *inblockL, int16_t *
// Master lowpass filter // Master lowpass filter
temp1 = acc - master_lowpass_r; temp1 = acc - master_lowpass_r;
master_lowpass_r += temp1 * master_lowpass_f; master_lowpass_r += temp1 * master_lowpass_f;
outblockR[i] =(int16_t)(master_lowpass_r * 32767.0f); outblock[i][1]=(int16_t)(master_lowpass_r * 32767.0f);
} }
if(input_blockL)
free(input_blockL);
if(input_blockR)
free(input_blockR);
} }

@ -65,11 +65,17 @@ template<typename T>
inline static T max(const T& a, const T& b) { inline static T max(const T& a, const T& b) {
return a > b ? a : b; return a > b ? a : b;
} }
*/
inline long my_map(long x, long in_min, long in_max, long out_min, long out_max) { inline long maplong(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
} }
*/
inline float32_t mapfloat(float32_t val, float32_t in_min, float32_t in_max, float32_t out_min, float32_t out_max)
{
return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
/*** /***
* Loop delay modulation: comment/uncomment to switch sin/cos * Loop delay modulation: comment/uncomment to switch sin/cos
@ -83,13 +89,13 @@ class AudioEffectPlateReverb
{ {
public: public:
AudioEffectPlateReverb(float32_t samplerate); AudioEffectPlateReverb(float32_t samplerate);
void doReverb(uint16_t len, int16_t *inblockL, int16_t *inblockR, int16_t *outblockL, int16_t *outblockR); void doReverb(uint16_t len, int16_t inblock[][2], int16_t outblock[][2]);
void size(float n) void size(float n)
{ {
n = constrain(n, 0.0f, 1.0f); n = constrain(n, 0.0f, 1.0f);
n = my_map(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 = my_map(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(); //__disable_irq();
rv_time_k = n; rv_time_k = n;
input_attn = attn; input_attn = attn;
@ -116,14 +122,14 @@ public:
void lowpass(float n) void lowpass(float n)
{ {
n = constrain(n, 0.0f, 1.0f); n = constrain(n, 0.0f, 1.0f);
n = my_map(n*n*n, 0.0f, 1.0f, 0.05f, 1.0f); n = mapfloat(n*n*n, 0.0f, 1.0f, 0.05f, 1.0f);
master_lowpass_f = n; master_lowpass_f = n;
} }
void diffusion(float n) void diffusion(float n)
{ {
n = constrain(n, 0.0f, 1.0f); n = constrain(n, 0.0f, 1.0f);
n = my_map(n, 0.0f, 1.0f, 0.005f, 0.65f); n = mapfloat(n, 0.0f, 1.0f, 0.005f, 0.65f);
//__disable_irq(); //__disable_irq();
in_allp_k = n; in_allp_k = n;
loop_allp_k = n; loop_allp_k = n;
@ -136,8 +142,6 @@ public:
void tgl_bypass(void) {bypass ^=1;} void tgl_bypass(void) {bypass ^=1;}
private: private:
bool bypass = false; bool bypass = false;
float32_t* input_blockL;
float32_t* input_blockR;
float32_t input_attn; float32_t input_attn;
float32_t in_allp_k; // input allpass coeff float32_t in_allp_k; // input allpass coeff

@ -109,13 +109,14 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
} }
#endif #endif
// Create reverb object // BEGIN setup reverb
reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate()); reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate());
reverb->size(0.3); reverb->size(0.7);
reverb->hidamp(0.8); reverb->hidamp(0.8);
reverb->lodamp(0.5); reverb->lodamp(0.5);
reverb->lowpass(0.3); reverb->lowpass(0.3);
reverb->diffusion(0.2); reverb->diffusion(0.2);
// END setup reverb
}; };
bool CMiniDexed::Initialize (void) bool CMiniDexed::Initialize (void)
@ -592,17 +593,18 @@ void CMiniDexed::ProcessSound (void)
} }
} }
// Test adding reverb // BEGIN adding reverb
int16_t ReverbBuffer[nFrames][2]; int16_t ReverbBuffer[nFrames][2];
reverb->doReverb(nFrames,&SampleBuffer[0][0],&SampleBuffer[0][1],&ReverbBuffer[0][0],&ReverbBuffer[0][1]);
reverb->doReverb(nFrames,SampleBuffer,ReverbBuffer);
for (unsigned i = 0; i < nFrames; i++) for (unsigned i = 0; i < nFrames; i++)
{ {
SampleBuffer[i][0] += ReverbBuffer[0][0]; SampleBuffer[i][0] = ReverbBuffer[i][0];
SampleBuffer[i][1] += ReverbBuffer[0][1]; SampleBuffer[i][1] = ReverbBuffer[i][1];
} }
// END adding reverb
if ( m_pSoundDevice->Write (SampleBuffer, sizeof SampleBuffer) if (m_pSoundDevice->Write (SampleBuffer, sizeof SampleBuffer) != (int) sizeof SampleBuffer)
!= (int) sizeof SampleBuffer)
{ {
LOGERR ("Sound data dropped"); LOGERR ("Sound data dropped");
} }

@ -29,5 +29,5 @@ EncoderPinData=6
EncoderPinSwitch=26 EncoderPinSwitch=26
# Debug # Debug
MIDIDumpEnabled=0 MIDIDumpEnabled=1
ProfileEnabled=0 ProfileEnabled=1

Loading…
Cancel
Save