diff options
Diffstat (limited to 'src/adlmidi_midiplay.cpp')
-rw-r--r-- | src/adlmidi_midiplay.cpp | 23 |
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) { |