Fixes for ReverbSend and Pan.

pull/85/head
Holger Wirtz 3 years ago
parent 8a61ff88c3
commit 4c21e517a1
  1. 25
      src/common.h
  2. 10
      src/effect_mixer.hpp
  3. 87
      src/minidexed.cpp
  4. 4
      src/minidexed.h
  5. 1
      src/minidexed.ini
  6. 24
      src/performance.ini
  7. 4
      src/performanceconfig.cpp

@ -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; return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
} }
#define constrain(amt, low, high) ({ \ inline float32_t mapfloat(int val, int in_min, int in_max, float32_t out_min, float32_t out_max)
__typeof__(amt) _amt = (amt); \ {
__typeof__(low) _low = (low); \ return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
__typeof__(high) _high = (high); \ }
(_amt < _low) ? _low : ((_amt > _high) ? _high : _amt); \
}) #ifndef _constrain_defined_
#define _constrain_defined_
template<class T>
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 #endif

@ -25,7 +25,7 @@ public:
multiplier[i] = UNITY_GAIN; multiplier[i] = UNITY_GAIN;
sumbufL=(float32_t*)malloc(sizeof(float32_t) * buffer_length); sumbufL=(float32_t*)malloc(sizeof(float32_t) * buffer_length);
arm_fill_f32(0.0, sumbufL, len); arm_fill_f32(0.0f, sumbufL, len);
} }
~AudioMixer() ~AudioMixer()
@ -78,7 +78,7 @@ public:
arm_copy_f32(sumbufL, buffer, buffer_length); arm_copy_f32(sumbufL, buffer, buffer_length);
if(sumbufL) if(sumbufL)
arm_fill_f32(0.0, sumbufL, buffer_length); arm_fill_f32(0.0f, sumbufL, buffer_length);
} }
protected: protected:
@ -96,7 +96,7 @@ public:
panorama[i] = UNITY_PANORAMA; panorama[i] = UNITY_PANORAMA;
sumbufR=(float32_t*)malloc(sizeof(float32_t) * buffer_length); 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() ~AudioStereoMixer()
@ -172,9 +172,9 @@ public:
arm_copy_f32 (sumbufR, bufferR, buffer_length); arm_copy_f32 (sumbufR, bufferR, buffer_length);
if(sumbufL) if(sumbufL)
arm_fill_f32(0.0, sumbufL, buffer_length); arm_fill_f32(0.0f, sumbufL, buffer_length);
if(sumbufR) if(sumbufR)
arm_fill_f32(0.0, sumbufR, buffer_length); arm_fill_f32(0.0f, sumbufR, buffer_length);
} }
protected: protected:

@ -116,11 +116,11 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
#endif #endif
// BEGIN setup tg_mixer // BEGIN setup tg_mixer
tg_mixer = new AudioStereoMixer<8>(pConfig->GetChunkSize()/2); tg_mixer = new AudioStereoMixer<CConfig::ToneGenerators>(pConfig->GetChunkSize()/2);
// END setup tgmixer // END setup tgmixer
// BEGIN setup reverb // BEGIN setup reverb
reverb_send_mixer = new AudioStereoMixer<8>(pConfig->GetChunkSize()/2); reverb_send_mixer = new AudioStereoMixer<CConfig::ToneGenerators>(pConfig->GetChunkSize()/2);
reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate()); reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate());
SetParameter (ParameterReverbEnable, 1); SetParameter (ParameterReverbEnable, 1);
SetParameter (ParameterReverbSize, 70); SetParameter (ParameterReverbSize, 70);
@ -128,7 +128,7 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
SetParameter (ParameterReverbLowDamp, 50); SetParameter (ParameterReverbLowDamp, 50);
SetParameter (ParameterReverbLowPass, 30); SetParameter (ParameterReverbLowPass, 30);
SetParameter (ParameterReverbDiffusion, 65); SetParameter (ParameterReverbDiffusion, 65);
SetParameter (ParameterReverbLevel, 80); SetParameter (ParameterReverbLevel, 99);
// END setup reverb // END setup reverb
SetParameter (ParameterCompressorEnable, 1); SetParameter (ParameterCompressorEnable, 1);
@ -165,9 +165,10 @@ bool CMiniDexed::Initialize (void)
m_pTG[i]->setPBController (12, 1); m_pTG[i]->setPBController (12, 1);
m_pTG[i]->setMWController (99, 7, 0); m_pTG[i]->setMWController (99, 7, 0);
tg_mixer->pan(i,m_nPan[i]/127.0f); tg_mixer->pan(i,mapfloat(m_nPan[i],0,127,0.0f,1.0f));
reverb_send_mixer->pan(i,m_nPan[i]/127.0f); tg_mixer->gain(i,1.0f);
reverb_send_mixer->gain(i,m_nReverbSend[i]/127.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 ()) if (m_PerformanceConfig.Load ())
@ -326,10 +327,7 @@ CSysExFileLoader *CMiniDexed::GetSysExFileLoader (void)
void CMiniDexed::BankSelectLSB (unsigned nBankLSB, unsigned nTG) void CMiniDexed::BankSelectLSB (unsigned nBankLSB, unsigned nTG)
{ {
if (nBankLSB > 127) nBankLSB=constrain((int)nBankLSB,0,127);
{
return;
}
assert (nTG < CConfig::ToneGenerators); assert (nTG < CConfig::ToneGenerators);
m_nVoiceBankID[nTG] = nBankLSB; m_nVoiceBankID[nTG] = nBankLSB;
@ -339,10 +337,7 @@ void CMiniDexed::BankSelectLSB (unsigned nBankLSB, unsigned nTG)
void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG) void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG)
{ {
if (nProgram > 31) nProgram=constrain((int)nProgram,0,31);
{
return;
}
assert (nTG < CConfig::ToneGenerators); assert (nTG < CConfig::ToneGenerators);
m_nProgram[nTG] = nProgram; m_nProgram[nTG] = nProgram;
@ -358,10 +353,7 @@ void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG)
void CMiniDexed::SetVolume (unsigned nVolume, unsigned nTG) void CMiniDexed::SetVolume (unsigned nVolume, unsigned nTG)
{ {
if (nVolume > 127) nVolume=constrain((int)nVolume,0,127);
{
return;
}
assert (nTG < CConfig::ToneGenerators); assert (nTG < CConfig::ToneGenerators);
m_nVolume[nTG] = nVolume; m_nVolume[nTG] = nVolume;
@ -374,36 +366,32 @@ void CMiniDexed::SetVolume (unsigned nVolume, unsigned nTG)
void CMiniDexed::SetPan (unsigned nPan, unsigned nTG) void CMiniDexed::SetPan (unsigned nPan, unsigned nTG)
{ {
if (nPan > 127) nPan=constrain((int)nPan,0,127);
{
return;
}
assert (nTG < CConfig::ToneGenerators); assert (nTG < CConfig::ToneGenerators);
m_nPan[nTG] = nPan; 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 (); m_UI.ParameterChanged ();
} }
void CMiniDexed::SetReverbSend (unsigned nReverbSend, unsigned nTG) void CMiniDexed::SetReverbSend (unsigned nReverbSend, unsigned nTG)
{ {
if (nReverbSend > 127) nReverbSend=constrain((int)nReverbSend,0,99);
{
return;
}
assert (nTG < CConfig::ToneGenerators); assert (nTG < CConfig::ToneGenerators);
m_nReverbSend[nTG] = nReverbSend; m_nReverbSend[nTG] = nReverbSend;
reverb_send_mixer->gain(nTG,mapfloat(nReverbSend,0,99,0.0f,1.0f));
m_UI.ParameterChanged (); m_UI.ParameterChanged ();
} }
void CMiniDexed::SetMasterTune (int nMasterTune, unsigned nTG) void CMiniDexed::SetMasterTune (int nMasterTune, unsigned nTG)
{ {
if (!(-99 <= nMasterTune && nMasterTune <= 99)) constrain((int)nMasterTune,-99,99);
{
return;
}
assert (nTG < CConfig::ToneGenerators); assert (nTG < CConfig::ToneGenerators);
m_nMasterTune[nTG] = nMasterTune; m_nMasterTune[nTG] = nMasterTune;
@ -541,44 +529,51 @@ void CMiniDexed::SetParameter (TParameter Parameter, int nValue)
break; break;
case ParameterReverbEnable: case ParameterReverbEnable:
constrain((int)nValue,0,1);
m_ReverbSpinLock.Acquire (); m_ReverbSpinLock.Acquire ();
reverb->set_bypass (!nValue); reverb->set_bypass (!nValue);
m_ReverbSpinLock.Release (); m_ReverbSpinLock.Release ();
break; break;
case ParameterReverbSize: case ParameterReverbSize:
constrain((int)nValue,0,99);
m_ReverbSpinLock.Acquire (); m_ReverbSpinLock.Acquire ();
reverb->size (nValue / 99.0); reverb->size (nValue / 99.0f);
m_ReverbSpinLock.Release (); m_ReverbSpinLock.Release ();
break; break;
case ParameterReverbHighDamp: case ParameterReverbHighDamp:
constrain((int)nValue,0,99);
m_ReverbSpinLock.Acquire (); m_ReverbSpinLock.Acquire ();
reverb->hidamp (nValue / 99.0); reverb->hidamp (nValue / 99.0f);
m_ReverbSpinLock.Release (); m_ReverbSpinLock.Release ();
break; break;
case ParameterReverbLowDamp: case ParameterReverbLowDamp:
constrain((int)nValue,0,99);
m_ReverbSpinLock.Acquire (); m_ReverbSpinLock.Acquire ();
reverb->lodamp (nValue / 99.0); reverb->lodamp (nValue / 99.0f);
m_ReverbSpinLock.Release (); m_ReverbSpinLock.Release ();
break; break;
case ParameterReverbLowPass: case ParameterReverbLowPass:
constrain((int)nValue,0,99);
m_ReverbSpinLock.Acquire (); m_ReverbSpinLock.Acquire ();
reverb->lowpass (nValue / 99.0); reverb->lowpass (nValue / 99.0f);
m_ReverbSpinLock.Release (); m_ReverbSpinLock.Release ();
break; break;
case ParameterReverbDiffusion: case ParameterReverbDiffusion:
constrain((int)nValue,0,99);
m_ReverbSpinLock.Acquire (); m_ReverbSpinLock.Acquire ();
reverb->diffusion (nValue / 99.0); reverb->diffusion (nValue / 99.0f);
m_ReverbSpinLock.Release (); m_ReverbSpinLock.Release ();
break; break;
case ParameterReverbLevel: case ParameterReverbLevel:
constrain((int)nValue,0,99);
m_ReverbSpinLock.Acquire (); m_ReverbSpinLock.Acquire ();
reverb->level (nValue / 99.0); reverb->level (nValue / 99.0f);
m_ReverbSpinLock.Release (); m_ReverbSpinLock.Release ();
break; break;
@ -801,18 +796,24 @@ void CMiniDexed::ProcessSound (void)
float32_t ReverbBuffer[2][nFrames]; float32_t ReverbBuffer[2][nFrames];
float32_t ReverbSendBuffer[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 (); 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 // scale down and add left reverb buffer by reverb level
arm_scale_f32(ReverbBuffer[0], reverb->get_level(), ReverbBuffer[0], nFrames); arm_scale_f32(ReverbBuffer[indexL], reverb->get_level(), ReverbBuffer[indexL], nFrames);
arm_add_f32(SampleBuffer[indexL], ReverbBuffer[0], SampleBuffer[indexL], nFrames); arm_add_f32(SampleBuffer[indexL], ReverbBuffer[indexL], SampleBuffer[indexL], nFrames);
// scale down and add right reverb buffer by reverb level // scale down and add right reverb buffer by reverb level
arm_scale_f32(ReverbBuffer[1], reverb->get_level(), ReverbBuffer[1], nFrames); arm_scale_f32(ReverbBuffer[indexR], reverb->get_level(), ReverbBuffer[indexR], nFrames);
arm_add_f32(SampleBuffer[indexR], ReverbBuffer[1], SampleBuffer[indexR], nFrames); arm_add_f32(SampleBuffer[indexR], ReverbBuffer[indexR], SampleBuffer[indexR], nFrames);
m_ReverbSpinLock.Release ();
} }
// END adding reverb // END adding reverb

@ -180,8 +180,8 @@ private:
bool m_bProfileEnabled; bool m_bProfileEnabled;
AudioEffectPlateReverb* reverb; AudioEffectPlateReverb* reverb;
AudioStereoMixer<8>* tg_mixer; AudioStereoMixer<CConfig::ToneGenerators>* tg_mixer;
AudioStereoMixer<8>* reverb_send_mixer; AudioStereoMixer<CConfig::ToneGenerators>* reverb_send_mixer;
CSpinLock m_ReverbSpinLock; CSpinLock m_ReverbSpinLock;
}; };

@ -3,6 +3,7 @@
# #
# Sound device # Sound device
#SoundDevice=i2s
SoundDevice=pwm SoundDevice=pwm
#SoundDevice=hdmi #SoundDevice=hdmi
SampleRate=48000 SampleRate=48000

@ -12,31 +12,31 @@
#NoteLimitLow#=0 # 0 .. 127, C-2 .. G8 #NoteLimitLow#=0 # 0 .. 127, C-2 .. G8
#NoteLimitHigh#=127 # 0 .. 127, C-2 .. G8 #NoteLimitHigh#=127 # 0 .. 127, C-2 .. G8
#NoteShift#=0 # -24 .. 24 #NoteShift#=0 # -24 .. 24
#ReverbSend=0 # 0 .. 127 #ReverbSend#=0 # 0 .. 99
# TG1 # TG1
BankNumber1=0 BankNumber1=0
VoiceNumber1=1 VoiceNumber1=1
MIDIChannel1=255 MIDIChannel1=255
Volume1=100 Volume1=100
Pan1=32 Pan1=0
Detune1=-11 Detune1=-11
NoteLimitLow1=0 NoteLimitLow1=0
NoteLimitHigh1=127 NoteLimitHigh1=127
NoteShift1=0 NoteShift1=0
ReverbSend=0 ReverbSend1=99
# TG2 # TG2
BankNumber2=0 BankNumber2=0
VoiceNumber2=1 VoiceNumber2=1
MIDIChannel2=255 MIDIChannel2=255
Volume2=100 Volume2=100
Pan2=96 Pan2=127
Detune2=11 Detune2=11
NoteLimitLow2=0 NoteLimitLow2=0
NoteLimitHigh2=127 NoteLimitHigh2=127
NoteShift2=0 NoteShift2=0
ReverbSend=0 ReverbSend2=70
# TG3 # TG3
BankNumber3=0 BankNumber3=0
@ -48,7 +48,7 @@ Detune3=-7
NoteLimitLow3=0 NoteLimitLow3=0
NoteLimitHigh3=127 NoteLimitHigh3=127
NoteShift3=0 NoteShift3=0
ReverbSend=0 ReverbSend3=0
# TG4 # TG4
BankNumber4=0 BankNumber4=0
@ -60,7 +60,7 @@ Detune4=7
NoteLimitLow4=0 NoteLimitLow4=0
NoteLimitHigh4=127 NoteLimitHigh4=127
NoteShift4=0 NoteShift4=0
ReverbSend=0 ReverbSend4=0
# TG5 # TG5
BankNumber5=0 BankNumber5=0
@ -72,7 +72,7 @@ Detune5=0
NoteLimitLow5=0 NoteLimitLow5=0
NoteLimitHigh5=127 NoteLimitHigh5=127
NoteShift5=0 NoteShift5=0
ReverbSend=0 ReverbSend5=0
# TG6 # TG6
BankNumber6=0 BankNumber6=0
@ -84,7 +84,7 @@ Detune6=0
NoteLimitLow6=0 NoteLimitLow6=0
NoteLimitHigh6=127 NoteLimitHigh6=127
NoteShift6=0 NoteShift6=0
ReverbSend=0 ReverbSend6=0
# TG7 # TG7
BankNumber7=0 BankNumber7=0
@ -96,7 +96,7 @@ Detune7=0
NoteLimitLow7=0 NoteLimitLow7=0
NoteLimitHigh7=127 NoteLimitHigh7=127
NoteShift7=0 NoteShift7=0
ReverbSend=0 ReverbSend7=0
# TG8 # TG8
BankNumber8=0 BankNumber8=0
@ -108,7 +108,7 @@ Detune8=0
NoteLimitLow8=0 NoteLimitLow8=0
NoteLimitHigh8=127 NoteLimitHigh8=127
NoteShift8=0 NoteShift8=0
ReverbSend=0 ReverbSend8=0
# Effects # Effects
#CompressorEnable=1 # 0: off, 1: on #CompressorEnable=1 # 0: off, 1: on
@ -128,4 +128,4 @@ ReverbHighDamp=50
ReverbLowDamp=50 ReverbLowDamp=50
ReverbLowPass=30 ReverbLowPass=30
ReverbDiffusion=65 ReverbDiffusion=65
ReverbLevel=80 ReverbLevel=99

@ -91,7 +91,7 @@ bool CPerformanceConfig::Load (void)
m_nNoteShift[nTG] = m_Properties.GetSignedNumber (PropertyName, 0); m_nNoteShift[nTG] = m_Properties.GetSignedNumber (PropertyName, 0);
PropertyName.Format ("ReverbSend%u", nTG+1); 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; m_bCompressorEnable = m_Properties.GetNumber ("CompressorEnable", 1) != 0;
@ -102,7 +102,7 @@ bool CPerformanceConfig::Load (void)
m_nReverbLowDamp = m_Properties.GetNumber ("ReverbLowDamp", 50); m_nReverbLowDamp = m_Properties.GetNumber ("ReverbLowDamp", 50);
m_nReverbLowPass = m_Properties.GetNumber ("ReverbLowPass", 30); m_nReverbLowPass = m_Properties.GetNumber ("ReverbLowPass", 30);
m_nReverbDiffusion = m_Properties.GetNumber ("ReverbDiffusion", 65); m_nReverbDiffusion = m_Properties.GetNumber ("ReverbDiffusion", 65);
m_nReverbLevel = m_Properties.GetNumber ("ReverbLevel", 80); m_nReverbLevel = m_Properties.GetNumber ("ReverbLevel", 99);
return bResult; return bResult;
} }

Loading…
Cancel
Save