diff options
author | Wohlstand <admin@wohlnet.ru> | 2019-06-06 21:27:19 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2019-06-06 21:27:19 +0300 |
commit | 86d471c8d664f0c6921f30f0fce4e8d2a7cab77d (patch) | |
tree | 49f94ead51b1487fce0033052b48c324a450658f /utils | |
parent | 14303359fde2d8cf76a129296cf1f30fdcb57520 (diff) | |
download | libADLMIDI-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.h | 24 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_jv.h | 3 | ||||
-rw-r--r-- | utils/gen_adldata/gen_adldata.cc | 4 | ||||
-rw-r--r-- | utils/gen_adldata/progs_cache.cpp | 96 | ||||
-rw-r--r-- | utils/gen_adldata/progs_cache.h | 4 |
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); |