aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi_opl3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/adlmidi_opl3.cpp')
-rw-r--r--src/adlmidi_opl3.cpp88
1 files changed, 78 insertions, 10 deletions
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp
index 887dd09..7938710 100644
--- a/src/adlmidi_opl3.cpp
+++ b/src/adlmidi_opl3.cpp
@@ -26,6 +26,10 @@
#include <stdlib.h>
#include <cassert>
+#ifndef DISABLE_EMBEDDED_BANKS
+#include "wopl/wopl_file.h"
+#endif
+
#ifdef ADLMIDI_HW_OPL
static const unsigned OPLBase = 0x388;
#else
@@ -293,21 +297,85 @@ void OPL3::setEmbeddedBank(uint32_t bank)
//Embedded banks are supports 128:128 GM set only
m_insBanks.clear();
- if(bank >= static_cast<unsigned int>(maxAdlBanks()))
+ if(bank >= static_cast<uint32_t>(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<size_t>((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];
+
+ 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<int8_t>(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