Fix for Issue #460 implements MIDI Bank Select MSB/LSB based on PR #395 submitted by @abscisys

pull/461/head
diyelectromusic 1 year ago
parent c487ffd28f
commit 65159b014e
  1. 6
      src/mididevice.cpp
  2. 42
      src/minidexed.cpp
  3. 4
      src/minidexed.h
  4. 6
      src/sysexfileloader.h

@ -36,7 +36,7 @@ LOGMODULE ("mididevice");
#define MIDI_AFTERTOUCH 0b1010 // TODO
#define MIDI_CHANNEL_AFTERTOUCH 0b1101 // right now Synth_Dexed just manage Channel Aftertouch not Polyphonic AT -> 0b1010
#define MIDI_CONTROL_CHANGE 0b1011
#define MIDI_CC_BANK_SELECT_MSB 0 // TODO
#define MIDI_CC_BANK_SELECT_MSB 0
#define MIDI_CC_MODULATION 1
#define MIDI_CC_BREATH_CONTROLLER 2
#define MIDI_CC_FOOT_PEDAL 4
@ -283,6 +283,10 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
m_pSynthesizer->SetPan (pMessage[2], nTG);
break;
case MIDI_CC_BANK_SELECT_MSB:
m_pSynthesizer->BankSelectMSB (pMessage[2], nTG);
break;
case MIDI_CC_BANK_SELECT_LSB:
m_pSynthesizer->BankSelectLSB (pMessage[2], nTG);
break;

@ -365,14 +365,44 @@ CSysExFileLoader *CMiniDexed::GetSysExFileLoader (void)
return &m_SysExFileLoader;
}
void CMiniDexed::BankSelect (unsigned nBank, unsigned nTG)
{
nBank=constrain((int)nBank,0,16383);
assert (nTG < CConfig::ToneGenerators);
unsigned nHighestBank = GetSysExFileLoader ()->GetNumHighestBank();
if (nBank <= nHighestBank)
{
m_nVoiceBankID[nTG] = nBank;
m_UI.ParameterChanged ();
}
}
void CMiniDexed::BankSelectMSB (unsigned nBankMSB, unsigned nTG)
{
nBankMSB=constrain((int)nBankMSB,0,127);
assert (nTG < CConfig::ToneGenerators);
unsigned nBank = m_nVoiceBankID[nTG];
unsigned nBankLSB = nBank & 0x7F;
nBank = (nBankMSB << 7) + nBankLSB;
BankSelect(nBank, nTG);
}
void CMiniDexed::BankSelectLSB (unsigned nBankLSB, unsigned nTG)
{
nBankLSB=constrain((int)nBankLSB,0,127);
assert (nTG < CConfig::ToneGenerators);
m_nVoiceBankID[nTG] = nBankLSB;
unsigned nBank = m_nVoiceBankID[nTG];
unsigned nBankMSB = nBank >> 7;
nBank = (nBankMSB << 7) + nBankLSB;
m_UI.ParameterChanged ();
BankSelect(nBank, nTG);
}
void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG)
@ -717,7 +747,9 @@ void CMiniDexed::SetTGParameter (TTGParameter Parameter, int nValue, unsigned nT
switch (Parameter)
{
case TGParameterVoiceBank: BankSelectLSB (nValue, nTG); break;
case TGParameterVoiceBank: BankSelect (nValue, nTG); break;
case TGParameterVoiceBankMSB: BankSelectMSB (nValue, nTG); break;
case TGParameterVoiceBankLSB: BankSelectLSB (nValue, nTG); break;
case TGParameterProgram: ProgramChange (nValue, nTG); break;
case TGParameterVolume: SetVolume (nValue, nTG); break;
case TGParameterPan: SetPan (nValue, nTG); break;
@ -771,6 +803,8 @@ int CMiniDexed::GetTGParameter (TTGParameter Parameter, unsigned nTG)
switch (Parameter)
{
case TGParameterVoiceBank: return m_nVoiceBankID[nTG];
case TGParameterVoiceBankMSB: return m_nVoiceBankID[nTG] >> 7;
case TGParameterVoiceBankLSB: return m_nVoiceBankID[nTG] & 0x7F;
case TGParameterProgram: return m_nProgram[nTG];
case TGParameterVolume: return m_nVolume[nTG];
case TGParameterPan: return m_nPan[nTG];
@ -1445,7 +1479,7 @@ void CMiniDexed::LoadPerformanceParameters(void)
for (unsigned nTG = 0; nTG < CConfig::ToneGenerators; nTG++)
{
BankSelectLSB (m_PerformanceConfig.GetBankNumber (nTG), 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);

@ -63,6 +63,8 @@ public:
CSysExFileLoader *GetSysExFileLoader (void);
void BankSelect (unsigned nBank, unsigned nTG);
void BankSelectMSB (unsigned nBankMSB, unsigned nTG);
void BankSelectLSB (unsigned nBankLSB, unsigned nTG);
void ProgramChange (unsigned nProgram, unsigned nTG);
void SetVolume (unsigned nVolume, unsigned nTG);
@ -149,6 +151,8 @@ public:
enum TTGParameter
{
TGParameterVoiceBank,
TGParameterVoiceBankMSB,
TGParameterVoiceBankLSB,
TGParameterProgram,
TGParameterVolume,
TGParameterPan,

@ -29,7 +29,7 @@
class CSysExFileLoader // Loader for DX7 .syx files
{
public:
static const unsigned MaxVoiceBankID = 16383;
static const unsigned MaxVoiceBankID = 16383; // i.e. 14-bit MSB/LSB value between 0 and 16383
static const unsigned VoicesPerBank = 32;
static const size_t SizePackedVoice = 128;
static const size_t SizeSingleVoice = 156;
@ -56,10 +56,10 @@ public:
void Load (void);
std::string GetBankName (unsigned nBankID); // 0 .. 127
std::string GetBankName (unsigned nBankID); // 0 .. MaxVoiceBankID
unsigned GetNumHighestBank (); // 0 .. MaxVoiceBankID
void GetVoice (unsigned nBankID, // 0 .. 127
void GetVoice (unsigned nBankID, // 0 .. MaxVoiceBankID
unsigned nVoiceID, // 0 .. 31
uint8_t *pVoiceData); // returns unpacked format (156 bytes)

Loading…
Cancel
Save