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

pull/461/head
diyelectromusic 2 years 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_AFTERTOUCH 0b1010 // TODO
#define MIDI_CHANNEL_AFTERTOUCH 0b1101 // right now Synth_Dexed just manage Channel Aftertouch not Polyphonic AT -> 0b1010 #define MIDI_CHANNEL_AFTERTOUCH 0b1101 // right now Synth_Dexed just manage Channel Aftertouch not Polyphonic AT -> 0b1010
#define MIDI_CONTROL_CHANGE 0b1011 #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_MODULATION 1
#define MIDI_CC_BREATH_CONTROLLER 2 #define MIDI_CC_BREATH_CONTROLLER 2
#define MIDI_CC_FOOT_PEDAL 4 #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); m_pSynthesizer->SetPan (pMessage[2], nTG);
break; break;
case MIDI_CC_BANK_SELECT_MSB:
m_pSynthesizer->BankSelectMSB (pMessage[2], nTG);
break;
case MIDI_CC_BANK_SELECT_LSB: case MIDI_CC_BANK_SELECT_LSB:
m_pSynthesizer->BankSelectLSB (pMessage[2], nTG); m_pSynthesizer->BankSelectLSB (pMessage[2], nTG);
break; break;

@ -365,14 +365,44 @@ CSysExFileLoader *CMiniDexed::GetSysExFileLoader (void)
return &m_SysExFileLoader; 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) void CMiniDexed::BankSelectLSB (unsigned nBankLSB, unsigned nTG)
{ {
nBankLSB=constrain((int)nBankLSB,0,127); nBankLSB=constrain((int)nBankLSB,0,127);
assert (nTG < CConfig::ToneGenerators); 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) void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG)
@ -717,7 +747,9 @@ void CMiniDexed::SetTGParameter (TTGParameter Parameter, int nValue, unsigned nT
switch (Parameter) 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 TGParameterProgram: ProgramChange (nValue, nTG); break;
case TGParameterVolume: SetVolume (nValue, nTG); break; case TGParameterVolume: SetVolume (nValue, nTG); break;
case TGParameterPan: SetPan (nValue, nTG); break; case TGParameterPan: SetPan (nValue, nTG); break;
@ -771,6 +803,8 @@ int CMiniDexed::GetTGParameter (TTGParameter Parameter, unsigned nTG)
switch (Parameter) switch (Parameter)
{ {
case TGParameterVoiceBank: return m_nVoiceBankID[nTG]; 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 TGParameterProgram: return m_nProgram[nTG];
case TGParameterVolume: return m_nVolume[nTG]; case TGParameterVolume: return m_nVolume[nTG];
case TGParameterPan: return m_nPan[nTG]; case TGParameterPan: return m_nPan[nTG];
@ -1445,7 +1479,7 @@ void CMiniDexed::LoadPerformanceParameters(void)
for (unsigned nTG = 0; nTG < CConfig::ToneGenerators; nTG++) 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); ProgramChange (m_PerformanceConfig.GetVoiceNumber (nTG), nTG);
SetMIDIChannel (m_PerformanceConfig.GetMIDIChannel (nTG), nTG); SetMIDIChannel (m_PerformanceConfig.GetMIDIChannel (nTG), nTG);
SetVolume (m_PerformanceConfig.GetVolume (nTG), nTG); SetVolume (m_PerformanceConfig.GetVolume (nTG), nTG);

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

@ -29,7 +29,7 @@
class CSysExFileLoader // Loader for DX7 .syx files class CSysExFileLoader // Loader for DX7 .syx files
{ {
public: 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 unsigned VoicesPerBank = 32;
static const size_t SizePackedVoice = 128; static const size_t SizePackedVoice = 128;
static const size_t SizeSingleVoice = 156; static const size_t SizeSingleVoice = 156;
@ -56,10 +56,10 @@ public:
void Load (void); void Load (void);
std::string GetBankName (unsigned nBankID); // 0 .. 127 std::string GetBankName (unsigned nBankID); // 0 .. MaxVoiceBankID
unsigned GetNumHighestBank (); // 0 .. MaxVoiceBankID unsigned GetNumHighestBank (); // 0 .. MaxVoiceBankID
void GetVoice (unsigned nBankID, // 0 .. 127 void GetVoice (unsigned nBankID, // 0 .. MaxVoiceBankID
unsigned nVoiceID, // 0 .. 31 unsigned nVoiceID, // 0 .. 31
uint8_t *pVoiceData); // returns unpacked format (156 bytes) uint8_t *pVoiceData); // returns unpacked format (156 bytes)

Loading…
Cancel
Save