diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-11-17 03:39:05 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-11-17 03:39:05 +0300 |
commit | e7e58c9ddce0438505ba3aabffbf2a5af1896071 (patch) | |
tree | 045078f86f3271569f4fabb68730ec1ca66b9e19 /src | |
parent | b0d6082900c3ea37b36afe190e0bb3b3e67c9899 (diff) | |
download | libADLMIDI-e7e58c9ddce0438505ba3aabffbf2a5af1896071.tar.gz libADLMIDI-e7e58c9ddce0438505ba3aabffbf2a5af1896071.tar.bz2 libADLMIDI-e7e58c9ddce0438505ba3aabffbf2a5af1896071.zip |
Added handling of XG percussion bank numbers
Diffstat (limited to 'src')
-rw-r--r-- | src/adlmidi_midiplay.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index f8e9d6a..9fe1cfd 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -918,14 +918,25 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity) size_t midiins = Ch[channel].patch; bool isPercussion = (channel % 16 == 9); + uint16_t bank = 0; + if(Ch[channel].bank_msb || Ch[channel].bank_lsb) + { + bank = (uint16_t(Ch[channel].bank_msb) * 256) + uint16_t(Ch[channel].bank_lsb); + if(bank == 0x7E00) //XG SFX1/SFX2 channel (16128 signed decimal) + isPercussion = true; + if(bank == 0x7F00) //XG Percussion channel (16256 signed decimal) + isPercussion = true; + } + if(isPercussion) + { + bank = (uint16_t)midiins; // MIDI instrument defines the patch midiins = opl.dynamic_percussion_offset + note; // Percussion instrument + } - uint16_t bank = 0; //Set bank bank - if(Ch[channel].bank_msb || Ch[channel].bank_lsb) + if(bank > 0) { - bank = (uint16_t(Ch[channel].bank_msb) * 256) + uint16_t(Ch[channel].bank_lsb); if(isPercussion) { OPL3::BankMap::iterator b = opl.dynamic_percussion_banks.find(bank); |