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

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

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

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

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

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

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

Loading…
Cancel
Save