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))
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;
float32_t input, acc, temp1, temp2;
@ -193,47 +193,16 @@ void AudioEffectPlateReverb::doReverb(uint16_t len, int16_t *inblockL, int16_t *
cleanup_done = true;
}
if (!inblockL)
memset(inblockL,0,len);
if (!inblockR)
memset(inblockR,0,len);
if (!inblock && outblock)
memset(outblock,0,len*sizeof(int16_t)*2);
return;
}
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
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 *)inblockL, input_blockL, len);
//arm_q15_to_float((q15_t *)inblockR, input_blockR, len);
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;
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
acc = in_allp1_bufL[in_allp1_idxL] + input * in_allp_k;
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;
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
acc = in_allp1_bufR[in_allp1_idxR] + input * in_allp_k;
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;
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
#ifdef TAP1_MODULATED
@ -482,12 +450,6 @@ void AudioEffectPlateReverb::doReverb(uint16_t len, int16_t *inblockL, int16_t *
// Master lowpass filter
temp1 = acc - master_lowpass_r;
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) {
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;
}
*/
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
@ -83,13 +89,13 @@ class AudioEffectPlateReverb
{
public:
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)
{
n = constrain(n, 0.0f, 1.0f);
n = my_map(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);
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);
//__disable_irq();
rv_time_k = n;
input_attn = attn;
@ -116,14 +122,14 @@ public:
void lowpass(float n)
{
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;
}
void diffusion(float n)
{
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();
in_allp_k = n;
loop_allp_k = n;
@ -136,8 +142,6 @@ public:
void tgl_bypass(void) {bypass ^=1;}
private:
bool bypass = false;
float32_t* input_blockL;
float32_t* input_blockR;
float32_t input_attn;
float32_t in_allp_k; // input allpass coeff

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

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

Loading…
Cancel
Save