From 81f905ea76f0efb6ea35331bd1fe476f14f804de Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 1 Jul 2019 05:01:55 +0300 Subject: First working of new database // not so stable, needs a polishing, however, multibank from embedded 72'th bank (DMXOPL3) works! --- src/adlmidi_opl3.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 10 deletions(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index a7bffc3..983949e 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -26,6 +26,10 @@ #include #include +#ifndef DISABLE_EMBEDDED_BANKS +#include "wopl/wopl_file.h" +#endif + #ifdef ADLMIDI_HW_OPL static const unsigned OPLBase = 0x388; #else @@ -245,21 +249,83 @@ void OPL3::setEmbeddedBank(uint32_t bank) //Embedded banks are supports 128:128 GM set only m_insBanks.clear(); - if(bank >= static_cast(maxAdlBanks())) + if(bank >= static_cast(g_embeddedBanksCount)) return; - Bank *bank_pair[2] = - { - &m_insBanks[0], - &m_insBanks[PercussionTag] - }; + const BanksDump::BankEntry &bankEntry = g_embeddedBanks[m_embeddedBank]; + m_insBankSetup.deepTremolo = ((bankEntry.bankSetup >> 8) & 0x01) != 0; + m_insBankSetup.deepVibrato = ((bankEntry.bankSetup >> 8) & 0x02) != 0; + m_insBankSetup.volumeModel = (bankEntry.bankSetup & 0xFF); + m_insBankSetup.scaleModulators = false; - for(unsigned i = 0; i < 256; ++i) + for(int ss = 0; ss < 2; ss++) { - size_t meta = banks[bank][i]; - adlinsdata2 &ins = bank_pair[i / 128]->ins[i % 128]; - ins = adlinsdata2::from_adldata(::adlins[meta]); + bank_count_t maxBanks = ss ? bankEntry.banksPercussionCount : bankEntry.banksMelodicCount ; + bank_count_t banksOffset = ss ? bankEntry.banksOffsetPercussive : bankEntry.banksOffsetMelodic; + + for(bank_count_t bankID = 0; bankID < maxBanks; bankID++) + { + size_t bankIndex = g_embeddedBanksMidiIndex[banksOffset + bankID]; + const BanksDump::MidiBank &bankData = g_embeddedBanksMidi[bankIndex]; + size_t bankMidiIndex = static_cast((bankData.msb * 256) + bankData.lsb) + (ss ? PercussionTag : 0); + Bank &bankTarget = m_insBanks[bankMidiIndex]; + + for(size_t instId = 0; instId < 128; instId++) + { + BanksDump::InstrumentEntry instIn = g_embeddedBanksInstruments[bankData.insts[instId]]; + adlinsdata2 &instOut = bankTarget.ins[instId]; + + instOut.voice2_fine_tune = 0.0; + if(instIn.secondVoiceDetune != 0) + { + if(instIn.secondVoiceDetune == 1) + instOut.voice2_fine_tune = 0.000025; + else if(instIn.secondVoiceDetune == -1) + instOut.voice2_fine_tune = -0.000025; + else + instOut.voice2_fine_tune = instIn.secondVoiceDetune * (15.625 / 1000.0); + } + + instOut.midi_velocity_offset = instIn.midiVelocityOffset; + instOut.tone = instIn.percussionKeyNumber; + instOut.flags = (instIn.instFlags & WOPL_Ins_4op) && (instIn.instFlags & WOPL_Ins_Pseudo4op) ? adlinsdata::Flag_Pseudo4op : 0; + instOut.flags|= (instIn.instFlags & WOPL_Ins_4op) && ((instIn.instFlags & WOPL_Ins_Pseudo4op) == 0) ? adlinsdata::Flag_Real4op : 0; + instOut.flags|= (instIn.instFlags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0; + instOut.flags|= instIn.instFlags & WOPL_RhythmModeMask; + + for(size_t op = 0; op < 2; op++) + { + if((instIn.ops[(op * 2) + 0] < 0) || (instIn.ops[(op * 2) + 1] < 0)) + break; + const BanksDump::Operator &op1 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 0]]; + const BanksDump::Operator &op2 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 1]]; + instOut.adl[op].modulator_E862 = op1.d_E862; + instOut.adl[op].modulator_40 = op1.d_40; + instOut.adl[op].carrier_E862 = op2.d_E862; + instOut.adl[op].carrier_40 = op2.d_40; + instOut.adl[op].feedconn = (instIn.fbConn >> (op * 8)) & 0xFF; + instOut.adl[op].finetune = op == 0 ? instIn.noteOffset1 : instIn.noteOffset2; + } + instOut.ms_sound_kon = instIn.delay_on_ms; + instOut.ms_sound_koff = instIn.delay_off_ms; + } + } } + +// Bank *bank_pair[2] = +// { +// &m_insBanks[0], +// &m_insBanks[PercussionTag] +// }; + +// for(unsigned i = 0; i < 256; ++i) +// { +// size_t meta = banks[bank][i]; +// adlinsdata2 &ins = bank_pair[i / 128]->ins[i % 128]; +// ins = adlinsdata2::from_adldata(::adlins[meta]); +// } + + #else ADL_UNUSED(bank); #endif -- cgit v1.2.3 From d82ce49e7f78d62c7df62f68d374203c040ba4ba Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 23 Sep 2019 02:10:46 +0300 Subject: Fixed MSVC warning in adlmidi_opl3.cpp --- src/adlmidi_opl3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 44322a3..7a1e845 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -307,7 +307,7 @@ void OPL3::setEmbeddedBank(uint32_t bank) instOut.adl[op].carrier_E862 = op2.d_E862; instOut.adl[op].carrier_40 = op2.d_40; instOut.adl[op].feedconn = (instIn.fbConn >> (op * 8)) & 0xFF; - instOut.adl[op].finetune = op == 0 ? instIn.noteOffset1 : instIn.noteOffset2; + instOut.adl[op].finetune = static_cast(op == 0 ? instIn.noteOffset1 : instIn.noteOffset2); } instOut.ms_sound_kon = instIn.delay_on_ms; instOut.ms_sound_koff = instIn.delay_off_ms; -- cgit v1.2.3 From 9b41e9128035a84731ea21f465a328cdf7e6494b Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Fri, 15 Nov 2019 23:20:22 +0300 Subject: Fixed a junk space in adlmidi_opl3.cpp --- src/adlmidi_opl3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 7a1e845..d37a9aa 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -263,7 +263,7 @@ void OPL3::setEmbeddedBank(uint32_t bank) for(int ss = 0; ss < 2; ss++) { - bank_count_t maxBanks = ss ? bankEntry.banksPercussionCount : bankEntry.banksMelodicCount ; + bank_count_t maxBanks = ss ? bankEntry.banksPercussionCount : bankEntry.banksMelodicCount; bank_count_t banksOffset = ss ? bankEntry.banksOffsetPercussive : bankEntry.banksOffsetMelodic; for(bank_count_t bankID = 0; bankID < maxBanks; bankID++) -- cgit v1.2.3 From 2ba770631ff1dc978d16a874a4ab99930ce12d2d Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Wed, 19 Aug 2020 02:11:01 +0300 Subject: Use new banks database format However, it's stil need to clean-up and fix gen_adldata for a correct work! --- src/adlmidi_opl3.cpp | 68 +++++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 33 deletions(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 18488b3..09e1a19 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -285,39 +285,41 @@ void OPL3::setEmbeddedBank(uint32_t bank) BanksDump::InstrumentEntry instIn = g_embeddedBanksInstruments[bankData.insts[instId]]; adlinsdata2 &instOut = bankTarget.ins[instId]; - instOut.voice2_fine_tune = 0.0; - if(instIn.secondVoiceDetune != 0) - { - if(instIn.secondVoiceDetune == 1) - instOut.voice2_fine_tune = 0.000025; - else if(instIn.secondVoiceDetune == -1) - instOut.voice2_fine_tune = -0.000025; - else - instOut.voice2_fine_tune = instIn.secondVoiceDetune * (15.625 / 1000.0); - } - - instOut.midi_velocity_offset = instIn.midiVelocityOffset; - instOut.tone = instIn.percussionKeyNumber; - instOut.flags = (instIn.instFlags & WOPL_Ins_4op) && (instIn.instFlags & WOPL_Ins_Pseudo4op) ? adlinsdata::Flag_Pseudo4op : 0; - instOut.flags|= (instIn.instFlags & WOPL_Ins_4op) && ((instIn.instFlags & WOPL_Ins_Pseudo4op) == 0) ? adlinsdata::Flag_Real4op : 0; - instOut.flags|= (instIn.instFlags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0; - instOut.flags|= instIn.instFlags & WOPL_RhythmModeMask; - - for(size_t op = 0; op < 2; op++) - { - if((instIn.ops[(op * 2) + 0] < 0) || (instIn.ops[(op * 2) + 1] < 0)) - break; - const BanksDump::Operator &op1 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 0]]; - const BanksDump::Operator &op2 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 1]]; - instOut.adl[op].modulator_E862 = op1.d_E862; - instOut.adl[op].modulator_40 = op1.d_40; - instOut.adl[op].carrier_E862 = op2.d_E862; - instOut.adl[op].carrier_40 = op2.d_40; - instOut.adl[op].feedconn = (instIn.fbConn >> (op * 8)) & 0xFF; - instOut.adl[op].finetune = static_cast(op == 0 ? instIn.noteOffset1 : instIn.noteOffset2); - } - instOut.ms_sound_kon = instIn.delay_on_ms; - instOut.ms_sound_koff = instIn.delay_off_ms; + adlFromInstrument(instIn, instOut); + +// instOut.voice2_fine_tune = 0.0; +// if(instIn.secondVoiceDetune != 0) +// { +// if(instIn.secondVoiceDetune == 1) +// instOut.voice2_fine_tune = 0.000025; +// else if(instIn.secondVoiceDetune == -1) +// instOut.voice2_fine_tune = -0.000025; +// else +// instOut.voice2_fine_tune = instIn.secondVoiceDetune * (15.625 / 1000.0); +// } + +// instOut.midi_velocity_offset = instIn.midiVelocityOffset; +// instOut.tone = instIn.percussionKeyNumber; +// instOut.flags = (instIn.instFlags & WOPL_Ins_4op) && (instIn.instFlags & WOPL_Ins_Pseudo4op) ? adlinsdata::Flag_Pseudo4op : 0; +// instOut.flags|= (instIn.instFlags & WOPL_Ins_4op) && ((instIn.instFlags & WOPL_Ins_Pseudo4op) == 0) ? adlinsdata::Flag_Real4op : 0; +// instOut.flags|= (instIn.instFlags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0; +// instOut.flags|= instIn.instFlags & WOPL_RhythmModeMask; + +// for(size_t op = 0; op < 2; op++) +// { +// if((instIn.ops[(op * 2) + 0] < 0) || (instIn.ops[(op * 2) + 1] < 0)) +// break; +// const BanksDump::Operator &op1 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 0]]; +// const BanksDump::Operator &op2 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 1]]; +// instOut.adl[op].modulator_E862 = op1.d_E862; +// instOut.adl[op].modulator_40 = op1.d_40; +// instOut.adl[op].carrier_E862 = op2.d_E862; +// instOut.adl[op].carrier_40 = op2.d_40; +// instOut.adl[op].feedconn = (instIn.fbConn >> (op * 8)) & 0xFF; +// instOut.adl[op].finetune = static_cast(op == 0 ? instIn.noteOffset1 : instIn.noteOffset2); +// } +// instOut.ms_sound_kon = instIn.delay_on_ms; +// instOut.ms_sound_koff = instIn.delay_off_ms; } } } -- cgit v1.2.3 From c9cfbda24b2ad1b1c646b8104ec86c5541d80451 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 24 Aug 2020 00:04:45 +0300 Subject: Another piece of removed code --- src/adlmidi_opl3.cpp | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 7938710..9920ab8 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -324,58 +324,10 @@ void OPL3::setEmbeddedBank(uint32_t bank) adlinsdata2 &instOut = bankTarget.ins[instId]; adlFromInstrument(instIn, instOut); - -// instOut.voice2_fine_tune = 0.0; -// if(instIn.secondVoiceDetune != 0) -// { -// if(instIn.secondVoiceDetune == 1) -// instOut.voice2_fine_tune = 0.000025; -// else if(instIn.secondVoiceDetune == -1) -// instOut.voice2_fine_tune = -0.000025; -// else -// instOut.voice2_fine_tune = instIn.secondVoiceDetune * (15.625 / 1000.0); -// } - -// instOut.midi_velocity_offset = instIn.midiVelocityOffset; -// instOut.tone = instIn.percussionKeyNumber; -// instOut.flags = (instIn.instFlags & WOPL_Ins_4op) && (instIn.instFlags & WOPL_Ins_Pseudo4op) ? adlinsdata::Flag_Pseudo4op : 0; -// instOut.flags|= (instIn.instFlags & WOPL_Ins_4op) && ((instIn.instFlags & WOPL_Ins_Pseudo4op) == 0) ? adlinsdata::Flag_Real4op : 0; -// instOut.flags|= (instIn.instFlags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0; -// instOut.flags|= instIn.instFlags & WOPL_RhythmModeMask; - -// for(size_t op = 0; op < 2; op++) -// { -// if((instIn.ops[(op * 2) + 0] < 0) || (instIn.ops[(op * 2) + 1] < 0)) -// break; -// const BanksDump::Operator &op1 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 0]]; -// const BanksDump::Operator &op2 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 1]]; -// instOut.adl[op].modulator_E862 = op1.d_E862; -// instOut.adl[op].modulator_40 = op1.d_40; -// instOut.adl[op].carrier_E862 = op2.d_E862; -// instOut.adl[op].carrier_40 = op2.d_40; -// instOut.adl[op].feedconn = (instIn.fbConn >> (op * 8)) & 0xFF; -// instOut.adl[op].finetune = static_cast(op == 0 ? instIn.noteOffset1 : instIn.noteOffset2); -// } -// instOut.ms_sound_kon = instIn.delay_on_ms; -// instOut.ms_sound_koff = instIn.delay_off_ms; } } } -// Bank *bank_pair[2] = -// { -// &m_insBanks[0], -// &m_insBanks[PercussionTag] -// }; - -// for(unsigned i = 0; i < 256; ++i) -// { -// size_t meta = banks[bank][i]; -// adlinsdata2 &ins = bank_pair[i / 128]->ins[i % 128]; -// ins = adlinsdata2::from_adldata(::adlins[meta]); -// } - - #else ADL_UNUSED(bank); #endif -- cgit v1.2.3 From fcf3bfd61fba0ea4f14e47551328ca1d05ced768 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 24 Aug 2020 00:48:59 +0300 Subject: Little clean-up of volume models code --- src/adlmidi_opl3.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 9920ab8..1a45b83 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -523,7 +523,8 @@ void OPL3::touchNote(size_t c, default: case Synth::VOLUME_Generic: { - volume = velocity * m_masterVolume * channelVolume * channelExpression; + volume = velocity * m_masterVolume * + channelVolume * channelExpression; /* If the channel has arpeggio, the effective volume of * *this* instrument is actually lower due to timesharing. @@ -533,9 +534,18 @@ void OPL3::touchNote(size_t c, * increment sounds wrong. Therefore, using the square root. */ //volume = (int)(volume * std::sqrt( (double) ch[c].users.size() )); + const double c1 = 11.541560327111707; + const double c2 = 1.601379199767093e+02; + uint_fast32_t minVolume = 8725 * 127; // The formula below: SOLVE(V=127^4 * 2^( (A-63.49999) / 8), A) - volume = volume > (8725 * 127) ? static_cast(std::log(static_cast(volume)) * 11.541560327111707 - 1.601379199767093e+02) : 0; + if(volume > minVolume) + { + double lv = std::log(static_cast(volume)); + volume = static_cast(lv * c1 - c2); + } + else + volume = 0; // The incorrect formula below: SOLVE(V=127^4 * (2^(A/63)-1), A) //opl.Touch_Real(c, volume>(11210*127) ? 91.61112 * std::log((4.8819E-7/127)*volume + 1.0)+0.5 : 0); } @@ -544,7 +554,7 @@ void OPL3::touchNote(size_t c, case Synth::VOLUME_NATIVE: { volume = velocity * channelVolume * channelExpression; - // volume = volume * m_masterVolume / (127 * 127 * 127) / 2; + // 4096766 = (127 * 127 * 127) / 2 volume = (volume * m_masterVolume) / 4096766; } break; @@ -561,15 +571,13 @@ void OPL3::touchNote(size_t c, { volume = (channelVolume * channelExpression * m_masterVolume / 16129); volume = ((64 * (velocity + 0x80)) * volume) >> 15; - //volume = ((63 * (velocity + 0x80)) * Ch[MidCh].volume) >> 15; } break; case Synth::VOLUME_9X: { - //volume = 63 - W9X_volume_mapping_table[(((velocity * Ch[MidCh].volume /** Ch[MidCh].expression*/) * m_masterVolume / 16129 /*2048383*/) >> 2)]; - volume = 63 - W9X_volume_mapping_table[((velocity * channelVolume * channelExpression * m_masterVolume / 2048383) >> 2)]; - //volume = W9X_volume_mapping_table[vol >> 2] + volume; + volume = velocity * channelVolume * channelExpression * m_masterVolume; + volume = 63 - W9X_volume_mapping_table[(volume / 2048383) >> 2]; } break; } -- cgit v1.2.3 From 8e1538618135210dc28a3c679f60517d17738731 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 24 Aug 2020 00:53:51 +0300 Subject: Fixed a small warning --- src/adlmidi_opl3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 1a45b83..1719191 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -315,7 +315,7 @@ void OPL3::setEmbeddedBank(uint32_t bank) { size_t bankIndex = g_embeddedBanksMidiIndex[banksOffset + bankID]; const BanksDump::MidiBank &bankData = g_embeddedBanksMidi[bankIndex]; - size_t bankMidiIndex = static_cast((bankData.msb * 256) + bankData.lsb) + (ss ? PercussionTag : 0); + size_t bankMidiIndex = static_cast((bankData.msb * 256) + bankData.lsb) + (ss ? static_cast(PercussionTag) : 0); Bank &bankTarget = m_insBanks[bankMidiIndex]; for(size_t instId = 0; instId < 128; instId++) -- cgit v1.2.3 From f7cb7d402779384a17408314ec285876299e3ae5 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 24 Aug 2020 01:18:26 +0300 Subject: Remove old comment --- src/adlmidi_opl3.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 1719191..1309d83 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -546,8 +546,6 @@ void OPL3::touchNote(size_t c, } else volume = 0; - // The incorrect formula below: SOLVE(V=127^4 * (2^(A/63)-1), A) - //opl.Touch_Real(c, volume>(11210*127) ? 91.61112 * std::log((4.8819E-7/127)*volume + 1.0)+0.5 : 0); } break; -- cgit v1.2.3 From 22d2506f5308094e706ec152ec64cfc92ef12876 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 24 Aug 2020 02:27:44 +0300 Subject: More clean-up of old commented code --- src/adlmidi_opl3.cpp | 14 -------------- 1 file changed, 14 deletions(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 1309d83..3648956 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -670,20 +670,6 @@ void OPL3::touchNote(size_t c, // 63 + chanvol * (instrvol / 63.0 - 1) } -/* -void OPL3::Touch(unsigned c, unsigned volume) // Volume maxes at 127*127*127 -{ - if(LogarithmicVolumes) - Touch_Real(c, volume * 127 / (127 * 127 * 127) / 2); - else - { - // The formula below: SOLVE(V=127^3 * 2^( (A-63.49999) / 8), A) - Touch_Real(c, volume > 8725 ? static_cast(std::log(volume) * 11.541561 + (0.5 - 104.22845)) : 0); - // The incorrect formula below: SOLVE(V=127^3 * (2^(A/63)-1), A) - //Touch_Real(c, volume>11210 ? 91.61112 * std::log(4.8819E-7*volume + 1.0)+0.5 : 0); - } -}*/ - void OPL3::setPatch(size_t c, const adldata &instrument) { size_t chip = c / NUM_OF_CHANNELS, cc = c % NUM_OF_CHANNELS; -- cgit v1.2.3 From 761bd05f107b856c8aefeb3e753fa94221f926bc Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 24 Aug 2020 13:32:11 +0300 Subject: Fixed a bug of junk instruments instead of blank --- src/adlmidi_opl3.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 3648956..27baa22 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -320,7 +320,10 @@ void OPL3::setEmbeddedBank(uint32_t bank) for(size_t instId = 0; instId < 128; instId++) { - BanksDump::InstrumentEntry instIn = g_embeddedBanksInstruments[bankData.insts[instId]]; + midi_bank_idx_t instIndex = bankData.insts[instId]; + if(instIndex < 0) + continue; + BanksDump::InstrumentEntry instIn = g_embeddedBanksInstruments[instIndex]; adlinsdata2 &instOut = bankTarget.ins[instId]; adlFromInstrument(instIn, instOut); -- cgit v1.2.3