diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 51e6444..2b43caa 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -70,10 +70,12 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, m_bSavePerformance (false), m_bSavePerformanceNewFile (false), m_bSetNewPerformance (false), + m_bSetNewPerformance2 (false), m_bSetNewPerformanceBank (false), m_bSetFirstPerformance (false), m_bDeletePerformance (false), m_bLoadPerformanceBusy(false), + m_bLoadPerformanceBusy2(false), m_bLoadPerformanceBankBusy(false) { assert (m_pConfig); @@ -329,7 +331,7 @@ bool CMiniDexed::Initialize (void) m_PerformanceConfig.Init(m_nToneGenerators); if (m_PerformanceConfig.Load ()) { - LoadPerformanceParameters(); + LoadPerformanceParameters(0); } else { @@ -447,6 +449,16 @@ void CMiniDexed::Process (bool bPlugAndPlayUpdated) } pScheduler->Yield(); } + + if (m_bSetNewPerformance2 && !m_bSetNewPerformanceBank && !m_bLoadPerformanceBusy2 && !m_bLoadPerformanceBankBusy) + { + DoSetNewPerformance2 (); + if (m_nSetNewPerformanceID2 == GetActualPerformanceID()) + { + m_bSetNewPerformance2 = false; + } + pScheduler->Yield(); + } if(m_bDeletePerformance) { @@ -1945,6 +1957,14 @@ bool CMiniDexed::SetNewPerformance(unsigned nID) return true; } +bool CMiniDexed::SetNewPerformance2(unsigned nID) +{ + m_bSetNewPerformance2 = true; + m_nSetNewPerformanceID2 = nID; + + return true; +} + bool CMiniDexed::SetNewPerformanceBank(unsigned nBankID) { m_bSetNewPerformanceBank = true; @@ -1968,7 +1988,7 @@ bool CMiniDexed::DoSetNewPerformance (void) if (m_PerformanceConfig.Load ()) { - LoadPerformanceParameters(); + LoadPerformanceParameters(0); m_bLoadPerformanceBusy = false; return true; } @@ -1980,6 +2000,27 @@ bool CMiniDexed::DoSetNewPerformance (void) } } +bool CMiniDexed::DoSetNewPerformance2 (void) +{ + m_bLoadPerformanceBusy2 = true; + + unsigned nID = m_nSetNewPerformanceID2; + m_PerformanceConfig.SetNewPerformance(nID); + + if (m_PerformanceConfig.Load ()) + { + LoadPerformanceParameters(1); + m_bLoadPerformanceBusy2 = false; + return true; + } + else + { + SetMIDIChannel (CMIDIDevice::OmniMode, 0); + m_bLoadPerformanceBusy2 = false; + return false; + } +} + bool CMiniDexed::DoSetNewPerformanceBank (void) { m_bLoadPerformanceBankBusy = true; @@ -2026,50 +2067,63 @@ bool CMiniDexed::DoSavePerformanceNewFile (void) } -void CMiniDexed::LoadPerformanceParameters(void) +void CMiniDexed::LoadPerformanceParameters(unsigned part) { for (unsigned nTG = 0; nTG < CConfig::AllToneGenerators; nTG++) { - - BankSelect (m_PerformanceConfig.GetBankNumber (nTG), nTG); - ProgramChange (m_PerformanceConfig.GetVoiceNumber (nTG), nTG); - SetMIDIChannel (m_PerformanceConfig.GetMIDIChannel (nTG), nTG); - SetVolume (m_PerformanceConfig.GetVolume (nTG), nTG); - SetPan (m_PerformanceConfig.GetPan (nTG), nTG); - SetMasterTune (m_PerformanceConfig.GetDetune (nTG), nTG); - SetCutoff (m_PerformanceConfig.GetCutoff (nTG), nTG); - SetResonance (m_PerformanceConfig.GetResonance (nTG), nTG); - setPitchbendRange (m_PerformanceConfig.GetPitchBendRange (nTG), nTG); - setPitchbendStep (m_PerformanceConfig.GetPitchBendStep (nTG), nTG); - setPortamentoMode (m_PerformanceConfig.GetPortamentoMode (nTG), nTG); - setPortamentoGlissando (m_PerformanceConfig.GetPortamentoGlissando (nTG), nTG); - setPortamentoTime (m_PerformanceConfig.GetPortamentoTime (nTG), nTG); - - m_nNoteLimitLow[nTG] = m_PerformanceConfig.GetNoteLimitLow (nTG); - m_nNoteLimitHigh[nTG] = m_PerformanceConfig.GetNoteLimitHigh (nTG); - m_nNoteShift[nTG] = m_PerformanceConfig.GetNoteShift (nTG); + unsigned nTargetTG = part * 8 + nTG; + unsigned nChannel = m_PerformanceConfig.GetMIDIChannel (nTG); + + if (nTargetTG >= CConfig::AllToneGenerators) + break; + + if (part == 0 && nTG >= 8 && nChannel == CMIDIDevice::Disabled) + continue; + + if (part == 1 && nChannel + 8 < CMIDIDevice::Channels) + nChannel += 8; + + BankSelect (m_PerformanceConfig.GetBankNumber (nTG), nTargetTG); + ProgramChange (m_PerformanceConfig.GetVoiceNumber (nTG), nTargetTG); + SetMIDIChannel (nChannel, nTargetTG); + SetVolume (m_PerformanceConfig.GetVolume (nTG), nTargetTG); + SetPan (m_PerformanceConfig.GetPan (nTG), nTargetTG); + SetMasterTune (m_PerformanceConfig.GetDetune (nTG), nTargetTG); + SetCutoff (m_PerformanceConfig.GetCutoff (nTG), nTargetTG); + SetResonance (m_PerformanceConfig.GetResonance (nTG), nTargetTG); + setPitchbendRange (m_PerformanceConfig.GetPitchBendRange (nTG), nTargetTG); + setPitchbendStep (m_PerformanceConfig.GetPitchBendStep (nTG), nTargetTG); + setPortamentoMode (m_PerformanceConfig.GetPortamentoMode (nTG), nTargetTG); + setPortamentoGlissando (m_PerformanceConfig.GetPortamentoGlissando (nTG), nTargetTG); + setPortamentoTime (m_PerformanceConfig.GetPortamentoTime (nTG), nTargetTG); + + m_nNoteLimitLow[nTargetTG] = m_PerformanceConfig.GetNoteLimitLow (nTG); + m_nNoteLimitHigh[nTargetTG] = m_PerformanceConfig.GetNoteLimitHigh (nTG); + m_nNoteShift[nTargetTG] = m_PerformanceConfig.GetNoteShift (nTG); if(m_PerformanceConfig.VoiceDataFilled(nTG)) { uint8_t* tVoiceData = m_PerformanceConfig.GetVoiceDataFromTxt(nTG); - m_pTG[nTG]->loadVoiceParameters(tVoiceData); - setOPMask(0b111111, nTG); + m_pTG[nTargetTG]->loadVoiceParameters(tVoiceData); + setOPMask(0b111111, nTargetTG); } - setMonoMode(m_PerformanceConfig.GetMonoMode(nTG) ? 1 : 0, nTG); - SetReverbSend (m_PerformanceConfig.GetReverbSend (nTG), nTG); + setMonoMode(m_PerformanceConfig.GetMonoMode(nTG) ? 1 : 0, nTargetTG); + SetReverbSend (m_PerformanceConfig.GetReverbSend (nTG), nTargetTG); - setModWheelRange (m_PerformanceConfig.GetModulationWheelRange (nTG), nTG); - setModWheelTarget (m_PerformanceConfig.GetModulationWheelTarget (nTG), nTG); - setFootControllerRange (m_PerformanceConfig.GetFootControlRange (nTG), nTG); - setFootControllerTarget (m_PerformanceConfig.GetFootControlTarget (nTG), nTG); - setBreathControllerRange (m_PerformanceConfig.GetBreathControlRange (nTG), nTG); - setBreathControllerTarget (m_PerformanceConfig.GetBreathControlTarget (nTG), nTG); - setAftertouchRange (m_PerformanceConfig.GetAftertouchRange (nTG), nTG); - setAftertouchTarget (m_PerformanceConfig.GetAftertouchTarget (nTG), nTG); + setModWheelRange (m_PerformanceConfig.GetModulationWheelRange (nTG), nTargetTG); + setModWheelTarget (m_PerformanceConfig.GetModulationWheelTarget (nTG), nTargetTG); + setFootControllerRange (m_PerformanceConfig.GetFootControlRange (nTG), nTargetTG); + setFootControllerTarget (m_PerformanceConfig.GetFootControlTarget (nTG), nTargetTG); + setBreathControllerRange (m_PerformanceConfig.GetBreathControlRange (nTG), nTargetTG); + setBreathControllerTarget (m_PerformanceConfig.GetBreathControlTarget (nTG), nTargetTG); + setAftertouchRange (m_PerformanceConfig.GetAftertouchRange (nTG), nTargetTG); + setAftertouchTarget (m_PerformanceConfig.GetAftertouchTarget (nTG), nTargetTG); } + if (part == 0) + { // Effects SetParameter (ParameterCompressorEnable, m_PerformanceConfig.GetCompressorEnable () ? 1 : 0); SetParameter (ParameterReverbEnable, m_PerformanceConfig.GetReverbEnable () ? 1 : 0); @@ -2079,8 +2133,9 @@ void CMiniDexed::LoadPerformanceParameters(void) SetParameter (ParameterReverbLowPass, m_PerformanceConfig.GetReverbLowPass ()); SetParameter (ParameterReverbDiffusion, m_PerformanceConfig.GetReverbDiffusion ()); SetParameter (ParameterReverbLevel, m_PerformanceConfig.GetReverbLevel ()); + } - m_UI.DisplayChanged (); + m_UI.DisplayChanged (); } std::string CMiniDexed::GetNewPerformanceDefaultName(void) @@ -2137,7 +2192,7 @@ bool CMiniDexed::DoDeletePerformance(void) { if (m_PerformanceConfig.Load ()) { - LoadPerformanceParameters(); + LoadPerformanceParameters(0); return true; } else diff --git a/src/minidexed.h b/src/minidexed.h index 1658482..143e3f4 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -141,6 +141,7 @@ public: unsigned GetActualPerformanceBankID(); void SetActualPerformanceBankID(unsigned nBankID); bool SetNewPerformance(unsigned nID); + bool SetNewPerformance2(unsigned nID); bool SetNewPerformanceBank(unsigned nBankID); void SetFirstPerformance(void); void DoSetFirstPerformance(void); @@ -148,6 +149,7 @@ public: bool DoSavePerformanceNewFile (void); bool DoSetNewPerformance (void); + bool DoSetNewPerformance2 (void); bool DoSetNewPerformanceBank (void); bool GetPerformanceSelectToLoad(void); bool SavePerformance (bool bSaveAsDeault); @@ -247,7 +249,7 @@ public: private: int16_t ApplyNoteLimits (int16_t pitch, unsigned nTG); // returns < 0 to ignore note uint8_t m_uchOPMask[CConfig::AllToneGenerators]; - void LoadPerformanceParameters(void); + void LoadPerformanceParameters(unsigned part); void ProcessSound (void); const char* GetNetworkDeviceShortName() const; @@ -355,13 +357,16 @@ private: bool m_bSavePerformance; bool m_bSavePerformanceNewFile; bool m_bSetNewPerformance; - unsigned m_nSetNewPerformanceID; + bool m_bSetNewPerformance2; + unsigned m_nSetNewPerformanceID; + unsigned m_nSetNewPerformanceID2; bool m_bSetNewPerformanceBank; unsigned m_nSetNewPerformanceBankID; bool m_bSetFirstPerformance; bool m_bDeletePerformance; unsigned m_nDeletePerformanceID; bool m_bLoadPerformanceBusy; + bool m_bLoadPerformanceBusy2; bool m_bLoadPerformanceBankBusy; bool m_bSaveAsDeault; }; diff --git a/src/uimenu.cpp b/src/uimenu.cpp index e8342c8..811bc93 100644 --- a/src/uimenu.cpp +++ b/src/uimenu.cpp @@ -338,6 +338,7 @@ static const unsigned NoteC3 = 39; const CUIMenu::TMenuItem CUIMenu::s_PerformanceMenu[] = { {"Load", PerformanceMenu, 0, 0}, + {"Load Part 2", PerformanceMenu, 0, 2}, {"Save", MenuHandler, s_SaveMenu}, {"Delete", PerformanceMenu, 0, 1}, {"Bank", EditPerformanceBankNumber, 0, 0}, @@ -1616,6 +1617,10 @@ void CUIMenu::PerformanceMenu (CUIMenu *pUIMenu, TMenuEvent Event) { pUIMenu->m_pMiniDexed->SetNewPerformance(nValue); } + if (!bPerformanceSelectToLoad && pUIMenu->m_nCurrentParameter==2) + { + pUIMenu->m_pMiniDexed->SetNewPerformance2(nValue); + } break; case MenuEventStepUp: @@ -1636,6 +1641,10 @@ void CUIMenu::PerformanceMenu (CUIMenu *pUIMenu, TMenuEvent Event) { pUIMenu->m_pMiniDexed->SetNewPerformance(nValue); } + if (!bPerformanceSelectToLoad && pUIMenu->m_nCurrentParameter==2) + { + pUIMenu->m_pMiniDexed->SetNewPerformance2(nValue); + } break; case MenuEventPressAndStepDown: @@ -1690,6 +1699,13 @@ void CUIMenu::PerformanceMenu (CUIMenu *pUIMenu, TMenuEvent Event) pUIMenu->m_bPerformanceDeleteMode=true; pUIMenu->m_bConfirmDeletePerformance=false; } + break; + case 2: + if (bPerformanceSelectToLoad) + { + pUIMenu->m_pMiniDexed->SetNewPerformance2(nValue); + } + break; default: break;