Allow enabling and disabling operators, closes #111

Thanks @rsta2
pull/118/head
probonopd 3 years ago committed by GitHub
parent 43d1b3ab93
commit ded7db2d35
  1. 2
      src/dexedadapter.h
  2. 20
      src/minidexed.cpp
  3. 3
      src/minidexed.h
  4. 4
      src/uimenu.cpp

@ -25,6 +25,8 @@
#include <circle/spinlock.h>
#include <stdint.h>
#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.

@ -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)

@ -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,

@ -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] =

Loading…
Cancel
Save