aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi.cpp
diff options
context:
space:
mode:
authorVitaly Novichkov <Wohlstand@users.noreply.github.com>2018-07-03 23:37:35 +0300
committerGitHub <noreply@github.com>2018-07-03 23:37:35 +0300
commit586a040555a5aac4d932887bf9eedc31d947a823 (patch)
treeecb4b4455c53374aaf744861de91f491f31437b8 /src/adlmidi.cpp
parent167231c0cf19a7cffd30210817b571a0d0b55013 (diff)
parenteecf8221aeac7097b971d585140850d45271e7a0 (diff)
downloadlibADLMIDI-586a040555a5aac4d932887bf9eedc31d947a823.tar.gz
libADLMIDI-586a040555a5aac4d932887bf9eedc31d947a823.tar.bz2
libADLMIDI-586a040555a5aac4d932887bf9eedc31d947a823.zip
Merge pull request #126 from jpcima/bank-embed-api
embedded bank loading API into multi-bank
Diffstat (limited to 'src/adlmidi.cpp')
-rw-r--r--src/adlmidi.cpp35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp
index 3a1923a..8d1595a 100644
--- a/src/adlmidi.cpp
+++ b/src/adlmidi.cpp
@@ -123,8 +123,8 @@ ADLMIDI_EXPORT int adl_setBank(ADL_MIDIPlayer *device, int bank)
ADL_UNUSED(bank);
MidiPlayer *play = GET_MIDI_PLAYER(device);
play->setErrorString("This build of libADLMIDI has no embedded banks. "
- "Please load bank by using of adl_openBankFile() or "
- "adl_openBankData() functions instead of adl_setBank()");
+ "Please load banks by using adl_openBankFile() or "
+ "adl_openBankData() functions instead of adl_setBank().");
return -1;
#else
const uint32_t NumBanks = static_cast<uint32_t>(maxAdlBanks());
@@ -304,6 +304,37 @@ ADLMIDI_EXPORT int adl_setInstrument(ADL_MIDIPlayer *device, ADL_Bank *bank, uns
return 0;
}
+ADLMIDI_EXPORT int adl_loadEmbeddedBank(struct ADL_MIDIPlayer *device, ADL_Bank *bank, int num)
+{
+ if(!device)
+ return -1;
+ MidiPlayer *play = GET_MIDI_PLAYER(device);
+ if (!play)
+ return -1;
+
+#ifdef DISABLE_EMBEDDED_BANKS
+ ADL_UNUSED(bank);
+ ADL_UNUSED(num);
+ play->setErrorString("This build of libADLMIDI has no embedded banks. "
+ "Please load banks by using adl_openBankFile() or "
+ "adl_openBankData() functions instead of adl_loadEmbeddedBank().");
+ return -1;
+#else
+ if(num < 0 || num >= maxAdlBanks())
+ return -1;
+
+ OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer);
+ size_t id = it->first;
+
+ for (unsigned i = 0; i < 128; ++i) {
+ size_t insno = i + ((id & OPL3::PercussionTag) ? 128 : 0);
+ size_t adlmeta = ::banks[num][insno];
+ it->second.ins[i] = adlinsdata2(::adlins[adlmeta]);
+ }
+ return 0;
+#endif
+}
+
ADLMIDI_EXPORT int adl_setNumFourOpsChn(ADL_MIDIPlayer *device, int ops4)
{
if(!device)