aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/adlmidi.cpp')
-rw-r--r--src/adlmidi.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp
index c6402e1..f9891a8 100644
--- a/src/adlmidi.cpp
+++ b/src/adlmidi.cpp
@@ -143,6 +143,142 @@ ADLMIDI_EXPORT const char *const *adl_getBankNames()
return banknames;
}
+ADLMIDI_EXPORT int adl_reserveBanks(ADL_MIDIPlayer *device, unsigned banks)
+{
+ if(!device)
+ return -1;
+ MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
+ OPL3::BankMap &map = play->opl.dynamic_banks;
+ map.reserve(banks);
+ return (int)map.capacity();
+}
+
+ADLMIDI_EXPORT int adl_getBank(ADL_MIDIPlayer *device, const ADL_BankId *idp, int flags, ADL_Bank *bank)
+{
+ if(!device || !idp || !bank)
+ return -1;
+
+ ADL_BankId id = *idp;
+ if(id.lsb > 127 || id.msb > 127 || id.percussive > 1)
+ return -1;
+ unsigned idnumber = (id.msb << 8) | id.lsb | (id.percussive ? OPL3::PercussionTag : 0);
+
+ MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
+ OPL3::BankMap &map = play->opl.dynamic_banks;
+
+ OPL3::BankMap::iterator it;
+ if(!(flags & ADLMIDI_Bank_Create))
+ {
+ it = map.find(idnumber);
+ if(it == map.end())
+ return -1;
+ }
+ else
+ {
+ std::pair<uint16_t, OPL3::Bank> value;
+ value.first = idnumber;
+ memset(&value.second, 0, sizeof(value.second));
+ for (unsigned i = 0; i < 128; ++i)
+ value.second.ins[i].flags = adlinsdata::Flag_NoSound;
+
+ std::pair<OPL3::BankMap::iterator, bool> ir;
+ if(flags & ADLMIDI_Bank_CreateRt)
+ {
+ ir = map.insert(value, OPL3::BankMap::do_not_expand_t());
+ if(ir.first == map.end())
+ return -1;
+ }
+ else
+ ir = map.insert(value);
+ it = ir.first;
+ }
+
+ it.to_ptrs(bank->pointer);
+ return 0;
+}
+
+ADLMIDI_EXPORT int adl_getBankId(ADL_MIDIPlayer *device, const ADL_Bank *bank, ADL_BankId *id)
+{
+ if(!device || !bank)
+ return -1;
+
+ OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer);
+ unsigned idnumber = it->first;
+ id->msb = (idnumber >> 8) & 127;
+ id->lsb = idnumber & 127;
+ id->percussive = (idnumber & OPL3::PercussionTag) ? 1 : 0;
+ return 0;
+}
+
+ADLMIDI_EXPORT int adl_removeBank(ADL_MIDIPlayer *device, ADL_Bank *bank)
+{
+ if(!device || !bank)
+ return -1;
+
+ MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
+ OPL3::BankMap &map = play->opl.dynamic_banks;
+ OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer);
+ size_t size = map.size();
+ map.erase(it);
+ return (map.size() != size) ? 0 : -1;
+}
+
+ADLMIDI_EXPORT int adl_getFirstBank(ADL_MIDIPlayer *device, ADL_Bank *bank)
+{
+ if(!device)
+ return -1;
+
+ MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
+ OPL3::BankMap &map = play->opl.dynamic_banks;
+
+ OPL3::BankMap::iterator it = map.begin();
+ if(it == map.end())
+ return -1;
+
+ it.to_ptrs(bank->pointer);
+ return 0;
+}
+
+ADLMIDI_EXPORT int adl_getNextBank(ADL_MIDIPlayer *device, ADL_Bank *bank)
+{
+ if(!device)
+ return -1;
+
+ MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
+ OPL3::BankMap &map = play->opl.dynamic_banks;
+
+ OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer);
+ if(++it == map.end())
+ return -1;
+
+ it.to_ptrs(bank->pointer);
+ return 0;
+}
+
+ADLMIDI_EXPORT int adl_getInstrument(ADL_MIDIPlayer *device, const ADL_Bank *bank, unsigned index, ADL_Instrument *ins)
+{
+ if(!device || !bank || index > 127 || !ins)
+ return 1;
+
+ OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer);
+ cvt_FMIns_to_ADLI(*ins, it->second.ins[index]);
+ ins->version = 0;
+ return 0;
+}
+
+ADLMIDI_EXPORT int adl_setInstrument(ADL_MIDIPlayer *device, ADL_Bank *bank, unsigned index, const ADL_Instrument *ins)
+{
+ if(!device || !bank || index > 127 || !ins)
+ return 1;
+
+ if(ins->version != 0)
+ return 1;
+
+ OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer);
+ cvt_ADLI_to_FMIns(it->second.ins[index], *ins);
+ return 0;
+}
+
ADLMIDI_EXPORT int adl_setNumFourOpsChn(ADL_MIDIPlayer *device, int ops4)
{
if(!device)