diff options
author | Wohlstand <admin@wohlnet.ru> | 2019-05-31 22:07:21 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2019-05-31 22:07:21 +0300 |
commit | 732f2f269d6be456b93af18c8cec035fc01b5eba (patch) | |
tree | 65f75615b944710adf3221100099793a22df660c | |
parent | 7786fa8f6ba65673d24aa07245cb11d9a1fc1350 (diff) | |
download | libADLMIDI-732f2f269d6be456b93af18c8cec035fc01b5eba.tar.gz libADLMIDI-732f2f269d6be456b93af18c8cec035fc01b5eba.tar.bz2 libADLMIDI-732f2f269d6be456b93af18c8cec035fc01b5eba.zip |
Organize file formats parsers, and multi-bank AIL support
-rw-r--r-- | utils/gen_adldata/file_formats/common.h | 9 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_ail.h | 153 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_bisqwit.h | 2 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_bnk.h | 2 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_bnk2.h | 6 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_ea.h | 2 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_ibk.h | 2 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_jv.h | 2 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_op2.h | 2 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_tmb.h | 2 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_wopl.h | 4 | ||||
-rw-r--r-- | utils/gen_adldata/gen_adldata.cc | 35 | ||||
-rw-r--r-- | utils/gen_adldata/progs_cache.cpp | 14 | ||||
-rw-r--r-- | utils/gen_adldata/progs_cache.h | 56 |
14 files changed, 236 insertions, 55 deletions
diff --git a/utils/gen_adldata/file_formats/common.h b/utils/gen_adldata/file_formats/common.h index d06059e..f441221 100644 --- a/utils/gen_adldata/file_formats/common.h +++ b/utils/gen_adldata/file_formats/common.h @@ -25,4 +25,13 @@ inline uint16_t toUint16LE(const uint8_t *arr) return num; } +inline uint32_t toUint32LE(const uint8_t *arr) +{ + uint32_t num = arr[0]; + num |= (static_cast<uint32_t>(arr[1] << 8) & 0x0000FF00); + num |= (static_cast<uint32_t>(arr[2] << 16) & 0x00FF0000); + num |= (static_cast<uint32_t>(arr[3] << 24) & 0xFF000000); + return num; +} + #endif // COMMON_H diff --git a/utils/gen_adldata/file_formats/load_ail.h b/utils/gen_adldata/file_formats/load_ail.h index 80ca8ad..2feedb9 100644 --- a/utils/gen_adldata/file_formats/load_ail.h +++ b/utils/gen_adldata/file_formats/load_ail.h @@ -3,8 +3,17 @@ #include "../progs_cache.h" #include "../midi_inst_list.h" +#include "common.h" -static bool LoadMiles(const char *fn, unsigned bank, const char *prefix) +struct GTL_Head // GTL file header entry structure +{ + uint8_t patch = 0; + uint8_t bank = 0; + uint32_t offset = 0; +}; + +bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, + const std::string &bankTitle, const char *prefix) { #ifdef HARD_BANKS writeIni("AIL", fn, prefix, bank, INI_Both); @@ -13,7 +22,7 @@ static bool LoadMiles(const char *fn, unsigned bank, const char *prefix) if(!fp) return false; std::fseek(fp, 0, SEEK_END); - std::vector<unsigned char> data(size_t(std::ftell(fp))); + std::vector<uint8_t> data(size_t(std::ftell(fp))); std::rewind(fp); if(std::fread(&data[0], 1, data.size(), fp) != data.size()) { @@ -22,6 +31,145 @@ static bool LoadMiles(const char *fn, unsigned bank, const char *prefix) } std::fclose(fp); + GTL_Head head; + std::vector<GTL_Head> heads; + uint_fast8_t max_bank_number = 0; + heads.reserve(256); + uint8_t *data_pos = data.data(); + uint8_t *data_end = data.data() + data.size(); + do + { + if((data_end - data_pos) < 6) + return false; + + head.patch = data_pos[0]; + head.bank = data_pos[1]; + head.offset = toUint32LE(data_pos + 2); + + if((head.patch == 0xFF) || (head.bank == 0xFF)) + break; + + if(head.patch > 127)//Patch ID is more than 127 + return false; + + if((head.bank != 0x7F) && (head.bank > max_bank_number) ) + max_bank_number = head.bank; + + heads.push_back(head); + data_pos += 6; + } + while(data_pos < data_end); + + size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_AIL); + + std::vector<BanksDump::MidiBank> bnkMelodic; + bnkMelodic.resize(max_bank_number + 1, BanksDump::MidiBank()); + BanksDump::MidiBank bnkPercussion; + + { + uint8_t bank_lsb_counter = 0; + uint8_t bank_msb_counter = 0; + for(BanksDump::MidiBank &b : bnkMelodic) + { + b.lsb = bank_lsb_counter++; + b.msb = bank_msb_counter; + if(bank_lsb_counter == 0) + bank_msb_counter++; + } + } + + uint32_t totalInsts = static_cast<uint32_t>(heads.size()); + for(uint32_t i = 0; i < totalInsts; i++) + { + GTL_Head &h = heads[i]; + bool isPerc = (h.bank == 0x7F); + int gmPatchId = isPerc ? h.patch : (h.patch + (h.bank * 128)); + unsigned offset = h.offset; + + BanksDump::MidiBank &bnk = isPerc ? bnkPercussion : bnkMelodic[h.bank]; + + int gmno = h.bank == 0x7F ? int(h.patch + 0x80) : int(h.patch); + int midi_index = gmno < 128 ? gmno + : gmno < 128 + 35 ? -1 + : gmno < 128 + 88 ? gmno - 35 + : -1; + + unsigned length = data[offset] + data[offset + 1] * 256; + signed char notenum = ((signed char)data[offset + 2]); + + BanksDump::InstrumentEntry inst; + BanksDump::Operator ops[5]; + + char name2[512]; + sprintf(name2, "%s%c%u", prefix, + (gmno < 128 ? 'M' : 'P'), gmno & 127); + + insdata tmp[200]; + + const unsigned inscount = (length - 3) / 11; + bool twoOp = (inscount == 1); + + for(unsigned i = 0; i < inscount; ++i) + { + if(i >= 2) + break; + unsigned o = offset + 3 + i * 11; + tmp[i].finetune = (gmno < 128 && i == 0) ? notenum : 0; + tmp[i].diff = (i == 1); + tmp[i].data[0] = data[o + 0]; // 20 + tmp[i].data[8] = data[o + 1]; // 40 (vol) + tmp[i].data[2] = data[o + 2]; // 60 + tmp[i].data[4] = data[o + 3]; // 80 + tmp[i].data[6] = data[o + 4]; // E0 + tmp[i].data[1] = data[o + 6]; // 23 + tmp[i].data[9] = data[o + 7]; // 43 (vol) + tmp[i].data[3] = data[o + 8]; // 63 + tmp[i].data[5] = data[o + 9]; // 83 + tmp[i].data[7] = data[o + 10]; // E3 + + unsigned fb_c = data[offset + 3 + 5]; + tmp[i].data[10] = uint8_t(fb_c); + if(i == 1) + { + inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op; + tmp[0].data[10] = fb_c & 0x0F; + tmp[1].data[10] = uint8_t((fb_c & 0x0E) | (fb_c >> 7)); + } + db.toOps(tmp[i], ops, i * 2); + } + + if(inscount <= 2) + { + struct ins tmp2; + tmp2.notenum = gmno < 128 ? 0 : (unsigned char)notenum; + tmp2.pseudo4op = false; + tmp2.real4op = (inscount > 1); + tmp2.voice2_fine_tune = 0.0; + tmp2.midi_velocity_offset = 0; + tmp2.rhythmModeDrum = 0; + std::string name; + if(midi_index >= 0) name = std::string(1, '\377') + MidiInsName[midi_index]; + if(h.bank == 0 || h.bank == 0x7F) + { + size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2, twoOp); + SetBank(bank, (unsigned int)gmno, resno); + } + //--------------------------------------------------------------- + inst.percussionKeyNumber = isPerc ? static_cast<uint_fast8_t>(notenum) : 0; + inst.noteOffset1 = isPerc ? 0 : notenum; + unsigned fb_c = data[offset + 3 + 5]; + inst.fbConn = (static_cast<uint_fast16_t>(fb_c & 0x0F)) | + (static_cast<uint_fast16_t>((fb_c & 0x0E) | (fb_c >> 7)) << 8); + db.addInstrument(bnk, h.patch, inst, ops); + } + } + + for(auto &b : bnkMelodic) + db.addMidiBank(bankDb, false, b); + + db.addMidiBank(bankDb, true, bnkPercussion); + +#if 0 for(unsigned a = 0; a < 2000; ++a) { unsigned gm_patch = data[a * 6 + 0]; @@ -99,6 +247,7 @@ static bool LoadMiles(const char *fn, unsigned bank, const char *prefix) SetBank(bank, (unsigned int)gmno, resno); } } +#endif AdlBankSetup setup; setup.volumeModel = VOLUME_Generic; diff --git a/utils/gen_adldata/file_formats/load_bisqwit.h b/utils/gen_adldata/file_formats/load_bisqwit.h index 9749a76..8686e90 100644 --- a/utils/gen_adldata/file_formats/load_bisqwit.h +++ b/utils/gen_adldata/file_formats/load_bisqwit.h @@ -4,7 +4,7 @@ #include "../progs_cache.h" #include "../midi_inst_list.h" -static bool LoadBisqwit(const char *fn, unsigned bank, const char *prefix) +bool BankFormats::LoadBisqwit(const char *fn, unsigned bank, const char *prefix) { #ifdef HARD_BANKS writeIni("Bisqwit", fn, prefix, bank, INI_Both); diff --git a/utils/gen_adldata/file_formats/load_bnk.h b/utils/gen_adldata/file_formats/load_bnk.h index f1412ba..ca20625 100644 --- a/utils/gen_adldata/file_formats/load_bnk.h +++ b/utils/gen_adldata/file_formats/load_bnk.h @@ -7,7 +7,7 @@ #include <cstdint> #include <string> -static bool LoadBNK(const char *fn, unsigned bank, const char *prefix, bool is_fat, bool percussive) +bool BankFormats::LoadBNK(const char *fn, unsigned bank, const char *prefix, bool is_fat, bool percussive) { #ifdef HARD_BANKS writeIni("HMI", fn, prefix, bank, percussive ? INI_Drums : INI_Melodic); diff --git a/utils/gen_adldata/file_formats/load_bnk2.h b/utils/gen_adldata/file_formats/load_bnk2.h index 072712c..6a1cd25 100644 --- a/utils/gen_adldata/file_formats/load_bnk2.h +++ b/utils/gen_adldata/file_formats/load_bnk2.h @@ -8,9 +8,9 @@ inline int stdstoi(const std::string& str) return std::atoi(str.c_str()); } -static bool LoadBNK2(const char *fn, unsigned bank, const char *prefix, - const std::string &melo_filter, - const std::string &perc_filter) +bool BankFormats::LoadBNK2(const char *fn, unsigned bank, const char *prefix, + const std::string &melo_filter, + const std::string &perc_filter) { #ifdef HARD_BANKS writeIni("AdLibGold", fn, prefix, bank, INI_Both, melo_filter.c_str(), perc_filter.c_str()); diff --git a/utils/gen_adldata/file_formats/load_ea.h b/utils/gen_adldata/file_formats/load_ea.h index c217c09..67283ca 100644 --- a/utils/gen_adldata/file_formats/load_ea.h +++ b/utils/gen_adldata/file_formats/load_ea.h @@ -4,7 +4,7 @@ #include "../progs_cache.h" #include "../midi_inst_list.h" -static bool LoadEA(const char *fn, unsigned bank, const char *prefix) +bool BankFormats::LoadEA(const char *fn, unsigned bank, const char *prefix) { FILE *fp = std::fopen(fn, "rb"); if(!fp) diff --git a/utils/gen_adldata/file_formats/load_ibk.h b/utils/gen_adldata/file_formats/load_ibk.h index 28177c7..8de302a 100644 --- a/utils/gen_adldata/file_formats/load_ibk.h +++ b/utils/gen_adldata/file_formats/load_ibk.h @@ -3,7 +3,7 @@ #include "../progs_cache.h" -static bool LoadIBK(const char *fn, unsigned bank, const char *prefix, bool percussive, bool noRhythmMode = false) +bool BankFormats::LoadIBK(const char *fn, unsigned bank, const char *prefix, bool percussive, bool noRhythmMode) { #ifdef HARD_BANKS writeIni("IBK", fn, prefix, bank, percussive ? INI_Drums : INI_Melodic); diff --git a/utils/gen_adldata/file_formats/load_jv.h b/utils/gen_adldata/file_formats/load_jv.h index a498bb6..bcdf855 100644 --- a/utils/gen_adldata/file_formats/load_jv.h +++ b/utils/gen_adldata/file_formats/load_jv.h @@ -4,7 +4,7 @@ #include "../progs_cache.h" #include "../midi_inst_list.h" -static bool LoadJunglevision(const char *fn, unsigned bank, const char *prefix) +bool BankFormats::LoadJunglevision(const char *fn, unsigned bank, const char *prefix) { #ifdef HARD_BANKS writeIni("Junglevision", fn, prefix, bank, INI_Both); diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h index feb85ed..cac6bc9 100644 --- a/utils/gen_adldata/file_formats/load_op2.h +++ b/utils/gen_adldata/file_formats/load_op2.h @@ -49,7 +49,7 @@ struct Doom_opl_instr #endif -static bool LoadDoom(const char *fn, unsigned bank, const char *prefix) +bool BankFormats::LoadDoom(const char *fn, unsigned bank, const char *prefix) { #ifdef HARD_BANKS writeIni("OP2", fn, prefix, bank, INI_Both); diff --git a/utils/gen_adldata/file_formats/load_tmb.h b/utils/gen_adldata/file_formats/load_tmb.h index 4417b02..e7537af 100644 --- a/utils/gen_adldata/file_formats/load_tmb.h +++ b/utils/gen_adldata/file_formats/load_tmb.h @@ -4,7 +4,7 @@ #include "../progs_cache.h" #include "../midi_inst_list.h" -static bool LoadTMB(const char *fn, unsigned bank, const char *prefix) +bool BankFormats::LoadTMB(const char *fn, unsigned bank, const char *prefix) { #ifdef HARD_BANKS writeIni("TMB", fn, prefix, bank, INI_Both); diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h index 6c57950..f4b7540 100644 --- a/utils/gen_adldata/file_formats/load_wopl.h +++ b/utils/gen_adldata/file_formats/load_wopl.h @@ -18,7 +18,7 @@ enum class WOPL_Flags WOPL_RhythmModeMask = 0x38, }; -static bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const std::string bankTitle, const char *prefix) +bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const std::string bankTitle, const char *prefix) { FILE *fp = std::fopen(fn, "rb"); if(!fp) @@ -64,7 +64,7 @@ static bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const std::st setup.volumeModel = (int)data[0x12]; setup.scaleModulators = false; - size_t bankDb = (unsigned)db.initBank(bank, bankTitle, static_cast<uint_fast16_t>((static_cast<unsigned>(data[0x11]) << 8) | static_cast<unsigned>(data[0x12]))); + size_t bankDb = db.initBank(bank, bankTitle, static_cast<uint_fast16_t>((static_cast<unsigned>(data[0x11]) << 8) | static_cast<unsigned>(data[0x12]))); // Validate file format by size calculation if(version == 1) diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index 341a3f9..5c99147 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -15,17 +15,6 @@ #include "midi_inst_list.h" -#include "file_formats/load_ail.h" -#include "file_formats/load_bisqwit.h" -#include "file_formats/load_bnk2.h" -#include "file_formats/load_bnk.h" -#include "file_formats/load_ibk.h" -#include "file_formats/load_jv.h" -#include "file_formats/load_op2.h" -#include "file_formats/load_tmb.h" -#include "file_formats/load_wopl.h" -#include "file_formats/load_ea.h" - int main(int argc, char**argv) { if(argc == 1) @@ -114,7 +103,7 @@ int main(int argc, char**argv) if(format == "AIL") { - if(!LoadMiles(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadMiles(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; @@ -123,7 +112,7 @@ int main(int argc, char**argv) else if(format == "Bisqwit") { - if(!LoadBisqwit(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadBisqwit(filepath.c_str(), bank, prefix.c_str())) { std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str()); return 1; @@ -132,7 +121,7 @@ int main(int argc, char**argv) else if(format == "WOPL") { - if(!LoadWopl(db, filepath.c_str(), bank, bank_name, prefix.c_str())) + if(!BankFormats::LoadWopl(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; @@ -141,7 +130,7 @@ int main(int argc, char**argv) else if(format == "OP2") { - if(!LoadDoom(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadDoom(filepath.c_str(), bank, prefix.c_str())) { std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str()); return 1; @@ -150,7 +139,7 @@ int main(int argc, char**argv) else if(format == "EA") { - if(!LoadEA(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadEA(filepath.c_str(), bank, prefix.c_str())) { std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str()); return 1; @@ -159,7 +148,7 @@ int main(int argc, char**argv) else if(format == "TMB") { - if(!LoadTMB(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadTMB(filepath.c_str(), bank, prefix.c_str())) { std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str()); return 1; @@ -168,7 +157,7 @@ int main(int argc, char**argv) else if(format == "Junglevision") { - if(!LoadJunglevision(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadJunglevision(filepath.c_str(), bank, prefix.c_str())) { std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str()); return 1; @@ -177,7 +166,7 @@ int main(int argc, char**argv) else if(format == "AdLibGold") { - if(!LoadBNK2(filepath.c_str(), bank, prefix.c_str(), filter_m, filter_p)) + if(!BankFormats::LoadBNK2(filepath.c_str(), bank, prefix.c_str(), filter_m, filter_p)) { std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str()); return 1; @@ -186,14 +175,14 @@ int main(int argc, char**argv) else if(format == "HMI") { - if(!LoadBNK(filepath.c_str(), bank, prefix.c_str(), false, false)) + if(!BankFormats::LoadBNK(filepath.c_str(), bank, 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(!LoadBNK(filepath_d.c_str(),bank, prefix_d.c_str(), false, true)) + if(!BankFormats::LoadBNK(filepath_d.c_str(),bank, prefix_d.c_str(), false, true)) { std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str()); return 1; @@ -203,7 +192,7 @@ int main(int argc, char**argv) else if(format == "IBK") { - if(!LoadIBK(filepath.c_str(), bank, prefix.c_str(), false)) + if(!BankFormats::LoadIBK(filepath.c_str(), bank, prefix.c_str(), false)) { std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str()); return 1; @@ -211,7 +200,7 @@ int main(int argc, char**argv) if(!filepath_d.empty()) { //printf("Loading %s... \n", filepath_d.c_str()); - if(!LoadIBK(filepath_d.c_str(),bank, prefix_d.c_str(), true, noRhythmMode)) + if(!BankFormats::LoadIBK(filepath_d.c_str(),bank, 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 978494c..e720384 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -1,5 +1,15 @@ #include "progs_cache.h" -#include <cstdio> + +#include "file_formats/load_ail.h" +#include "file_formats/load_bisqwit.h" +#include "file_formats/load_bnk2.h" +#include "file_formats/load_bnk.h" +#include "file_formats/load_ibk.h" +#include "file_formats/load_jv.h" +#include "file_formats/load_op2.h" +#include "file_formats/load_tmb.h" +#include "file_formats/load_wopl.h" +#include "file_formats/load_ea.h" InstrumentDataTab insdatatab; @@ -309,7 +319,7 @@ 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, " %u, %u, %d, %u, %lu, %d, 0x%04lX, 0x%lX, 0x%lX,\n", + std::fprintf(out, " %d, %d, %d, %u, %lu, %d, 0x%04lX, 0x%lX, 0x%lX,\n", be.noteOffset1, be.noteOffset2, be.midiVelocityOffset, diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 89d611f..8f32568 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -13,10 +13,10 @@ #include <limits> #include <cmath> #include <cstdint> +#include <cstdio> #include <cassert> - struct insdata { uint8_t data[11]; @@ -129,6 +129,28 @@ extern std::vector<std::string> banknames; //static std::map<unsigned, std::map<unsigned, unsigned> > Correlate; //extern unsigned maxvalues[30]; +void SetBank(size_t bank, unsigned patch, size_t insno); +void SetBankSetup(size_t bank, const AdlBankSetup &setup); + +/* 2op voice instrument */ +size_t InsertIns(const insdata &id, ins &in, + const std::string &name, const std::string &name2); + +/* 4op voice instrument or double-voice 2-op instrument */ +size_t InsertIns(const insdata &id, const insdata &id2, ins &in, + const std::string &name, const std::string &name2, + bool oneVoice = false); + +size_t InsertNoSoundIns(); +insdata MakeNoSoundIns(); + + + + + + + + struct BanksDump { @@ -268,8 +290,8 @@ struct BanksDump WOPL_RM_HiHat = 0x28 } WOPL_RhythmMode; - uint_fast8_t noteOffset1 = 0; - uint_fast8_t noteOffset2 = 0; + int_fast8_t noteOffset1 = 0; + int_fast8_t noteOffset2 = 0; int_fast8_t midiVelocityOffset = 0; uint_fast8_t percussionKeyNumber = 0; uint_fast32_t instFlags = 0; @@ -335,20 +357,22 @@ struct BanksDump }; +namespace BankFormats +{ -void SetBank(size_t bank, unsigned patch, size_t insno); -void SetBankSetup(size_t bank, const AdlBankSetup &setup); - -/* 2op voice instrument */ -size_t InsertIns(const insdata &id, ins &in, - const std::string &name, const std::string &name2); - -/* 4op voice instrument or double-voice 2-op instrument */ -size_t InsertIns(const insdata &id, const insdata &id2, ins &in, - const std::string &name, const std::string &name2, - bool oneVoice = false); +bool LoadMiles(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix); +bool LoadBisqwit(const char *fn, unsigned bank, 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, + 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 LoadJunglevision(const char *fn, unsigned bank, const char *prefix); +bool LoadDoom(const char *fn, unsigned bank, const char *prefix); +bool LoadTMB(const char *fn, unsigned bank, const char *prefix); +bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const std::string bankTitle, const char *prefix); -size_t InsertNoSoundIns(); -insdata MakeNoSoundIns(); +} #endif // PROGS_H |