diff --git a/src/effect_platervbstereo.cpp b/src/effect_platervbstereo.cpp index be0e8ad..dd8c9ec 100644 --- a/src/effect_platervbstereo.cpp +++ b/src/effect_platervbstereo.cpp @@ -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); } diff --git a/src/effect_platervbstereo.h b/src/effect_platervbstereo.h index 21f751b..18a6fb8 100644 --- a/src/effect_platervbstereo.h +++ b/src/effect_platervbstereo.h @@ -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 diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 64285b1..6fbc90a 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -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"); } diff --git a/src/minidexed.ini b/src/minidexed.ini index cd2123a..f2f1c6a 100644 --- a/src/minidexed.ini +++ b/src/minidexed.ini @@ -29,5 +29,5 @@ EncoderPinData=6 EncoderPinSwitch=26 # Debug -MIDIDumpEnabled=0 -ProfileEnabled=0 +MIDIDumpEnabled=1 +ProfileEnabled=1