diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 88861ba..b68c6c7 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -106,18 +106,20 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, memset(m_OutputLevel[i][1], 0, CConfig::MaxChunkSize * sizeof(float32_t)); #endif - m_InsertFXSpinLock[i] = new CSpinLock(); - m_InsertFX[i] = new AudioEffect(pConfig->GetSampleRate ()); m_nSendFX1[i] = 0; m_nSendFX2[i] = 0; // Active the required number of active TGs if (iGetSampleRate ()); + m_uchOPMask[i] = 0b111111; // All operators on m_pTG[i] = new CDexedAdapter (m_nPolyphony, pConfig->GetSampleRate ()); assert (m_pTG[i]); + m_MidiArpSpinLock[i] = new CSpinLock(); m_MidiArp[i] = new MidiEffect(pConfig->GetSampleRate(), m_pTG[i]); @@ -703,7 +705,7 @@ void CMiniDexed::setInsertFXType (unsigned nType, unsigned nTG) assert (nTG < CConfig::AllToneGenerators); // If the effect type is already set just return - if (m_InsertFX[nTG]->getId() == nType) { + if (m_InsertFX[nTG] != NULL && m_InsertFX[nTG]->getId() == nType) { return; } @@ -730,12 +732,15 @@ void CMiniDexed::setMidiFXType (unsigned nType, unsigned nTG) assert (nTG < CConfig::AllToneGenerators); // If the effect type is already set just return - if (m_MidiArp[nTG]->getId() == nType) { + if (m_MidiArp[nTG] != NULL && m_MidiArp[nTG]->getId() == nType) { return; } m_MidiArpSpinLock[nTG]->Acquire(); - delete m_MidiArp[nTG]; + if (m_MidiArp[nTG] != NULL) + { + delete m_MidiArp[nTG]; + } m_MidiArp[nTG] = newMidiEffect(nType, m_pConfig->GetSampleRate(), m_pTG[nTG]); m_MidiArp[nTG]->setTempo(m_nTempo); m_MidiArpSpinLock[nTG]->Release(); @@ -972,7 +977,7 @@ void CMiniDexed::setTempo(unsigned nValue) m_SendFX1->setTempo(m_nTempo); m_SendFX2->setTempo(m_nTempo); m_MasterFX->setTempo(m_nTempo); - for (unsigned nTG = 0; nTG < CConfig::AllToneGenerators; nTG++) + for (unsigned nTG = 0; nTG < m_nToneGenerators; nTG++) { m_InsertFX[nTG]->setTempo(m_nTempo); m_MidiArp[nTG]->setTempo(m_nTempo); @@ -2402,17 +2407,19 @@ void CMiniDexed::LoadPerformanceParameters(void) setPortamentoGlissando (m_PerformanceConfig.GetPortamentoGlissando (nTG), nTG); setPortamentoTime (m_PerformanceConfig.GetPortamentoTime (nTG), nTG); - setInsertFXType(m_PerformanceConfig.GetInsertFX (nTG), nTG); - std::vector pParams = m_PerformanceConfig.GetInsertFXParams(nTG); - m_InsertFX[nTG]->setParameters(pParams); - pParams.clear(); - pParams.shrink_to_fit(); - - setMidiFXType(m_PerformanceConfig.GetMidiFX (nTG), nTG); - std::vector pMidiFXParams = m_PerformanceConfig.GetMidiFXParams(nTG); - m_MidiArp[nTG]->setParameters(pMidiFXParams); - pMidiFXParams.clear(); - pMidiFXParams.shrink_to_fit(); + if (nTG < m_nToneGenerators) { + setInsertFXType(m_PerformanceConfig.GetInsertFX (nTG), nTG); + std::vector pParams = m_PerformanceConfig.GetInsertFXParams(nTG); + m_InsertFX[nTG]->setParameters(pParams); + pParams.clear(); + pParams.shrink_to_fit(); + + setMidiFXType(m_PerformanceConfig.GetMidiFX (nTG), nTG); + std::vector pMidiFXParams = m_PerformanceConfig.GetMidiFXParams(nTG); + m_MidiArp[nTG]->setParameters(pMidiFXParams); + pMidiFXParams.clear(); + pMidiFXParams.shrink_to_fit(); + } m_nNoteLimitLow[nTG] = m_PerformanceConfig.GetNoteLimitLow (nTG); m_nNoteLimitHigh[nTG] = m_PerformanceConfig.GetNoteLimitHigh (nTG);