diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-10-17 21:00:59 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-10-17 21:00:59 +0300 |
commit | 8b88c5ce46c508f5b7277774456b2266d459cc88 (patch) | |
tree | 735af1af14ce047ae72c548fc1c703552f712e8f /src/adlmidi_private.cpp | |
parent | c07b146a1a3991edd6c3233dcd1956b989303dd3 (diff) | |
download | libADLMIDI-8b88c5ce46c508f5b7277774456b2266d459cc88.tar.gz libADLMIDI-8b88c5ce46c508f5b7277774456b2266d459cc88.tar.bz2 libADLMIDI-8b88c5ce46c508f5b7277774456b2266d459cc88.zip |
Custom banks 4-operator voices playback fix
Diffstat (limited to 'src/adlmidi_private.cpp')
-rw-r--r-- | src/adlmidi_private.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp index 0c18958..fd9253c 100644 --- a/src/adlmidi_private.cpp +++ b/src/adlmidi_private.cpp @@ -28,24 +28,40 @@ std::string ADLMIDI_ErrorString; int adlRefreshNumCards(ADL_MIDIPlayer *device) { unsigned n_fourop[2] = {0, 0}, n_total[2] = {0, 0}; + MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); - for(unsigned a = 0; a < 256; ++a) + //Automatically calculate how much 4-operator channels is necessary + if(play->opl.AdlBank == ~0u) { - unsigned insno = banks[device->AdlBank][a]; - - if(insno == 198) continue; - - ++n_total[a / 128]; - - if(adlins[insno].adlno1 != adlins[insno].adlno2) - ++n_fourop[a / 128]; + //For custom bank + for(size_t a = 0; a < play->opl.dynamic_metainstruments.size(); ++a) + { + ++n_total[a / 128]; + adlinsdata &ins = play->opl.dynamic_metainstruments[a]; + if((ins.adlno1 != ins.adlno2) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) + ++n_fourop[a / 128]; + } + } + else + { + //For embedded bank + for(unsigned a = 0; a < 256; ++a) + { + unsigned insno = banks[device->AdlBank][a]; + if(insno == 198) + continue; + ++n_total[a / 128]; + const adlinsdata &ins = adlins[insno]; + if((ins.adlno1 != ins.adlno2) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) + ++n_fourop[a / 128]; + } } device->NumFourOps = (n_fourop[0] >= n_total[0] * 7 / 8) ? device->NumCards * 6 : (n_fourop[0] < n_total[0] * 1 / 8) ? 0 : (device->NumCards == 1 ? 1 : device->NumCards * 4); - reinterpret_cast<MIDIplay *>(device->adl_midiPlayer)->opl.NumFourOps = device->NumFourOps; + play->opl.NumFourOps = device->NumFourOps; if(n_fourop[0] >= n_total[0] * 15 / 16 && device->NumFourOps == 0) { |