Apply voice change in TG to auxiliary TGs

unison
probonopd 1 week ago
parent c114768ec7
commit c55fa12135
  1. 52
      src/minidexed.cpp

@ -679,6 +679,29 @@ void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG)
m_pTG[nTG]->loadVoiceParameters (Buffer); m_pTG[nTG]->loadVoiceParameters (Buffer);
setOPMask(0b111111, nTG); setOPMask(0b111111, nTG);
// Propagate to auxiliary TGs for unison
unsigned unisonVoices = m_nUnisonVoices[nTG];
if (unisonVoices < 1) unisonVoices = 1;
int baseDetune = m_nMasterTune[nTG];
unsigned basePan = m_nPan[nTG];
unsigned unisonDetune = m_nUnisonDetune[nTG];
unsigned unisonSpread = m_nUnisonSpread[nTG];
for (unsigned v = 0; v < unisonVoices; ++v) {
unsigned physicalTG = getPhysicalTG(nTG, v, unisonVoices);
if (physicalTG == nTG || physicalTG >= m_nToneGenerators) continue;
m_pTG[physicalTG]->loadVoiceParameters(Buffer);
setOPMask(0b111111, physicalTG);
// Apply per-voice detune and pan
float detuneOffset = ((float)v - (unisonVoices - 1) / 2.0f) * (float)unisonDetune;
float panOffset = ((float)v - (unisonVoices - 1) / 2.0f) * (float)unisonSpread;
int detune = baseDetune + (int)detuneOffset;
unsigned pan = basePan + (int)panOffset;
detune = constrain(detune, -99, 99);
pan = constrain((int)pan, 0, 127);
m_pTG[physicalTG]->setMasterTune((int8_t)detune);
tg_mixer->pan(physicalTG, mapfloat(pan, 0, 127, 0.0f, 1.0f));
}
if (m_pConfig->GetMIDIAutoVoiceDumpOnPC()) if (m_pConfig->GetMIDIAutoVoiceDumpOnPC())
{ {
// Only do the voice dump back out over MIDI if we have a specific // Only do the voice dump back out over MIDI if we have a specific
@ -1636,9 +1659,9 @@ bool CMiniDexed::DoSavePerformance (void)
m_PerformanceConfig.SetPortamentoGlissando (m_nPortamentoGlissando[nTG], nTG); m_PerformanceConfig.SetPortamentoGlissando (m_nPortamentoGlissando[nTG], nTG);
m_PerformanceConfig.SetPortamentoTime (m_nPortamentoTime[nTG], nTG); m_PerformanceConfig.SetPortamentoTime (m_nPortamentoTime[nTG], nTG);
m_PerformanceConfig.SetNoteLimitLow (m_nNoteLimitLow[nTG], nTG); m_nNoteLimitLow[nTG] = m_PerformanceConfig.GetNoteLimitLow (nTG);
m_PerformanceConfig.SetNoteLimitHigh (m_nNoteLimitHigh[nTG], nTG); m_nNoteLimitHigh[nTG] = m_PerformanceConfig.GetNoteLimitHigh (nTG);
m_PerformanceConfig.SetNoteShift (m_nNoteShift[nTG], nTG); m_nNoteShift[nTG] = m_PerformanceConfig.GetNoteShift (nTG);
if (nTG < m_pConfig->GetToneGenerators()) if (nTG < m_pConfig->GetToneGenerators())
{ {
m_pTG[nTG]->getVoiceData(m_nRawVoiceData); m_pTG[nTG]->getVoiceData(m_nRawVoiceData);
@ -1903,11 +1926,30 @@ void CMiniDexed::loadVoiceParameters(const uint8_t* data, uint8_t nTG)
m_pTG[nTG]->loadVoiceParameters(&voice[6]); m_pTG[nTG]->loadVoiceParameters(&voice[6]);
m_pTG[nTG]->doRefreshVoice(); m_pTG[nTG]->doRefreshVoice();
setOPMask(0b111111, nTG); setOPMask(0b111111, nTG);
FOR_AUX_UNISON_TGS(nTG, {
// Propagate to auxiliary TGs for unison
unsigned unisonVoices = m_nUnisonVoices[nTG];
if (unisonVoices < 1) unisonVoices = 1;
int baseDetune = m_nMasterTune[nTG];
unsigned basePan = m_nPan[nTG];
unsigned unisonDetune = m_nUnisonDetune[nTG];
unsigned unisonSpread = m_nUnisonSpread[nTG];
for (unsigned v = 0; v < unisonVoices; ++v) {
unsigned physicalTG = getPhysicalTG(nTG, v, unisonVoices);
if (physicalTG == nTG || physicalTG >= m_nToneGenerators) continue;
m_pTG[physicalTG]->loadVoiceParameters(&voice[6]); m_pTG[physicalTG]->loadVoiceParameters(&voice[6]);
m_pTG[physicalTG]->doRefreshVoice(); m_pTG[physicalTG]->doRefreshVoice();
setOPMask(0b111111, physicalTG); setOPMask(0b111111, physicalTG);
}) // Apply per-voice detune and pan
float detuneOffset = ((float)v - (unisonVoices - 1) / 2.0f) * (float)unisonDetune;
float panOffset = ((float)v - (unisonVoices - 1) / 2.0f) * (float)unisonSpread;
int detune = baseDetune + (int)detuneOffset;
unsigned pan = basePan + (int)panOffset;
detune = constrain(detune, -99, 99);
pan = constrain((int)pan, 0, 127);
m_pTG[physicalTG]->setMasterTune((int8_t)detune);
tg_mixer->pan(physicalTG, mapfloat(pan, 0, 127, 0.0f, 1.0f));
}
m_UI.ParameterChanged (); m_UI.ParameterChanged ();
} }

Loading…
Cancel
Save