diff --git a/src/common.h b/src/common.h index ef6a51f..3b56b3c 100644 --- a/src/common.h +++ b/src/common.h @@ -11,11 +11,24 @@ inline float32_t mapfloat(float32_t val, float32_t in_min, float32_t in_max, flo return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } -#define constrain(amt, low, high) ({ \ - __typeof__(amt) _amt = (amt); \ - __typeof__(low) _low = (low); \ - __typeof__(high) _high = (high); \ - (_amt < _low) ? _low : ((_amt > _high) ? _high : _amt); \ -}) +inline float32_t mapfloat(int val, int in_min, int in_max, float32_t out_min, float32_t out_max) +{ + return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +#ifndef _constrain_defined_ +#define _constrain_defined_ +template +const T& constrain(const T& x, const T& a, const T& b) { + if(x < a) { + return a; + } + else if(b < x) { + return b; + } + else + return x; +} +#endif #endif diff --git a/src/effect_mixer.hpp b/src/effect_mixer.hpp index 033545e..26e062c 100644 --- a/src/effect_mixer.hpp +++ b/src/effect_mixer.hpp @@ -25,7 +25,7 @@ public: multiplier[i] = UNITY_GAIN; sumbufL=(float32_t*)malloc(sizeof(float32_t) * buffer_length); - arm_fill_f32(0.0, sumbufL, len); + arm_fill_f32(0.0f, sumbufL, len); } ~AudioMixer() @@ -78,7 +78,7 @@ public: arm_copy_f32(sumbufL, buffer, buffer_length); if(sumbufL) - arm_fill_f32(0.0, sumbufL, buffer_length); + arm_fill_f32(0.0f, sumbufL, buffer_length); } protected: @@ -96,7 +96,7 @@ public: panorama[i] = UNITY_PANORAMA; sumbufR=(float32_t*)malloc(sizeof(float32_t) * buffer_length); - arm_fill_f32(0.0, sumbufR, buffer_length); + arm_fill_f32(0.0f, sumbufR, buffer_length); } ~AudioStereoMixer() @@ -172,9 +172,9 @@ public: arm_copy_f32 (sumbufR, bufferR, buffer_length); if(sumbufL) - arm_fill_f32(0.0, sumbufL, buffer_length); + arm_fill_f32(0.0f, sumbufL, buffer_length); if(sumbufR) - arm_fill_f32(0.0, sumbufR, buffer_length); + arm_fill_f32(0.0f, sumbufR, buffer_length); } protected: diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 7c287ed..262574d 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -116,11 +116,11 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, #endif // BEGIN setup tg_mixer - tg_mixer = new AudioStereoMixer<8>(pConfig->GetChunkSize()/2); + tg_mixer = new AudioStereoMixer(pConfig->GetChunkSize()/2); // END setup tgmixer // BEGIN setup reverb - reverb_send_mixer = new AudioStereoMixer<8>(pConfig->GetChunkSize()/2); + reverb_send_mixer = new AudioStereoMixer(pConfig->GetChunkSize()/2); reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate()); SetParameter (ParameterReverbEnable, 1); SetParameter (ParameterReverbSize, 70); @@ -128,7 +128,7 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, SetParameter (ParameterReverbLowDamp, 50); SetParameter (ParameterReverbLowPass, 30); SetParameter (ParameterReverbDiffusion, 65); - SetParameter (ParameterReverbLevel, 80); + SetParameter (ParameterReverbLevel, 99); // END setup reverb SetParameter (ParameterCompressorEnable, 1); @@ -165,9 +165,10 @@ bool CMiniDexed::Initialize (void) m_pTG[i]->setPBController (12, 1); m_pTG[i]->setMWController (99, 7, 0); - tg_mixer->pan(i,m_nPan[i]/127.0f); - reverb_send_mixer->pan(i,m_nPan[i]/127.0f); - reverb_send_mixer->gain(i,m_nReverbSend[i]/127.0f); + tg_mixer->pan(i,mapfloat(m_nPan[i],0,127,0.0f,1.0f)); + tg_mixer->gain(i,1.0f); + reverb_send_mixer->pan(i,mapfloat(m_nPan[i],0,127,0.0f,1.0f)); + reverb_send_mixer->gain(i,mapfloat(m_nReverbSend[i],0,99,0.0f,1.0f)); } if (m_PerformanceConfig.Load ()) @@ -326,10 +327,7 @@ CSysExFileLoader *CMiniDexed::GetSysExFileLoader (void) void CMiniDexed::BankSelectLSB (unsigned nBankLSB, unsigned nTG) { - if (nBankLSB > 127) - { - return; - } + nBankLSB=constrain((int)nBankLSB,0,127); assert (nTG < CConfig::ToneGenerators); m_nVoiceBankID[nTG] = nBankLSB; @@ -339,10 +337,7 @@ void CMiniDexed::BankSelectLSB (unsigned nBankLSB, unsigned nTG) void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG) { - if (nProgram > 31) - { - return; - } + nProgram=constrain((int)nProgram,0,31); assert (nTG < CConfig::ToneGenerators); m_nProgram[nTG] = nProgram; @@ -358,10 +353,7 @@ void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG) void CMiniDexed::SetVolume (unsigned nVolume, unsigned nTG) { - if (nVolume > 127) - { - return; - } + nVolume=constrain((int)nVolume,0,127); assert (nTG < CConfig::ToneGenerators); m_nVolume[nTG] = nVolume; @@ -374,36 +366,32 @@ void CMiniDexed::SetVolume (unsigned nVolume, unsigned nTG) void CMiniDexed::SetPan (unsigned nPan, unsigned nTG) { - if (nPan > 127) - { - return; - } + nPan=constrain((int)nPan,0,127); assert (nTG < CConfig::ToneGenerators); m_nPan[nTG] = nPan; + tg_mixer->pan(nTG,mapfloat(nPan,-99,99,0.0f,1.0f)); + reverb_send_mixer->pan(nTG,mapfloat(nPan,-99,99,0.0f,1.0f)); + m_UI.ParameterChanged (); } void CMiniDexed::SetReverbSend (unsigned nReverbSend, unsigned nTG) { - if (nReverbSend > 127) - { - return; - } + nReverbSend=constrain((int)nReverbSend,0,99); assert (nTG < CConfig::ToneGenerators); m_nReverbSend[nTG] = nReverbSend; + + reverb_send_mixer->gain(nTG,mapfloat(nReverbSend,0,99,0.0f,1.0f)); m_UI.ParameterChanged (); } void CMiniDexed::SetMasterTune (int nMasterTune, unsigned nTG) { - if (!(-99 <= nMasterTune && nMasterTune <= 99)) - { - return; - } + constrain((int)nMasterTune,-99,99); assert (nTG < CConfig::ToneGenerators); m_nMasterTune[nTG] = nMasterTune; @@ -541,44 +529,51 @@ void CMiniDexed::SetParameter (TParameter Parameter, int nValue) break; case ParameterReverbEnable: + constrain((int)nValue,0,1); m_ReverbSpinLock.Acquire (); reverb->set_bypass (!nValue); m_ReverbSpinLock.Release (); break; case ParameterReverbSize: + constrain((int)nValue,0,99); m_ReverbSpinLock.Acquire (); - reverb->size (nValue / 99.0); + reverb->size (nValue / 99.0f); m_ReverbSpinLock.Release (); break; case ParameterReverbHighDamp: + constrain((int)nValue,0,99); m_ReverbSpinLock.Acquire (); - reverb->hidamp (nValue / 99.0); + reverb->hidamp (nValue / 99.0f); m_ReverbSpinLock.Release (); break; case ParameterReverbLowDamp: + constrain((int)nValue,0,99); m_ReverbSpinLock.Acquire (); - reverb->lodamp (nValue / 99.0); + reverb->lodamp (nValue / 99.0f); m_ReverbSpinLock.Release (); break; case ParameterReverbLowPass: + constrain((int)nValue,0,99); m_ReverbSpinLock.Acquire (); - reverb->lowpass (nValue / 99.0); + reverb->lowpass (nValue / 99.0f); m_ReverbSpinLock.Release (); break; case ParameterReverbDiffusion: + constrain((int)nValue,0,99); m_ReverbSpinLock.Acquire (); - reverb->diffusion (nValue / 99.0); + reverb->diffusion (nValue / 99.0f); m_ReverbSpinLock.Release (); break; case ParameterReverbLevel: + constrain((int)nValue,0,99); m_ReverbSpinLock.Acquire (); - reverb->level (nValue / 99.0); + reverb->level (nValue / 99.0f); m_ReverbSpinLock.Release (); break; @@ -801,18 +796,24 @@ void CMiniDexed::ProcessSound (void) float32_t ReverbBuffer[2][nFrames]; float32_t ReverbSendBuffer[2][nFrames]; - reverb_send_mixer->getMix(ReverbSendBuffer[indexL], ReverbSendBuffer[indexR]); + arm_fill_f32(0.0f, ReverbBuffer[indexL], nFrames); + arm_fill_f32(0.0f, ReverbBuffer[indexR], nFrames); + arm_fill_f32(0.0f, ReverbSendBuffer[indexR], nFrames); + arm_fill_f32(0.0f, ReverbSendBuffer[indexL], nFrames); m_ReverbSpinLock.Acquire (); - reverb->doReverb(ReverbSendBuffer[indexL],ReverbSendBuffer[indexR],ReverbBuffer[0], ReverbBuffer[1],nFrames); - m_ReverbSpinLock.Release (); + + reverb_send_mixer->getMix(ReverbSendBuffer[indexL], ReverbSendBuffer[indexR]); + reverb->doReverb(ReverbSendBuffer[indexL],ReverbSendBuffer[indexR],ReverbBuffer[indexL], ReverbBuffer[indexR],nFrames); // 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); + arm_scale_f32(ReverbBuffer[indexL], reverb->get_level(), ReverbBuffer[indexL], nFrames); + arm_add_f32(SampleBuffer[indexL], ReverbBuffer[indexL], 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); + arm_scale_f32(ReverbBuffer[indexR], reverb->get_level(), ReverbBuffer[indexR], nFrames); + arm_add_f32(SampleBuffer[indexR], ReverbBuffer[indexR], SampleBuffer[indexR], nFrames); + + m_ReverbSpinLock.Release (); } // END adding reverb diff --git a/src/minidexed.h b/src/minidexed.h index 1e9af25..ee0f288 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -180,8 +180,8 @@ private: bool m_bProfileEnabled; AudioEffectPlateReverb* reverb; - AudioStereoMixer<8>* tg_mixer; - AudioStereoMixer<8>* reverb_send_mixer; + AudioStereoMixer* tg_mixer; + AudioStereoMixer* reverb_send_mixer; CSpinLock m_ReverbSpinLock; }; diff --git a/src/minidexed.ini b/src/minidexed.ini index b9f33ce..4ecc003 100644 --- a/src/minidexed.ini +++ b/src/minidexed.ini @@ -3,6 +3,7 @@ # # Sound device +#SoundDevice=i2s SoundDevice=pwm #SoundDevice=hdmi SampleRate=48000 diff --git a/src/performance.ini b/src/performance.ini index de3dfba..f004c3f 100644 --- a/src/performance.ini +++ b/src/performance.ini @@ -12,31 +12,31 @@ #NoteLimitLow#=0 # 0 .. 127, C-2 .. G8 #NoteLimitHigh#=127 # 0 .. 127, C-2 .. G8 #NoteShift#=0 # -24 .. 24 -#ReverbSend=0 # 0 .. 127 +#ReverbSend#=0 # 0 .. 99 # TG1 BankNumber1=0 VoiceNumber1=1 MIDIChannel1=255 Volume1=100 -Pan1=32 +Pan1=0 Detune1=-11 NoteLimitLow1=0 NoteLimitHigh1=127 NoteShift1=0 -ReverbSend=0 +ReverbSend1=99 # TG2 BankNumber2=0 VoiceNumber2=1 MIDIChannel2=255 Volume2=100 -Pan2=96 +Pan2=127 Detune2=11 NoteLimitLow2=0 NoteLimitHigh2=127 NoteShift2=0 -ReverbSend=0 +ReverbSend2=70 # TG3 BankNumber3=0 @@ -48,7 +48,7 @@ Detune3=-7 NoteLimitLow3=0 NoteLimitHigh3=127 NoteShift3=0 -ReverbSend=0 +ReverbSend3=0 # TG4 BankNumber4=0 @@ -60,7 +60,7 @@ Detune4=7 NoteLimitLow4=0 NoteLimitHigh4=127 NoteShift4=0 -ReverbSend=0 +ReverbSend4=0 # TG5 BankNumber5=0 @@ -72,7 +72,7 @@ Detune5=0 NoteLimitLow5=0 NoteLimitHigh5=127 NoteShift5=0 -ReverbSend=0 +ReverbSend5=0 # TG6 BankNumber6=0 @@ -84,7 +84,7 @@ Detune6=0 NoteLimitLow6=0 NoteLimitHigh6=127 NoteShift6=0 -ReverbSend=0 +ReverbSend6=0 # TG7 BankNumber7=0 @@ -96,7 +96,7 @@ Detune7=0 NoteLimitLow7=0 NoteLimitHigh7=127 NoteShift7=0 -ReverbSend=0 +ReverbSend7=0 # TG8 BankNumber8=0 @@ -108,7 +108,7 @@ Detune8=0 NoteLimitLow8=0 NoteLimitHigh8=127 NoteShift8=0 -ReverbSend=0 +ReverbSend8=0 # Effects #CompressorEnable=1 # 0: off, 1: on @@ -128,4 +128,4 @@ ReverbHighDamp=50 ReverbLowDamp=50 ReverbLowPass=30 ReverbDiffusion=65 -ReverbLevel=80 +ReverbLevel=99 diff --git a/src/performanceconfig.cpp b/src/performanceconfig.cpp index 0021b37..c992ad3 100644 --- a/src/performanceconfig.cpp +++ b/src/performanceconfig.cpp @@ -91,7 +91,7 @@ bool CPerformanceConfig::Load (void) m_nNoteShift[nTG] = m_Properties.GetSignedNumber (PropertyName, 0); PropertyName.Format ("ReverbSend%u", nTG+1); - m_nReverbSend[nTG] = m_Properties.GetNumber (PropertyName, 64); + m_nReverbSend[nTG] = m_Properties.GetNumber (PropertyName, 50); } m_bCompressorEnable = m_Properties.GetNumber ("CompressorEnable", 1) != 0; @@ -102,7 +102,7 @@ bool CPerformanceConfig::Load (void) m_nReverbLowDamp = m_Properties.GetNumber ("ReverbLowDamp", 50); m_nReverbLowPass = m_Properties.GetNumber ("ReverbLowPass", 30); m_nReverbDiffusion = m_Properties.GetNumber ("ReverbDiffusion", 65); - m_nReverbLevel = m_Properties.GetNumber ("ReverbLevel", 80); + m_nReverbLevel = m_Properties.GetNumber ("ReverbLevel", 99); return bResult; }