From ded7db2d3589f4821e8238b455cb081e26db5662 Mon Sep 17 00:00:00 2001 From: probonopd Date: Wed, 20 Apr 2022 06:57:49 +0000 Subject: [PATCH] Allow enabling and disabling operators, closes #111 Thanks @rsta2 --- src/dexedadapter.h | 2 ++ src/minidexed.cpp | 20 ++++++++++++++++++-- src/minidexed.h | 3 ++- src/uimenu.cpp | 4 +++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/dexedadapter.h b/src/dexedadapter.h index be04f42..573e80e 100644 --- a/src/dexedadapter.h +++ b/src/dexedadapter.h @@ -25,6 +25,8 @@ #include #include +#define DEXED_OP_ENABLE (DEXED_OP_OSC_DETUNE + 1) + // Some Dexed methods require to be guarded from being interrupted // by other Dexed calls. This is done herein. diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 0858c54..dccc2f8 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -68,6 +68,7 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, m_nNoteShift[i] = 0; m_nReverbSend[i] = 0; + m_uchOPMask[i] = 0b111111; // All operators on m_pTG[i] = new CDexedAdapter (CConfig::MaxNotes, pConfig->GetSampleRate ()); assert (m_pTG[i]); @@ -682,7 +683,14 @@ void CMiniDexed::SetVoiceParameter (uint8_t uchOffset, uint8_t uchValue, unsigne uchOffset += nOP * 21; assert (uchOffset < 156); - m_pTG[nTG]->setVoiceDataElement (uchOffset, uchValue); + if (nOP < 6 && uchOffset == DEXED_OP_ENABLE) + { + // https://github.com/probonopd/MiniDexed/issues/111#issuecomment-1103319499 + m_pTG[nTG]->setVoiceDataElement (uchOffset, uchValue); + m_pTG[nTG]->setOPAll(m_uchOPMask[nTG]); + } else { + m_pTG[nTG]->setVoiceDataElement (uchOffset, uchValue); + } } uint8_t CMiniDexed::GetVoiceParameter (uint8_t uchOffset, unsigned nOP, unsigned nTG) @@ -699,7 +707,15 @@ uint8_t CMiniDexed::GetVoiceParameter (uint8_t uchOffset, unsigned nOP, unsigned uchOffset += nOP * 21; assert (uchOffset < 156); - return m_pTG[nTG]->getVoiceDataElement (uchOffset); + if (nOP < 6 && uchOffset == DEXED_OP_ENABLE) + { + // https://github.com/probonopd/MiniDexed/issues/111#issuecomment-1103319499 + // In this case the bit for the respective operator + // in m_uchOPMask[] must be returned (0 or 1) + return 1 == ( (m_pTG[nTG]->getVoiceDataElement (uchOffset) >> nTG) & 1); + } else { + return m_pTG[nTG]->getVoiceDataElement (uchOffset); + } } std::string CMiniDexed::GetVoiceName (unsigned nTG) diff --git a/src/minidexed.h b/src/minidexed.h index ade7ddb..c941ea9 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -81,7 +81,8 @@ public: void ControllersRefresh (unsigned nTG); void SetReverbSend (unsigned nReverbSend, unsigned nTG); // 0 .. 127 - + uint8_t m_uchOPMask[CConfig::ToneGenerators]; + enum TParameter { ParameterCompressorEnable, diff --git a/src/uimenu.cpp b/src/uimenu.cpp index b03b6aa..1dc3c58 100644 --- a/src/uimenu.cpp +++ b/src/uimenu.cpp @@ -151,6 +151,7 @@ const CUIMenu::TMenuItem CUIMenu::s_OperatorMenu[] = {"Rate Scaling",EditOPParameter, 0, DEXED_OP_OSC_RATE_SCALE}, {"A Mod Sens.", EditOPParameter, 0, DEXED_OP_AMP_MOD_SENS}, {"K Vel. Sens.",EditOPParameter, 0, DEXED_OP_KEY_VEL_SENS}, + {"Enable", EditOPParameter, 0, DEXED_OP_ENABLE}, {0} }; @@ -234,7 +235,8 @@ const CUIMenu::TParameter CUIMenu::s_OPParameter[] = {0, 1, 1, ToOscillatorMode}, // DEXED_OP_OSC_MODE {0, 31, 1}, // DEXED_OP_FREQ_COARSE {0, 99, 1}, // DEXED_OP_FREQ_FINE - {0, 14, 1, ToOscillatorDetune} // DEXED_OP_OSC_DETUNE + {0, 14, 1, ToOscillatorDetune}, // DEXED_OP_OSC_DETUNE + {0, 1, 1, ToOnOff} // DEXED_OP_ENABLE }; const char CUIMenu::s_NoteName[100][4] =