|
|
@ -51,6 +51,7 @@ CMiniDexed::CMiniDexed ( |
|
|
|
#ifdef ARM_ALLOW_MULTI_CORE |
|
|
|
#ifdef ARM_ALLOW_MULTI_CORE |
|
|
|
m_nActiveTGsLog2 (0), |
|
|
|
m_nActiveTGsLog2 (0), |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
m_GetChunkTimer ("GetChunk", 1000000U * pConfig->GetChunkSize ()/2 / pConfig->GetSampleRate ()), |
|
|
|
m_GetChunkTimer ("GetChunk", 1000000U * pConfig->GetChunkSize ()/2 / pConfig->GetSampleRate ()), |
|
|
|
m_bProfileEnabled (m_pConfig->GetProfileEnabled ()), |
|
|
|
m_bProfileEnabled (m_pConfig->GetProfileEnabled ()), |
|
|
|
m_bSavePerformance (false), |
|
|
|
m_bSavePerformance (false), |
|
|
@ -82,6 +83,15 @@ CMiniDexed::CMiniDexed ( |
|
|
|
m_nNoteLimitHigh[i] = 127; |
|
|
|
m_nNoteLimitHigh[i] = 127; |
|
|
|
m_nNoteShift[i] = 0; |
|
|
|
m_nNoteShift[i] = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_nModulationWheelRange[i] = 99; |
|
|
|
m_nModulationWheelRange[i] = 99; |
|
|
|
m_nModulationWheelTarget[i] = 7; |
|
|
|
m_nModulationWheelTarget[i] = 7; |
|
|
|
m_nFootControlRange[i] = 99; |
|
|
|
m_nFootControlRange[i] = 99; |
|
|
@ -318,6 +328,8 @@ bool CMiniDexed::Initialize (void) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if defined(ARM_ALLOW_MULTI_CORE) |
|
|
|
#if defined(ARM_ALLOW_MULTI_CORE) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_pSoundDevice->SetWriteFormat (SoundFormatSigned16, 2); // 16-bit Stereo
|
|
|
|
m_pSoundDevice->SetWriteFormat (SoundFormatSigned16, 2); // 16-bit Stereo
|
|
|
|
#else |
|
|
|
#else |
|
|
|
m_pSoundDevice->SetWriteFormat (SoundFormatSigned16, 1); // 16-bit Mono
|
|
|
|
m_pSoundDevice->SetWriteFormat (SoundFormatSigned16, 1); // 16-bit Mono
|
|
|
@ -510,13 +522,34 @@ void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG) |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert (m_pConfig); |
|
|
|
assert (m_pConfig); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsigned nBankOffset; |
|
|
|
|
|
|
|
bool bPCAcrossBanks = m_pConfig->GetExpandPCAcrossBanks(); |
|
|
|
|
|
|
|
if (bPCAcrossBanks) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// Note: This doesn't actually change the bank in use
|
|
|
|
|
|
|
|
// but will allow PC messages of 0..127
|
|
|
|
|
|
|
|
// to select across four consecutive banks of voices.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// So if the current bank = 5 then:
|
|
|
|
|
|
|
|
// PC 0-31 = Bank 5, Program 0-31
|
|
|
|
|
|
|
|
// PC 32-63 = Bank 6, Program 0-31
|
|
|
|
|
|
|
|
// PC 64-95 = Bank 7, Program 0-31
|
|
|
|
|
|
|
|
// PC 96-127 = Bank 8, Program 0-31
|
|
|
|
|
|
|
|
nProgram=constrain((int)nProgram,0,127); |
|
|
|
|
|
|
|
nBankOffset = nProgram >> 5; |
|
|
|
|
|
|
|
nProgram = nProgram % 32; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
nBankOffset = 0; |
|
|
|
nProgram=constrain((int)nProgram,0,31); |
|
|
|
nProgram=constrain((int)nProgram,0,31); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
assert (nTG < CConfig::ToneGenerators); |
|
|
|
assert (nTG < CConfig::ToneGenerators); |
|
|
|
m_nProgram[nTG] = nProgram; |
|
|
|
m_nProgram[nTG] = nProgram; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t Buffer[156]; |
|
|
|
uint8_t Buffer[156]; |
|
|
|
m_SysExFileLoader.GetVoice (m_nVoiceBankID[nTG], nProgram, Buffer); |
|
|
|
m_SysExFileLoader.GetVoice (m_nVoiceBankID[nTG]+nBankOffset, nProgram, Buffer); |
|
|
|
|
|
|
|
|
|
|
|
assert (m_pTG[nTG]); |
|
|
|
assert (m_pTG[nTG]); |
|
|
|
m_pTG[nTG]->loadVoiceParameters (Buffer); |
|
|
|
m_pTG[nTG]->loadVoiceParameters (Buffer); |
|
|
@ -656,6 +689,8 @@ void CMiniDexed::SetResonance (int nResonance, unsigned nTG) |
|
|
|
m_UI.ParameterChanged (); |
|
|
|
m_UI.ParameterChanged (); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CMiniDexed::SetMIDIChannel (uint8_t uchChannel, unsigned nTG) |
|
|
|
void CMiniDexed::SetMIDIChannel (uint8_t uchChannel, unsigned nTG) |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert (nTG < CConfig::ToneGenerators); |
|
|
|
assert (nTG < CConfig::ToneGenerators); |
|
|
@ -771,6 +806,7 @@ void CMiniDexed::setModWheel (uint8_t value, unsigned nTG) |
|
|
|
m_pTG[nTG]->setModWheel (value); |
|
|
|
m_pTG[nTG]->setModWheel (value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CMiniDexed::setFootController (uint8_t value, unsigned nTG) |
|
|
|
void CMiniDexed::setFootController (uint8_t value, unsigned nTG) |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert (nTG < CConfig::ToneGenerators); |
|
|
|
assert (nTG < CConfig::ToneGenerators); |
|
|
@ -808,6 +844,8 @@ void CMiniDexed::ControllersRefresh (unsigned nTG) |
|
|
|
|
|
|
|
|
|
|
|
void CMiniDexed::SetParameter (TParameter Parameter, int nValue) |
|
|
|
void CMiniDexed::SetParameter (TParameter Parameter, int nValue) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert(Parameter < TParameter::ParameterUnknown); |
|
|
|
assert(Parameter < TParameter::ParameterUnknown); |
|
|
|
|
|
|
|
|
|
|
|
m_nParameter[Parameter] = nValue; |
|
|
|
m_nParameter[Parameter] = nValue; |
|
|
@ -1812,6 +1850,8 @@ void CMiniDexed::ProcessSound (void) |
|
|
|
uint8_t indexL=0, indexR=1; |
|
|
|
uint8_t indexL=0, indexR=1; |
|
|
|
|
|
|
|
|
|
|
|
// BEGIN TG mixing
|
|
|
|
// BEGIN TG mixing
|
|
|
|
|
|
|
|
float32_t tmp_float[nFrames*2]; |
|
|
|
|
|
|
|
|
|
|
|
if(nMasterVolume > 0.0f) |
|
|
|
if(nMasterVolume > 0.0f) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (uint8_t i = 0; i < CConfig::ToneGenerators; i++) |
|
|
|
for (uint8_t i = 0; i < CConfig::ToneGenerators; i++) |
|
|
@ -2315,6 +2355,11 @@ void CMiniDexed::getSysExVoiceDump(uint8_t* dest, uint8_t nTG) |
|
|
|
void CMiniDexed::setMasterVolume (float32_t vol) |
|
|
|
void CMiniDexed::setMasterVolume (float32_t vol) |
|
|
|
{ |
|
|
|
{ |
|
|
|
this->nMasterVolume = constrain(vol, 0.0f, 1.0f); |
|
|
|
this->nMasterVolume = constrain(vol, 0.0f, 1.0f); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::string CMiniDexed::GetPerformanceFileName(unsigned nID) |
|
|
|
std::string CMiniDexed::GetPerformanceFileName(unsigned nID) |
|
|
@ -2375,7 +2420,7 @@ bool CMiniDexed::DoSetNewPerformance (void) |
|
|
|
|
|
|
|
|
|
|
|
bool CMiniDexed::SavePerformanceNewFile () |
|
|
|
bool CMiniDexed::SavePerformanceNewFile () |
|
|
|
{ |
|
|
|
{ |
|
|
|
m_bSavePerformanceNewFile = m_PerformanceConfig.GetInternalFolderOk(); |
|
|
|
m_bSavePerformanceNewFile = m_PerformanceConfig.GetInternalFolderOk() && m_PerformanceConfig.CheckFreePerformanceSlot(); |
|
|
|
return m_bSavePerformanceNewFile; |
|
|
|
return m_bSavePerformanceNewFile; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -2404,7 +2449,8 @@ void CMiniDexed::LoadPerformanceParameters(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (unsigned nTG = 0; nTG < CConfig::ToneGenerators; nTG++) |
|
|
|
for (unsigned nTG = 0; nTG < CConfig::ToneGenerators; nTG++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
BankSelectLSB (m_PerformanceConfig.GetBankNumber (nTG), nTG); |
|
|
|
|
|
|
|
|
|
|
|
BankSelect (m_PerformanceConfig.GetBankNumber (nTG), nTG); |
|
|
|
ProgramChange (m_PerformanceConfig.GetVoiceNumber (nTG), nTG); |
|
|
|
ProgramChange (m_PerformanceConfig.GetVoiceNumber (nTG), nTG); |
|
|
|
SetMIDIChannel (m_PerformanceConfig.GetMIDIChannel (nTG), nTG); |
|
|
|
SetMIDIChannel (m_PerformanceConfig.GetMIDIChannel (nTG), nTG); |
|
|
|
SetVolume (m_PerformanceConfig.GetVolume (nTG), nTG); |
|
|
|
SetVolume (m_PerformanceConfig.GetVolume (nTG), nTG); |
|
|
@ -2422,6 +2468,24 @@ void CMiniDexed::LoadPerformanceParameters(void) |
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(m_PerformanceConfig.VoiceDataFilled(nTG))
|
|
|
|
if(m_PerformanceConfig.VoiceDataFilled(nTG))
|
|
|
|
{ |
|
|
|
{ |
|
|
|
uint8_t* tVoiceData = m_PerformanceConfig.GetVoiceDataFromTxt(nTG); |
|
|
|
uint8_t* tVoiceData = m_PerformanceConfig.GetVoiceDataFromTxt(nTG); |
|
|
@ -2429,6 +2493,7 @@ void CMiniDexed::LoadPerformanceParameters(void) |
|
|
|
} |
|
|
|
} |
|
|
|
setMonoMode(m_PerformanceConfig.GetMonoMode(nTG) ? 1 : 0, nTG);
|
|
|
|
setMonoMode(m_PerformanceConfig.GetMonoMode(nTG) ? 1 : 0, nTG);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this->SetParameter(TParameter::ParameterCompressorEnable, this->m_PerformanceConfig.GetCompressorEnable()); |
|
|
|
this->SetParameter(TParameter::ParameterCompressorEnable, this->m_PerformanceConfig.GetCompressorEnable()); |
|
|
|
#if defined(MIXING_CONSOLE_ENABLE) |
|
|
|
#if defined(MIXING_CONSOLE_ENABLE) |
|
|
|
for(size_t fx = 0; fx < MixerOutput::kFXCount; ++fx) |
|
|
|
for(size_t fx = 0; fx < MixerOutput::kFXCount; ++fx) |
|
|
@ -2738,5 +2803,4 @@ unsigned CMiniDexed::getModController (unsigned controller, unsigned parameter, |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|