aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/gen_adldata/file_formats/load_bnk.h17
-rw-r--r--utils/gen_adldata/file_formats/load_bnk2.h38
-rw-r--r--utils/gen_adldata/file_formats/load_ea.h27
-rw-r--r--utils/gen_adldata/gen_adldata.cc8
-rw-r--r--utils/gen_adldata/progs_cache.h6
5 files changed, 84 insertions, 12 deletions
diff --git a/utils/gen_adldata/file_formats/load_bnk.h b/utils/gen_adldata/file_formats/load_bnk.h
index ca20625..beb2bd5 100644
--- a/utils/gen_adldata/file_formats/load_bnk.h
+++ b/utils/gen_adldata/file_formats/load_bnk.h
@@ -7,7 +7,9 @@
#include <cstdint>
#include <string>
-bool BankFormats::LoadBNK(const char *fn, unsigned bank, const char *prefix, bool is_fat, bool percussive)
+bool BankFormats::LoadBNK(BanksDump &db, const char *fn, unsigned bank,
+ const std::string &bankTitle, const char *prefix,
+ bool is_fat, bool percussive)
{
#ifdef HARD_BANKS
writeIni("HMI", fn, prefix, bank, percussive ? INI_Drums : INI_Melodic);
@@ -25,6 +27,9 @@ bool BankFormats::LoadBNK(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;
+
/*printf("%s:\n", fn);*/
//unsigned short version = *(short*)&data[0]; // major,minor (2 bytes)
// "ADLIB-" (6 bytes)
@@ -80,6 +85,9 @@ bool BankFormats::LoadBNK(const char *fn, unsigned bank, const char *prefix, boo
else
sprintf(name2, "%s%u", prefix, n);
+ BanksDump::InstrumentEntry inst;
+ BanksDump::Operator ops[5];
+
insdata tmp;
tmp.data[0] = uint8_t(
(op1[ 9] << 7) // TREMOLO FLAG
@@ -115,11 +123,16 @@ bool BankFormats::LoadBNK(const char *fn, unsigned bank, const char *prefix, boo
if(is_fat) tmp.data[10] ^= 1;
+ db.toOps(tmp, ops, 0);
+ inst.percussionKeyNumber = is_fat ? voice_num : (percussive ? usage_flag : 0);
+ inst.setFbConn(op1[2] * 2 + op1[12]);
+
size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2);
if(!is_fat)
{
SetBank(bank, (unsigned int)gmno, resno);
+ db.addInstrument(bnk, n & 127, inst, ops);
}
else
{
@@ -151,6 +164,8 @@ bool BankFormats::LoadBNK(const char *fn, unsigned bank, const char *prefix, boo
*/
}
+ db.addMidiBank(bankDb, percussive, bnk);
+
AdlBankSetup setup;
setup.volumeModel = VOLUME_Generic;
setup.deepTremolo = false;
diff --git a/utils/gen_adldata/file_formats/load_bnk2.h b/utils/gen_adldata/file_formats/load_bnk2.h
index 6a1cd25..7ab8af6 100644
--- a/utils/gen_adldata/file_formats/load_bnk2.h
+++ b/utils/gen_adldata/file_formats/load_bnk2.h
@@ -8,7 +8,8 @@ inline int stdstoi(const std::string& str)
return std::atoi(str.c_str());
}
-bool BankFormats::LoadBNK2(const char *fn, unsigned bank, const char *prefix,
+bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank,
+ const std::string &bankTitle, const char *prefix,
const std::string &melo_filter,
const std::string &perc_filter)
{
@@ -28,6 +29,10 @@ bool BankFormats::LoadBNK2(const char *fn, unsigned bank, const char *prefix,
}
std::fclose(fp);
+ size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_Generic);
+ BanksDump::MidiBank bnkMelodic;
+ BanksDump::MidiBank bnkPercussion;
+
unsigned short ins_entries = *(unsigned short *)&data[28 + 2 + 10];
unsigned char *records = &data[48];
@@ -47,13 +52,24 @@ bool BankFormats::LoadBNK2(const char *fn, unsigned bank, const char *prefix,
}
int gmno = 0;
+ int patchId = 0;
+ bool isPercussion = false;
if(name.substr(0, melo_filter.size()) == melo_filter)
- gmno = stdstoi(name.substr(melo_filter.size()));
+ {
+ gmno = patchId = stdstoi(name.substr(melo_filter.size()));
+ isPercussion = false;
+ }
else if(name.substr(0, perc_filter.size()) == perc_filter)
- gmno = stdstoi(name.substr(perc_filter.size())) + 128;
+ {
+ patchId = stdstoi(name.substr(perc_filter.size()));
+ gmno = patchId + 128;
+ isPercussion = false;
+ }
else
continue;
+ BanksDump::MidiBank &bnk = isPercussion ? bnkMelodic : bnkPercussion;
+
const unsigned char *insdata = &data[size_t(offset2)];
const unsigned char *ops[4] = { insdata + 0, insdata + 6, insdata + 12, insdata + 18 };
unsigned char C4xxxFFFC = insdata[24];
@@ -64,6 +80,9 @@ bool BankFormats::LoadBNK2(const char *fn, unsigned bank, const char *prefix,
char name2[512];
sprintf(name2, "%s%c%u", prefix, (gmno & 128) ? 'P' : 'M', gmno & 127);
+ BanksDump::InstrumentEntry inst;
+ BanksDump::Operator opsD[5];
+
struct insdata tmp[2];
for(unsigned a = 0; a < 2; ++a)
{
@@ -79,6 +98,7 @@ bool BankFormats::LoadBNK2(const char *fn, unsigned bank, const char *prefix,
tmp[a].data[9] = ops[a * 2 + 1][1];
tmp[a].finetune = (int8_t)TTTTTTTT;
tmp[a].diff = false;
+ db.toOps(tmp[a], opsD, a * 2);
}
tmp[0].data[10] = C4xxxFFFC & 0x0F;
tmp[1].data[10] = (tmp[0].data[10] & 0x0E) | (C4xxxFFFC >> 7);
@@ -91,6 +111,10 @@ bool BankFormats::LoadBNK2(const char *fn, unsigned bank, const char *prefix,
tmp2.midi_velocity_offset = 0;
tmp2.rhythmModeDrum = 0;
+ inst.setFbConn(C4xxxFFFC & 0x0F, (tmp[0].data[10] & 0x0E) | (C4xxxFFFC >> 7));
+ inst.noteOffset1 = (int8_t)TTTTTTTT;
+ inst.percussionKeyNumber = (gmno & 128) ? 35 : 0;
+
if(xxP24NNN & 8)
{
// dual-op
@@ -98,15 +122,23 @@ bool BankFormats::LoadBNK2(const char *fn, unsigned bank, const char *prefix,
tmp[1].diff = true;
size_t resno = InsertIns(tmp[0], tmp[1], tmp2, std::string(1, '\377') + name, name2);
SetBank(bank, (unsigned int)gmno, resno);
+
+ inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op;
+ db.addInstrument(bnk, patchId, inst, opsD);
}
else
{
// single-op
size_t resno = InsertIns(tmp[0], tmp2, std::string(1, '\377') + name, name2);
SetBank(bank, (unsigned int)gmno, resno);
+
+ db.addInstrument(bnk, patchId, inst, opsD);
}
}
+ db.addMidiBank(bankDb, false, bnkMelodic);
+ db.addMidiBank(bankDb, true, bnkPercussion);
+
AdlBankSetup setup;
setup.volumeModel = VOLUME_Generic;
setup.deepTremolo = false;
diff --git a/utils/gen_adldata/file_formats/load_ea.h b/utils/gen_adldata/file_formats/load_ea.h
index 67283ca..da7d0cc 100644
--- a/utils/gen_adldata/file_formats/load_ea.h
+++ b/utils/gen_adldata/file_formats/load_ea.h
@@ -4,12 +4,17 @@
#include "../progs_cache.h"
#include "../midi_inst_list.h"
-bool BankFormats::LoadEA(const char *fn, unsigned bank, const char *prefix)
+bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank,
+ const std::string &bankTitle, const char *prefix)
{
FILE *fp = std::fopen(fn, "rb");
if(!fp)
return false;
+ size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_CMF);
+ BanksDump::MidiBank bnkMelodic = db.midiBanks[db.banks[0].melodic[0]];
+ BanksDump::MidiBank bnkPercussion = db.midiBanks[db.banks[0].percussion[0]];
+
// Copy all instruments from bank 0
for(unsigned gmno = 0; gmno < 128; ++gmno)
progs[bank][gmno] = progs[0][gmno];
@@ -61,6 +66,9 @@ bool BankFormats::LoadEA(const char *fn, unsigned bank, const char *prefix)
return false;
}
+ BanksDump::InstrumentEntry inst;
+ BanksDump::Operator ops[5];
+
insdata tmp;
tmp.data[0] = bytes[0]; // reg 0x20: modulator AM/VIG/EG/KSR
tmp.data[8] = bytes[1]; // reg 0x40: modulator ksl/attenuation
@@ -88,6 +96,10 @@ bool BankFormats::LoadEA(const char *fn, unsigned bank, const char *prefix)
tmp2.real4op = false;
tmp2.rhythmModeDrum = 0;
+ db.toOps(tmp, ops, 0);
+ inst.setFbConn(bytes[8]);
+ inst.noteOffset1 = int8_t(bytes[9] + 12);
+
std::string name;
char name2[512];
if(gmno < 20)
@@ -101,28 +113,38 @@ bool BankFormats::LoadEA(const char *fn, unsigned bank, const char *prefix)
size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2);
SetBank(bank, gmno, resno);
+ db.addInstrument(bnkMelodic, gmno, inst, ops);
+
if(gmno == 10)
{
/*tmp.finetune=0;*/ tmp2.notenum = 0x49;
SetBank(bank, 0x80 + 0x36, InsertIns(tmp, tmp2, std::string(1, '\377') + MidiInsName[0x80 + 0x36 - 35], std::string(1, '\377') + prefix + "P54"));
+ inst.percussionKeyNumber = 0x49;
+ db.addInstrument(bnkPercussion, 0x36, inst, ops);
}
if(gmno == 18)
{
/*tmp.finetune=0;*/ tmp2.notenum = 0x17;
SetBank(bank, 0x80 + 0x2A, InsertIns(tmp, tmp2, std::string(1, '\377') + MidiInsName[0x80 + 0x2A - 35], std::string(1, '\377') + prefix + "P42"));
+ inst.percussionKeyNumber = 0x17;
+ db.addInstrument(bnkPercussion, 0x2A, inst, ops);
}
if(gmno == 16)
{
/*tmp.finetune=0;*/ tmp2.notenum = 0x0C;
SetBank(bank, 0x80 + 0x24, InsertIns(tmp, tmp2, std::string(1, '\377') + MidiInsName[0x80 + 0x24 - 35], std::string(1, '\377') + prefix + "P36"));
+ inst.percussionKeyNumber = 0x0C;
+ db.addInstrument(bnkPercussion, 0x24, inst, ops);
}
if(gmno == 17)
{
/*tmp.finetune=0;*/ tmp2.notenum = 0x01;
SetBank(bank, 0x80 + 0x26, InsertIns(tmp, tmp2, std::string(1, '\377') + MidiInsName[0x80 + 0x26 - 35], std::string(1, '\377') + prefix + "P38"));
+ inst.percussionKeyNumber = 0x01;
+ db.addInstrument(bnkPercussion, 0x26, inst, ops);
}
}
@@ -135,6 +157,9 @@ bool BankFormats::LoadEA(const char *fn, unsigned bank, const char *prefix)
setup.scaleModulators = false;
SetBankSetup(bank, setup);
+ db.addMidiBank(bankDb, false, bnkMelodic);
+ db.addMidiBank(bankDb, true, bnkPercussion);
+
return true;
}
diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc
index c501642..d2cfa5c 100644
--- a/utils/gen_adldata/gen_adldata.cc
+++ b/utils/gen_adldata/gen_adldata.cc
@@ -139,7 +139,7 @@ int main(int argc, char**argv)
else
if(format == "EA")
{
- if(!BankFormats::LoadEA(filepath.c_str(), bank, prefix.c_str()))
+ if(!BankFormats::LoadEA(db, filepath.c_str(), bank, bank_name, prefix.c_str()))
{
std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str());
return 1;
@@ -166,7 +166,7 @@ int main(int argc, char**argv)
else
if(format == "AdLibGold")
{
- if(!BankFormats::LoadBNK2(filepath.c_str(), bank, prefix.c_str(), filter_m, filter_p))
+ if(!BankFormats::LoadBNK2(db, filepath.c_str(), bank, bank_name, prefix.c_str(), filter_m, filter_p))
{
std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str());
return 1;
@@ -175,14 +175,14 @@ int main(int argc, char**argv)
else
if(format == "HMI")
{
- if(!BankFormats::LoadBNK(filepath.c_str(), bank, prefix.c_str(), false, false))
+ if(!BankFormats::LoadBNK(db, filepath.c_str(), bank, bank_name, prefix.c_str(), false, false))
{
std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str());
return 1;
}
if(!filepath_d.empty())
{
- if(!BankFormats::LoadBNK(filepath_d.c_str(),bank, prefix_d.c_str(), false, true))
+ if(!BankFormats::LoadBNK(db, filepath_d.c_str(), bank, bank_name, prefix_d.c_str(), false, true))
{
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.h b/utils/gen_adldata/progs_cache.h
index 7998027..09f75f6 100644
--- a/utils/gen_adldata/progs_cache.h
+++ b/utils/gen_adldata/progs_cache.h
@@ -364,11 +364,11 @@ namespace BankFormats
bool LoadMiles(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix);
bool LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix);
-bool LoadBNK(const char *fn, unsigned bank, const char *prefix, bool is_fat, bool percussive);
-bool LoadBNK2(const char *fn, unsigned bank, const char *prefix,
+bool LoadBNK(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix, bool is_fat, bool percussive);
+bool LoadBNK2(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix,
const std::string &melo_filter,
const std::string &perc_filter);
-bool LoadEA(const char *fn, unsigned bank, const char *prefix);
+bool LoadEA(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix);
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);