aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2019-06-06 21:27:19 +0300
committerWohlstand <admin@wohlnet.ru>2019-06-06 21:27:19 +0300
commit86d471c8d664f0c6921f30f0fce4e8d2a7cab77d (patch)
tree49f94ead51b1487fce0033052b48c324a450658f /utils
parent14303359fde2d8cf76a129296cf1f30fdcb57520 (diff)
downloadlibADLMIDI-86d471c8d664f0c6921f30f0fce4e8d2a7cab77d.tar.gz
libADLMIDI-86d471c8d664f0c6921f30f0fce4e8d2a7cab77d.tar.bz2
libADLMIDI-86d471c8d664f0c6921f30f0fce4e8d2a7cab77d.zip
Added IBK and C++98 support for generated database
Diffstat (limited to 'utils')
-rw-r--r--utils/gen_adldata/file_formats/load_ibk.h24
-rw-r--r--utils/gen_adldata/file_formats/load_jv.h3
-rw-r--r--utils/gen_adldata/gen_adldata.cc4
-rw-r--r--utils/gen_adldata/progs_cache.cpp96
-rw-r--r--utils/gen_adldata/progs_cache.h4
5 files changed, 83 insertions, 48 deletions
diff --git a/utils/gen_adldata/file_formats/load_ibk.h b/utils/gen_adldata/file_formats/load_ibk.h
index 8de302a..029d193 100644
--- a/utils/gen_adldata/file_formats/load_ibk.h
+++ b/utils/gen_adldata/file_formats/load_ibk.h
@@ -3,7 +3,9 @@
#include "../progs_cache.h"
-bool BankFormats::LoadIBK(const char *fn, unsigned bank, const char *prefix, bool percussive, bool noRhythmMode)
+bool BankFormats::LoadIBK(BanksDump &db, const char *fn, unsigned bank,
+ const std::string &bankTitle, const char *prefix,
+ bool percussive, bool noRhythmMode)
{
#ifdef HARD_BANKS
writeIni("IBK", fn, prefix, bank, percussive ? INI_Drums : INI_Melodic);
@@ -21,6 +23,9 @@ bool BankFormats::LoadIBK(const char *fn, unsigned bank, const char *prefix, boo
}
std::fclose(fp);
+ size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_Generic);
+ BanksDump::MidiBank bnk;
+
unsigned offs1_base = 0x804, offs1_len = 9;
unsigned offs2_base = 0x004, offs2_len = 16;
@@ -43,6 +48,9 @@ bool BankFormats::LoadIBK(const char *fn, unsigned bank, const char *prefix, boo
sprintf(name2, "%s%c%u", prefix,
(gmno < 128 ? 'M' : 'P'), gmno & 127);
+ BanksDump::InstrumentEntry inst;
+ BanksDump::Operator ops[5];
+
insdata tmp;
tmp.data[0] = data[offset2 + 0];
tmp.data[1] = data[offset2 + 1];
@@ -66,6 +74,11 @@ bool BankFormats::LoadIBK(const char *fn, unsigned bank, const char *prefix, boo
tmp2.voice2_fine_tune = 0.0;
tmp2.midi_velocity_offset = 0;
+ db.toOps(tmp, ops, 0);
+ inst.noteOffset1 = percussive ? 0 : data[offset2 + 12];
+ inst.percussionKeyNumber = percussive ? data[offset2 + 13] : 0;
+ inst.setFbConn(data[offset2 + 10]);
+
tmp2.rhythmModeDrum = 0;
if(percussive && !noRhythmMode)
{
@@ -74,18 +87,23 @@ bool BankFormats::LoadIBK(const char *fn, unsigned bank, const char *prefix, boo
{
case 6:
tmp2.rhythmModeDrum = ins::Flag_RM_BassDrum;
+ inst.instFlags |= BanksDump::InstrumentEntry::WOPL_RM_BassDrum;
break;
case 7:
tmp2.rhythmModeDrum = ins::Flag_RM_Snare;
+ inst.instFlags |= BanksDump::InstrumentEntry::WOPL_RM_Snare;
break;
case 8:
tmp2.rhythmModeDrum = ins::Flag_RM_TomTom;
+ inst.instFlags |= BanksDump::InstrumentEntry::WOPL_RM_TomTom;
break;
case 9:
tmp2.rhythmModeDrum = ins::Flag_RM_Cymbal;
+ inst.instFlags |= BanksDump::InstrumentEntry::WOPL_RM_Cymbal;
break;
case 10:
tmp2.rhythmModeDrum = ins::Flag_RM_HiHat;
+ inst.instFlags |= BanksDump::InstrumentEntry::WOPL_RM_HiHat;
break;
default:
// IBK logic: make non-percussion instrument be silent
@@ -96,8 +114,12 @@ bool BankFormats::LoadIBK(const char *fn, unsigned bank, const char *prefix, boo
size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2);
SetBank(bank, (unsigned int)gmno, resno);
+
+ db.addInstrument(bnk, a, inst, ops);
}
+ db.addMidiBank(bankDb, percussive, bnk);
+
AdlBankSetup setup;
setup.volumeModel = VOLUME_Generic;
setup.deepTremolo = false;
diff --git a/utils/gen_adldata/file_formats/load_jv.h b/utils/gen_adldata/file_formats/load_jv.h
index d2fe06b..a7ebf7b 100644
--- a/utils/gen_adldata/file_formats/load_jv.h
+++ b/utils/gen_adldata/file_formats/load_jv.h
@@ -96,8 +96,7 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank,
if(data[offset] != 0)
inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op;
inst.percussionKeyNumber = data[offset + 1];
- inst.fbConn = (static_cast<uint_fast16_t>(data[offset + 7] & 0x0F)) |
- (static_cast<uint_fast16_t>(data[offset + 7 + 11] & 0x0F) << 8);
+ inst.setFbConn(data[offset + 7], data[offset + 7 + 11]);
db.toOps(tmp[0], ops, 0);
db.toOps(tmp[1], ops, 2);
diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc
index 4b59439..c501642 100644
--- a/utils/gen_adldata/gen_adldata.cc
+++ b/utils/gen_adldata/gen_adldata.cc
@@ -192,7 +192,7 @@ int main(int argc, char**argv)
else
if(format == "IBK")
{
- if(!BankFormats::LoadIBK(filepath.c_str(), bank, prefix.c_str(), false))
+ if(!BankFormats::LoadIBK(db, filepath.c_str(), bank, bank_name, prefix.c_str(), false))
{
std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str());
return 1;
@@ -200,7 +200,7 @@ int main(int argc, char**argv)
if(!filepath_d.empty())
{
//printf("Loading %s... \n", filepath_d.c_str());
- if(!BankFormats::LoadIBK(filepath_d.c_str(),bank, prefix_d.c_str(), true, noRhythmMode))
+ if(!BankFormats::LoadIBK(db, filepath_d.c_str(),bank, bank_name, prefix_d.c_str(), true, noRhythmMode))
{
std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str());
return 1;
diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp
index 9200f0f..cb07092 100644
--- a/utils/gen_adldata/progs_cache.cpp
+++ b/utils/gen_adldata/progs_cache.cpp
@@ -251,32 +251,36 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade
std::fprintf(out, "const size_t g_embeddedBanksCount = %zu;\n\n", banks.size());
std::fprintf(out, "const BanksDump::BankEntry g_embeddedBanks[] =\n"
"{\n");
+
+ std::vector<size_t> bankNumberLists;
+
for(const BankEntry &be : banks)
{
- bool commaNeeded = true;
- std::fprintf(out, " {\n");
- std::fprintf(out, " 0x%04lX, %zu, %zu, \"%s\",\n",
+ std::fprintf(out, " {0x%04lX, %zu, %zu, \"%s\", ",
be.bankSetup,
be.melodic.size(),
be.percussion.size(),
be.bankTitle.c_str());
- // Melodic banks
- std::fprintf(out, " {");
- commaNeeded = false;
+
+ fprintf(out, "%zu, ", bankNumberLists.size()); // Use offset to point the common array of bank IDs
for(const size_t &me : be.melodic)
- {
- if(commaNeeded)
- std::fprintf(out, ", ");
- else
- commaNeeded = true;
- std::fprintf(out, "%zu", me);
- }
- std::fprintf(out, "},\n");
+ bankNumberLists.push_back(me);
- // Percussive banks
- commaNeeded = false;
- std::fprintf(out, " {");
+ fprintf(out, "%zu", bankNumberLists.size());
for(const size_t &me : be.percussion)
+ bankNumberLists.push_back(me);
+
+ std::fprintf(out, "},\n");
+ }
+
+ std::fprintf(out, "};\n\n");
+
+
+ std::fprintf(out, "const size_t g_embeddedBanksMidiIndex[] =\n"
+ "{ ");
+ {
+ bool commaNeeded = false;
+ for(const size_t &me : bankNumberLists)
{
if(commaNeeded)
std::fprintf(out, ", ");
@@ -284,23 +288,17 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade
commaNeeded = true;
std::fprintf(out, "%zu", me);
}
- std::fprintf(out, "}\n");
-
- std::fprintf(out, " },\n");
}
-
- std::fprintf(out, "}\n\n");
-
+ std::fprintf(out, " };\n\n");
std::fprintf(out, "const BanksDump::MidiBank g_embeddedBanksMidi[] =\n"
"{\n");
for(const MidiBank &be : midiBanks)
{
bool commaNeeded = true;
- std::fprintf(out, " {\n");
- std::fprintf(out, " %u, %u,\n", be.msb, be.lsb);
+ std::fprintf(out, " { %u, %u, ", be.msb, be.lsb);
- std::fprintf(out, " {");
+ std::fprintf(out, "{");
commaNeeded = false;
for(size_t i = 0; i < 128; i++)
{
@@ -310,11 +308,11 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade
commaNeeded = true;
std::fprintf(out, "%ld", be.instruments[i]);
}
- std::fprintf(out, "},\n");
+ std::fprintf(out, "} ");
- std::fprintf(out, " },\n");
+ std::fprintf(out, "},\n");
}
- std::fprintf(out, "}\n\n");
+ std::fprintf(out, "};\n\n");
std::fprintf(out, "const BanksDump::InstrumentEntry g_embeddedBanksInstruments[] =\n"
@@ -323,38 +321,52 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade
{
size_t opsCount = ((be.instFlags & InstrumentEntry::WOPL_Ins_4op) != 0 ||
(be.instFlags & InstrumentEntry::WOPL_Ins_Pseudo4op) != 0) ? 4 : 2;
- std::fprintf(out, " {\n");
- std::fprintf(out, " %d, %d, %d, %u, %lu, %d, 0x%04lX, 0x%lX, 0x%lX,\n",
+ std::fprintf(out, " { %d, %d, %d, %u, %s%lX, %d, %s%lX, %s%lX, %s%lX, ",
be.noteOffset1,
be.noteOffset2,
be.midiVelocityOffset,
be.percussionKeyNumber,
- be.instFlags,
+ (be.instFlags == 0 ? "" : "0x"), be.instFlags, // for compactness, don't print "0x" when is zero
be.secondVoiceDetune,
- be.fbConn,
- be.delay_on_ms,
- be.delay_off_ms);
+ (be.fbConn == 0 ? "" : "0x"), be.fbConn,
+ (be.delay_on_ms == 0 ? "" : "0x"), be.delay_on_ms,
+ (be.delay_off_ms == 0 ? "" : "0x"), be.delay_off_ms);
if(opsCount == 4)
- std::fprintf(out, " {%ld, %ld, %ld, %ld}\n",
+ std::fprintf(out, "{%ld, %ld, %ld, %ld} ",
be.ops[0], be.ops[1], be.ops[2], be.ops[3]);
else
- std::fprintf(out, " {%ld, %ld}\n",
+ std::fprintf(out, "{%ld, %ld} ",
be.ops[0], be.ops[1]);
- std::fprintf(out, " },\n");
+ std::fprintf(out, "},\n");
}
- std::fprintf(out, "}\n\n");
+ std::fprintf(out, "};\n\n");
std::fprintf(out, "const BanksDump::Operator g_embeddedBanksOperators[] =\n"
"{\n");
+ size_t operatorEntryCounter = 0;
for(const Operator &be : operators)
{
- std::fprintf(out, " {0x%07lX, 0x%02lX},\n",
+ if(operatorEntryCounter == 0)
+ std::fprintf(out, " ");
+ std::fprintf(out, "{0x%07lX, %s%02lX},",
be.d_E862,
- be.d_40);
+ (be.d_40 == 0 ? "" : "0x"), be.d_40);
+ operatorEntryCounter++;
+ if(operatorEntryCounter >= 25)
+ {
+ std::fprintf(out, "\n");
+ operatorEntryCounter = 0;
+ }
}
- std::fprintf(out, "}\n\n");
+ std::fprintf(out, "\n};\n\n");
std::fclose(out);
}
+
+void BanksDump::InstrumentEntry::setFbConn(uint_fast16_t fbConn1, uint_fast16_t fbConn2)
+{
+ fbConn = (static_cast<uint_fast16_t>(fbConn1 & 0x0F)) |
+ (static_cast<uint_fast16_t>(fbConn2 & 0x0F) << 8);
+}
diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h
index 6c47581..7998027 100644
--- a/utils/gen_adldata/progs_cache.h
+++ b/utils/gen_adldata/progs_cache.h
@@ -307,6 +307,8 @@ struct BanksDump
int_fast64_t delay_off_ms = 0;
int_fast32_t ops[5] = {-1, -1, -1, -1, -1};
+ void setFbConn(uint_fast16_t fbConn1, uint_fast16_t fbConn2 = 0x00);
+
bool operator==(const InstrumentEntry &o)
{
return (
@@ -367,7 +369,7 @@ bool LoadBNK2(const char *fn, unsigned bank, const char *prefix,
const std::string &melo_filter,
const std::string &perc_filter);
bool LoadEA(const char *fn, unsigned bank, const char *prefix);
-bool LoadIBK(const char *fn, unsigned bank, const char *prefix, bool percussive, bool noRhythmMode = false);
+bool LoadIBK(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix, bool percussive, bool noRhythmMode = false);
bool LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix);
bool LoadDoom(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix);
bool LoadTMB(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix);