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;
}
#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<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

@ -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:

@ -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<CConfig::ToneGenerators>(pConfig->GetChunkSize()/2);
// END setup tgmixer
// 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());
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

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

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

@ -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

@ -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;
}

Loading…
Cancel
Save