Added ReverbSend Parameter for each TG.

pull/85/head
Holger Wirtz 3 years ago
parent 0124b248dc
commit 8a61ff88c3
  1. 18
      src/effect_mixer.hpp
  2. 45
      src/minidexed.cpp
  3. 8
      src/minidexed.h
  4. 9
      src/performance.ini
  5. 15
      src/performanceconfig.cpp
  6. 3
      src/performanceconfig.h
  7. 1
      src/uimenu.cpp

@ -28,6 +28,12 @@ public:
arm_fill_f32(0.0, sumbufL, len);
}
~AudioMixer()
{
if(sumbufL)
free(sumbufL);
}
void doAddMix(uint8_t channel, float32_t* in)
{
float32_t* tmp=(float32_t*)malloc(sizeof(float32_t)*buffer_length);
@ -93,6 +99,14 @@ public:
arm_fill_f32(0.0, sumbufR, buffer_length);
}
~AudioStereoMixer()
{
if(sumbufL)
free(sumbufL);
if(sumbufR)
free(sumbufR);
}
void pan(uint8_t channel, float32_t pan)
{
if (channel >= NN) return;
@ -136,11 +150,11 @@ public:
// left
if(multiplier[channel]!=UNITY_GAIN)
arm_scale_f32(inL,AudioMixer<NN>::multiplier[channel],tmp,buffer_length);
arm_scale_f32(inL,multiplier[channel],tmp,buffer_length);
arm_add_f32(sumbufL, tmp, sumbufL, buffer_length);
// right
if(multiplier[channel]!=UNITY_GAIN)
arm_scale_f32(inR,AudioMixer<NN>::multiplier[channel],tmp,buffer_length);
arm_scale_f32(inR,multiplier[channel],tmp,buffer_length);
arm_add_f32(sumbufR, tmp, sumbufR, buffer_length);
if(tmp)

@ -58,7 +58,6 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
m_nProgram[i] = 0;
m_nVolume[i] = 100;
m_nPan[i] = 64;
m_fPan[i] = 0.5f;
m_nMasterTune[i] = 0;
m_nMIDIChannel[i] = CMIDIDevice::Disabled;
@ -66,6 +65,8 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
m_nNoteLimitHigh[i] = 127;
m_nNoteShift[i] = 0;
m_nReverbSend[i] = 0;
m_pTG[i] = new CDexedAdapter (CConfig::MaxNotes, pConfig->GetSampleRate ());
assert (m_pTG[i]);
@ -119,6 +120,7 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
// END setup tgmixer
// BEGIN setup reverb
reverb_send_mixer = new AudioStereoMixer<8>(pConfig->GetChunkSize()/2);
reverb = new AudioEffectPlateReverb(pConfig->GetSampleRate());
SetParameter (ParameterReverbEnable, 1);
SetParameter (ParameterReverbSize, 70);
@ -163,7 +165,9 @@ bool CMiniDexed::Initialize (void)
m_pTG[i]->setPBController (12, 1);
m_pTG[i]->setMWController (99, 7, 0);
tg_mixer->pan(i,m_fPan[i]);
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);
}
if (m_PerformanceConfig.Load ())
@ -180,6 +184,8 @@ bool CMiniDexed::Initialize (void)
m_nNoteLimitLow[nTG] = m_PerformanceConfig.GetNoteLimitLow (nTG);
m_nNoteLimitHigh[nTG] = m_PerformanceConfig.GetNoteLimitHigh (nTG);
m_nNoteShift[nTG] = m_PerformanceConfig.GetNoteShift (nTG);
SetReverbSend (m_PerformanceConfig.GetReverbSend (nTG), nTG);
}
// Effects
@ -361,7 +367,7 @@ void CMiniDexed::SetVolume (unsigned nVolume, unsigned nTG)
m_nVolume[nTG] = nVolume;
assert (m_pTG[nTG]);
m_pTG[nTG]->setGain (nVolume / 127.0);
m_pTG[nTG]->setGain (nVolume / 127.0f);
m_UI.ParameterChanged ();
}
@ -375,7 +381,19 @@ void CMiniDexed::SetPan (unsigned nPan, unsigned nTG)
assert (nTG < CConfig::ToneGenerators);
m_nPan[nTG] = nPan;
m_fPan[nTG]=mapfloat(nPan,0,127,0.0,1.0);
m_UI.ParameterChanged ();
}
void CMiniDexed::SetReverbSend (unsigned nReverbSend, unsigned nTG)
{
if (nReverbSend > 127)
{
return;
}
assert (nTG < CConfig::ToneGenerators);
m_nReverbSend[nTG] = nReverbSend;
m_UI.ParameterChanged ();
}
@ -593,6 +611,8 @@ void CMiniDexed::SetTGParameter (TTGParameter Parameter, int nValue, unsigned nT
SetMIDIChannel ((uint8_t) nValue, nTG);
break;
case TGParameterReverbSend: SetReverbSend (nValue, nTG); break;
default:
assert (0);
break;
@ -611,6 +631,7 @@ int CMiniDexed::GetTGParameter (TTGParameter Parameter, unsigned nTG)
case TGParameterPan: return m_nPan[nTG];
case TGParameterMasterTune: return m_nMasterTune[nTG];
case TGParameterMIDIChannel: return m_nMIDIChannel[nTG];
case TGParameterReverbSend: return m_nReverbSend[nTG];
default:
assert (0);
@ -761,17 +782,14 @@ void CMiniDexed::ProcessSound (void)
// BEGIN TG mixing
for (uint8_t i = 0; i < CConfig::ToneGenerators; i++)
{
tg_mixer->doAddMix(i,m_OutputLevel[i]);
reverb_send_mixer->doAddMix(i,m_OutputLevel[i]);
}
// END TG mixing
// BEGIN create SampleBuffer for holding audio data
float32_t SampleBuffer[2][nFrames];
// init left sum output
assert (SampleBuffer[0]!=NULL);
arm_fill_f32(0.0, SampleBuffer[0], nFrames);
// init right sum output
assert (SampleBuffer[1]!=NULL);
arm_fill_f32(0.0, SampleBuffer[1], nFrames);
// END create SampleBuffer for holding audio data
// get the mix of all TGs
@ -781,9 +799,12 @@ void CMiniDexed::ProcessSound (void)
if (m_nParameter[ParameterReverbEnable])
{
float32_t ReverbBuffer[2][nFrames];
float32_t ReverbSendBuffer[2][nFrames];
reverb_send_mixer->getMix(ReverbSendBuffer[indexL], ReverbSendBuffer[indexR]);
m_ReverbSpinLock.Acquire ();
reverb->doReverb(SampleBuffer[indexL],SampleBuffer[indexR],ReverbBuffer[0], ReverbBuffer[1],nFrames);
reverb->doReverb(ReverbSendBuffer[indexL],ReverbSendBuffer[indexR],ReverbBuffer[0], ReverbBuffer[1],nFrames);
m_ReverbSpinLock.Release ();
// scale down and add left reverb buffer by reverb level
@ -833,6 +854,8 @@ bool CMiniDexed::SavePerformance (void)
m_PerformanceConfig.SetNoteLimitLow (m_nNoteLimitLow[nTG], nTG);
m_PerformanceConfig.SetNoteLimitHigh (m_nNoteLimitHigh[nTG], nTG);
m_PerformanceConfig.SetNoteShift (m_nNoteShift[nTG], nTG);
m_PerformanceConfig.SetReverbSend (m_nReverbSend[nTG], nTG);
}
m_PerformanceConfig.SetCompressorEnable (!!m_nParameter[ParameterCompressorEnable]);

@ -78,6 +78,8 @@ public:
void setPitchbend (int16_t value, unsigned nTG);
void ControllersRefresh (unsigned nTG);
void SetReverbSend (unsigned nReverbSend, unsigned nTG); // 0 .. 127
enum TParameter
{
ParameterCompressorEnable,
@ -102,6 +104,7 @@ public:
TGParameterPan,
TGParameterMasterTune,
TGParameterMIDIChannel,
TGParameterReverbSend,
TGParameterUnknown
};
@ -144,7 +147,6 @@ private:
unsigned m_nProgram[CConfig::ToneGenerators];
unsigned m_nVolume[CConfig::ToneGenerators];
unsigned m_nPan[CConfig::ToneGenerators];
float32_t m_fPan[CConfig::ToneGenerators];
int m_nMasterTune[CConfig::ToneGenerators];
unsigned m_nMIDIChannel[CConfig::ToneGenerators];
@ -152,6 +154,8 @@ private:
unsigned m_nNoteLimitHigh[CConfig::ToneGenerators];
int m_nNoteShift[CConfig::ToneGenerators];
unsigned m_nReverbSend[CConfig::ToneGenerators];
CUserInterface m_UI;
CSysExFileLoader m_SysExFileLoader;
CPerformanceConfig m_PerformanceConfig;
@ -177,8 +181,8 @@ private:
AudioEffectPlateReverb* reverb;
AudioStereoMixer<8>* tg_mixer;
AudioStereoMixer<8>* reverb_send_mixer;
CSpinLock m_PanoramaSpinLock;
CSpinLock m_ReverbSpinLock;
};

@ -12,6 +12,7 @@
#NoteLimitLow#=0 # 0 .. 127, C-2 .. G8
#NoteLimitHigh#=127 # 0 .. 127, C-2 .. G8
#NoteShift#=0 # -24 .. 24
#ReverbSend=0 # 0 .. 127
# TG1
BankNumber1=0
@ -23,6 +24,7 @@ Detune1=-11
NoteLimitLow1=0
NoteLimitHigh1=127
NoteShift1=0
ReverbSend=0
# TG2
BankNumber2=0
@ -34,6 +36,7 @@ Detune2=11
NoteLimitLow2=0
NoteLimitHigh2=127
NoteShift2=0
ReverbSend=0
# TG3
BankNumber3=0
@ -45,6 +48,7 @@ Detune3=-7
NoteLimitLow3=0
NoteLimitHigh3=127
NoteShift3=0
ReverbSend=0
# TG4
BankNumber4=0
@ -56,6 +60,7 @@ Detune4=7
NoteLimitLow4=0
NoteLimitHigh4=127
NoteShift4=0
ReverbSend=0
# TG5
BankNumber5=0
@ -67,6 +72,7 @@ Detune5=0
NoteLimitLow5=0
NoteLimitHigh5=127
NoteShift5=0
ReverbSend=0
# TG6
BankNumber6=0
@ -78,6 +84,7 @@ Detune6=0
NoteLimitLow6=0
NoteLimitHigh6=127
NoteShift6=0
ReverbSend=0
# TG7
BankNumber7=0
@ -89,6 +96,7 @@ Detune7=0
NoteLimitLow7=0
NoteLimitHigh7=127
NoteShift7=0
ReverbSend=0
# TG8
BankNumber8=0
@ -100,6 +108,7 @@ Detune8=0
NoteLimitLow8=0
NoteLimitHigh8=127
NoteShift8=0
ReverbSend=0
# Effects
#CompressorEnable=1 # 0: off, 1: on

@ -89,6 +89,9 @@ bool CPerformanceConfig::Load (void)
PropertyName.Format ("NoteShift%u", nTG+1);
m_nNoteShift[nTG] = m_Properties.GetSignedNumber (PropertyName, 0);
PropertyName.Format ("ReverbSend%u", nTG+1);
m_nReverbSend[nTG] = m_Properties.GetNumber (PropertyName, 64);
}
m_bCompressorEnable = m_Properties.GetNumber ("CompressorEnable", 1) != 0;
@ -220,6 +223,12 @@ int CPerformanceConfig::GetNoteShift (unsigned nTG) const
return m_nNoteShift[nTG];
}
unsigned CPerformanceConfig::GetReverbSend (unsigned nTG) const
{
assert (nTG < CConfig::ToneGenerators);
return m_nReverbSend[nTG];
}
void CPerformanceConfig::SetBankNumber (unsigned nValue, unsigned nTG)
{
assert (nTG < CConfig::ToneGenerators);
@ -274,6 +283,12 @@ void CPerformanceConfig::SetNoteShift (int nValue, unsigned nTG)
m_nNoteShift[nTG] = nValue;
}
void CPerformanceConfig::SetReverbSend (unsigned nValue, unsigned nTG)
{
assert (nTG < CConfig::ToneGenerators);
m_nReverbSend[nTG] = nValue;
}
bool CPerformanceConfig::GetCompressorEnable (void) const
{
return m_bCompressorEnable;

@ -47,6 +47,7 @@ public:
unsigned GetNoteLimitLow (unsigned nTG) const; // 0 .. 127
unsigned GetNoteLimitHigh (unsigned nTG) const; // 0 .. 127
int GetNoteShift (unsigned nTG) const; // -24 .. 24
unsigned GetReverbSend (unsigned nTG) const; // 0 .. 127
void SetBankNumber (unsigned nValue, unsigned nTG);
void SetVoiceNumber (unsigned nValue, unsigned nTG);
@ -57,6 +58,7 @@ public:
void SetNoteLimitLow (unsigned nValue, unsigned nTG);
void SetNoteLimitHigh (unsigned nValue, unsigned nTG);
void SetNoteShift (int nValue, unsigned nTG);
void SetReverbSend (unsigned nValue, unsigned nTG);
// Effects
bool GetCompressorEnable (void) const;
@ -89,6 +91,7 @@ private:
unsigned m_nNoteLimitLow[CConfig::ToneGenerators];
unsigned m_nNoteLimitHigh[CConfig::ToneGenerators];
int m_nNoteShift[CConfig::ToneGenerators];
int m_nReverbSend[CConfig::ToneGenerators];
bool m_bCompressorEnable;
bool m_bReverbEnable;

@ -63,6 +63,7 @@ const CUIMenu::TMenuItem CUIMenu::s_TGMenu[] =
#ifdef ARM_ALLOW_MULTI_CORE
{"Pan", EditTGParameter, 0, CMiniDexed::TGParameterPan},
#endif
{"Reverb-Send", EditTGParameter, 0, CMiniDexed::TGParameterReverbSend},
{"Detune", EditTGParameter, 0, CMiniDexed::TGParameterMasterTune},
{"Channel", EditTGParameter, 0, CMiniDexed::TGParameterMIDIChannel},
{"Edit Voice", MenuHandler, s_EditVoiceMenu},

Loading…
Cancel
Save