diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-11-18 02:12:16 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-11-18 02:12:16 +0300 |
commit | ada60caf444fc8cbd0865eab9594cd1912f618a2 (patch) | |
tree | a668664b7e6ce4577f7d25da8e798d216ef573a3 /src/adlmidi_midiplay.cpp | |
parent | 3c82e4c30cdb33cb82933661b379e46c1554b04c (diff) | |
download | libADLMIDI-ada60caf444fc8cbd0865eab9594cd1912f618a2.tar.gz libADLMIDI-ada60caf444fc8cbd0865eab9594cd1912f618a2.tar.bz2 libADLMIDI-ada60caf444fc8cbd0865eab9594cd1912f618a2.zip |
Add the XG support into drum note length fixer algorithm
Diffstat (limited to 'src/adlmidi_midiplay.cpp')
-rw-r--r-- | src/adlmidi_midiplay.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index 01e973e..b11d959 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -583,8 +583,10 @@ bool MIDIplay::buildTrackData() char ___pad[7]; } drNotes[255]; + uint16_t banks[16]; for(size_t tk = 0; tk < trackCount; ++tk) { + std::memset(banks, 0, sizeof(banks)); std::memset(drNotes, 0, sizeof(drNotes)); MidiTrackQueue &track = trackDataNew[tk]; if(track.empty()) @@ -597,7 +599,26 @@ bool MIDIplay::buildTrackData() for(ssize_t e = 0; e < (ssize_t)pos.events.size(); e++) { MidiEvent *et = &pos.events[(size_t)e]; - if(et->channel != 9) + + /* Set MSB/LSB bank */ + if(et->type == MidiEvent::T_CTRLCHANGE) + { + uint8_t ctrlno = et->data[0]; + uint8_t value = et->data[1]; + switch(ctrlno) + { + case 0: // Set bank msb (GM bank) + banks[et->channel] = (uint16_t(value) << 8) | (banks[et->channel] & 0x00FF); + case 32: // Set bank lsb (XG bank) + banks[et->channel] = (banks[et->channel] & 0xFF00) | (uint16_t(value) & 0x00FF); + } + continue; + } + + bool percussion = (et->channel == 9) || + banks[et->channel] == 0x7E00 || //XG SFX1/SFX2 channel (16128 signed decimal) + banks[et->channel] == 0x7F00; //XG Percussion channel (16256 signed decimal) + if(!percussion) continue; if(et->type == MidiEvent::T_NOTEON) |