aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi_midiplay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/adlmidi_midiplay.cpp')
-rw-r--r--src/adlmidi_midiplay.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp
index b256d79..1021117 100644
--- a/src/adlmidi_midiplay.cpp
+++ b/src/adlmidi_midiplay.cpp
@@ -283,14 +283,7 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
size_t midiins = midiChan.patch;
bool isPercussion = (channel % 16 == 9) || midiChan.is_xg_percussion;
- size_t bank = 0;
- if(midiChan.bank_msb || midiChan.bank_lsb)
- {
- if((m_synthMode & Mode_GS) != 0) //in GS mode ignore LSB
- bank = (midiChan.bank_msb * 256);
- else
- bank = (midiChan.bank_msb * 256) + midiChan.bank_lsb;
- }
+ size_t bank = midiChan.bank_msb * 256 + midiChan.bank_lsb;
if(isPercussion)
{
@@ -339,6 +332,20 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
hooks.onDebugMessage(hooks.onDebugMessage_userData, "[%i] Playing missing %s MIDI bank %i (patch %i)", channel, text, bank, midiins);
}
}
+ //Or fall back to bank ignoring LSB (GS)
+ if((ains->flags & adlinsdata::Flag_NoSound) && (m_synthMode & Mode_GS) != 0)
+ {
+ size_t fallback = bank & ~(size_t)0x7F;
+ if(fallback != bank)
+ {
+ OPL3::BankMap::iterator b = m_synth.m_insBanks.find(fallback);
+ if(b != m_synth.m_insBanks.end())
+ bnk = &b->second;
+
+ if(bnk)
+ ains = &bnk->ins[midiins];
+ }
+ }
//Or fall back to first bank
if(ains->flags & adlinsdata::Flag_NoSound)
{