From 6878f4ead2cbf01f62a5d5903229a994cacad9b6 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Thu, 30 May 2019 00:49:05 +0300 Subject: Draft structure for new embedded banks store --- utils/gen_adldata/progs_cache.h | 121 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) (limited to 'utils') diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 28aaa19..a6614b3 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -125,6 +125,127 @@ extern std::vector banknames; //static std::map > Correlate; //extern unsigned maxvalues[30]; + +struct BanksDump +{ + struct BankEntry + { + uint_fast32_t bankId; + + /* Global OPL flags */ + typedef enum WOPLFileFlags + { + /* Enable Deep-Tremolo flag */ + WOPL_FLAG_DEEP_TREMOLO = 0x01, + /* Enable Deep-Vibrato flag */ + WOPL_FLAG_DEEP_VIBRATO = 0x02 + } WOPLFileFlags; + + /* Volume scaling model implemented in the libADLMIDI */ + typedef enum WOPL_VolumeModel + { + WOPL_VM_Generic = 0, + WOPL_VM_Native, + WOPL_VM_DMX, + WOPL_VM_Apogee, + WOPL_VM_Win9x + } WOPL_VolumeModel; + + /** + * @brief Suggested bank setup in dependence from a driver that does use of this + */ + enum BankSetup + { + SETUP_Generic = 0x0300, + SETUP_Win9X = 0x0304, + SETUP_DMX = 0x0002, + SETUP_Apogee = 0x0003, + SETUP_AIL = 0x0300, + SETUP_IBK = 0x0301, + SETUP_IMF = 0x0200, + SETUP_CMF = 0x0201 + }; + + uint_fast16_t bankSetup; // 0xAABB, AA - OPL flags, BB - Volume model + std::vector melodic; + std::vector percussion; + }; + + struct MidiBank + { + uint_fast32_t midiBankId; + uint_fast8_t msb, lsb; + int_fast32_t instruments[128]; + }; + + struct InstrumentEntry + { + uint_fast32_t instId; + + typedef enum WOPL_InstrumentFlags + { + /* Is two-operator single-voice instrument (no flags) */ + WOPL_Ins_2op = 0x00, + /* Is true four-operator instrument */ + WOPL_Ins_4op = 0x01, + /* Is pseudo four-operator (two 2-operator voices) instrument */ + WOPL_Ins_Pseudo4op = 0x02, + /* Is a blank instrument entry */ + WOPL_Ins_IsBlank = 0x04, + + /* RythmMode flags mask */ + WOPL_RhythmModeMask = 0x38, + + /* Mask of the flags range */ + WOPL_Ins_ALL_MASK = 0x07 + } WOPL_InstrumentFlags; + + typedef enum WOPL_RhythmMode + { + /* RythmMode: BassDrum */ + WOPL_RM_BassDrum = 0x08, + /* RythmMode: Snare */ + WOPL_RM_Snare = 0x10, + /* RythmMode: TomTom */ + WOPL_RM_TomTom = 0x18, + /* RythmMode: Cymbell */ + WOPL_RM_Cymbal = 0x20, + /* RythmMode: HiHat */ + WOPL_RM_HiHat = 0x28 + } WOPL_RhythmMode; + + uint_fast8_t noteOffset1; + uint_fast8_t noteOffset2; + int_fast8_t midiVelocityOffset; + uint_fast8_t percussionKeyNumber; + uint_fast32_t instFlags; + double secondVoiceDetune; + /* + 2op: modulator1, carrier1, feedback1 + 2vo: modulator1, carrier1, modulator2, carrier2, feedback(1+2) + 4op: modulator1, carrier1, modulator2, carrier2, feedback1 + */ + //! Contains FeedBack-Connection for both operators 0xBBAA - AA - first, BB - second + int16_t fbConn; + size_t ops[5] = {-1, -1, -1, -1, -1}; + int64_t delay_on_ms; + int64_t delay_off_ms; + }; + + struct Operator + { + uint_fast32_t d_E862; + uint_fast32_t d_40; + }; + + std::vector banks; + std::vector midiBanks; + std::vector instruments; + std::vector operators; +}; + + + void SetBank(size_t bank, unsigned patch, size_t insno); void SetBankSetup(size_t bank, const AdlBankSetup &setup); -- cgit v1.2.3 From 283b2f249a17eba3be8a98e09f1d009e2ef20aee Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Thu, 30 May 2019 18:11:59 +0300 Subject: Continue work on a new db format with a small dumper --- utils/gen_adldata/file_formats/load_wopl.h | 11 +- utils/gen_adldata/gen_adldata.cc | 6 +- utils/gen_adldata/progs_cache.cpp | 173 +++++++++++++++++++++++++++++ utils/gen_adldata/progs_cache.h | 121 +++++++++++++++++--- 4 files changed, 289 insertions(+), 22 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h index cd8765e..cef475f 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(const char *fn, unsigned bank, const char *prefix) +static bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const char *prefix) { FILE *fp = std::fopen(fn, "rb"); if(!fp) @@ -27,6 +27,7 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix) std::fflush(stderr); return false; } + std::fseek(fp, 0, SEEK_END); std::vector data(size_t(std::ftell(fp))); std::rewind(fp); @@ -63,6 +64,8 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix) setup.volumeModel = (int)data[0x12]; setup.scaleModulators = false; + size_t bankDb = (unsigned)db.initBank(bank, static_cast((static_cast(data[0x11]) << 8) | static_cast(data[0x12]))); + // Validate file format by size calculation if(version == 1) { @@ -98,12 +101,14 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix) percussion_offset = melodic_offset + (insSize * 128 * mbanks_count); - uint32_t root_offsets[2] = {melodic_offset, percussion_offset}; + //uint32_t root_sizes[2] = {mbanks_count, pbanks_count}; + uint32_t root_sizes[2] = {1, 1}; + uint32_t root_offsets[2] = {melodic_offset, percussion_offset}; for(size_t bset = 0; bset < 2; bset++) { bool is_percussion = (bset == 1); - for(uint32_t bankno = 0; bankno < 1; bankno++) // only first melodic bank (Until multi-banks support will be implemented) + for(uint32_t bankno = 0; bankno < root_sizes[bset]; bankno++) // only first melodic bank (Until multi-banks support will be implemented) { uint32_t bank_offset = root_offsets[bset] + (bankno * insSize * 128); diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index 7cb4528..1896c43 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -46,6 +46,8 @@ int main(int argc, char**argv) return 1; } + BanksDump db; + std::fprintf(outFile, "\ #include \"adldata.hh\"\n\ \n\ @@ -130,7 +132,7 @@ int main(int argc, char**argv) else if(format == "WOPL") { - if(!LoadWopl(filepath.c_str(), bank, prefix.c_str())) + if(!LoadWopl(db, filepath.c_str(), bank, prefix.c_str())) { std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str()); return 1; @@ -565,6 +567,8 @@ int main(int argc, char**argv) std::fclose(outFile); + db.exportBanks(std::string(outFile_s) + "x"); + std::printf("Generation of ADLMIDI data has been completed!\n"); std::fflush(stdout); } diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index 10124a8..df78026 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -1,4 +1,5 @@ #include "progs_cache.h" +#include InstrumentDataTab insdatatab; @@ -121,3 +122,175 @@ insdata MakeNoSoundIns() return { {0x00, 0x10, 0x07, 0x07, 0xF7, 0xF7, 0x00, 0x00, 0xFF, 0xFF, 0x00}, 0, false}; } + +size_t BanksDump::initBank(size_t bankId, uint_fast16_t bankSetup) +{ +#if 0 + assert(bankId <= banks.size()); + if(bankId >= banks.size()) + banks.emplace_back(); + BankEntry &b = banks[bankId]; +#else + banks.emplace_back(); + BankEntry &b = banks.back(); +#endif + b.bankId = bankId; + b.bankSetup = bankSetup; + return b.bankId; +} + +void BanksDump::addMidiBank(size_t bankId, bool percussion, BanksDump::MidiBank b) +{ + assert(bankId < banks.size()); + BankEntry &be = banks[bankId]; + + auto it = std::find(midiBanks.begin(), midiBanks.end(), b); + if(it == midiBanks.end()) + { + b.midiBankId = midiBanks.size(); + midiBanks.push_back(b); + } + else + { + b.midiBankId = it->midiBankId; + } + + if(percussion) + be.percussion.push_back(b.midiBankId); + else + be.melodic.push_back(b.midiBankId); +} + +void BanksDump::addInstrument(BanksDump::MidiBank &bank, size_t patchId, BanksDump::InstrumentEntry e, BanksDump::Operator *ops) +{ + assert(patchId < 128); + size_t opsCount = ((e.instFlags & InstrumentEntry::WOPL_Ins_4op) != 0 || + (e.instFlags & InstrumentEntry::WOPL_Ins_Pseudo4op) != 0) ? + 4 : 2; + for(size_t op = 0; op < opsCount; op++) + { + Operator o = ops[op]; + auto it = std::find(operators.begin(), operators.end(), o); + if(it == operators.end()) + { + o.opId = operators.size(); + e.ops[op] = static_cast(o.opId); + operators.push_back(o); + } + else + { + e.ops[op] = static_cast(it->opId); + } + } + + auto it = std::find(instruments.begin(), instruments.end(), e); + if(it == instruments.end()) + { + e.instId = instruments.size(); + instruments.push_back(e); + } + else + { + e.instId = it->instId; + } + bank.instruments[patchId] = static_cast(e.instId); +} + +void BanksDump::exportBanks(const std::string &outPath, const std::string &headerName) +{ + FILE *out = std::fopen(outPath.c_str(), "w"); + + std::fprintf(out, "/**********************************************************\n" + " This file is generated by `gen_adldata` automatically\n" + " Don't edit it directly!\n" + " To modify content of this file, modify banks\n" + " and re-run the `gen_adldata` build step.\n" + "***********************************************************/\n\n" + "#include \"%s\"\n\n\n", headerName.c_str()); + + std::fprintf(out, "const size_t g_embeddedBanksCount = %zu;\n\n", banks.size()); + std::fprintf(out, "const BanksDump::BankEntry g_embeddedBanks[] =\n" + "{\n"); + for(const BankEntry &be : banks) + { + std::fprintf(out, " {\n"); + std::fprintf(out, " 0x%04lX, %zu, %zu,", + be.bankSetup, + be.melodic.size(), + be.percussion.size()); + // Melodic banks + std::fprintf(out, " { "); + for(const size_t &me : be.melodic) + std::fprintf(out, "%zu, ", me); + std::fprintf(out, " },\n"); + + // Percussive banks + std::fprintf(out, " { "); + for(const size_t &me : be.percussion) + std::fprintf(out, "%zu, ", me); + std::fprintf(out, " }\n"); + + std::fprintf(out, " },\n"); + } + + std::fprintf(out, "}\n\n"); + + + std::fprintf(out, "const BanksDump::MidiBank g_embeddedBanksMidi[] =\n" + "{\n"); + for(const MidiBank &be : midiBanks) + { + std::fprintf(out, " {\n"); + std::fprintf(out, " %u, %u,", be.msb, be.lsb); + + std::fprintf(out, " { "); + for(size_t i = 0; i < 128; i++) + std::fprintf(out, "%ld, ", be.instruments[i]); + std::fprintf(out, " },\n"); + + std::fprintf(out, " },\n"); + } + std::fprintf(out, "}\n\n"); + + + std::fprintf(out, "const BanksDump::InstrumentEntry g_embeddedBanksInstruments[] =\n" + "{\n"); + for(const InstrumentEntry &be : instruments) + { + 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, %lu, %lu, %lu, ", + be.noteOffset1, + be.noteOffset2, + be.midiVelocityOffset, + be.percussionKeyNumber, + be.instFlags, + be.secondVoiceDetune, + be.fbConn, + be.delay_on_ms, + be.delay_off_ms); + + if(opsCount == 4) + 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}", + be.ops[0], be.ops[1]); + + std::fprintf(out, " },\n"); + } + std::fprintf(out, "}\n\n"); + + std::fprintf(out, "const BanksDump::Operator g_embeddedBanksOperators[] =\n" + "{\n"); + for(const Operator &be : operators) + { + std::fprintf(out, " { %08lX, %02lX },\n", + be.d_E862, + be.d_40); + } + std::fprintf(out, "}\n\n"); + + std::fclose(out); +} diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index a6614b3..d115ddc 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -12,6 +12,10 @@ #include #include #include +#include + +#include + struct insdata { @@ -130,7 +134,7 @@ struct BanksDump { struct BankEntry { - uint_fast32_t bankId; + uint_fast32_t bankId = 0; /* Global OPL flags */ typedef enum WOPLFileFlags @@ -166,21 +170,68 @@ struct BanksDump SETUP_CMF = 0x0201 }; - uint_fast16_t bankSetup; // 0xAABB, AA - OPL flags, BB - Volume model + uint_fast16_t bankSetup = SETUP_Generic; // 0xAABB, AA - OPL flags, BB - Volume model std::vector melodic; std::vector percussion; + + explicit BankEntry() = default; + + BankEntry(const BankEntry &o) + { + bankId = o.bankId; + bankSetup = o.bankSetup; + melodic = o.melodic; + percussion = o.percussion; + } + + BankEntry(const BankEntry &&o) + { + bankId = std::move(o.bankId); + bankSetup = std::move(o.bankSetup); + melodic = std::move(o.melodic); + percussion = std::move(o.percussion); + } }; struct MidiBank { - uint_fast32_t midiBankId; - uint_fast8_t msb, lsb; - int_fast32_t instruments[128]; + uint_fast32_t midiBankId = 0; + uint_fast8_t msb = 0, lsb = 0; + int_fast32_t instruments[128]; + + MidiBank() + { + for(size_t i = 0; i < 128; i++) + instruments[i] = -1; + } + + MidiBank(const MidiBank &o) + { + midiBankId = 0; + msb = 0; + lsb = 0; + std::memcpy(instruments, o.instruments, sizeof(int_fast32_t) * 128); + } + + bool operator==(const MidiBank &o) + { + if(msb != o.msb) + return false; + if(lsb != o.lsb) + return false; + if(std::memcmp(instruments, o.instruments, sizeof(int_fast32_t) * 128) != 0) + return false; + return true; + } + bool operator!=(const MidiBank &o) + { + return !operator==(o); + } }; struct InstrumentEntry { - uint_fast32_t instId; + uint_fast32_t instId = 0; typedef enum WOPL_InstrumentFlags { @@ -214,34 +265,68 @@ struct BanksDump WOPL_RM_HiHat = 0x28 } WOPL_RhythmMode; - uint_fast8_t noteOffset1; - uint_fast8_t noteOffset2; - int_fast8_t midiVelocityOffset; - uint_fast8_t percussionKeyNumber; - uint_fast32_t instFlags; - double secondVoiceDetune; + uint_fast8_t noteOffset1 = 0; + uint_fast8_t noteOffset2 = 0; + int_fast8_t midiVelocityOffset = 0; + uint_fast8_t percussionKeyNumber = 0; + uint_fast32_t instFlags = 0; + int_fast8_t secondVoiceDetune = 0; /* 2op: modulator1, carrier1, feedback1 2vo: modulator1, carrier1, modulator2, carrier2, feedback(1+2) 4op: modulator1, carrier1, modulator2, carrier2, feedback1 */ //! Contains FeedBack-Connection for both operators 0xBBAA - AA - first, BB - second - int16_t fbConn; - size_t ops[5] = {-1, -1, -1, -1, -1}; - int64_t delay_on_ms; - int64_t delay_off_ms; + int_fast16_t fbConn = 0; + int_fast64_t delay_on_ms = 0; + int_fast64_t delay_off_ms = 0; + int_fast32_t ops[5] = {-1, -1, -1, -1, -1}; + + bool operator==(const InstrumentEntry &o) + { + return ( + (noteOffset1 == o.noteOffset1) && + (noteOffset2 == o.noteOffset2) && + (midiVelocityOffset == o.midiVelocityOffset) && + (percussionKeyNumber == o.percussionKeyNumber) && + (instFlags == o.instFlags) && + (secondVoiceDetune == o.secondVoiceDetune) && + (fbConn == o.fbConn) && + (delay_on_ms == o.delay_on_ms) && + (delay_off_ms == o.delay_off_ms) && + (std::memcmp(ops, o.ops, sizeof(int_fast32_t) * 5) == 0) + ); + } + bool operator!=(const InstrumentEntry &o) + { + return !operator==(o); + } }; struct Operator { - uint_fast32_t d_E862; - uint_fast32_t d_40; + uint_fast32_t opId = 0; + uint_fast32_t d_E862 = 0; + uint_fast32_t d_40 = 0; + bool operator==(const Operator &o) + { + return ((d_E862 == o.d_E862) && (d_40 == o.d_40)); + } + bool operator!=(const Operator &o) + { + return !operator==(o); + } }; std::vector banks; std::vector midiBanks; std::vector instruments; std::vector operators; + + size_t initBank(size_t bankId, uint_fast16_t bankSetup); + void addMidiBank(size_t bankId, bool percussion, MidiBank b); + void addInstrument(MidiBank &bank, size_t patchId, InstrumentEntry e, Operator *ops); + void exportBanks(const std::string &outPath, const std::string &headerName = "adlmidi_db.h"); }; -- cgit v1.2.3 From 7786fa8f6ba65673d24aa07245cb11d9a1fc1350 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Fri, 31 May 2019 20:25:44 +0300 Subject: Make the output of data into new database format --- utils/gen_adldata/file_formats/load_wopl.h | 49 ++++++++++++++++-- utils/gen_adldata/gen_adldata.cc | 2 +- utils/gen_adldata/progs_cache.cpp | 83 ++++++++++++++++++++++++------ utils/gen_adldata/progs_cache.h | 15 ++++-- 4 files changed, 123 insertions(+), 26 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h index cef475f..6c57950 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 char *prefix) +static bool 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 char *p setup.volumeModel = (int)data[0x12]; setup.scaleModulators = false; - size_t bankDb = (unsigned)db.initBank(bank, static_cast((static_cast(data[0x11]) << 8) | static_cast(data[0x12]))); + size_t bankDb = (unsigned)db.initBank(bank, bankTitle, static_cast((static_cast(data[0x11]) << 8) | static_cast(data[0x12]))); // Validate file format by size calculation if(version == 1) @@ -94,16 +94,28 @@ static bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const char *p uint32_t melodic_offset = 0; uint32_t percussion_offset = 0; + uint32_t melodic_meta_offset = 0; + uint32_t percussion_meta_offset = 0; + if(version < 2) + { melodic_offset = 0x13; + melodic_meta_offset = 0; + } else + { melodic_offset = 0x13 + 34 * mbanks_count + 34 * pbanks_count; + melodic_meta_offset = 0x13; + percussion_meta_offset = 0x13 + 34 * mbanks_count; + } percussion_offset = melodic_offset + (insSize * 128 * mbanks_count); //uint32_t root_sizes[2] = {mbanks_count, pbanks_count}; - uint32_t root_sizes[2] = {1, 1}; + uint32_t root_sizes[2] = {(version >= 2) ? mbanks_count : 1u, + (version >= 2) ? pbanks_count : 1u}; uint32_t root_offsets[2] = {melodic_offset, percussion_offset}; + uint32_t root_meta_offsets[2] = {melodic_meta_offset, percussion_meta_offset}; for(size_t bset = 0; bset < 2; bset++) { @@ -112,12 +124,23 @@ static bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const char *p { uint32_t bank_offset = root_offsets[bset] + (bankno * insSize * 128); + BanksDump::MidiBank bnk; + if(version >= 2) + { + uint32_t meta_offset = root_meta_offsets[bset] + (bankno * 34); + bnk.lsb = data[meta_offset + 32 + 0]; + bnk.msb = data[meta_offset + 32 + 1]; + } + for(uint32_t i = 0; i < 128; i++) { uint32_t offset = bank_offset + uint32_t(i * insSize); std::string name; insdata tmp[2]; + BanksDump::InstrumentEntry inst; + BanksDump::Operator ops[5]; + name.resize(32); std::memcpy(&name[0], data.data() + offset, 32); name.resize(std::strlen(&name[0])); @@ -165,6 +188,9 @@ static bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const char *p * Those fields are made for hot-loading while runtime, but not * for generation of embedded banks database. */ + db.toOps(tmp[0], ops, 0); + db.toOps(tmp[1], ops, 2); + tmp[0].finetune = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 32)); tmp[1].finetune = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 34)); @@ -180,6 +206,21 @@ static bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const char *p tmp2.rhythmModeDrum = (flags & (uint8_t)WOPL_Flags::WOPL_RhythmModeMask); tmp[0].diff = false; tmp[1].diff = real4op && !tmp2.pseudo4op; + //---------------- + inst.instFlags = flags; + inst.percussionKeyNumber = is_percussion ? data[offset + 38] : 0; + inst.noteOffset1 = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 32)); + inst.noteOffset2 = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 32)); + inst.secondVoiceDetune = static_cast(data[offset + 37]); + inst.midiVelocityOffset = static_cast(data[offset + 36]); + inst.fbConn = (static_cast(data[offset + 40])) | + (static_cast(data[offset + 41]) << 8); + if(version >= 2) + { + inst.delay_on_ms = toUint16BE((const uint8_t *)data.data() + offset + 62); + inst.delay_off_ms = toUint16BE((const uint8_t *)data.data() + offset + 64); + } + //---------------- int8_t fine_tune = (int8_t)data[offset + 37]; if(fine_tune != 0) @@ -229,7 +270,9 @@ static bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const char *p size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); SetBank(bank, gmno, resno); } + db.addInstrument(bnk, i, inst, ops); } + db.addMidiBank(bankDb, is_percussion, bnk); } } diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index 1896c43..341a3f9 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -132,7 +132,7 @@ int main(int argc, char**argv) else if(format == "WOPL") { - if(!LoadWopl(db, filepath.c_str(), bank, prefix.c_str())) + if(!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; diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index df78026..978494c 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -123,7 +123,23 @@ insdata MakeNoSoundIns() } -size_t BanksDump::initBank(size_t bankId, uint_fast16_t bankSetup) +void BanksDump::toOps(const insdata &inData, BanksDump::Operator *outData, size_t begin) +{ + outData[begin + 0].d_E862 = + uint_fast32_t(inData.data[6] << 24) + + uint_fast32_t(inData.data[4] << 16) + + uint_fast32_t(inData.data[2] << 8) + + uint_fast32_t(inData.data[0] << 0); + outData[begin + 1].d_E862 = + uint_fast32_t(inData.data[7] << 24) + + uint_fast32_t(inData.data[5] << 16) + + uint_fast32_t(inData.data[3] << 8) + + uint_fast32_t(inData.data[1] << 0); + outData[begin + 0].d_40 = inData.data[8]; + outData[begin + 1].d_40 = inData.data[9]; +} + +size_t BanksDump::initBank(size_t bankId, const std::string &title, uint_fast16_t bankSetup) { #if 0 assert(bankId <= banks.size()); @@ -131,10 +147,12 @@ size_t BanksDump::initBank(size_t bankId, uint_fast16_t bankSetup) banks.emplace_back(); BankEntry &b = banks[bankId]; #else + bankId = banks.size(); banks.emplace_back(); BankEntry &b = banks.back(); #endif b.bankId = bankId; + b.bankTitle = title; b.bankSetup = bankSetup; return b.bankId; } @@ -167,6 +185,13 @@ void BanksDump::addInstrument(BanksDump::MidiBank &bank, size_t patchId, BanksDu size_t opsCount = ((e.instFlags & InstrumentEntry::WOPL_Ins_4op) != 0 || (e.instFlags & InstrumentEntry::WOPL_Ins_Pseudo4op) != 0) ? 4 : 2; + + if((e.instFlags & InstrumentEntry::WOPL_Ins_IsBlank) != 0) + { + bank.instruments[patchId] = -1; + return; + } + for(size_t op = 0; op < opsCount; op++) { Operator o = ops[op]; @@ -213,22 +238,38 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade "{\n"); for(const BankEntry &be : banks) { + bool commaNeeded = true; std::fprintf(out, " {\n"); - std::fprintf(out, " 0x%04lX, %zu, %zu,", + std::fprintf(out, " 0x%04lX, %zu, %zu, \"%s\",\n", be.bankSetup, be.melodic.size(), - be.percussion.size()); + be.percussion.size(), + be.bankTitle.c_str()); // Melodic banks - std::fprintf(out, " { "); + std::fprintf(out, " {"); + commaNeeded = false; for(const size_t &me : be.melodic) - std::fprintf(out, "%zu, ", me); - std::fprintf(out, " },\n"); + { + if(commaNeeded) + std::fprintf(out, ", "); + else + commaNeeded = true; + std::fprintf(out, "%zu", me); + } + std::fprintf(out, "},\n"); // Percussive banks - std::fprintf(out, " { "); + commaNeeded = false; + std::fprintf(out, " {"); for(const size_t &me : be.percussion) - std::fprintf(out, "%zu, ", me); - std::fprintf(out, " }\n"); + { + if(commaNeeded) + std::fprintf(out, ", "); + else + commaNeeded = true; + std::fprintf(out, "%zu", me); + } + std::fprintf(out, "}\n"); std::fprintf(out, " },\n"); } @@ -240,13 +281,21 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade "{\n"); for(const MidiBank &be : midiBanks) { + bool commaNeeded = true; std::fprintf(out, " {\n"); - std::fprintf(out, " %u, %u,", be.msb, be.lsb); + std::fprintf(out, " %u, %u,\n", be.msb, be.lsb); - std::fprintf(out, " { "); + std::fprintf(out, " {"); + commaNeeded = false; for(size_t i = 0; i < 128; i++) - std::fprintf(out, "%ld, ", be.instruments[i]); - std::fprintf(out, " },\n"); + { + if(commaNeeded) + std::fprintf(out, ", "); + else + commaNeeded = true; + std::fprintf(out, "%ld", be.instruments[i]); + } + std::fprintf(out, "},\n"); std::fprintf(out, " },\n"); } @@ -260,7 +309,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, %lu, %lu, %lu, ", + std::fprintf(out, " %u, %u, %d, %u, %lu, %d, 0x%04lX, 0x%lX, 0x%lX,\n", be.noteOffset1, be.noteOffset2, be.midiVelocityOffset, @@ -272,10 +321,10 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade be.delay_off_ms); if(opsCount == 4) - std::fprintf(out, "{%ld, %ld, %ld, %ld}", + std::fprintf(out, " {%ld, %ld, %ld, %ld}\n", be.ops[0], be.ops[1], be.ops[2], be.ops[3]); else - std::fprintf(out, "{%ld, %ld}", + std::fprintf(out, " {%ld, %ld}\n", be.ops[0], be.ops[1]); std::fprintf(out, " },\n"); @@ -286,7 +335,7 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade "{\n"); for(const Operator &be : operators) { - std::fprintf(out, " { %08lX, %02lX },\n", + std::fprintf(out, " {0x%07lX, 0x%02lX},\n", be.d_E862, be.d_40); } diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index d115ddc..89d611f 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -135,6 +135,7 @@ struct BanksDump struct BankEntry { uint_fast32_t bankId = 0; + std::string bankTitle = "Untitled"; /* Global OPL flags */ typedef enum WOPLFileFlags @@ -179,6 +180,7 @@ struct BanksDump BankEntry(const BankEntry &o) { bankId = o.bankId; + bankTitle = o.bankTitle; bankSetup = o.bankSetup; melodic = o.melodic; percussion = o.percussion; @@ -187,6 +189,7 @@ struct BanksDump BankEntry(const BankEntry &&o) { bankId = std::move(o.bankId); + bankTitle = std::move(o.bankTitle); bankSetup = std::move(o.bankSetup); melodic = std::move(o.melodic); percussion = std::move(o.percussion); @@ -207,9 +210,9 @@ struct BanksDump MidiBank(const MidiBank &o) { - midiBankId = 0; - msb = 0; - lsb = 0; + midiBankId = o.midiBankId; + msb = o.msb; + lsb = o.lsb; std::memcpy(instruments, o.instruments, sizeof(int_fast32_t) * 128); } @@ -277,7 +280,7 @@ struct BanksDump 4op: modulator1, carrier1, modulator2, carrier2, feedback1 */ //! Contains FeedBack-Connection for both operators 0xBBAA - AA - first, BB - second - int_fast16_t fbConn = 0; + uint_fast16_t fbConn = 0; int_fast64_t delay_on_ms = 0; int_fast64_t delay_off_ms = 0; int_fast32_t ops[5] = {-1, -1, -1, -1, -1}; @@ -323,7 +326,9 @@ struct BanksDump std::vector instruments; std::vector operators; - size_t initBank(size_t bankId, uint_fast16_t bankSetup); + void toOps(const insdata &inData, Operator *outData, size_t begin = 0); + + size_t initBank(size_t bankId, const std::string &title, uint_fast16_t bankSetup); void addMidiBank(size_t bankId, bool percussion, MidiBank b); void addInstrument(MidiBank &bank, size_t patchId, InstrumentEntry e, Operator *ops); void exportBanks(const std::string &outPath, const std::string &headerName = "adlmidi_db.h"); -- cgit v1.2.3 From 732f2f269d6be456b93af18c8cec035fc01b5eba Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Fri, 31 May 2019 22:07:21 +0300 Subject: Organize file formats parsers, and multi-bank AIL support --- utils/gen_adldata/file_formats/common.h | 9 ++ utils/gen_adldata/file_formats/load_ail.h | 153 +++++++++++++++++++++++++- utils/gen_adldata/file_formats/load_bisqwit.h | 2 +- utils/gen_adldata/file_formats/load_bnk.h | 2 +- utils/gen_adldata/file_formats/load_bnk2.h | 6 +- utils/gen_adldata/file_formats/load_ea.h | 2 +- utils/gen_adldata/file_formats/load_ibk.h | 2 +- utils/gen_adldata/file_formats/load_jv.h | 2 +- utils/gen_adldata/file_formats/load_op2.h | 2 +- utils/gen_adldata/file_formats/load_tmb.h | 2 +- utils/gen_adldata/file_formats/load_wopl.h | 4 +- utils/gen_adldata/gen_adldata.cc | 35 ++---- utils/gen_adldata/progs_cache.cpp | 14 ++- utils/gen_adldata/progs_cache.h | 56 +++++++--- 14 files changed, 236 insertions(+), 55 deletions(-) (limited to 'utils') 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(arr[1] << 8) & 0x0000FF00); + num |= (static_cast(arr[2] << 16) & 0x00FF0000); + num |= (static_cast(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 data(size_t(std::ftell(fp))); + std::vector 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 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 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(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(notenum) : 0; + inst.noteOffset1 = isPerc ? 0 : notenum; + unsigned fb_c = data[offset + 3 + 5]; + inst.fbConn = (static_cast(fb_c & 0x0F)) | + (static_cast((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 #include -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((static_cast(data[0x11]) << 8) | static_cast(data[0x12]))); + size_t bankDb = db.initBank(bank, bankTitle, static_cast((static_cast(data[0x11]) << 8) | static_cast(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 + +#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 #include #include +#include #include - struct insdata { uint8_t data[11]; @@ -129,6 +129,28 @@ extern std::vector banknames; //static std::map > 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 -- cgit v1.2.3 From 291dda79c24d985802f63af59a076a358f427e62 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Fri, 31 May 2019 22:12:36 +0300 Subject: Minor clean-up of AIL code --- utils/gen_adldata/file_formats/load_ail.h | 93 ++----------------------------- 1 file changed, 6 insertions(+), 87 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_ail.h b/utils/gen_adldata/file_formats/load_ail.h index 2feedb9..13d5d84 100644 --- a/utils/gen_adldata/file_formats/load_ail.h +++ b/utils/gen_adldata/file_formats/load_ail.h @@ -83,12 +83,12 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, { GTL_Head &h = heads[i]; bool isPerc = (h.bank == 0x7F); - int gmPatchId = isPerc ? h.patch : (h.patch + (h.bank * 128)); + // 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 gmno = isPerc ? int(h.patch + 0x80) : int(h.patch); int midi_index = gmno < 128 ? gmno : gmno < 128 + 35 ? -1 : gmno < 128 + 88 ? gmno - 35 @@ -164,91 +164,6 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, } } - 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]; - unsigned gm_bank = data[a * 6 + 1]; - unsigned offset = *(unsigned *)&data[a * 6 + 2]; - - if(gm_patch == 0xFF) - break; - - int gmno = gm_bank == 0x7F ? int(gm_patch + 0x80) : int(gm_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]); - - /*printf("%02X %02X %08X ", gmnumber,gmnumber2, offset); - for(unsigned b=0; b 3 && (b-3)%11 == 0) printf("\n "); - printf("%02X ", data[offset+b]); - } - printf("\n");*/ - - if(gm_bank != 0 && gm_bank != 0x7F) - continue; - - 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) - { - 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) - { - tmp[0].data[10] = fb_c & 0x0F; - tmp[1].data[10] = uint8_t((fb_c & 0x0E) | (fb_c >> 7)); - } - } - - 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]; - size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2, twoOp); - SetBank(bank, (unsigned int)gmno, resno); - } - } -#endif - AdlBankSetup setup; setup.volumeModel = VOLUME_Generic; setup.deepTremolo = true; @@ -256,6 +171,10 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, setup.scaleModulators = false; SetBankSetup(bank, setup); + for(auto &b : bnkMelodic) + db.addMidiBank(bankDb, false, b); + db.addMidiBank(bankDb, true, bnkPercussion); + return true; } -- cgit v1.2.3 From fc9829095afcace792f072ecb094c268039b14e7 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Fri, 31 May 2019 22:21:56 +0300 Subject: WOPL: Don't try to pass multibank data into old generator --- utils/gen_adldata/file_formats/load_wopl.h | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h index f4b7540..0f05b6a 100644 --- a/utils/gen_adldata/file_formats/load_wopl.h +++ b/utils/gen_adldata/file_formats/load_wopl.h @@ -111,9 +111,7 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s percussion_offset = melodic_offset + (insSize * 128 * mbanks_count); - //uint32_t root_sizes[2] = {mbanks_count, pbanks_count}; - uint32_t root_sizes[2] = {(version >= 2) ? mbanks_count : 1u, - (version >= 2) ? pbanks_count : 1u}; + uint32_t root_sizes[2] = {mbanks_count, pbanks_count}; uint32_t root_offsets[2] = {melodic_offset, percussion_offset}; uint32_t root_meta_offsets[2] = {melodic_meta_offset, percussion_meta_offset}; @@ -260,15 +258,18 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s else snprintf(name2, 512, "%sM%u", prefix, i); - if(!real4op && !tmp2.pseudo4op) + if(bankno == 0) { - size_t resno = InsertIns(tmp[0], tmp2, name, name2); - SetBank(bank, gmno, resno); - } - else - { - size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); - SetBank(bank, gmno, resno); + if(!real4op && !tmp2.pseudo4op) + { + size_t resno = InsertIns(tmp[0], tmp2, name, name2); + SetBank(bank, gmno, resno); + } + else + { + size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); + SetBank(bank, gmno, resno); + } } db.addInstrument(bnk, i, inst, ops); } -- cgit v1.2.3 From 99cc4bfafcce3390bdd5d78ef8e55222d6507877 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sat, 1 Jun 2019 02:43:59 +0300 Subject: Add Bisqwit, OP2 and TMB --- utils/gen_adldata/file_formats/load_bisqwit.h | 30 +++++++++++++++++++++++++-- utils/gen_adldata/file_formats/load_op2.h | 27 ++++++++++++++++++++++-- utils/gen_adldata/file_formats/load_tmb.h | 24 +++++++++++++++++++-- utils/gen_adldata/gen_adldata.cc | 6 +++--- utils/gen_adldata/progs_cache.h | 6 +++--- 5 files changed, 81 insertions(+), 12 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_bisqwit.h b/utils/gen_adldata/file_formats/load_bisqwit.h index 8686e90..cf3a6a1 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" -bool BankFormats::LoadBisqwit(const char *fn, unsigned bank, const char *prefix) +bool BankFormats::LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix) { #ifdef HARD_BANKS writeIni("Bisqwit", fn, prefix, bank, INI_Both); @@ -13,14 +13,25 @@ bool BankFormats::LoadBisqwit(const char *fn, unsigned bank, const char *prefix) if(!fp) return false; - for(uint32_t a = 0; a < 256; ++a) + size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_Generic); + BanksDump::MidiBank bnkMelodique; + BanksDump::MidiBank bnkPercussion; + + for(uint32_t a = 0, patchId = 0; a < 256; ++a, patchId++) { //unsigned offset = a * 25; uint32_t gmno = a; + bool isPercussion = gmno >= 128; int32_t midi_index = gmno < 128 ? int32_t(gmno) : gmno < 128 + 35 ? -1 : gmno < 128 + 88 ? int32_t(gmno - 35) : -1; + if(patchId == 128) + patchId = 0; + + BanksDump::MidiBank &bnk = isPercussion ? bnkPercussion : bnkMelodique; + BanksDump::InstrumentEntry inst; + BanksDump::Operator ops[5]; struct ins tmp2; tmp2.notenum = (uint8_t)std::fgetc(fp); @@ -49,9 +60,24 @@ bool BankFormats::LoadBisqwit(const char *fn, unsigned bank, const char *prefix) tmp2.real4op = tmp[1].diff; size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2, (tmp[0] == tmp[1])); SetBank(bank, gmno, resno); + + db.toOps(tmp[0], ops, 0); + if(tmp[0] != tmp[1]) + { + inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op; + db.toOps(tmp[1], ops, 2); + } + + inst.fbConn = uint_fast16_t(tmp[0].data[10]) | (uint_fast16_t(tmp[1].data[10]) << 8); + inst.percussionKeyNumber = tmp2.notenum; + inst.noteOffset1 = tmp2.notenum; + db.addInstrument(bnk, patchId, inst, ops); } std::fclose(fp); + db.addMidiBank(bankDb, false, bnkMelodique); + db.addMidiBank(bankDb, true, bnkPercussion); + AdlBankSetup setup; setup.volumeModel = VOLUME_Generic; setup.deepTremolo = true; diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h index cac6bc9..0c67323 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 -bool BankFormats::LoadDoom(const char *fn, unsigned bank, const char *prefix) +bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix) { #ifdef HARD_BANKS writeIni("OP2", fn, prefix, bank, INI_Both); @@ -68,11 +68,17 @@ bool BankFormats::LoadDoom(const char *fn, unsigned bank, const char *prefix) } std::fclose(fp); + size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_DMX); + BanksDump::MidiBank bnkMelodique; + BanksDump::MidiBank bnkPercussion; + for(unsigned a = 0; a < 175; ++a) { const size_t offset1 = 0x18A4 + a * 32; const size_t offset2 = 8 + a * 36; - + BanksDump::MidiBank &bnk = a < 128 ? bnkMelodique : bnkPercussion; + BanksDump::InstrumentEntry inst; + BanksDump::Operator ops[5]; std::string name; for(unsigned p = 0; p < 32; ++p) if(data[offset1] != '\0') @@ -80,6 +86,7 @@ bool BankFormats::LoadDoom(const char *fn, unsigned bank, const char *prefix) //printf("%3d %3d %3d %8s: ", a,b,c, name.c_str()); int gmno = int(a < 128 ? a : ((a | 128) + 35)); + size_t patchId = a < 128 ? a : ((a - 128) + 35); char name2[512]; snprintf(name2, 512, "%s%c%u", prefix, (gmno < 128 ? 'M' : 'P'), gmno & 127); @@ -104,6 +111,12 @@ bool BankFormats::LoadDoom(const char *fn, unsigned bank, const char *prefix) tmp[index].data[9] = src.scale_2 | src.level_2; tmp[index].data[10] = src.feedback; tmp[index].finetune = int8_t(src.basenote + 12); + inst.fbConn |= (uint_fast16_t(src.feedback) << (a == 1 ? 8 : 0)); + if(a == 0) + inst.noteOffset1 = int8_t(src.basenote + 12); + else + inst.noteOffset2 = int8_t(src.basenote + 12); + db.toOps(tmp[index], ops, index * 2); } struct ins tmp2; tmp2.notenum = ins.note; @@ -120,6 +133,11 @@ bool BankFormats::LoadDoom(const char *fn, unsigned bank, const char *prefix) tmp[1].finetune -= 12; } + if((ins.flags & FL_DOUBLE_VOICE) != 0) + inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op; + inst.percussionKeyNumber = tmp2.notenum; + inst.secondVoiceDetune = ins.finetune; + if(!(ins.flags & FL_DOUBLE_VOICE)) { size_t resno = InsertIns(tmp[0], tmp2, std::string(1, '\377') + name, name2); @@ -138,6 +156,8 @@ bool BankFormats::LoadDoom(const char *fn, unsigned bank, const char *prefix) SetBank(bank, (unsigned int)gmno, resno); } + db.addInstrument(bnk, patchId, inst, ops); + /*const Doom_OPL2instrument& A = ins.patchdata[0]; const Doom_OPL2instrument& B = ins.patchdata[1]; printf( @@ -159,6 +179,9 @@ bool BankFormats::LoadDoom(const char *fn, unsigned bank, const char *prefix) printf("------------------------------------------------------------\n");*/ } + db.addMidiBank(bankDb, false, bnkMelodique); + db.addMidiBank(bankDb, true, bnkPercussion); + AdlBankSetup setup; setup.volumeModel = VOLUME_DMX; setup.deepTremolo = false; diff --git a/utils/gen_adldata/file_formats/load_tmb.h b/utils/gen_adldata/file_formats/load_tmb.h index e7537af..66ced30 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" -bool BankFormats::LoadTMB(const char *fn, unsigned bank, const char *prefix) +bool BankFormats::LoadTMB(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix) { #ifdef HARD_BANKS writeIni("TMB", fn, prefix, bank, INI_Both); @@ -22,7 +22,11 @@ bool BankFormats::LoadTMB(const char *fn, unsigned bank, const char *prefix) } std::fclose(fp); - for(unsigned a = 0; a < 256; ++a) + size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_Apogee); + BanksDump::MidiBank bnkMelodique; + BanksDump::MidiBank bnkPercussion; + + for(unsigned a = 0, patchId = 0; a < 256; ++a, patchId++) { unsigned offset = a * 0x0D; unsigned gmno = a; @@ -30,6 +34,12 @@ bool BankFormats::LoadTMB(const char *fn, unsigned bank, const char *prefix) : gmno < 128 + 35 ? -1 : gmno < 128 + 88 ? int(gmno - 35) : -1; + if(patchId == 128) + patchId = 0; + bool isPercussion = a >= 128; + BanksDump::MidiBank &bnk = isPercussion ? bnkPercussion : bnkMelodique; + BanksDump::InstrumentEntry inst; + BanksDump::Operator ops[5]; insdata tmp; @@ -55,6 +65,11 @@ bool BankFormats::LoadTMB(const char *fn, unsigned bank, const char *prefix) tmp2.midi_velocity_offset = (int8_t)data[offset + 12]; tmp2.rhythmModeDrum = 0; + inst.percussionKeyNumber = data[offset + 11]; + inst.midiVelocityOffset = (int8_t)data[offset + 12]; + inst.fbConn = data[offset + 10]; + db.toOps(tmp, ops, 0); + std::string name; if(midi_index >= 0) name = std::string(1, '\377') + MidiInsName[midi_index]; @@ -64,8 +79,13 @@ bool BankFormats::LoadTMB(const char *fn, unsigned bank, const char *prefix) size_t resno = InsertIns(tmp, tmp2, name, name2); SetBank(bank, gmno, resno); + + db.addInstrument(bnk, patchId, inst, ops); } + db.addMidiBank(bankDb, false, bnkMelodique); + db.addMidiBank(bankDb, true, bnkPercussion); + AdlBankSetup setup; setup.volumeModel = VOLUME_APOGEE; setup.deepTremolo = false; diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index 5c99147..14e68ea 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -112,7 +112,7 @@ int main(int argc, char**argv) else if(format == "Bisqwit") { - if(!BankFormats::LoadBisqwit(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadBisqwit(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; @@ -130,7 +130,7 @@ int main(int argc, char**argv) else if(format == "OP2") { - if(!BankFormats::LoadDoom(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadDoom(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; @@ -148,7 +148,7 @@ int main(int argc, char**argv) else if(format == "TMB") { - if(!BankFormats::LoadTMB(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadTMB(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; diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 8f32568..bb7e105 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -361,7 +361,7 @@ namespace BankFormats { 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 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, const std::string &melo_filter, @@ -369,8 +369,8 @@ bool LoadBNK2(const char *fn, unsigned bank, const char *prefix, 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 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); bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const std::string bankTitle, const char *prefix); } -- cgit v1.2.3 From 14303359fde2d8cf76a129296cf1f30fdcb57520 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sun, 2 Jun 2019 02:54:00 +0300 Subject: Junglevision format is also supported by new DB --- utils/gen_adldata/file_formats/load_jv.h | 24 +++++++++++++++++++++++- utils/gen_adldata/gen_adldata.cc | 2 +- utils/gen_adldata/progs_cache.cpp | 23 ++++++++++++++--------- utils/gen_adldata/progs_cache.h | 2 +- 4 files changed, 39 insertions(+), 12 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_jv.h b/utils/gen_adldata/file_formats/load_jv.h index bcdf855..d2fe06b 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" -bool BankFormats::LoadJunglevision(const char *fn, unsigned bank, const char *prefix) +bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix) { #ifdef HARD_BANKS writeIni("Junglevision", fn, prefix, bank, INI_Both); @@ -22,6 +22,10 @@ bool BankFormats::LoadJunglevision(const char *fn, unsigned bank, const char *pr } std::fclose(fp); + size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_Win9X); + BanksDump::MidiBank bnkMelodique; + BanksDump::MidiBank bnkPercussion; + uint16_t ins_count = uint16_t(data[0x20] + (data[0x21] << 8)); uint16_t drum_count = uint16_t(data[0x22] + (data[0x23] << 8)); uint16_t first_ins = uint16_t(data[0x24] + (data[0x25] << 8)); @@ -38,6 +42,12 @@ bool BankFormats::LoadJunglevision(const char *fn, unsigned bank, const char *pr : gmno < 128 + 88 ? int(gmno - 35) : -1; + bool isPercussion = ins_count >= 128; + size_t patchId = (a < ins_count) ? (a + first_ins) : ((a - ins_count) + first_drum); + BanksDump::MidiBank &bnk = isPercussion ? bnkPercussion : bnkMelodique; + BanksDump::InstrumentEntry inst; + BanksDump::Operator ops[5]; + insdata tmp[2]; tmp[0].data[0] = data[offset + 2]; @@ -83,6 +93,14 @@ bool BankFormats::LoadJunglevision(const char *fn, unsigned bank, const char *pr tmp[1].finetune -= 12; } + if(data[offset] != 0) + inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op; + inst.percussionKeyNumber = data[offset + 1]; + inst.fbConn = (static_cast(data[offset + 7] & 0x0F)) | + (static_cast(data[offset + 7 + 11] & 0x0F) << 8); + db.toOps(tmp[0], ops, 0); + db.toOps(tmp[1], ops, 2); + std::string name; if(midi_index >= 0) name = std::string(1, '\377') + MidiInsName[midi_index]; @@ -100,8 +118,12 @@ bool BankFormats::LoadJunglevision(const char *fn, unsigned bank, const char *pr size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); SetBank(bank, gmno, resno); } + db.addInstrument(bnk, patchId, inst, ops); } + db.addMidiBank(bankDb, false, bnkMelodique); + db.addMidiBank(bankDb, true, bnkPercussion); + AdlBankSetup setup; setup.volumeModel = VOLUME_9X; setup.deepTremolo = true; diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index 14e68ea..4b59439 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -157,7 +157,7 @@ int main(int argc, char**argv) else if(format == "Junglevision") { - if(!BankFormats::LoadJunglevision(filepath.c_str(), bank, prefix.c_str())) + if(!BankFormats::LoadJunglevision(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; diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index e720384..9200f0f 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -151,20 +151,25 @@ void BanksDump::toOps(const insdata &inData, BanksDump::Operator *outData, size_ size_t BanksDump::initBank(size_t bankId, const std::string &title, uint_fast16_t bankSetup) { -#if 0 - assert(bankId <= banks.size()); - if(bankId >= banks.size()) - banks.emplace_back(); - BankEntry &b = banks[bankId]; -#else - bankId = banks.size(); + for(size_t bID = 0; bID < banks.size(); bID++) + { + BankEntry &be = banks[bID]; + if(bankId == be.bankId) + { + be.bankTitle = title; + be.bankSetup = bankSetup; + return bID; + } + } + + size_t bankIndex = banks.size(); banks.emplace_back(); BankEntry &b = banks.back(); -#endif + b.bankId = bankId; b.bankTitle = title; b.bankSetup = bankSetup; - return b.bankId; + return bankIndex; } void BanksDump::addMidiBank(size_t bankId, bool percussion, BanksDump::MidiBank b) diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index bb7e105..6c47581 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -368,7 +368,7 @@ bool LoadBNK2(const char *fn, unsigned bank, const char *prefix, 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 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); bool LoadWopl(BanksDump &db, const char *fn, unsigned bank, const std::string bankTitle, const char *prefix); -- cgit v1.2.3 From 86d471c8d664f0c6921f30f0fce4e8d2a7cab77d Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Thu, 6 Jun 2019 21:27:19 +0300 Subject: Added IBK and C++98 support for generated database --- utils/gen_adldata/file_formats/load_ibk.h | 24 +++++++- utils/gen_adldata/file_formats/load_jv.h | 3 +- utils/gen_adldata/gen_adldata.cc | 4 +- utils/gen_adldata/progs_cache.cpp | 96 +++++++++++++++++-------------- utils/gen_adldata/progs_cache.h | 4 +- 5 files changed, 83 insertions(+), 48 deletions(-) (limited to 'utils') 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(data[offset + 7] & 0x0F)) | - (static_cast(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 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(fbConn1 & 0x0F)) | + (static_cast(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); -- cgit v1.2.3 From db28f6d8489798eec60ef7f12e2f3bff423a5681 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Thu, 6 Jun 2019 22:17:05 +0300 Subject: All bank formats now loading into new database --- utils/gen_adldata/file_formats/load_bnk.h | 17 ++++++++++++- utils/gen_adldata/file_formats/load_bnk2.h | 38 +++++++++++++++++++++++++++--- utils/gen_adldata/file_formats/load_ea.h | 27 ++++++++++++++++++++- utils/gen_adldata/gen_adldata.cc | 8 +++---- utils/gen_adldata/progs_cache.h | 6 ++--- 5 files changed, 84 insertions(+), 12 deletions(-) (limited to 'utils') 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 #include -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); -- cgit v1.2.3 From 44e7fcf4789f365ed3509904a36af0c1abf56395 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Fri, 7 Jun 2019 03:18:12 +0300 Subject: Prepare to make measurer for new stuff --- utils/gen_adldata/measurer.cpp | 112 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index dc73363..29ce764 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -16,6 +16,48 @@ # include "../../src/chips/dosbox_opl3.h" #endif +#define NUM_OF_CHANNELS 23 +#define NUM_OF_RM_CHANNELS 5 + +//! Per-channel and per-operator registers map +static const uint16_t g_operatorsMap[(NUM_OF_CHANNELS + NUM_OF_RM_CHANNELS) * 2] = +{ + // Channels 0-2 + 0x000, 0x003, 0x001, 0x004, 0x002, 0x005, // operators 0, 3, 1, 4, 2, 5 + // Channels 3-5 + 0x008, 0x00B, 0x009, 0x00C, 0x00A, 0x00D, // operators 6, 9, 7,10, 8,11 + // Channels 6-8 + 0x010, 0x013, 0x011, 0x014, 0x012, 0x015, // operators 12,15, 13,16, 14,17 + // Same for second card + 0x100, 0x103, 0x101, 0x104, 0x102, 0x105, // operators 18,21, 19,22, 20,23 + 0x108, 0x10B, 0x109, 0x10C, 0x10A, 0x10D, // operators 24,27, 25,28, 26,29 + 0x110, 0x113, 0x111, 0x114, 0x112, 0x115, // operators 30,33, 31,34, 32,35 + + //==For Rhythm-mode percussions + // Channel 18 + 0x010, 0x013, // operators 12,15 + // Channel 19 + 0xFFF, 0x014, // operator 16 + // Channel 19 + 0x012, 0xFFF, // operator 14 + // Channel 19 + 0xFFF, 0x015, // operator 17 + // Channel 19 + 0x011, 0xFFF, // operator 13 + + //==For Rhythm-mode percussions in CMF, snare and cymbal operators has inverted! + 0x010, 0x013, // operators 12,15 + // Channel 19 + 0x014, 0xFFF, // operator 16 + // Channel 19 + 0x012, 0xFFF, // operator 14 + // Channel 19 + 0x015, 0xFFF, // operator 17 + // Channel 19 + 0x011, 0xFFF // operator 13 +}; + + template class AudioHistory { @@ -161,6 +203,76 @@ struct TinySynth } } + void setInstrument(const BanksDump &db, const BanksDump::InstrumentEntry &ins) + { + // TODO: Implement this function correctly! + bool is4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_4op) != 0); + bool isPseudo4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op) != 0); + size_t opsNum = (is4ops || isPseudo4ops) ? 4 : 2; + BanksDump::Operator ops[4]; + assert(ins.ops[0] >= 0); + assert(ins.ops[1] >= 0); + ops[0] = db.operators[ins.ops[0]]; + ops[1] = db.operators[ins.ops[1]]; + if(opsNum > 0) + { + assert(ins.ops[2] >= 0); + assert(ins.ops[3] >= 0); + ops[2] = db.operators[ins.ops[2]]; + ops[3] = db.operators[ins.ops[3]]; + } + + std::memset(m_x, 0, sizeof(m_x)); + m_notenum = ins.percussionKeyNumber >= 128 ? (ins.percussionKeyNumber - 128) : ins.percussionKeyNumber; + if(m_notenum == 0) + m_notenum = 25; + m_notesNum = opsNum / 2; + m_fineTune = 0; + m_noteOffsets[0] = ins.noteOffset1; + m_noteOffsets[1] = ins.noteOffset2; + if(isPseudo4ops) + m_fineTune = ins.secondVoiceDetune; + if(is4ops) + { + m_chip->writeReg(0x105, 1); + m_chip->writeReg(0x104, 0xFF); + } + + //For clearer measurement, disable tremolo and vibrato +// rawData[0].data[0] &= 0x3F; +// rawData[0].data[1] &= 0x3F; +// rawData[1].data[0] &= 0x3F; +// rawData[1].data[1] &= 0x3F; + + for(unsigned n = 0; n < m_notesNum; ++n) + { + static const uint8_t data[4] = {0x20, 0x60, 0x80, 0xE0}; + uint16_t o1 = g_operatorsMap[0]; + uint16_t o2 = g_operatorsMap[1]; + unsigned x = ops[0].d_E862, y = ops[1].d_E862; + + for(size_t a = 0; a < 4; ++a, x >>= 8, y >>= 8) + { + if(o1 != 0xFFF) + m_chip->writeReg(data[a] + o1, x & 0xFF); + if(o2 != 0xFFF) + m_chip->writeReg(data[a] + o2, y & 0xFF); + } + m_chip->writeReg(0xC0 + n * 8, (ins.fbConn >> n * 8) & 0xFF); + } + +// for(unsigned n = 0; n < m_notesNum; ++n) +// { +// static const unsigned char patchdata[11] = +// {0x20, 0x23, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0x40, 0x43, 0xC0}; +// for(unsigned a = 0; a < 10; ++a) +// { +// m_chip->writeReg(patchdata[a] + n * 8, rawData[n].data[a]); +// } +// m_chip->writeReg(patchdata[10] + n * 8, (ins.fbConn >> n * 8) & 0xFF); +// } + } + void noteOn() { std::memset(m_x, 0, sizeof(m_x)); -- cgit v1.2.3 From d20e6b38692f4d1159fa4219c0985f8b322454e4 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sat, 22 Jun 2019 03:59:56 +0300 Subject: Enable measurer for new database format too --- utils/gen_adldata/CMakeLists.txt | 5 + utils/gen_adldata/file_formats/load_bisqwit.h | 4 +- utils/gen_adldata/gen_adldata.cc | 14 ++ utils/gen_adldata/measurer.cpp | 260 ++++++++++++++++++++++++-- utils/gen_adldata/measurer.h | 4 + 5 files changed, 274 insertions(+), 13 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/CMakeLists.txt b/utils/gen_adldata/CMakeLists.txt index 56662e7..e214534 100644 --- a/utils/gen_adldata/CMakeLists.txt +++ b/utils/gen_adldata/CMakeLists.txt @@ -51,6 +51,11 @@ else() target_link_libraries(gen_adldata PRIVATE pthread m) endif() +option(WITH_GENADLDATA_PROGRESS "Enable progress printing in gen_adldata" OFF) +if(WITH_GENADLDATA_PROGRESS) + target_compile_options(gen_adldata PUBLIC "-DADL_GENDATA_PRINT_PROGRESS") +endif() + if(WITH_GENADLDATA_COMMENTS) target_compile_options(gen_adldata PUBLIC "-DADLDATA_WITH_COMMENTS") endif() diff --git a/utils/gen_adldata/file_formats/load_bisqwit.h b/utils/gen_adldata/file_formats/load_bisqwit.h index cf3a6a1..8ff91b1 100644 --- a/utils/gen_adldata/file_formats/load_bisqwit.h +++ b/utils/gen_adldata/file_formats/load_bisqwit.h @@ -69,8 +69,8 @@ bool BankFormats::LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, cons } inst.fbConn = uint_fast16_t(tmp[0].data[10]) | (uint_fast16_t(tmp[1].data[10]) << 8); - inst.percussionKeyNumber = tmp2.notenum; - inst.noteOffset1 = tmp2.notenum; + inst.percussionKeyNumber = a >= 128 ? tmp2.notenum : 0; + inst.noteOffset1 = a < 128 ? tmp2.notenum : 0; db.addInstrument(bnk, patchId, inst, ops); } std::fclose(fp); diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index d2cfa5c..0aa756d 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -556,6 +556,20 @@ int main(int argc, char**argv) std::fclose(outFile); + { + measureCounter.m_durationInfo.clear(); + measureCounter.m_cache_matches = 0; + measureCounter.m_done = 0; + measureCounter.m_total = db.instruments.size(); + std::printf("Beginning to generate measures data... (hardware concurrency of %d)\n", std::thread::hardware_concurrency()); + std::fflush(stdout); + for(size_t b = 0; b < db.instruments.size(); ++b) + { + measureCounter.run(db, db.instruments[b]); + } + std::fflush(stdout); + measureCounter.waitAll(); + } db.exportBanks(std::string(outFile_s) + "x"); std::printf("Generation of ADLMIDI data has been completed!\n"); diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 29ce764..3270463 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -187,7 +187,7 @@ struct TinySynth m_chip->writeReg(0x104, 0xFF); } - //For clearer measurement, disable tremolo and vibrato + //For cleaner measurement, disable tremolo and vibrato rawData[0].data[0] &= 0x3F; rawData[0].data[1] &= 0x3F; rawData[1].data[0] &= 0x3F; @@ -214,7 +214,7 @@ struct TinySynth assert(ins.ops[1] >= 0); ops[0] = db.operators[ins.ops[0]]; ops[1] = db.operators[ins.ops[1]]; - if(opsNum > 0) + if(opsNum > 2) { assert(ins.ops[2] >= 0); assert(ins.ops[3] >= 0); @@ -238,7 +238,9 @@ struct TinySynth m_chip->writeReg(0x104, 0xFF); } - //For clearer measurement, disable tremolo and vibrato + //For cleaner measurement, disable tremolo and vibrato + ops[0].d_E862 &= 0xFFFF3F3F; + ops[1].d_E862 &= 0xFFFF3F3F; // rawData[0].data[0] &= 0x3F; // rawData[0].data[1] &= 0x3F; // rawData[1].data[0] &= 0x3F; @@ -504,6 +506,201 @@ DurationInfo MeasureDurations(const ins &in, OPLChipBase *chip) return result; } + +DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &ins, OPLChipBase *chip) +{ + AudioHistory audioHistory; + + const unsigned interval = 150; + const unsigned samples_per_interval = g_outputRate / interval; + + const double historyLength = 0.1; // maximum duration to memorize (seconds) + audioHistory.reset(std::ceil(historyLength * g_outputRate)); + + std::unique_ptr window; + window.reset(new double[audioHistory.capacity()]); + unsigned winsize = 0; + + TinySynth synth; + synth.m_chip = chip; + synth.resetChip(); + synth.setInstrument(db, ins); + synth.noteOn(); + + /* For capturing */ + const unsigned max_silent = 6; + const unsigned max_on = 40; + const unsigned max_off = 60; + + unsigned max_period_on = max_on * interval; + unsigned max_period_off = max_off * interval; + + const double min_coefficient_on = 0.008; + const double min_coefficient_off = 0.2; + + unsigned windows_passed_on = 0; + unsigned windows_passed_off = 0; + + /* For Analyze the results */ + double begin_amplitude = 0; + double peak_amplitude_value = 0; + size_t peak_amplitude_time = 0; + size_t quarter_amplitude_time = max_period_on; + bool quarter_amplitude_time_found = false; + size_t keyoff_out_time = 0; + bool keyoff_out_time_found = false; + + const size_t audioBufferLength = 256; + const size_t audioBufferSize = 2 * audioBufferLength; + int16_t audioBuffer[audioBufferSize]; + + // For up to 40 seconds, measure mean amplitude. + double highest_sofar = 0; + short sound_min = 0, sound_max = 0; + + for(unsigned period = 0; period < max_period_on; ++period, ++windows_passed_on) + { + for(unsigned i = 0; i < samples_per_interval;) + { + size_t blocksize = samples_per_interval - i; + blocksize = (blocksize < audioBufferLength) ? blocksize : audioBufferLength; + synth.generate(audioBuffer, blocksize); + for (unsigned j = 0; j < blocksize; ++j) + { + int16_t s = audioBuffer[2 * j]; + audioHistory.add(s); + if(sound_min > s) sound_min = s; + if(sound_max < s) sound_max = s; + } + i += blocksize; + } + + if(winsize != audioHistory.size()) + { + winsize = audioHistory.size(); + HannWindow(window.get(), winsize); + } + + double rms = MeasureRMS(audioHistory.data(), window.get(), winsize); + /* ======== Peak time detection ======== */ + if(period == 0) + { + begin_amplitude = rms; + peak_amplitude_value = rms; + peak_amplitude_time = 0; + } + else if(rms > peak_amplitude_value) + { + peak_amplitude_value = rms; + peak_amplitude_time = period; + // In next step, update the quater amplitude time + quarter_amplitude_time_found = false; + } + else if(!quarter_amplitude_time_found && (rms <= peak_amplitude_value * min_coefficient_on)) + { + quarter_amplitude_time = period; + quarter_amplitude_time_found = true; + } + /* ======== Peak time detection =END==== */ + if(rms > highest_sofar) + highest_sofar = rms; + + if((period > max_silent * interval) && + ( (rms < highest_sofar * min_coefficient_on) || (sound_min >= -1 && sound_max <= 1) ) + ) + break; + } + + if(!quarter_amplitude_time_found) + quarter_amplitude_time = windows_passed_on; + + if(windows_passed_on >= max_period_on) + { + // Just Keyoff the note + synth.noteOff(); + } + else + { + // Reset the emulator and re-run the "ON" simulation until reaching the peak time + synth.resetChip(); + synth.setInstrument(db, ins); + synth.noteOn(); + + audioHistory.reset(std::ceil(historyLength * g_outputRate)); + for(unsigned period = 0; + ((period < peak_amplitude_time) || (period == 0)) && (period < max_period_on); + ++period) + { + for(unsigned i = 0; i < samples_per_interval;) + { + size_t blocksize = samples_per_interval - i; + blocksize = (blocksize < audioBufferLength) ? blocksize : audioBufferLength; + synth.generate(audioBuffer, blocksize); + for (unsigned j = 0; j < blocksize; ++j) + audioHistory.add(audioBuffer[2 * j]); + i += blocksize; + } + } + synth.noteOff(); + } + + // Now, for up to 60 seconds, measure mean amplitude. + for(unsigned period = 0; period < max_period_off; ++period, ++windows_passed_off) + { + for(unsigned i = 0; i < samples_per_interval;) + { + size_t blocksize = samples_per_interval - i; + blocksize = (blocksize < 256) ? blocksize : 256; + synth.generate(audioBuffer, blocksize); + for (unsigned j = 0; j < blocksize; ++j) + { + int16_t s = audioBuffer[2 * j]; + audioHistory.add(s); + if(sound_min > s) sound_min = s; + if(sound_max < s) sound_max = s; + } + i += blocksize; + } + + if(winsize != audioHistory.size()) + { + winsize = audioHistory.size(); + HannWindow(window.get(), winsize); + } + + double rms = MeasureRMS(audioHistory.data(), window.get(), winsize); + /* ======== Find Key Off time ======== */ + if(!keyoff_out_time_found && (rms <= peak_amplitude_value * min_coefficient_off)) + { + keyoff_out_time = period; + keyoff_out_time_found = true; + } + /* ======== Find Key Off time ==END=== */ + if(rms < highest_sofar * min_coefficient_off) + break; + + if((period > max_silent * interval) && (sound_min >= -1 && sound_max <= 1)) + break; + } + + DurationInfo result; + result.peak_amplitude_time = peak_amplitude_time; + result.peak_amplitude_value = peak_amplitude_value; + result.begin_amplitude = begin_amplitude; + result.quarter_amplitude_time = (double)quarter_amplitude_time; + result.keyoff_out_time = (double)keyoff_out_time; + + result.ms_sound_kon = (int64_t)(quarter_amplitude_time * 1000.0 / interval); + result.ms_sound_koff = (int64_t)(keyoff_out_time * 1000.0 / interval); + result.nosound = (peak_amplitude_value < 0.5) || ((sound_min >= -1) && (sound_max <= 1)); + + db.instruments[ins.instId].delay_on_ms = result.ms_sound_kon; + db.instruments[ins.instId].delay_off_ms = result.ms_sound_koff; + + return result; +} + + void MeasureThreaded::LoadCache(const char *fileName) { FILE *in = std::fopen(fileName, "rb"); @@ -783,6 +980,36 @@ void MeasureThreaded::run(InstrumentsData::const_iterator i) destData *dd = new destData; dd->i = i; + dd->bd = nullptr; + dd->bd_ins = nullptr; + dd->myself = this; + dd->start(); + m_threads.push_back(dd); +#ifdef ADL_GENDATA_PRINT_PROGRESS + printProgress(); +#endif +} + +void MeasureThreaded::run(BanksDump &bd, BanksDump::InstrumentEntry &e) +{ + m_semaphore.wait(); + if(m_threads.size() > 0) + { + for(std::vector::iterator it = m_threads.begin(); it != m_threads.end();) + { + if(!(*it)->m_works) + { + delete(*it); + it = m_threads.erase(it); + } + else + it++; + } + } + + destData *dd = new destData; + dd->bd = &bd; + dd->bd_ins = &e; dd->myself = this; dd->start(); m_threads.push_back(dd); @@ -814,18 +1041,29 @@ void MeasureThreaded::destData::callback(void *myself) destData *s = reinterpret_cast(myself); DurationInfo info; DosBoxOPL3 dosbox; - DurationInfoCache::iterator cachedEntry = s->myself->m_durationInfo.find(s->i->first); - if(cachedEntry != s->myself->m_durationInfo.end()) + if(s->bd) { - s->myself->m_cache_matches++; - goto endWork; + info = MeasureDurations(*s->bd, *s->bd_ins, &dosbox); + // s->myself->m_durationInfo_mx.lock(); + // s->myself->m_durationInfo.insert({s->i->first, info}); + // s->myself->m_durationInfo_mx.unlock(); } + else + { + DurationInfoCache::iterator cachedEntry = s->myself->m_durationInfo.find(s->i->first); + + if(cachedEntry != s->myself->m_durationInfo.end()) + { + s->myself->m_cache_matches++; + goto endWork; + } - info = MeasureDurations(s->i->first, &dosbox); - s->myself->m_durationInfo_mx.lock(); - s->myself->m_durationInfo.insert({s->i->first, info}); - s->myself->m_durationInfo_mx.unlock(); + info = MeasureDurations(s->i->first, &dosbox); + s->myself->m_durationInfo_mx.lock(); + s->myself->m_durationInfo.insert({s->i->first, info}); + s->myself->m_durationInfo_mx.unlock(); + } endWork: s->myself->m_semaphore.notify(); diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index 63475ca..d02b2e4 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -85,6 +85,8 @@ struct MeasureThreaded } MeasureThreaded *myself; std::map > >::const_iterator i; + BanksDump *bd; + BanksDump::InstrumentEntry *bd_ins; std::thread m_work; std::atomic_bool m_works; @@ -97,10 +99,12 @@ struct MeasureThreaded void printProgress(); void printFinal(); void run(InstrumentsData::const_iterator i); + void run(BanksDump &bd, BanksDump::InstrumentEntry &e); void waitAll(); }; class OPLChipBase; extern DurationInfo MeasureDurations(const ins &in, OPLChipBase *chip); +extern DurationInfo MeasureDurations(const BanksDump &db, const BanksDump::InstrumentEntry &ins, OPLChipBase *chip); #endif // MEASURER_H -- cgit v1.2.3 From 7c4015695a733f9649f0f3d98c9a79b94b7393da Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sat, 22 Jun 2019 04:31:03 +0300 Subject: Make new cache format for new database entries --- utils/gen_adldata/measurer.cpp | 20 +++++++++++++++++--- utils/gen_adldata/measurer.h | 4 ++++ 2 files changed, 21 insertions(+), 3 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 3270463..8785254 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -1044,10 +1044,24 @@ void MeasureThreaded::destData::callback(void *myself) if(s->bd) { + OperatorsKey ok = {s->bd_ins->ops[0], s->bd_ins->ops[1], s->bd_ins->ops[2], s->bd_ins->ops[3], + static_cast(s->bd_ins->fbConn), + s->bd_ins->noteOffset1, s->bd_ins->noteOffset2, + static_cast(s->bd_ins->percussionKeyNumber), + static_cast(s->bd_ins->instFlags)}; + DurationInfoCacheX::iterator cachedEntry = s->myself->m_durationInfoX.find(ok); + if(cachedEntry != s->myself->m_durationInfoX.end()) + { + const DurationInfo &di = cachedEntry->second; + s->bd_ins->delay_on_ms = di.ms_sound_kon; + s->bd_ins->delay_off_ms = di.ms_sound_koff; + s->myself->m_cache_matches++; + goto endWork; + } info = MeasureDurations(*s->bd, *s->bd_ins, &dosbox); - // s->myself->m_durationInfo_mx.lock(); - // s->myself->m_durationInfo.insert({s->i->first, info}); - // s->myself->m_durationInfo_mx.unlock(); + s->myself->m_durationInfo_mx.lock(); + s->myself->m_durationInfoX.insert({ok, info}); + s->myself->m_durationInfo_mx.unlock(); } else { diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index d02b2e4..ddc66bc 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -6,6 +6,7 @@ #include #include #include +#include #include "progs_cache.h" @@ -54,7 +55,9 @@ private: struct MeasureThreaded { + typedef std::array OperatorsKey; typedef std::map DurationInfoCache; + typedef std::map DurationInfoCacheX; MeasureThreaded() : m_semaphore(int(std::thread::hardware_concurrency()) * 2), @@ -65,6 +68,7 @@ struct MeasureThreaded Semaphore m_semaphore; std::mutex m_durationInfo_mx; DurationInfoCache m_durationInfo; + DurationInfoCacheX m_durationInfoX; std::atomic_bool m_delete_tail; size_t m_total = 0; std::atomic m_done; -- cgit v1.2.3 From d992f42f694e816a1ab2922d2bdc6fc3d1bce408 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sun, 30 Jun 2019 16:31:43 +0300 Subject: New cache format for measured entries --- utils/gen_adldata/file_formats/common.h | 18 +++++ utils/gen_adldata/gen_adldata.cc | 2 + utils/gen_adldata/measurer.cpp | 137 ++++++++++++++++++++++++++++++++ utils/gen_adldata/measurer.h | 3 + 4 files changed, 160 insertions(+) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/common.h b/utils/gen_adldata/file_formats/common.h index f441221..a03ca5d 100644 --- a/utils/gen_adldata/file_formats/common.h +++ b/utils/gen_adldata/file_formats/common.h @@ -18,6 +18,14 @@ inline int16_t toSint16BE(const uint8_t *arr) return num; } +inline int16_t toSint16LE(const uint8_t *arr) +{ + int16_t num = *reinterpret_cast(&arr[1]); + num *= 1 << 8; + num |= static_cast(arr[0]) & 0x00FF; + return num; +} + inline uint16_t toUint16LE(const uint8_t *arr) { uint16_t num = arr[0]; @@ -34,4 +42,14 @@ inline uint32_t toUint32LE(const uint8_t *arr) return num; } +inline int32_t toSint32LE(const uint8_t *arr) +{ + int32_t num = *reinterpret_cast(&arr[3]); + num *= 1 << 24; + num |= (static_cast(arr[2]) << 16) & 0x00FF0000; + num |= (static_cast(arr[1]) << 8) & 0x0000FF00; + num |= static_cast(arr[0]) & 0x000000FF; + return num; +} + #endif // COMMON_H diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index 0aa756d..f0c1265 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -557,6 +557,7 @@ int main(int argc, char**argv) std::fclose(outFile); { + measureCounter.LoadCacheX("fm_banks/adldata-cache-x.dat"); measureCounter.m_durationInfo.clear(); measureCounter.m_cache_matches = 0; measureCounter.m_done = 0; @@ -569,6 +570,7 @@ int main(int argc, char**argv) } std::fflush(stdout); measureCounter.waitAll(); + measureCounter.SaveCacheX("fm_banks/adldata-cache-x.dat"); } db.exportBanks(std::string(outFile_s) + "x"); diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 8785254..1b49011 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -1,4 +1,5 @@ #include "measurer.h" +#include "file_formats/common.h" #include #ifndef M_PI @@ -703,6 +704,8 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i void MeasureThreaded::LoadCache(const char *fileName) { + m_durationInfo.clear(); + FILE *in = std::fopen(fileName, "rb"); if(!in) { @@ -930,6 +933,140 @@ void MeasureThreaded::SaveCache(const char *fileName) std::fclose(out); } +void MeasureThreaded::LoadCacheX(const char *fileName) +{ + m_durationInfoX.clear(); + + FILE *in = std::fopen(fileName, "rb"); + if(!in) + { + std::printf("Failed to load CacheX: file is not exists.\n" + "Complete data will be generated from scratch.\n"); + std::fflush(stdout); + return; + } + + char magic[32]; + if(std::fread(magic, 1, 32, in) != 32) + { + std::fclose(in); + std::printf("Failed to load CacheX: can't read magic.\n" + "Complete data will be generated from scratch.\n"); + std::fflush(stdout); + return; + } + + if(std::memcmp(magic, "ADLMIDI-DURATION-CACHE-FILE-V2.0", 32) != 0) + { + std::fclose(in); + std::printf("Failed to load CacheX: magic missmatch.\n" + "Complete data will be generated from scratch.\n"); + std::fflush(stdout); + return; + } + + uint_fast32_t itemsCount; + uint8_t itemsCountA[4]; + if(std::fread(itemsCountA, 1, 4, in) != 4) + { + std::fclose(in); + std::printf("Failed to load CacheX: can't read cache size value.\n" + "Complete data will be generated from scratch.\n"); + std::fflush(stdout); + return; + } + + itemsCount = static_cast(toSint32LE(itemsCountA)); + + while(!std::feof(in) && itemsCount > 0) + { + OperatorsKey k; + DurationInfo v; + + uint8_t data_k[4]; + + for(auto &kv : k) + { + uint8_t data[4]; + auto ret = std::fread(data, 1, 4, in); + if(ret != 4) + { + std::fclose(in); + std::printf("Failed to load CacheX: unexpected end of file.\n" + "Complete data will be generated from scratch.\n"); + std::fflush(stdout); + return; + } + kv = static_cast(toSint32LE(data)); + } + + auto ret = std::fread(data_k, 1, 4, in); + if(ret != 4) + { + std::fclose(in); + std::printf("Failed to load CacheX: unexpected end of file.\n" + "Complete data will be generated from scratch.\n"); + std::fflush(stdout); + return; + } + + v.ms_sound_kon = static_cast(toUint16LE(data_k + 0)); + v.ms_sound_koff = static_cast(toUint16LE(data_k + 2)); + + m_durationInfoX.insert({k, v}); + itemsCount--; + } + + std::printf("CacheX loaded!\n"); + std::fflush(stdout); + + std::fclose(in); +} + +void MeasureThreaded::SaveCacheX(const char *fileName) +{ + FILE *out = std::fopen(fileName, "wb"); + std::fprintf(out, "ADLMIDI-DURATION-CACHE-FILE-V2.0"); + + uint_fast32_t itemsCount = static_cast(m_durationInfoX.size()); + uint8_t itemsCountA[4] = + { + static_cast((itemsCount >> 0) & 0xFF), + static_cast((itemsCount >> 8) & 0xFF), + static_cast((itemsCount >> 16) & 0xFF), + static_cast((itemsCount >> 24) & 0xFF) + }; + std::fwrite(itemsCountA, 1, 4, out); + + for(DurationInfoCacheX::iterator it = m_durationInfoX.begin(); it != m_durationInfoX.end(); it++) + { + const OperatorsKey &k = it->first; + const DurationInfo &v = it->second; + + uint8_t data_k[4] = + { + static_cast((v.ms_sound_kon >> 0) & 0xFF), + static_cast((v.ms_sound_kon >> 8) & 0xFF), + static_cast((v.ms_sound_koff >> 0) & 0xFF), + static_cast((v.ms_sound_koff >> 8) & 0xFF) + }; + + for(auto &kv : k) + { + uint8_t data[4] = + { + static_cast((kv >> 0) & 0xFF), + static_cast((kv >> 8) & 0xFF), + static_cast((kv >> 16) & 0xFF), + static_cast((kv >> 24) & 0xFF) + }; + std::fwrite(data, 1, 4, out); + } + std::fwrite(data_k, 1, 4, out); + } + std::fclose(out); +} + #ifdef ADL_GENDATA_PRINT_PROGRESS static const char* spinner = "-\\|/"; diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index ddc66bc..ed7810a 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -77,6 +77,9 @@ struct MeasureThreaded void LoadCache(const char *fileName); void SaveCache(const char *fileName); + void LoadCacheX(const char *fileName); + void SaveCacheX(const char *fileName); + struct destData { destData() -- cgit v1.2.3 From 81f905ea76f0efb6ea35331bd1fe476f14f804de Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 1 Jul 2019 05:01:55 +0300 Subject: First working of new database // not so stable, needs a polishing, however, multibank from embedded 72'th bank (DMXOPL3) works! --- utils/gen_adldata/CMakeLists.txt | 5 + utils/gen_adldata/gen_adldata.cc | 3 + utils/gen_adldata/measurer.cpp | 155 +++++++++++++++++++--------- utils/gen_adldata/measurer.h | 6 +- utils/gen_adldata/progs_cache.h | 7 ++ utils/midiplay/wave_writer.c | 214 ++++++++++++++++++++++++--------------- utils/midiplay/wave_writer.h | 20 ++-- 7 files changed, 266 insertions(+), 144 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/CMakeLists.txt b/utils/gen_adldata/CMakeLists.txt index e214534..46c2525 100644 --- a/utils/gen_adldata/CMakeLists.txt +++ b/utils/gen_adldata/CMakeLists.txt @@ -19,6 +19,11 @@ list(APPEND GEN_ADLDATA_SRC ini/ini_processing.cpp ) +#add_definitions(-DGEN_ADLDATA_DEEP_DEBUG) +#list(APPEND GEN_ADLDATA_SRC +# ../midiplay/wave_writer.c +#) + if(USE_DOSBOX_EMULATOR) set(HAS_EMULATOR TRUE) list(APPEND GEN_ADLDATA_SRC diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index f0c1265..2b94ab6 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -341,6 +341,7 @@ int main(int argc, char**argv) std::fprintf(outFile, "{\n"); MeasureThreaded measureCounter; +#ifndef GEN_ADLDATA_DEEP_DEBUG // Skip slowest place to work with a debug { std::printf("Beginning to generate measures data... (hardware concurrency of %d)\n", std::thread::hardware_concurrency()); std::fflush(stdout); @@ -358,6 +359,7 @@ int main(int argc, char**argv) measureCounter.waitAll(); measureCounter.SaveCache("fm_banks/adldata-cache.dat"); } +#endif std::printf("Writing generated measure data...\n"); std::fflush(stdout); @@ -566,6 +568,7 @@ int main(int argc, char**argv) std::fflush(stdout); for(size_t b = 0; b < db.instruments.size(); ++b) { + assert(db.instruments[b].instId == b); measureCounter.run(db, db.instruments[b]); } std::fflush(stdout); diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 1b49011..23e3883 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -2,6 +2,10 @@ #include "file_formats/common.h" #include +#ifdef GEN_ADLDATA_DEEP_DEBUG +#include "../midiplay/wave_writer.h" +#endif + #ifndef M_PI #define M_PI 3.14159265358979323846 #endif @@ -58,6 +62,14 @@ static const uint16_t g_operatorsMap[(NUM_OF_CHANNELS + NUM_OF_RM_CHANNELS) * 2] 0x011, 0xFFF // operator 13 }; +//! Channel map to regoster offsets +static const uint16_t g_channelsMap[NUM_OF_CHANNELS] = +{ + 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008, // 0..8 + 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, // 9..17 (secondary set) + 0x006, 0x007, 0x008, 0x008, 0x008 // <- hw percussions, hihats and cymbals using tom-tom's channel as pitch source +}; + template class AudioHistory @@ -130,8 +142,11 @@ struct TinySynth { OPLChipBase *m_chip; unsigned m_notesNum; - int m_notenum; - int8_t m_fineTune; + unsigned m_actualNotesNum; + bool m_isReal4op; + bool m_isPseudo4op; + int m_playNoteNum; + int8_t m_voice1Detune; int16_t m_noteOffsets[2]; unsigned m_x[2]; @@ -146,6 +161,8 @@ struct TinySynth m_chip->setRate(g_outputRate); + for(size_t a = 0; a < 18; ++a) + m_chip->writeReg(0xB0 + g_channelsMap[a], 0x00); for(unsigned a = 0; a < 18; a += 2) m_chip->writeReg((uint16_t)initdata[a], (uint8_t)initdata[a + 1]); } @@ -173,20 +190,19 @@ struct TinySynth } std::memset(m_x, 0, sizeof(m_x)); - m_notenum = in.notenum >= 128 ? (in.notenum - 128) : in.notenum; - if(m_notenum == 0) - m_notenum = 25; + m_playNoteNum = in.notenum >= 128 ? (in.notenum - 128) : in.notenum; + m_isReal4op = in.real4op && !in.pseudo4op; + m_isPseudo4op = in.pseudo4op; + if(m_playNoteNum == 0) + m_playNoteNum = 25; m_notesNum = in.insno1 == in.insno2 ? 1 : 2; - m_fineTune = 0; + m_actualNotesNum = (m_isReal4op ? 1 : m_notesNum); + m_voice1Detune = 0; m_noteOffsets[0] = rawData[0].finetune; m_noteOffsets[1] = rawData[1].finetune; if(in.pseudo4op) - m_fineTune = in.voice2_fine_tune; - if(in.real4op) - { - m_chip->writeReg(0x105, 1); - m_chip->writeReg(0x104, 0xFF); - } + m_voice1Detune = in.voice2_fine_tune; + m_chip->writeReg(0x104, in.real4op ? (1 << 6) - 1 : 0x00); //For cleaner measurement, disable tremolo and vibrato rawData[0].data[0] &= 0x3F; @@ -206,9 +222,8 @@ struct TinySynth void setInstrument(const BanksDump &db, const BanksDump::InstrumentEntry &ins) { - // TODO: Implement this function correctly! - bool is4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_4op) != 0); bool isPseudo4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op) != 0); + bool is4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_4op) != 0) && !isPseudo4ops; size_t opsNum = (is4ops || isPseudo4ops) ? 4 : 2; BanksDump::Operator ops[4]; assert(ins.ops[0] >= 0); @@ -224,24 +239,25 @@ struct TinySynth } std::memset(m_x, 0, sizeof(m_x)); - m_notenum = ins.percussionKeyNumber >= 128 ? (ins.percussionKeyNumber - 128) : ins.percussionKeyNumber; - if(m_notenum == 0) - m_notenum = 25; + m_playNoteNum = ins.percussionKeyNumber >= 128 ? (ins.percussionKeyNumber - 128) : ins.percussionKeyNumber; + m_isReal4op = is4ops; + m_isPseudo4op = isPseudo4ops; + if(m_playNoteNum == 0) + m_playNoteNum = 60; m_notesNum = opsNum / 2; - m_fineTune = 0; + m_actualNotesNum = (m_isReal4op ? 1 : m_notesNum); + m_voice1Detune = 0; m_noteOffsets[0] = ins.noteOffset1; m_noteOffsets[1] = ins.noteOffset2; if(isPseudo4ops) - m_fineTune = ins.secondVoiceDetune; - if(is4ops) - { - m_chip->writeReg(0x105, 1); - m_chip->writeReg(0x104, 0xFF); - } + m_voice1Detune = ins.secondVoiceDetune; + m_chip->writeReg(0x104, is4ops ? (1 << 6) - 1 : 0x00); //For cleaner measurement, disable tremolo and vibrato - ops[0].d_E862 &= 0xFFFF3F3F; - ops[1].d_E862 &= 0xFFFF3F3F; + ops[0].d_E862 &= 0xFFFFFF3F; + ops[1].d_E862 &= 0xFFFFFF3F; + ops[2].d_E862 &= 0xFFFFFF3F; + ops[3].d_E862 &= 0xFFFFFF3F; // rawData[0].data[0] &= 0x3F; // rawData[0].data[1] &= 0x3F; // rawData[1].data[0] &= 0x3F; @@ -252,16 +268,19 @@ struct TinySynth static const uint8_t data[4] = {0x20, 0x60, 0x80, 0xE0}; uint16_t o1 = g_operatorsMap[0]; uint16_t o2 = g_operatorsMap[1]; - unsigned x = ops[0].d_E862, y = ops[1].d_E862; + size_t opOffset = (n * 2); + uint_fast32_t x1 = ops[opOffset + 0].d_E862, y1 = ops[opOffset + 1].d_E862; + uint_fast8_t x2 = ops[opOffset + 0].d_40, y2 = ops[opOffset + 1].d_40; + uint_fast8_t fbConn = (ins.fbConn >> (n * 8)) & 0xFF; - for(size_t a = 0; a < 4; ++a, x >>= 8, y >>= 8) + for(size_t a = 0; a < 4; ++a, x1 >>= 8, y1 >>= 8) { - if(o1 != 0xFFF) - m_chip->writeReg(data[a] + o1, x & 0xFF); - if(o2 != 0xFFF) - m_chip->writeReg(data[a] + o2, y & 0xFF); + m_chip->writeReg(data[a] + o1, x1 & 0xFF); + m_chip->writeReg(data[a] + o2, y1 & 0xFF); } - m_chip->writeReg(0xC0 + n * 8, (ins.fbConn >> n * 8) & 0xFF); + m_chip->writeReg(0xC0 + (n * 8), fbConn | 0x30); + m_chip->writeReg(0x40 + o1, x2 & 0xFF); + m_chip->writeReg(0x40 + o2, y2 & 0xFF); } // for(unsigned n = 0; n < m_notesNum; ++n) @@ -269,27 +288,25 @@ struct TinySynth // static const unsigned char patchdata[11] = // {0x20, 0x23, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0x40, 0x43, 0xC0}; // for(unsigned a = 0; a < 10; ++a) -// { // m_chip->writeReg(patchdata[a] + n * 8, rawData[n].data[a]); -// } -// m_chip->writeReg(patchdata[10] + n * 8, (ins.fbConn >> n * 8) & 0xFF); +// m_chip->writeReg(patchdata[10] + n * 8, rawData[n].data[10] | 0x30); // } } void noteOn() { std::memset(m_x, 0, sizeof(m_x)); - for(unsigned n = 0; n < m_notesNum; ++n) + for(unsigned n = 0; n < m_actualNotesNum; ++n) { - double hertz = 172.00093 * std::exp(0.057762265 * (m_notenum + m_noteOffsets[n])); + double hertz = 172.00093 * std::exp(0.057762265 * (m_playNoteNum + m_noteOffsets[n])); if(hertz > 131071) { std::fprintf(stdout, "%s:%d:0: warning: Why does note %d + note-offset %d produce hertz %g?\n", __FILE__, __LINE__, - m_notenum, m_noteOffsets[n], hertz); + m_playNoteNum, m_noteOffsets[n], hertz); std::fflush(stdout); hertz = 131071; } - m_x[n] = 0x2000; + m_x[n] = 0x2000u; while(hertz >= 1023.5) { hertz /= 2.0; // Calculate octave @@ -298,16 +315,16 @@ struct TinySynth m_x[n] += (unsigned int)(hertz + 0.5); // Keyon the note - m_chip->writeReg(0xA0 + n * 3, m_x[n] & 0xFF); - m_chip->writeReg(0xB0 + n * 3, m_x[n] >> 8); + m_chip->writeReg(0xA0 + (n * 3), m_x[n] & 0xFF); + m_chip->writeReg(0xB0 + (n * 3), (m_x[n] >> 8) & 0xFF); } } void noteOff() { // Keyoff the note - for(unsigned n = 0; n < m_notesNum; ++n) - m_chip->writeReg(0xB0 + n * 3, (m_x[n] >> 8) & 0xDF); + for(unsigned n = 0; n < m_actualNotesNum; ++n) + m_chip->writeReg(0xB0 + (n * 3), (m_x[n] >> 8) & 0xDF); } void generate(int16_t *output, size_t frames) @@ -528,6 +545,19 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i synth.setInstrument(db, ins); synth.noteOn(); +#ifdef GEN_ADLDATA_DEEP_DEBUG + /*****************DEBUG******************/ + char waveFileOut[80] = ""; + std::snprintf(waveFileOut, 80, "fm_banks/_deep_debug/%04lu_%s_%u_an_%u_no.wav", + ins.instId, synth.m_isPseudo4op ? "pseudo4op" : + synth.m_isReal4op ? "4op" : "2op", + synth.m_actualNotesNum, + synth.m_notesNum); + void *waveCtx = ctx_wave_open(g_outputRate, waveFileOut); + ctx_wave_enable_stereo(waveCtx); + /*****************DEBUG******************/ +#endif + /* For capturing */ const unsigned max_silent = 6; const unsigned max_on = 40; @@ -566,6 +596,11 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i size_t blocksize = samples_per_interval - i; blocksize = (blocksize < audioBufferLength) ? blocksize : audioBufferLength; synth.generate(audioBuffer, blocksize); +#ifdef GEN_ADLDATA_DEEP_DEBUG + /***************DEBUG******************/ + ctx_wave_write(waveCtx, audioBuffer, blocksize * 2); + /***************DEBUG******************/ +#endif for (unsigned j = 0; j < blocksize; ++j) { int16_t s = audioBuffer[2 * j]; @@ -697,11 +732,26 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i db.instruments[ins.instId].delay_on_ms = result.ms_sound_kon; db.instruments[ins.instId].delay_off_ms = result.ms_sound_koff; + if(result.nosound) + db.instruments[ins.instId].instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_IsBlank; +#ifdef GEN_ADLDATA_DEEP_DEBUG + /***************DEBUG******************/ + ctx_wave_close(waveCtx); + /***************DEBUG******************/ +#endif return result; } +MeasureThreaded::MeasureThreaded() : + m_semaphore(int(std::thread::hardware_concurrency()) * 2), + m_done(0), + m_cache_matches(0) +{ + DosBoxOPL3::globalPreInit(); +} + void MeasureThreaded::LoadCache(const char *fileName) { m_durationInfo.clear(); @@ -983,7 +1033,7 @@ void MeasureThreaded::LoadCacheX(const char *fileName) OperatorsKey k; DurationInfo v; - uint8_t data_k[4]; + uint8_t data_k[5]; for(auto &kv : k) { @@ -1000,8 +1050,8 @@ void MeasureThreaded::LoadCacheX(const char *fileName) kv = static_cast(toSint32LE(data)); } - auto ret = std::fread(data_k, 1, 4, in); - if(ret != 4) + auto ret = std::fread(data_k, 1, 5, in); + if(ret != 5) { std::fclose(in); std::printf("Failed to load CacheX: unexpected end of file.\n" @@ -1012,6 +1062,7 @@ void MeasureThreaded::LoadCacheX(const char *fileName) v.ms_sound_kon = static_cast(toUint16LE(data_k + 0)); v.ms_sound_koff = static_cast(toUint16LE(data_k + 2)); + v.nosound = (data_k[4] == 0x01); m_durationInfoX.insert({k, v}); itemsCount--; @@ -1043,12 +1094,13 @@ void MeasureThreaded::SaveCacheX(const char *fileName) const OperatorsKey &k = it->first; const DurationInfo &v = it->second; - uint8_t data_k[4] = + uint8_t data_k[5] = { static_cast((v.ms_sound_kon >> 0) & 0xFF), static_cast((v.ms_sound_kon >> 8) & 0xFF), static_cast((v.ms_sound_koff >> 0) & 0xFF), - static_cast((v.ms_sound_koff >> 8) & 0xFF) + static_cast((v.ms_sound_koff >> 8) & 0xFF), + static_cast(v.nosound ? 0x01 : 0x00) }; for(auto &kv : k) @@ -1062,7 +1114,7 @@ void MeasureThreaded::SaveCacheX(const char *fileName) }; std::fwrite(data, 1, 4, out); } - std::fwrite(data_k, 1, 4, out); + std::fwrite(data_k, 1, 5, out); } std::fclose(out); } @@ -1178,6 +1230,7 @@ void MeasureThreaded::destData::callback(void *myself) destData *s = reinterpret_cast(myself); DurationInfo info; DosBoxOPL3 dosbox; + // NukedOPL3 dosbox; if(s->bd) { @@ -1192,6 +1245,8 @@ void MeasureThreaded::destData::callback(void *myself) const DurationInfo &di = cachedEntry->second; s->bd_ins->delay_on_ms = di.ms_sound_kon; s->bd_ins->delay_off_ms = di.ms_sound_koff; + if(di.nosound) + s->bd_ins->instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_IsBlank; s->myself->m_cache_matches++; goto endWork; } diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index ed7810a..d2b8a76 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -59,11 +59,7 @@ struct MeasureThreaded typedef std::map DurationInfoCache; typedef std::map DurationInfoCacheX; - MeasureThreaded() : - m_semaphore(int(std::thread::hardware_concurrency()) * 2), - m_done(0), - m_cache_matches(0) - {} + MeasureThreaded(); Semaphore m_semaphore; std::mutex m_durationInfo_mx; diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 09f75f6..34e42a3 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -335,6 +335,13 @@ struct BanksDump uint_fast32_t opId = 0; uint_fast32_t d_E862 = 0; uint_fast32_t d_40 = 0; + explicit Operator() {} + Operator(const Operator &o) + { + opId = o.opId; + d_E862 = o.d_E862; + d_40 = o.d_40; + } bool operator==(const Operator &o) { return ((d_E862 == o.d_E862) && (d_40 == o.d_40)); diff --git a/utils/midiplay/wave_writer.c b/utils/midiplay/wave_writer.c index e8ee10c..bdee5d7 100755 --- a/utils/midiplay/wave_writer.c +++ b/utils/midiplay/wave_writer.c @@ -26,145 +26,195 @@ enum { header_size = 0x2C }; typedef short sample_t; -static unsigned char* buf; -static FILE* file; -static long sample_count_; -static long sample_rate_; -static long buf_pos; -static int chan_count; - -static void exit_with_error( const char* str ) +struct Context { - fprintf(stderr, "WAVE Writer Error: %s\n", str ); + unsigned char *m_buf; + FILE *m_file; + long m_sample_count; + long m_sample_rate; + long m_buf_pos; + int m_chan_count; +}; + +static struct Context *g_wwContext = NULL; + +static void exit_with_error(const char *str) +{ + fprintf(stderr, "WAVE Writer Error: %s\n", str); fflush(stderr); } -int wave_open( long sample_rate, const char* filename ) +int wave_open(long sample_rate, const char *filename) +{ + g_wwContext = ctx_wave_open(sample_rate, filename); + return g_wwContext ? 0 : -1; +} + +void wave_enable_stereo(void) +{ + ctx_wave_enable_stereo(g_wwContext); +} + +void wave_write(short const *in, long remain) +{ + ctx_wave_write(g_wwContext, in, remain); +} + +long wave_sample_count(void) +{ + return ctx_wave_sample_count(g_wwContext); +} + +void wave_close(void) { - sample_count_ = 0; - sample_rate_ = sample_rate; - buf_pos = header_size; - chan_count = 1; + ctx_wave_close(g_wwContext); +} + + + +static void set_le32(void *p, unsigned long n) +{ + ((unsigned char *) p) [0] = (unsigned char) n & (0xFF); + ((unsigned char *) p) [1] = (unsigned char)(n >> 8) & (0xFF); + ((unsigned char *) p) [2] = (unsigned char)(n >> 16) & (0xFF); + ((unsigned char *) p) [3] = (unsigned char)(n >> 24) & (0xFF); +} - buf = (unsigned char*) malloc( buf_size * sizeof *buf ); - if ( !buf ) +void *ctx_wave_open(long sample_rate, const char *filename) +{ + struct Context *ctx = (struct Context*)malloc(sizeof(struct Context)); + if(!ctx) { - exit_with_error( "Out of memory" ); - return -1; + exit_with_error("Out of memory"); + return NULL; + } + + ctx->m_sample_count = 0; + ctx->m_sample_rate = sample_rate; + ctx->m_buf_pos = header_size; + ctx->m_chan_count = 1; + + ctx->m_buf = (unsigned char *) malloc(buf_size); + if(!ctx->m_buf) + { + exit_with_error("Out of memory"); + free(ctx); + return NULL; } #if !defined(_WIN32) || defined(__WATCOMC__) - file = fopen( filename, "wb" ); + ctx->m_file = fopen(filename, "wb"); #else wchar_t widePath[MAX_PATH]; int size = MultiByteToWideChar(CP_UTF8, 0, filename, strlen(filename), widePath, MAX_PATH); widePath[size] = '\0'; - file = _wfopen( widePath, L"wb" ); + ctx->m_file = _wfopen(widePath, L"wb"); #endif - if (!file) + if(!ctx->m_file) { - exit_with_error( "Couldn't open WAVE file for writing" ); - return -1; + exit_with_error("Couldn't open WAVE file for writing"); + free(ctx); + return NULL; } - setvbuf( file, 0, _IOFBF, 32 * 1024L ); - return 0; + setvbuf(ctx->m_file, 0, _IOFBF, 32 * 1024L); + return ctx; } -void wave_enable_stereo( void ) +void ctx_wave_enable_stereo(void *ctx) { - chan_count = 2; + struct Context *wWriter = (struct Context *)ctx; + wWriter->m_chan_count = 2; } -static void flush_() + +static void flush_(struct Context *ctx) { - if ( buf_pos && !fwrite( buf, (size_t)buf_pos, 1, file ) ) - exit_with_error( "Couldn't write WAVE data" ); - buf_pos = 0; + if(ctx->m_buf_pos && !fwrite(ctx->m_buf, (size_t)ctx->m_buf_pos, 1, ctx->m_file)) + exit_with_error("Couldn't write WAVE data"); + ctx->m_buf_pos = 0; } -void wave_write( short const* in, long remain ) +void ctx_wave_write(void *ctx, const short *in, long remain) { - sample_count_ += remain; - while ( remain ) + struct Context *wWriter = (struct Context *)ctx; + wWriter->m_sample_count += remain; + while(remain) { - if ( buf_pos >= buf_size ) - flush_(); - + if(wWriter->m_buf_pos >= buf_size) + flush_(wWriter); { - unsigned char* p = &buf [buf_pos]; - long n = (buf_size - (unsigned long)buf_pos) / sizeof (sample_t); - if ( n > remain ) + unsigned char *p = &wWriter->m_buf [wWriter->m_buf_pos]; + long n = (buf_size - (unsigned long)wWriter->m_buf_pos) / sizeof(sample_t); + if(n > remain) n = remain; remain -= n; /* convert to LSB first format */ - while ( n-- ) + while(n--) { int s = *in++; *p++ = (unsigned char) s & (0x00FF); - *p++ = (unsigned char) (s >> 8) & (0x00FF); + *p++ = (unsigned char)(s >> 8) & (0x00FF); } - buf_pos = p - buf; - assert( buf_pos <= buf_size ); + wWriter->m_buf_pos = p - wWriter->m_buf; + assert(wWriter->m_buf_pos <= buf_size); } } } -long wave_sample_count( void ) +long ctx_wave_sample_count(void *ctx) { - return sample_count_; + struct Context *wWriter = (struct Context *)ctx; + return wWriter->m_sample_count; } -static void set_le32( void* p, unsigned long n ) +void ctx_wave_close(void *ctx) { - ((unsigned char*) p) [0] = (unsigned char) n & (0xFF); - ((unsigned char*) p) [1] = (unsigned char) (n >> 8) & (0xFF); - ((unsigned char*) p) [2] = (unsigned char) (n >> 16) & (0xFF); - ((unsigned char*) p) [3] = (unsigned char) (n >> 24) & (0xFF); -} + struct Context *wWriter = (struct Context *)ctx; + if(!wWriter) + return; -void wave_close( void ) -{ - if ( file ) + if(wWriter->m_file) { /* generate header */ unsigned char h [header_size] = { - 'R','I','F','F', - 0,0,0,0, /* length of rest of file */ - 'W','A','V','E', - 'f','m','t',' ', - 0x10,0,0,0, /* size of fmt chunk */ - 1,0, /* uncompressed format */ - 0,0, /* channel count */ - 0,0,0,0, /* sample rate */ - 0,0,0,0, /* bytes per second */ - 0,0, /* bytes per sample frame */ - 16,0, /* bits per sample */ - 'd','a','t','a', - 0,0,0,0, /* size of sample data */ + 'R', 'I', 'F', 'F', + 0, 0, 0, 0, /* length of rest of file */ + 'W', 'A', 'V', 'E', + 'f', 'm', 't', ' ', + 0x10, 0, 0, 0, /* size of fmt chunk */ + 1, 0, /* uncompressed format */ + 0, 0, /* channel count */ + 0, 0, 0, 0, /* sample rate */ + 0, 0, 0, 0, /* bytes per second */ + 0, 0, /* bytes per sample frame */ + 16, 0, /* bits per sample */ + 'd', 'a', 't', 'a', + 0, 0, 0, 0, /* size of sample data */ /* ... */ /* sample data */ }; - long ds = sample_count_ * (long)sizeof (sample_t); - int frame_size = chan_count * (long)sizeof (sample_t); + long ds = wWriter->m_sample_count * (long)sizeof(sample_t); + int frame_size = wWriter->m_chan_count * (long)sizeof(sample_t); - set_le32( h + 0x04, header_size - 8 + ds ); - h [0x16] = (unsigned char)chan_count; - set_le32( h + 0x18, (unsigned long)sample_rate_ ); - set_le32( h + 0x1C, (unsigned long)sample_rate_ * (unsigned long)frame_size ); + set_le32(h + 0x04, header_size - 8 + ds); + h [0x16] = (unsigned char)wWriter->m_chan_count; + set_le32(h + 0x18, (unsigned long)wWriter->m_sample_rate); + set_le32(h + 0x1C, (unsigned long)wWriter->m_sample_rate * (unsigned long)frame_size); h [0x20] = (unsigned char)frame_size; - set_le32( h + 0x28, (unsigned long)ds ); + set_le32(h + 0x28, (unsigned long)ds); - flush_(); + flush_(wWriter); /* write header */ - fseek( file, 0, SEEK_SET ); - fwrite( h, header_size, 1, file ); - fclose( file ); - file = 0; - free( buf ); - buf = 0; + fseek(wWriter->m_file, 0, SEEK_SET); + fwrite(h, header_size, 1, wWriter->m_file); + fclose(wWriter->m_file); + wWriter->m_file = 0; + free(wWriter->m_buf); + wWriter->m_buf = 0; } + free(wWriter); } diff --git a/utils/midiplay/wave_writer.h b/utils/midiplay/wave_writer.h index 6d49718..17318c3 100755 --- a/utils/midiplay/wave_writer.h +++ b/utils/midiplay/wave_writer.h @@ -5,17 +5,23 @@ #define WAVE_WRITER_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif -int wave_open( long sample_rate, const char* filename ); -void wave_enable_stereo( void ); -void wave_write( short const* in, long count ); -long wave_sample_count( void ); -void wave_close( void ); +int wave_open(long sample_rate, const char *filename); +void wave_enable_stereo(void); +void wave_write(short const *in, long count); +long wave_sample_count(void); +void wave_close(void); + +void *ctx_wave_open(long sample_rate, const char *filename); +void ctx_wave_enable_stereo(void *ctx); +void ctx_wave_write(void *ctx, short const *in, long count); +long ctx_wave_sample_count(void *ctx); +void ctx_wave_close(void *ctx); #ifdef __cplusplus - } +} #endif #endif -- cgit v1.2.3 From 48a951279b9278ebedbf36e77c4884c66acc3da5 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 1 Jul 2019 05:14:03 +0300 Subject: Fixed broken OP2's note offsets --- utils/gen_adldata/file_formats/load_op2.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h index 0c67323..1d7ea6f 100644 --- a/utils/gen_adldata/file_formats/load_op2.h +++ b/utils/gen_adldata/file_formats/load_op2.h @@ -133,6 +133,9 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s tmp[1].finetune -= 12; } + inst.noteOffset1 = int8_t(tmp[0].finetune); + inst.noteOffset2 = int8_t(tmp[1].finetune); + if((ins.flags & FL_DOUBLE_VOICE) != 0) inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op; inst.percussionKeyNumber = tmp2.notenum; -- cgit v1.2.3 From c24e8ff891a353f37a2d6bf7bbd670e8fdd11927 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Tue, 2 Jul 2019 00:38:59 +0300 Subject: Fixed messed up JungleVision banks --- utils/gen_adldata/file_formats/load_jv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_jv.h b/utils/gen_adldata/file_formats/load_jv.h index a7ebf7b..ef36f76 100644 --- a/utils/gen_adldata/file_formats/load_jv.h +++ b/utils/gen_adldata/file_formats/load_jv.h @@ -42,7 +42,7 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, : gmno < 128 + 88 ? int(gmno - 35) : -1; - bool isPercussion = ins_count >= 128; + bool isPercussion = a >= ins_count; size_t patchId = (a < ins_count) ? (a + first_ins) : ((a - ins_count) + first_drum); BanksDump::MidiBank &bnk = isPercussion ? bnkPercussion : bnkMelodique; BanksDump::InstrumentEntry inst; -- cgit v1.2.3 From 6a3a102b21e7d0b4e8fe3147294d9b02f0fcd166 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Tue, 2 Jul 2019 01:11:42 +0300 Subject: Fix for pseudo-4op instruments --- utils/gen_adldata/file_formats/load_op2.h | 8 ++------ utils/gen_adldata/file_formats/load_wopl.h | 2 +- utils/gen_adldata/measurer.cpp | 3 ++- utils/gen_adldata/measurer.h | 2 +- 4 files changed, 6 insertions(+), 9 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h index 1d7ea6f..6599a9f 100644 --- a/utils/gen_adldata/file_formats/load_op2.h +++ b/utils/gen_adldata/file_formats/load_op2.h @@ -112,10 +112,6 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s tmp[index].data[10] = src.feedback; tmp[index].finetune = int8_t(src.basenote + 12); inst.fbConn |= (uint_fast16_t(src.feedback) << (a == 1 ? 8 : 0)); - if(a == 0) - inst.noteOffset1 = int8_t(src.basenote + 12); - else - inst.noteOffset2 = int8_t(src.basenote + 12); db.toOps(tmp[index], ops, index * 2); } struct ins tmp2; @@ -137,9 +133,9 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s inst.noteOffset2 = int8_t(tmp[1].finetune); if((ins.flags & FL_DOUBLE_VOICE) != 0) - inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op; + inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op | BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op; inst.percussionKeyNumber = tmp2.notenum; - inst.secondVoiceDetune = ins.finetune; + inst.secondVoiceDetune = static_cast(static_cast(ins.finetune) - 128); if(!(ins.flags & FL_DOUBLE_VOICE)) { diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h index 0f05b6a..0db911c 100644 --- a/utils/gen_adldata/file_formats/load_wopl.h +++ b/utils/gen_adldata/file_formats/load_wopl.h @@ -208,7 +208,7 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s inst.instFlags = flags; inst.percussionKeyNumber = is_percussion ? data[offset + 38] : 0; inst.noteOffset1 = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 32)); - inst.noteOffset2 = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 32)); + inst.noteOffset2 = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 34)); inst.secondVoiceDetune = static_cast(data[offset + 37]); inst.midiVelocityOffset = static_cast(data[offset + 36]); inst.fbConn = (static_cast(data[offset + 40])) | diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 23e3883..fbae571 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -1238,7 +1238,8 @@ void MeasureThreaded::destData::callback(void *myself) static_cast(s->bd_ins->fbConn), s->bd_ins->noteOffset1, s->bd_ins->noteOffset2, static_cast(s->bd_ins->percussionKeyNumber), - static_cast(s->bd_ins->instFlags)}; + static_cast(s->bd_ins->instFlags), + static_cast(s->bd_ins->secondVoiceDetune)}; DurationInfoCacheX::iterator cachedEntry = s->myself->m_durationInfoX.find(ok); if(cachedEntry != s->myself->m_durationInfoX.end()) { diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index d2b8a76..60fdcb7 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -55,7 +55,7 @@ private: struct MeasureThreaded { - typedef std::array OperatorsKey; + typedef std::array OperatorsKey; typedef std::map DurationInfoCache; typedef std::map DurationInfoCacheX; -- cgit v1.2.3 From 651a39afe998defee15140aebb967e57bd4d64e2 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Tue, 2 Jul 2019 02:49:11 +0300 Subject: Fixed messed up AdLib Gold BNK --- utils/gen_adldata/file_formats/load_bnk2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_bnk2.h b/utils/gen_adldata/file_formats/load_bnk2.h index 7ab8af6..e977cd7 100644 --- a/utils/gen_adldata/file_formats/load_bnk2.h +++ b/utils/gen_adldata/file_formats/load_bnk2.h @@ -63,12 +63,12 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, { patchId = stdstoi(name.substr(perc_filter.size())); gmno = patchId + 128; - isPercussion = false; + isPercussion = true; } else continue; - BanksDump::MidiBank &bnk = isPercussion ? bnkMelodic : bnkPercussion; + BanksDump::MidiBank &bnk = isPercussion ? bnkPercussion : bnkMelodic; const unsigned char *insdata = &data[size_t(offset2)]; const unsigned char *ops[4] = { insdata + 0, insdata + 6, insdata + 12, insdata + 18 }; -- cgit v1.2.3 From 068f54a35f704e8feb56849e9ac37dc981bf665f Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Tue, 2 Jul 2019 03:45:50 +0300 Subject: Draft for silent instrument detector Logically identify instruments which will result you a silence --- utils/gen_adldata/progs_cache.cpp | 110 ++++++++++++++++++++++++++++++++++++++ utils/gen_adldata/progs_cache.h | 4 +- 2 files changed, 113 insertions(+), 1 deletion(-) (limited to 'utils') diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index cb07092..60324f6 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -365,6 +365,116 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade std::fclose(out); } +bool BanksDump::isSilent(const BanksDump::Operator *ops, uint_fast16_t fbConn, size_t countOps, bool pseudo4op) +{ + // TODO: Implement this completely!!! + const uint_fast8_t conn1 = (fbConn) & 0x01; + const uint_fast8_t conn2 = (fbConn >> 8) & 0x01; + const uint_fast8_t egEn[4] = + { + static_cast(((ops[0].d_E862 & 0xFF) >> 5) & 0x01), + static_cast(((ops[1].d_E862 & 0xFF) >> 5) & 0x01), + static_cast(((ops[2].d_E862 & 0xFF) >> 5) & 0x01), + static_cast(((ops[3].d_E862 & 0xFF) >> 5) & 0x01) + }; + const uint_fast8_t attack[4] = + { + static_cast((((ops[0].d_E862 >> 8) & 0xFF) >> 4) & 0x0F), + static_cast((((ops[1].d_E862 >> 8) & 0xFF) >> 4) & 0x0F), + static_cast((((ops[2].d_E862 >> 8) & 0xFF) >> 4) & 0x0F), + static_cast((((ops[3].d_E862 >> 8) & 0xFF) >> 4) & 0x0F) + }; + const uint_fast8_t decay[4] = + { + static_cast((ops[0].d_E862 >> 8) & 0x0F), + static_cast((ops[1].d_E862 >> 8) & 0x0F), + static_cast((ops[2].d_E862 >> 8) & 0x0F), + static_cast((ops[3].d_E862 >> 8) & 0x0F) + }; + const uint_fast8_t sustain[4] = + { + static_cast((((ops[0].d_E862 >> 16) & 0xFF) >> 4) & 0x0F), + static_cast((((ops[1].d_E862 >> 16) & 0xFF) >> 4) & 0x0F), + static_cast((((ops[2].d_E862 >> 16) & 0xFF) >> 4) & 0x0F), + static_cast((((ops[3].d_E862 >> 16) & 0xFF) >> 4) & 0x0F) + }; + const uint_fast8_t level[4] = + { + static_cast(ops[0].d_40), + static_cast(ops[1].d_40), + static_cast(ops[2].d_40), + static_cast(ops[3].d_40) + }; + + // level=0x3f - silence + // attack=0x00 - silence + // attack=0x0F & sustain=0 & decay=0x0F & egOff - silence + + if(countOps == 2) + { + if(conn1 == 0) + { + if(level[1] == 0x3F) + return true; + if(attack[1] == 0x00) + return true; + if(attack[1] == 0x0F && sustain[1] == 0x00 && decay[1] == 0x0F && !egEn[1]) + return true; + } + if(conn1 == 1) + { + if(level[0] == 0x3F && level[1] == 0x3F) + return true; + if(attack[0] == 0x00 && attack[1] == 0x00) + return true; + if(attack[0] == 0x0F && sustain[0] == 0x00 && decay[0] == 0x0F && !egEn[0] && + attack[1] == 0x0F && sustain[1] == 0x00 && decay[1] == 0x0F && !egEn[1]) + return true; + } + } + else if(countOps == 4 && pseudo4op) + { + bool silent1 = false; + bool silent2 = false; + if(conn1 == 0 && (level[1] == 0x3F)) + silent1 = true; + if(conn1 == 1 && (level[0] == 0x3F) && (level[1] == 0x3F)) + silent1 = true; + if(conn2 == 0 && (level[3] == 0x3F)) + silent2 = true; + if(conn2 == 1 && (level[2] == 0x3F) && (level[3] == 0x3F)) + silent2 = true; + if(silent1 && silent2) + return true; + } + else if(countOps == 4 && !pseudo4op) + { + if(conn1 == 0 && conn1 == 0) // FM-FM [0, 0, 0, 1] + { + if(level[3] == 0x3F ) + return true; + } + + if(conn1 == 1 && conn1 == 0) // AM-FM [1, 0, 0, 1] + { + if(level[0] == 0x3F && level[3] == 0x3F) + return true; + } + if(conn1 == 0 && conn1 == 1) // FM-AM [0, 1, 0, 1] + { + if(level[1] == 0x3F && level[3] == 0x3F) + return true; + } + if(conn1 == 1 && conn1 == 1) // FM-AM [1, 0, 1, 1] + { + if(level[0] == 0x3F && level[2] == 0x3F && level[3] == 0x3F) + return true; + } + } + + return false; +} + void BanksDump::InstrumentEntry::setFbConn(uint_fast16_t fbConn1, uint_fast16_t fbConn2) { fbConn = (static_cast(fbConn1 & 0x0F)) | diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 34e42a3..239187b 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -357,7 +357,9 @@ struct BanksDump std::vector instruments; std::vector operators; - void toOps(const insdata &inData, Operator *outData, size_t begin = 0); + static void toOps(const insdata &inData, Operator *outData, size_t begin = 0); + //! WIP + static bool isSilent(const Operator *ops, uint_fast16_t fbConn, size_t countOps = 2, bool pseudo4op = false); size_t initBank(size_t bankId, const std::string &title, uint_fast16_t bankSetup); void addMidiBank(size_t bankId, bool percussion, MidiBank b); -- cgit v1.2.3 From bca3c8a1ef8f26ed44da8f37b93ebd360d52f378 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Tue, 2 Jul 2019 17:34:00 +0300 Subject: Bank names array for compatibility and less DB source file size Yes, the compatibility is needed... for public function that gives RO an access to that array. --- utils/gen_adldata/progs_cache.cpp | 47 +++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 12 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index 60324f6..9de0759 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -256,7 +256,7 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade for(const BankEntry &be : banks) { - std::fprintf(out, " {0x%04lX, %zu, %zu, \"%s\", ", + std::fprintf(out, "\t{0x%04lX, %zu, %zu, \"%s\", ", be.bankSetup, be.melodic.size(), be.percussion.size(), @@ -275,40 +275,63 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade std::fprintf(out, "};\n\n"); + std::fprintf(out, "const char* const g_embeddedBankNames[] =\n" + "{\n\t"); + { + bool commaNeeded = false; + size_t operatorEntryCounter = 0; + for(const BankEntry &be : banks) + { + if(commaNeeded) + std::fprintf(out, ", "); + else + commaNeeded = true; + operatorEntryCounter++; + if(operatorEntryCounter >= 25) + { + std::fprintf(out, "\n"); + operatorEntryCounter = 0; + } + if(operatorEntryCounter == 0) + std::fprintf(out, "\t"); + std::fprintf(out, "g_embeddedBanks[%zu].title", be.bankId); + } + } + std::fprintf(out, "\n};\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, ", "); + std::fprintf(out, ","); else commaNeeded = true; std::fprintf(out, "%zu", me); } } - 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, " { %u, %u, ", be.msb, be.lsb); + std::fprintf(out, "\t{%u,%u,", be.msb, be.lsb); std::fprintf(out, "{"); commaNeeded = false; for(size_t i = 0; i < 128; i++) { if(commaNeeded) - std::fprintf(out, ", "); + std::fprintf(out, ","); else commaNeeded = true; std::fprintf(out, "%ld", be.instruments[i]); } - std::fprintf(out, "} "); + std::fprintf(out, "}"); std::fprintf(out, "},\n"); } @@ -321,7 +344,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, " { %d, %d, %d, %u, %s%lX, %d, %s%lX, %s%lX, %s%lX, ", + std::fprintf(out, "\t{%d,%d,%d,%u,%s%lX,%d,%s%lX,%s%lX,%s%lX,", be.noteOffset1, be.noteOffset2, be.midiVelocityOffset, @@ -333,10 +356,10 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade (be.delay_off_ms == 0 ? "" : "0x"), be.delay_off_ms); if(opsCount == 4) - std::fprintf(out, "{%ld, %ld, %ld, %ld} ", + 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} ", + std::fprintf(out, "{%ld,%ld}", be.ops[0], be.ops[1]); std::fprintf(out, "},\n"); @@ -349,8 +372,8 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade for(const Operator &be : operators) { if(operatorEntryCounter == 0) - std::fprintf(out, " "); - std::fprintf(out, "{0x%07lX, %s%02lX},", + std::fprintf(out, "\t"); + std::fprintf(out, "{0x%07lX,%s%02lX},", be.d_E862, (be.d_40 == 0 ? "" : "0x"), be.d_40); operatorEntryCounter++; -- cgit v1.2.3 From d9ebc58d5c408331a5cdc8443fa849179eb272a6 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Tue, 2 Jul 2019 17:09:19 +0200 Subject: genadldata: fix invalid access in the AIL reader --- utils/gen_adldata/file_formats/load_ail.h | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_ail.h b/utils/gen_adldata/file_formats/load_ail.h index 13d5d84..286b665 100644 --- a/utils/gen_adldata/file_formats/load_ail.h +++ b/utils/gen_adldata/file_formats/load_ail.h @@ -116,16 +116,25 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, 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 + + uint8_t temp[11] = {0}; + if(o < data.size()) + { + size_t count = data.size() - o; + count = (count > sizeof(temp)) ? sizeof(temp) : count; + std::memcpy(temp, &data[o], count); + } + + tmp[i].data[0] = temp[0]; // 20 + tmp[i].data[8] = temp[1]; // 40 (vol) + tmp[i].data[2] = temp[2]; // 60 + tmp[i].data[4] = temp[3]; // 80 + tmp[i].data[6] = temp[4]; // E0 + tmp[i].data[1] = temp[6]; // 23 + tmp[i].data[9] = temp[7]; // 43 (vol) + tmp[i].data[3] = temp[8]; // 63 + tmp[i].data[5] = temp[9]; // 83 + tmp[i].data[7] = temp[10]; // E3 unsigned fb_c = data[offset + 3 + 5]; tmp[i].data[10] = uint8_t(fb_c); -- cgit v1.2.3 From a41963a48cfab8cfc5e949e4ff5628f0bf9aedba Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Tue, 2 Jul 2019 18:37:47 +0300 Subject: Simplify and automate preparation for deep-debug --- utils/gen_adldata/CMakeLists.txt | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/CMakeLists.txt b/utils/gen_adldata/CMakeLists.txt index 46c2525..5b7a18e 100644 --- a/utils/gen_adldata/CMakeLists.txt +++ b/utils/gen_adldata/CMakeLists.txt @@ -19,10 +19,21 @@ list(APPEND GEN_ADLDATA_SRC ini/ini_processing.cpp ) -#add_definitions(-DGEN_ADLDATA_DEEP_DEBUG) -#list(APPEND GEN_ADLDATA_SRC -# ../midiplay/wave_writer.c -#) +option(WITH_GENADLDATA_DEEPDEBUG "Enable deep debug mode of gen_adldata with dumping every voice into WAV file" OFF) +if(WITH_GENADLDATA_DEEPDEBUG) + add_definitions(-DGEN_ADLDATA_DEEP_DEBUG) + list(APPEND GEN_ADLDATA_SRC + ../midiplay/wave_writer.c + ) + file(GLOB WAV_FILES ${libADLMIDI_SOURCE_DIR}/fm_banks/_deep_debug/*.wav) + if(WAV_FILES) + file(REMOVE ${WAV_FILES}) + endif() + add_custom_target(gen_adldata_deepdebug_prepare ALL + COMMAND ${CMAKE_COMMAND} -E make_directory ${libADLMIDI_SOURCE_DIR}/fm_banks/_deep_debug + COMMAND ${CMAKE_COMMAND} -E remove ${libADLMIDI_SOURCE_DIR}/fm_banks/adldata-cache-x.dat + ) +endif() if(USE_DOSBOX_EMULATOR) set(HAS_EMULATOR TRUE) @@ -56,8 +67,12 @@ else() target_link_libraries(gen_adldata PRIVATE pthread m) endif() +if(WITH_GENADLDATA_DEEPDEBUG) + add_dependencies(gen_adldata gen_adldata_deepdebug_prepare) +endif() + option(WITH_GENADLDATA_PROGRESS "Enable progress printing in gen_adldata" OFF) -if(WITH_GENADLDATA_PROGRESS) +if(WITH_GENADLDATA_PROGRESS OR WITH_GENADLDATA_DEEPDEBUG) target_compile_options(gen_adldata PUBLIC "-DADL_GENDATA_PRINT_PROGRESS") endif() -- cgit v1.2.3 From bf9255e78e18675ab5ac3f4aa03fa55ebce92920 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Tue, 2 Jul 2019 19:49:43 +0300 Subject: Some work on old cache --- utils/gen_adldata/file_formats/load_ea.h | 2 +- utils/gen_adldata/measurer.cpp | 64 +++++++++++++++++++------------- utils/gen_adldata/progs_cache.cpp | 14 ++++++- utils/gen_adldata/progs_cache.h | 46 +++++++++++++++++++++-- 4 files changed, 94 insertions(+), 32 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_ea.h b/utils/gen_adldata/file_formats/load_ea.h index da7d0cc..7d15883 100644 --- a/utils/gen_adldata/file_formats/load_ea.h +++ b/utils/gen_adldata/file_formats/load_ea.h @@ -90,7 +90,7 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, tmp.data[6] = 0; // reg 0xE0: modulator, never seems to be set tmp.data[7] = 0; // reg 0xE0: carrier, never seems to be set - ins tmp2{}; + ins tmp2; tmp2.notenum = 0; tmp2.pseudo4op = false; tmp2.real4op = false; diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index fbae571..2deebc9 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -810,14 +810,29 @@ void MeasureThreaded::LoadCache(const char *fileName) if(std::fread(&inval, 1, sizeof(uint64_t), in) != sizeof(uint64_t)) break; inst.insno2 = inval; + if(std::fread(&inst.instCache1.data, 1, 11, in) != 11) + break; + if(std::fread(&inst.instCache1.finetune, 1, 1, in) != 1) + break; + if(std::fread(&inst.instCache1.diff, 1, sizeof(bool), in) != sizeof(bool)) + break; + if(std::fread(&inst.instCache2.data, 1, 11, in) != 11) + break; + if(std::fread(&inst.instCache2.finetune, 1, 1, in) != 1) + break; + if(std::fread(&inst.instCache2.diff, 1, sizeof(bool), in) != sizeof(bool)) + break; + if(std::fread(&inst.notenum, 1, 1, in) != 1) break; if(std::fread(&inst.real4op, 1, 1, in) != 1) break; if(std::fread(&inst.pseudo4op, 1, 1, in) != 1) break; - if(std::fread(&inst.voice2_fine_tune, sizeof(double), 1, in) != 1) + int64_t voice2detune = 0; + if(std::fread(&voice2detune, sizeof(int64_t), 1, in) != 1) break; + inst.voice2_fine_tune = static_cast(voice2detune) / 1000000.0; //Instrument data if(fread(found_f, 1, 2 * sizeof(bool), in) != sizeof(bool) * 2) @@ -896,18 +911,6 @@ void MeasureThreaded::LoadCache(const char *fileName) } //Duration data - if(std::fread(&info.peak_amplitude_time, 1, sizeof(uint64_t), in) != sizeof(uint64_t)) - break; - if(std::fread(&info.peak_amplitude_value, 1, sizeof(double), in) != sizeof(double)) - break; - if(std::fread(&info.quarter_amplitude_time, 1, sizeof(double), in) != sizeof(double)) - break; - if(std::fread(&info.begin_amplitude, 1, sizeof(double), in) != sizeof(double)) - break; - if(std::fread(&info.interval, 1, sizeof(double), in) != sizeof(double)) - break; - if(std::fread(&info.keyoff_out_time, 1, sizeof(double), in) != sizeof(double)) - break; if(std::fread(&info.ms_sound_kon, 1, sizeof(int64_t), in) != sizeof(int64_t)) break; if(std::fread(&info.ms_sound_koff, 1, sizeof(int64_t), in) != sizeof(int64_t)) @@ -941,10 +944,17 @@ void MeasureThreaded::SaveCache(const char *fileName) fwrite(&outval, 1, sizeof(uint64_t), out); outval = in.insno2; fwrite(&outval, 1, sizeof(uint64_t), out); + fwrite(&in.instCache1.data, 1, 11, out); + fwrite(&in.instCache1.finetune, 1, 1, out); + fwrite(&in.instCache1.diff, 1, sizeof(bool), out); + fwrite(&in.instCache2.data, 1, 11, out); + fwrite(&in.instCache2.finetune, 1, 1, out); + fwrite(&in.instCache2.diff, 1, sizeof(bool), out); fwrite(&in.notenum, 1, 1, out); fwrite(&in.real4op, 1, 1, out); fwrite(&in.pseudo4op, 1, 1, out); - fwrite(&in.voice2_fine_tune, sizeof(double), 1, out); + int64_t voice2detune = static_cast(in.voice2_fine_tune * 1000000.0); + fwrite(&voice2detune, sizeof(int64_t), 1, out); for(InstrumentDataTab::const_iterator j = insdatatab.begin(); j != insdatatab.end(); ++j) { @@ -970,12 +980,6 @@ void MeasureThreaded::SaveCache(const char *fileName) fwrite(&id[i].diff, 1, sizeof(bool), out); } - fwrite(&it->second.peak_amplitude_time, 1, sizeof(uint64_t), out); - fwrite(&it->second.peak_amplitude_value, 1, sizeof(double), out); - fwrite(&it->second.quarter_amplitude_time, 1, sizeof(double), out); - fwrite(&it->second.begin_amplitude, 1, sizeof(double), out); - fwrite(&it->second.interval, 1, sizeof(double), out); - fwrite(&it->second.keyoff_out_time, 1, sizeof(double), out); fwrite(&it->second.ms_sound_kon, 1, sizeof(int64_t), out); fwrite(&it->second.ms_sound_koff, 1, sizeof(int64_t), out); fwrite(&it->second.nosound, 1, sizeof(bool), out); @@ -1026,7 +1030,7 @@ void MeasureThreaded::LoadCacheX(const char *fileName) return; } - itemsCount = static_cast(toSint32LE(itemsCountA)); + itemsCount = static_cast(toUint32LE(itemsCountA)); while(!std::feof(in) && itemsCount > 0) { @@ -1240,8 +1244,12 @@ void MeasureThreaded::destData::callback(void *myself) static_cast(s->bd_ins->percussionKeyNumber), static_cast(s->bd_ins->instFlags), static_cast(s->bd_ins->secondVoiceDetune)}; + s->myself->m_durationInfo_mx.lock(); DurationInfoCacheX::iterator cachedEntry = s->myself->m_durationInfoX.find(ok); - if(cachedEntry != s->myself->m_durationInfoX.end()) + bool atEnd = cachedEntry == s->myself->m_durationInfoX.end(); + s->myself->m_durationInfo_mx.unlock(); + + if(!atEnd) { const DurationInfo &di = cachedEntry->second; s->bd_ins->delay_on_ms = di.ms_sound_kon; @@ -1258,17 +1266,21 @@ void MeasureThreaded::destData::callback(void *myself) } else { - DurationInfoCache::iterator cachedEntry = s->myself->m_durationInfo.find(s->i->first); + const ins &ok = s->i->first; + s->myself->m_durationInfo_mx.lock(); + DurationInfoCache::iterator cachedEntry = s->myself->m_durationInfo.find(ok); + bool atEnd = cachedEntry == s->myself->m_durationInfo.end(); + s->myself->m_durationInfo_mx.unlock(); - if(cachedEntry != s->myself->m_durationInfo.end()) + if(!atEnd) { s->myself->m_cache_matches++; goto endWork; } - info = MeasureDurations(s->i->first, &dosbox); + info = MeasureDurations(ok, &dosbox); s->myself->m_durationInfo_mx.lock(); - s->myself->m_durationInfo.insert({s->i->first, info}); + s->myself->m_durationInfo.insert({ok, info}); s->myself->m_durationInfo_mx.unlock(); } diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index 9de0759..2225f74 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -66,10 +66,14 @@ size_t InsertIns( } in.insno1 = insno; + in.instCache1 = id; } if(oneVoice || (id == id2)) + { in.insno2 = in.insno1; + in.instCache2 = in.instCache1; + } else { InstrumentDataTab::iterator i = insdatatab.lower_bound(id2); @@ -92,6 +96,7 @@ size_t InsertIns( insno2 = i->second.first; } in.insno2 = insno2; + in.instCache2 = id2; } { @@ -123,13 +128,18 @@ size_t InsertNoSoundIns() { // { 0x0F70700,0x0F70710, 0xFF,0xFF, 0x0,+0 }, insdata tmp1 = MakeNoSoundIns(); - struct ins tmp2 = { 0, 0, 0, false, false, 0u, 0.0, 0}; + struct ins tmp2; return InsertIns(tmp1, tmp1, tmp2, "nosound", ""); } insdata MakeNoSoundIns() { - return { {0x00, 0x10, 0x07, 0x07, 0xF7, 0xF7, 0x00, 0x00, 0xFF, 0xFF, 0x00}, 0, false}; + insdata nosnd; + uint8_t d[] = {0x00, 0x10, 0x07, 0x07, 0xF7, 0xF7, 0x00, 0x00, 0xFF, 0xFF, 0x00}; + std::memcpy(nosnd.data, d, 11); + nosnd.finetune = 0; + nosnd.diff = false; + return nosnd; } diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 239187b..0f25a5d 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -22,6 +22,18 @@ struct insdata uint8_t data[11]; int8_t finetune; bool diff; + explicit insdata() + { + std::memset(data, 0, 11); + finetune = 0; + diff = false; + } + insdata(const insdata &b) + { + std::memcpy(data, b.data, 11); + finetune = b.finetune; + diff = b.diff; + } bool operator==(const insdata &b) const { return (std::memcmp(data, b.data, 11) == 0) && (finetune == b.finetune) && (diff == b.diff); @@ -46,9 +58,9 @@ struct insdata inline bool equal_approx(double const a, double const b) { - double const epsilon(std::numeric_limits::epsilon() * 100); - double const scale(1.0); - return std::fabs(a - b) < epsilon * (scale + (std::max)(std::fabs(a), std::fabs(b))); + int_fast64_t ai = static_cast(a * 1000000.0); + int_fast64_t bi = static_cast(b * 1000000.0); + return ai == bi; } struct ins @@ -59,18 +71,44 @@ struct ins Flag_RM_Cymbal = 0x20, Flag_RM_HiHat = 0x28, Mask_RhythmMode = 0x38 }; size_t insno1, insno2; + insdata instCache1, instCache2; unsigned char notenum; bool pseudo4op; bool real4op; uint32_t rhythmModeDrum; double voice2_fine_tune; int8_t midi_velocity_offset; + explicit ins() : + insno1(0), + insno2(0), + notenum(0), + pseudo4op(false), + real4op(false), + rhythmModeDrum(false), + voice2_fine_tune(0.0), + midi_velocity_offset(0) + {} + + ins(const ins &o) : + insno1(o.insno1), + insno2(o.insno2), + instCache1(o.instCache1), + instCache2(o.instCache2), + notenum(o.notenum), + pseudo4op(o.pseudo4op), + real4op(o.real4op), + rhythmModeDrum(o.rhythmModeDrum), + voice2_fine_tune(o.voice2_fine_tune), + midi_velocity_offset(o.midi_velocity_offset) + {} bool operator==(const ins &b) const { return notenum == b.notenum && insno1 == b.insno1 && insno2 == b.insno2 + && instCache1 == b.instCache2 + && instCache2 == b.instCache2 && pseudo4op == b.pseudo4op && real4op == b.real4op && rhythmModeDrum == b.rhythmModeDrum @@ -81,6 +119,8 @@ struct ins { if(insno1 != b.insno1) return insno1 < b.insno1; if(insno2 != b.insno2) return insno2 < b.insno2; + if(instCache1 != b.instCache1) return instCache1 < b.instCache1; + if(instCache2 != b.instCache2) return instCache2 < b.instCache2; if(notenum != b.notenum) return notenum < b.notenum; if(pseudo4op != b.pseudo4op) return pseudo4op < b.pseudo4op; if(real4op != b.real4op) return real4op < b.real4op; -- cgit v1.2.3 From 06769afda989539d8b5b801edcd30a95ac8330ce Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Tue, 2 Jul 2019 19:58:32 +0300 Subject: Don't pass useless data to the chip --- utils/gen_adldata/measurer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 2deebc9..c8b4246 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -152,7 +152,7 @@ struct TinySynth void resetChip() { - static const short initdata[(2 + 3 + 2 + 2) * 2] = + static const short initdata[] = { 0x004, 96, 0x004, 128, // Pulse timer 0x105, 0, 0x105, 1, 0x105, 0, // Pulse OPL3 enable, leave disabled @@ -163,7 +163,7 @@ struct TinySynth for(size_t a = 0; a < 18; ++a) m_chip->writeReg(0xB0 + g_channelsMap[a], 0x00); - for(unsigned a = 0; a < 18; a += 2) + for(unsigned a = 0; a < sizeof(initdata) / sizeof(*initdata); a += 2) m_chip->writeReg((uint16_t)initdata[a], (uint8_t)initdata[a + 1]); } -- cgit v1.2.3 From 603dc987b719dc13c74b36db8661540b729c5a12 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Wed, 3 Jul 2019 04:21:38 +0300 Subject: Fix for 4op and pseudo4ops inside measurer's generator --- utils/gen_adldata/measurer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index c8b4246..caa81a9 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -266,9 +266,9 @@ struct TinySynth for(unsigned n = 0; n < m_notesNum; ++n) { static const uint8_t data[4] = {0x20, 0x60, 0x80, 0xE0}; - uint16_t o1 = g_operatorsMap[0]; - uint16_t o2 = g_operatorsMap[1]; size_t opOffset = (n * 2); + uint16_t o1 = g_operatorsMap[opOffset + 0]; + uint16_t o2 = g_operatorsMap[opOffset + 1]; uint_fast32_t x1 = ops[opOffset + 0].d_E862, y1 = ops[opOffset + 1].d_E862; uint_fast8_t x2 = ops[opOffset + 0].d_40, y2 = ops[opOffset + 1].d_40; uint_fast8_t fbConn = (ins.fbConn >> (n * 8)) & 0xFF; -- cgit v1.2.3 From ddeb2a43fd2bf7361f388b5bc6692b0efc46665c Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sun, 7 Jul 2019 03:10:16 +0300 Subject: Make using of WIP silence guesser It's incomplete, therefore fails a unit test on some cases and says false about some instruments --- utils/gen_adldata/measurer.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index caa81a9..33e9012 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -150,6 +150,8 @@ struct TinySynth int16_t m_noteOffsets[2]; unsigned m_x[2]; + bool m_isSilentGuess; + void resetChip() { static const short initdata[] = @@ -283,6 +285,7 @@ struct TinySynth m_chip->writeReg(0x40 + o2, y2 & 0xFF); } + m_isSilentGuess = BanksDump::isSilent(ops, ins.fbConn, opsNum, isPseudo4ops); // for(unsigned n = 0; n < m_notesNum; ++n) // { // static const unsigned char patchdata[11] = @@ -734,6 +737,11 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i db.instruments[ins.instId].delay_off_ms = result.ms_sound_koff; if(result.nosound) db.instruments[ins.instId].instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_IsBlank; +// { +// bool silent1 = result.nosound; +// bool silent2 = synth.m_isSilentGuess; +// assert(silent1 == silent2); +// } #ifdef GEN_ADLDATA_DEEP_DEBUG /***************DEBUG******************/ ctx_wave_close(waveCtx); -- cgit v1.2.3 From bfd932874f5e107eaf81c40b87d5c722170a5ace Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 8 Jul 2019 02:28:48 +0300 Subject: More accurate silence detector Now, there are very low level of error! The only one weird condition is still be there... --- utils/gen_adldata/file_formats/load_ail.h | 2 +- utils/gen_adldata/file_formats/load_bisqwit.h | 2 +- utils/gen_adldata/file_formats/load_bnk.h | 2 +- utils/gen_adldata/file_formats/load_bnk2.h | 4 +- utils/gen_adldata/file_formats/load_ea.h | 10 +- utils/gen_adldata/file_formats/load_ibk.h | 2 +- utils/gen_adldata/file_formats/load_jv.h | 2 +- utils/gen_adldata/file_formats/load_op2.h | 2 +- utils/gen_adldata/file_formats/load_tmb.h | 2 +- utils/gen_adldata/file_formats/load_wopl.h | 2 +- utils/gen_adldata/measurer.cpp | 31 ++++- utils/gen_adldata/progs_cache.cpp | 160 ++++++++++++++++---------- utils/gen_adldata/progs_cache.h | 6 +- 13 files changed, 141 insertions(+), 86 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_ail.h b/utils/gen_adldata/file_formats/load_ail.h index 286b665..a12789b 100644 --- a/utils/gen_adldata/file_formats/load_ail.h +++ b/utils/gen_adldata/file_formats/load_ail.h @@ -169,7 +169,7 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, unsigned fb_c = data[offset + 3 + 5]; inst.fbConn = (static_cast(fb_c & 0x0F)) | (static_cast((fb_c & 0x0E) | (fb_c >> 7)) << 8); - db.addInstrument(bnk, h.patch, inst, ops); + db.addInstrument(bnk, h.patch, inst, ops, fn); } } diff --git a/utils/gen_adldata/file_formats/load_bisqwit.h b/utils/gen_adldata/file_formats/load_bisqwit.h index 8ff91b1..7ea3a38 100644 --- a/utils/gen_adldata/file_formats/load_bisqwit.h +++ b/utils/gen_adldata/file_formats/load_bisqwit.h @@ -71,7 +71,7 @@ bool BankFormats::LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, cons inst.fbConn = uint_fast16_t(tmp[0].data[10]) | (uint_fast16_t(tmp[1].data[10]) << 8); inst.percussionKeyNumber = a >= 128 ? tmp2.notenum : 0; inst.noteOffset1 = a < 128 ? tmp2.notenum : 0; - db.addInstrument(bnk, patchId, inst, ops); + db.addInstrument(bnk, patchId, inst, ops, fn); } std::fclose(fp); diff --git a/utils/gen_adldata/file_formats/load_bnk.h b/utils/gen_adldata/file_formats/load_bnk.h index beb2bd5..9379de5 100644 --- a/utils/gen_adldata/file_formats/load_bnk.h +++ b/utils/gen_adldata/file_formats/load_bnk.h @@ -132,7 +132,7 @@ bool BankFormats::LoadBNK(BanksDump &db, const char *fn, unsigned bank, if(!is_fat) { SetBank(bank, (unsigned int)gmno, resno); - db.addInstrument(bnk, n & 127, inst, ops); + db.addInstrument(bnk, n & 127, inst, ops, fn); } else { diff --git a/utils/gen_adldata/file_formats/load_bnk2.h b/utils/gen_adldata/file_formats/load_bnk2.h index e977cd7..5468cb5 100644 --- a/utils/gen_adldata/file_formats/load_bnk2.h +++ b/utils/gen_adldata/file_formats/load_bnk2.h @@ -124,7 +124,7 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, SetBank(bank, (unsigned int)gmno, resno); inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op; - db.addInstrument(bnk, patchId, inst, opsD); + db.addInstrument(bnk, patchId, inst, opsD, fn); } else { @@ -132,7 +132,7 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, 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.addInstrument(bnk, patchId, inst, opsD, fn); } } diff --git a/utils/gen_adldata/file_formats/load_ea.h b/utils/gen_adldata/file_formats/load_ea.h index 7d15883..4b40b0f 100644 --- a/utils/gen_adldata/file_formats/load_ea.h +++ b/utils/gen_adldata/file_formats/load_ea.h @@ -113,14 +113,14 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2); SetBank(bank, gmno, resno); - db.addInstrument(bnkMelodic, gmno, inst, ops); + db.addInstrument(bnkMelodic, gmno, inst, ops, fn); 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); + db.addInstrument(bnkPercussion, 0x36, inst, ops, fn); } if(gmno == 18) @@ -128,7 +128,7 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, /*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); + db.addInstrument(bnkPercussion, 0x2A, inst, ops, fn); } if(gmno == 16) @@ -136,7 +136,7 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, /*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); + db.addInstrument(bnkPercussion, 0x24, inst, ops, fn); } if(gmno == 17) @@ -144,7 +144,7 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, /*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); + db.addInstrument(bnkPercussion, 0x26, inst, ops, fn); } } diff --git a/utils/gen_adldata/file_formats/load_ibk.h b/utils/gen_adldata/file_formats/load_ibk.h index 029d193..d4b54f6 100644 --- a/utils/gen_adldata/file_formats/load_ibk.h +++ b/utils/gen_adldata/file_formats/load_ibk.h @@ -115,7 +115,7 @@ bool BankFormats::LoadIBK(BanksDump &db, const char *fn, unsigned bank, 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.addInstrument(bnk, a, inst, ops, fn); } db.addMidiBank(bankDb, percussive, bnk); diff --git a/utils/gen_adldata/file_formats/load_jv.h b/utils/gen_adldata/file_formats/load_jv.h index ef36f76..bb4fbdb 100644 --- a/utils/gen_adldata/file_formats/load_jv.h +++ b/utils/gen_adldata/file_formats/load_jv.h @@ -117,7 +117,7 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); SetBank(bank, gmno, resno); } - db.addInstrument(bnk, patchId, inst, ops); + db.addInstrument(bnk, patchId, inst, ops, fn); } db.addMidiBank(bankDb, false, bnkMelodique); diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h index 6599a9f..e31a803 100644 --- a/utils/gen_adldata/file_formats/load_op2.h +++ b/utils/gen_adldata/file_formats/load_op2.h @@ -155,7 +155,7 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s SetBank(bank, (unsigned int)gmno, resno); } - db.addInstrument(bnk, patchId, inst, ops); + db.addInstrument(bnk, patchId, inst, ops, fn); /*const Doom_OPL2instrument& A = ins.patchdata[0]; const Doom_OPL2instrument& B = ins.patchdata[1]; diff --git a/utils/gen_adldata/file_formats/load_tmb.h b/utils/gen_adldata/file_formats/load_tmb.h index 66ced30..d9d57dd 100644 --- a/utils/gen_adldata/file_formats/load_tmb.h +++ b/utils/gen_adldata/file_formats/load_tmb.h @@ -80,7 +80,7 @@ bool BankFormats::LoadTMB(BanksDump &db, const char *fn, unsigned bank, const st size_t resno = InsertIns(tmp, tmp2, name, name2); SetBank(bank, gmno, resno); - db.addInstrument(bnk, patchId, inst, ops); + db.addInstrument(bnk, patchId, inst, ops, fn); } db.addMidiBank(bankDb, false, bnkMelodique); diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h index 0db911c..047ed7b 100644 --- a/utils/gen_adldata/file_formats/load_wopl.h +++ b/utils/gen_adldata/file_formats/load_wopl.h @@ -271,7 +271,7 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s SetBank(bank, gmno, resno); } } - db.addInstrument(bnk, i, inst, ops); + db.addInstrument(bnk, i, inst, ops, fn); } db.addMidiBank(bankDb, is_percussion, bnk); } diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 33e9012..4e47723 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -285,7 +285,6 @@ struct TinySynth m_chip->writeReg(0x40 + o2, y2 & 0xFF); } - m_isSilentGuess = BanksDump::isSilent(ops, ins.fbConn, opsNum, isPseudo4ops); // for(unsigned n = 0; n < m_notesNum; ++n) // { // static const unsigned char patchdata[11] = @@ -737,16 +736,36 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i db.instruments[ins.instId].delay_off_ms = result.ms_sound_koff; if(result.nosound) db.instruments[ins.instId].instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_IsBlank; -// { -// bool silent1 = result.nosound; -// bool silent2 = synth.m_isSilentGuess; -// assert(silent1 == silent2); -// } + #ifdef GEN_ADLDATA_DEEP_DEBUG /***************DEBUG******************/ ctx_wave_close(waveCtx); /***************DEBUG******************/ #endif + { + bool silent1 = result.nosound; + bool silent2 = BanksDump::isSilent(db, ins); + if(silent1 != silent2) + { + std::fprintf(stdout, + "\n\n%04lu - %s AN=%u NN=%u -- con1=%lu, con2=%lu\n%s computed - %s actual (%g peak)\n\n", + ins.instId, synth.m_isPseudo4op ? "pseudo4op" : + synth.m_isReal4op ? "4op" : "2op", + synth.m_actualNotesNum, + synth.m_notesNum, + (ins.fbConn) & 0x01, + (ins.fbConn >> 8) & 0x01, + silent2 ? "silent" : "sound", + silent1 ? "silent" : "sound", + peak_amplitude_value); + for(auto &sss : ins.instMetas) + std::fprintf(stdout, "%s\n", sss.c_str()); + BanksDump::isSilent(db, ins, true); + std::fprintf(stdout, "\n\n"); + std::fflush(stdout); + assert(silent1 == silent2); + } + } return result; } diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index 2225f74..d4ba10e 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -204,7 +204,10 @@ void BanksDump::addMidiBank(size_t bankId, bool percussion, BanksDump::MidiBank be.melodic.push_back(b.midiBankId); } -void BanksDump::addInstrument(BanksDump::MidiBank &bank, size_t patchId, BanksDump::InstrumentEntry e, BanksDump::Operator *ops) +void BanksDump::addInstrument(BanksDump::MidiBank &bank, size_t patchId, + BanksDump::InstrumentEntry e, + BanksDump::Operator *ops, + const std::string &meta) { assert(patchId < 128); size_t opsCount = ((e.instFlags & InstrumentEntry::WOPL_Ins_4op) != 0 || @@ -237,11 +240,14 @@ void BanksDump::addInstrument(BanksDump::MidiBank &bank, size_t patchId, BanksDu if(it == instruments.end()) { e.instId = instruments.size(); + e.instMetas.push_back(meta + "_" + std::to_string(patchId)); instruments.push_back(e); } else { e.instId = it->instId; + e.instMetas.push_back(meta + "_" + std::to_string(patchId)); + it->instMetas.push_back(meta + "_" + std::to_string(patchId)); } bank.instruments[patchId] = static_cast(e.instId); } @@ -398,70 +404,98 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade std::fclose(out); } -bool BanksDump::isSilent(const BanksDump::Operator *ops, uint_fast16_t fbConn, size_t countOps, bool pseudo4op) +struct OpCheckData { - // TODO: Implement this completely!!! - const uint_fast8_t conn1 = (fbConn) & 0x01; - const uint_fast8_t conn2 = (fbConn >> 8) & 0x01; - const uint_fast8_t egEn[4] = - { - static_cast(((ops[0].d_E862 & 0xFF) >> 5) & 0x01), - static_cast(((ops[1].d_E862 & 0xFF) >> 5) & 0x01), - static_cast(((ops[2].d_E862 & 0xFF) >> 5) & 0x01), - static_cast(((ops[3].d_E862 & 0xFF) >> 5) & 0x01) - }; - const uint_fast8_t attack[4] = + uint_fast8_t egEn; + uint_fast8_t attack; + uint_fast8_t decay; + uint_fast8_t sustain; + uint_fast8_t release; + uint_fast8_t level; + + void setData(uint_fast32_t d_E862, uint_fast32_t d_40) { - static_cast((((ops[0].d_E862 >> 8) & 0xFF) >> 4) & 0x0F), - static_cast((((ops[1].d_E862 >> 8) & 0xFF) >> 4) & 0x0F), - static_cast((((ops[2].d_E862 >> 8) & 0xFF) >> 4) & 0x0F), - static_cast((((ops[3].d_E862 >> 8) & 0xFF) >> 4) & 0x0F) - }; - const uint_fast8_t decay[4] = - { - static_cast((ops[0].d_E862 >> 8) & 0x0F), - static_cast((ops[1].d_E862 >> 8) & 0x0F), - static_cast((ops[2].d_E862 >> 8) & 0x0F), - static_cast((ops[3].d_E862 >> 8) & 0x0F) - }; - const uint_fast8_t sustain[4] = + egEn = static_cast(((d_E862 & 0xFF) >> 5) & 0x01); + decay = static_cast((d_E862 >> 8) & 0x0F); + attack = static_cast((d_E862 >> 12) & 0x0F); + release = static_cast((d_E862 >> 16) & 0x0F); + sustain = static_cast((d_E862 >> 20) & 0x0F); + level = static_cast(d_40); + } + + bool isOpSilent(bool moreInfo) { - static_cast((((ops[0].d_E862 >> 16) & 0xFF) >> 4) & 0x0F), - static_cast((((ops[1].d_E862 >> 16) & 0xFF) >> 4) & 0x0F), - static_cast((((ops[2].d_E862 >> 16) & 0xFF) >> 4) & 0x0F), - static_cast((((ops[3].d_E862 >> 16) & 0xFF) >> 4) & 0x0F) - }; - const uint_fast8_t level[4] = + // level=0x3f - silence + // attack=0x00 - silence + // attack=0x0F & sustain=0x0F & decay=0x0F - silence + // attack=0x0F & decay=0x0F & release=0x00 & egOff - silence + if(level == 0x3F) + { + if(moreInfo) + std::fprintf(stdout, "== volume=0x3F ==\n"); + return true; + } + if(attack == 0x00) + { + if(moreInfo) + std::fprintf(stdout, "== attack=0x00 ==\n"); + return true; + } + if(attack == 0x0F && sustain == 0x0F && decay == 0x0F) + { + if(moreInfo) + std::fprintf(stdout, "== attack=0x0F, sustain=0x0F, decay=0x0F ==\n"); + return true; + } + if(attack == 0x0F && decay == 0x0F && release == 0x00 && !egEn) + { + if(moreInfo) + std::fprintf(stdout, "== attack=0x0F, decay=0x0F, release=0x00, !egEn ==\n"); + return true; + } + return false; + } +}; + +bool BanksDump::isSilent(const BanksDump &db, const BanksDump::InstrumentEntry &ins, bool moreInfo) +{ + bool isPseudo4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op) != 0); + bool is4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_4op) != 0) && !isPseudo4ops; + size_t opsNum = (is4ops || isPseudo4ops) ? 4 : 2; + BanksDump::Operator ops[4]; + assert(ins.ops[0] >= 0); + assert(ins.ops[1] >= 0); + ops[0] = db.operators[ins.ops[0]]; + ops[1] = db.operators[ins.ops[1]]; + if(opsNum > 2) { - static_cast(ops[0].d_40), - static_cast(ops[1].d_40), - static_cast(ops[2].d_40), - static_cast(ops[3].d_40) - }; + assert(ins.ops[2] >= 0); + assert(ins.ops[3] >= 0); + ops[2] = db.operators[ins.ops[2]]; + ops[3] = db.operators[ins.ops[3]]; + } + return isSilent(ops, ins.fbConn, opsNum, isPseudo4ops, moreInfo); +} - // level=0x3f - silence - // attack=0x00 - silence - // attack=0x0F & sustain=0 & decay=0x0F & egOff - silence +bool BanksDump::isSilent(const BanksDump::Operator *ops, uint_fast16_t fbConn, size_t countOps, bool pseudo4op, bool moreInfo) +{ + // TODO: Implement this completely!!! + const uint_fast8_t conn1 = (fbConn) & 0x01; + const uint_fast8_t conn2 = (fbConn >> 8) & 0x01; + OpCheckData opd[4]; + for(size_t i = 0; i < 4; i++) + opd[i].setData(ops[i].d_E862, ops[i].d_40); if(countOps == 2) { if(conn1 == 0) { - if(level[1] == 0x3F) - return true; - if(attack[1] == 0x00) - return true; - if(attack[1] == 0x0F && sustain[1] == 0x00 && decay[1] == 0x0F && !egEn[1]) + if(opd[1].isOpSilent(moreInfo)) return true; } if(conn1 == 1) { - if(level[0] == 0x3F && level[1] == 0x3F) - return true; - if(attack[0] == 0x00 && attack[1] == 0x00) - return true; - if(attack[0] == 0x0F && sustain[0] == 0x00 && decay[0] == 0x0F && !egEn[0] && - attack[1] == 0x0F && sustain[1] == 0x00 && decay[1] == 0x0F && !egEn[1]) + if(opd[0].isOpSilent(moreInfo) && opd[1].isOpSilent(moreInfo)) return true; } } @@ -469,38 +503,38 @@ bool BanksDump::isSilent(const BanksDump::Operator *ops, uint_fast16_t fbConn, s { bool silent1 = false; bool silent2 = false; - if(conn1 == 0 && (level[1] == 0x3F)) + if(conn1 == 0 && opd[1].isOpSilent(moreInfo)) silent1 = true; - if(conn1 == 1 && (level[0] == 0x3F) && (level[1] == 0x3F)) + if(conn1 == 1 && opd[0].isOpSilent(moreInfo) && opd[1].isOpSilent(moreInfo)) silent1 = true; - if(conn2 == 0 && (level[3] == 0x3F)) + if(conn2 == 0 && opd[3].isOpSilent(moreInfo)) silent2 = true; - if(conn2 == 1 && (level[2] == 0x3F) && (level[3] == 0x3F)) + if(conn2 == 1 && opd[2].isOpSilent(moreInfo) && opd[3].isOpSilent(moreInfo)) silent2 = true; if(silent1 && silent2) return true; } else if(countOps == 4 && !pseudo4op) { - if(conn1 == 0 && conn1 == 0) // FM-FM [0, 0, 0, 1] + if(conn1 == 0 && conn2 == 0) // FM-FM [0, 0, 0, 1] { - if(level[3] == 0x3F ) + if(opd[3].isOpSilent(moreInfo)) return true; } - if(conn1 == 1 && conn1 == 0) // AM-FM [1, 0, 0, 1] + if(conn1 == 1 && conn2 == 0) // AM-FM [1, 0, 0, 1] { - if(level[0] == 0x3F && level[3] == 0x3F) + if(opd[0].isOpSilent(moreInfo) && opd[3].isOpSilent(moreInfo)) return true; } - if(conn1 == 0 && conn1 == 1) // FM-AM [0, 1, 0, 1] + if(conn1 == 0 && conn2 == 1) // FM-AM [0, 1, 0, 1] { - if(level[1] == 0x3F && level[3] == 0x3F) + if(opd[1].isOpSilent(moreInfo) && opd[3].isOpSilent(moreInfo)) return true; } - if(conn1 == 1 && conn1 == 1) // FM-AM [1, 0, 1, 1] + if(conn1 == 1 && conn2 == 1) // FM-AM [1, 0, 1, 1] { - if(level[0] == 0x3F && level[2] == 0x3F && level[3] == 0x3F) + if(opd[0].isOpSilent(moreInfo) && opd[2].isOpSilent(moreInfo) && opd[3].isOpSilent(moreInfo)) return true; } } diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 0f25a5d..195c5f1 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -297,6 +297,7 @@ struct BanksDump struct InstrumentEntry { uint_fast32_t instId = 0; + std::vector instMetas; typedef enum WOPL_InstrumentFlags { @@ -399,11 +400,12 @@ struct BanksDump static void toOps(const insdata &inData, Operator *outData, size_t begin = 0); //! WIP - static bool isSilent(const Operator *ops, uint_fast16_t fbConn, size_t countOps = 2, bool pseudo4op = false); + static bool isSilent(const BanksDump &db, const BanksDump::InstrumentEntry &ins, bool moreInfo = false); + static bool isSilent(const Operator *ops, uint_fast16_t fbConn, size_t countOps = 2, bool pseudo4op = false, bool moreInfo = false); size_t initBank(size_t bankId, const std::string &title, uint_fast16_t bankSetup); void addMidiBank(size_t bankId, bool percussion, MidiBank b); - void addInstrument(MidiBank &bank, size_t patchId, InstrumentEntry e, Operator *ops); + void addInstrument(MidiBank &bank, size_t patchId, InstrumentEntry e, Operator *ops, const std::string &meta = std::string()); void exportBanks(const std::string &outPath, const std::string &headerName = "adlmidi_db.h"); }; -- cgit v1.2.3 From 9cf0445116c8e69dc3d4c2768af74af9281914d1 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 8 Jul 2019 03:13:54 +0300 Subject: Minor fixes Looks like need to correct 4-op sounding, looks like it really silent inside measurer when it must give an actual sound! --- utils/gen_adldata/measurer.cpp | 11 +++++++---- utils/gen_adldata/progs_cache.cpp | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 4e47723..9dd5e68 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -253,7 +253,7 @@ struct TinySynth m_noteOffsets[1] = ins.noteOffset2; if(isPseudo4ops) m_voice1Detune = ins.secondVoiceDetune; - m_chip->writeReg(0x104, is4ops ? (1 << 6) - 1 : 0x00); + m_chip->writeReg(0x104, is4ops ? 0x3F : 0x00); //For cleaner measurement, disable tremolo and vibrato ops[0].d_E862 &= 0xFFFFFF3F; @@ -730,7 +730,7 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i result.ms_sound_kon = (int64_t)(quarter_amplitude_time * 1000.0 / interval); result.ms_sound_koff = (int64_t)(keyoff_out_time * 1000.0 / interval); - result.nosound = (peak_amplitude_value < 0.5) || ((sound_min >= -1) && (sound_max <= 1)); + result.nosound = (peak_amplitude_value < 0.5) || ((sound_min >= -19) && (sound_max <= 18)); db.instruments[ins.instId].delay_on_ms = result.ms_sound_kon; db.instruments[ins.instId].delay_off_ms = result.ms_sound_koff; @@ -748,7 +748,7 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i if(silent1 != silent2) { std::fprintf(stdout, - "\n\n%04lu - %s AN=%u NN=%u -- con1=%lu, con2=%lu\n%s computed - %s actual (%g peak)\n\n", + "\n\n%04lu - %s AN=%u NN=%u -- con1=%lu, con2=%lu\n%s computed - %s actual (%g peak, %d<%d)\n\n", ins.instId, synth.m_isPseudo4op ? "pseudo4op" : synth.m_isReal4op ? "4op" : "2op", synth.m_actualNotesNum, @@ -757,13 +757,16 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i (ins.fbConn >> 8) & 0x01, silent2 ? "silent" : "sound", silent1 ? "silent" : "sound", - peak_amplitude_value); + peak_amplitude_value, + sound_min, + sound_max); for(auto &sss : ins.instMetas) std::fprintf(stdout, "%s\n", sss.c_str()); BanksDump::isSilent(db, ins, true); std::fprintf(stdout, "\n\n"); std::fflush(stdout); assert(silent1 == silent2); + exit(1); } } diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index d4ba10e..0e087d3 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -420,7 +420,7 @@ struct OpCheckData attack = static_cast((d_E862 >> 12) & 0x0F); release = static_cast((d_E862 >> 16) & 0x0F); sustain = static_cast((d_E862 >> 20) & 0x0F); - level = static_cast(d_40); + level = static_cast(d_40 & 0x3F); } bool isOpSilent(bool moreInfo) -- cgit v1.2.3 From 70523bb770f6e74140d2307f6f581558cac00304 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sun, 14 Jul 2019 18:53:13 +0300 Subject: Add NULL entry into end of bank names list --- utils/gen_adldata/progs_cache.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'utils') diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index 0e087d3..6dcfc25 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -312,6 +312,7 @@ void BanksDump::exportBanks(const std::string &outPath, const std::string &heade std::fprintf(out, "\t"); std::fprintf(out, "g_embeddedBanks[%zu].title", be.bankId); } + std::fprintf(out, ",\n\tNULL"); // Make a null entry as finalizer } std::fprintf(out, "\n};\n\n"); -- cgit v1.2.3 From e81457552b255e1baf35ea04d6a8dc35f08ad919 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sun, 14 Jul 2019 23:42:08 +0300 Subject: Completely fixed the trouble of measurer! - DosBox works fine and produces correct sound - 4op voices are now working! --- utils/gen_adldata/measurer.cpp | 60 +++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 33 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 9dd5e68..f7b5bd3 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -152,21 +152,26 @@ struct TinySynth bool m_isSilentGuess; + void writeReg(uint16_t addr, uint8_t data) + { + m_chip->writeReg(addr, data); + } + void resetChip() { static const short initdata[] = { - 0x004, 96, 0x004, 128, // Pulse timer - 0x105, 0, 0x105, 1, 0x105, 0, // Pulse OPL3 enable, leave disabled - 0x001, 32, 0x0BD, 0 // Enable wave & melodic + 0x004, 96, 0x004, 128, // Pulse timer + 0x105, 0, 0x105, 1, 0x105, 0, // Pulse OPL3 enable + 0x001, 32, 0x105, 1 // Enable wave, OPL3 extensions }; m_chip->setRate(g_outputRate); for(size_t a = 0; a < 18; ++a) - m_chip->writeReg(0xB0 + g_channelsMap[a], 0x00); - for(unsigned a = 0; a < sizeof(initdata) / sizeof(*initdata); a += 2) - m_chip->writeReg((uint16_t)initdata[a], (uint8_t)initdata[a + 1]); + writeReg(0xB0 + g_channelsMap[a], 0x00); + for(unsigned a = 0; a < 14; a += 2) + writeReg((uint16_t)initdata[a], (uint8_t)initdata[a + 1]); } void setInstrument(const ins &in) @@ -204,7 +209,7 @@ struct TinySynth m_noteOffsets[1] = rawData[1].finetune; if(in.pseudo4op) m_voice1Detune = in.voice2_fine_tune; - m_chip->writeReg(0x104, in.real4op ? (1 << 6) - 1 : 0x00); + writeReg(0x104, in.real4op ? (1 << 6) - 1 : 0x00); //For cleaner measurement, disable tremolo and vibrato rawData[0].data[0] &= 0x3F; @@ -217,8 +222,8 @@ struct TinySynth static const unsigned char patchdata[11] = {0x20, 0x23, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0x40, 0x43, 0xC0}; for(unsigned a = 0; a < 10; ++a) - m_chip->writeReg(patchdata[a] + n * 8, rawData[n].data[a]); - m_chip->writeReg(patchdata[10] + n * 8, rawData[n].data[10] | 0x30); + writeReg(patchdata[a] + n * 8, rawData[n].data[a]); + writeReg(patchdata[10] + n * 8, rawData[n].data[10] | 0x30); } } @@ -253,46 +258,35 @@ struct TinySynth m_noteOffsets[1] = ins.noteOffset2; if(isPseudo4ops) m_voice1Detune = ins.secondVoiceDetune; - m_chip->writeReg(0x104, is4ops ? 0x3F : 0x00); + writeReg(0x104, m_isReal4op ? 0x3F : 0x00); //For cleaner measurement, disable tremolo and vibrato ops[0].d_E862 &= 0xFFFFFF3F; ops[1].d_E862 &= 0xFFFFFF3F; ops[2].d_E862 &= 0xFFFFFF3F; ops[3].d_E862 &= 0xFFFFFF3F; -// rawData[0].data[0] &= 0x3F; -// rawData[0].data[1] &= 0x3F; -// rawData[1].data[0] &= 0x3F; -// rawData[1].data[1] &= 0x3F; for(unsigned n = 0; n < m_notesNum; ++n) { static const uint8_t data[4] = {0x20, 0x60, 0x80, 0xE0}; size_t opOffset = (n * 2); - uint16_t o1 = g_operatorsMap[opOffset + 0]; - uint16_t o2 = g_operatorsMap[opOffset + 1]; + size_t opMapOffset = m_isReal4op ? (n * 6) : opOffset; + uint16_t op1off = g_operatorsMap[opMapOffset + 0]; + uint16_t op2off = g_operatorsMap[opMapOffset + 1]; uint_fast32_t x1 = ops[opOffset + 0].d_E862, y1 = ops[opOffset + 1].d_E862; uint_fast8_t x2 = ops[opOffset + 0].d_40, y2 = ops[opOffset + 1].d_40; uint_fast8_t fbConn = (ins.fbConn >> (n * 8)) & 0xFF; for(size_t a = 0; a < 4; ++a, x1 >>= 8, y1 >>= 8) { - m_chip->writeReg(data[a] + o1, x1 & 0xFF); - m_chip->writeReg(data[a] + o2, y1 & 0xFF); + writeReg(data[a] + op1off, x1 & 0xFF); + writeReg(data[a] + op2off, y1 & 0xFF); } - m_chip->writeReg(0xC0 + (n * 8), fbConn | 0x30); - m_chip->writeReg(0x40 + o1, x2 & 0xFF); - m_chip->writeReg(0x40 + o2, y2 & 0xFF); - } + writeReg(0xC0 + g_channelsMap[m_isReal4op ? (n * 3) : n], fbConn | 0x30); -// for(unsigned n = 0; n < m_notesNum; ++n) -// { -// static const unsigned char patchdata[11] = -// {0x20, 0x23, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0x40, 0x43, 0xC0}; -// for(unsigned a = 0; a < 10; ++a) -// m_chip->writeReg(patchdata[a] + n * 8, rawData[n].data[a]); -// m_chip->writeReg(patchdata[10] + n * 8, rawData[n].data[10] | 0x30); -// } + writeReg(0x40 + op1off, x2 & 0xFF); + writeReg(0x40 + op2off, y2 & 0xFF); + } } void noteOn() @@ -317,8 +311,8 @@ struct TinySynth m_x[n] += (unsigned int)(hertz + 0.5); // Keyon the note - m_chip->writeReg(0xA0 + (n * 3), m_x[n] & 0xFF); - m_chip->writeReg(0xB0 + (n * 3), (m_x[n] >> 8) & 0xFF); + writeReg(0xA0 + g_channelsMap[n], m_x[n] & 0xFF); + writeReg(0xB0 + g_channelsMap[n], (m_x[n] >> 8) & 0xFF); } } @@ -326,7 +320,7 @@ struct TinySynth { // Keyoff the note for(unsigned n = 0; n < m_actualNotesNum; ++n) - m_chip->writeReg(0xB0 + (n * 3), (m_x[n] >> 8) & 0xDF); + writeReg(0xB0 + g_channelsMap[n], (m_x[n] >> 8) & 0xDF); } void generate(int16_t *output, size_t frames) -- cgit v1.2.3 From 1529bbea9b3003bfb25853660cfa5db091fd7646 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 15 Jul 2019 00:32:06 +0300 Subject: Another fix of measurer --- utils/gen_adldata/measurer.cpp | 4 ++-- utils/gen_adldata/progs_cache.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index f7b5bd3..4ef615e 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -759,8 +759,8 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i BanksDump::isSilent(db, ins, true); std::fprintf(stdout, "\n\n"); std::fflush(stdout); - assert(silent1 == silent2); - exit(1); +// assert(silent1 == silent2); +// exit(1); } } diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index 6dcfc25..fa67da3 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -428,8 +428,8 @@ struct OpCheckData { // level=0x3f - silence // attack=0x00 - silence - // attack=0x0F & sustain=0x0F & decay=0x0F - silence - // attack=0x0F & decay=0x0F & release=0x00 & egOff - silence + // attack=0x0F & sustain=0x0F & decay=0x0F - half-silence + // attack=0x0F & decay=0x0F & release=0x00 & egOff - half-silence if(level == 0x3F) { if(moreInfo) -- cgit v1.2.3 From c8953f4fb0d4a39accf99f67baecd569670f8e6f Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 15 Jul 2019 01:03:54 +0300 Subject: Don't measure rhythm-mode drums. Yet. --- utils/gen_adldata/measurer.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 4ef615e..e39512d 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -145,6 +145,7 @@ struct TinySynth unsigned m_actualNotesNum; bool m_isReal4op; bool m_isPseudo4op; + bool m_isRhythmMode; int m_playNoteNum; int8_t m_voice1Detune; int16_t m_noteOffsets[2]; @@ -197,6 +198,7 @@ struct TinySynth } std::memset(m_x, 0, sizeof(m_x)); + m_isRhythmMode = false; m_playNoteNum = in.notenum >= 128 ? (in.notenum - 128) : in.notenum; m_isReal4op = in.real4op && !in.pseudo4op; m_isPseudo4op = in.pseudo4op; @@ -231,6 +233,7 @@ struct TinySynth { bool isPseudo4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op) != 0); bool is4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_4op) != 0) && !isPseudo4ops; + m_isRhythmMode = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_RhythmModeMask) != 0); size_t opsNum = (is4ops || isPseudo4ops) ? 4 : 2; BanksDump::Operator ops[4]; assert(ins.ops[0] >= 0); @@ -541,6 +544,18 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i synth.setInstrument(db, ins); synth.noteOn(); + if(synth.m_isRhythmMode) // Skip rhythm-mode check + { + DurationInfo result; + std::memset(&result, 0, sizeof(DurationInfo)); + result.ms_sound_kon = 1000; + result.ms_sound_koff = 10; + result.nosound = false; + db.instruments[ins.instId].delay_on_ms = result.ms_sound_kon; + db.instruments[ins.instId].delay_off_ms = result.ms_sound_koff; + return result; + } + #ifdef GEN_ADLDATA_DEEP_DEBUG /*****************DEBUG******************/ char waveFileOut[80] = ""; -- cgit v1.2.3 From 8bc7650ee883b6f24cbebf40c4d2b007b0ed6255 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 15 Jul 2019 01:16:49 +0300 Subject: Put back 25'th note for measurement --- utils/gen_adldata/measurer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index e39512d..4663072 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -253,7 +253,7 @@ struct TinySynth m_isReal4op = is4ops; m_isPseudo4op = isPseudo4ops; if(m_playNoteNum == 0) - m_playNoteNum = 60; + m_playNoteNum = 25;//60; m_notesNum = opsNum / 2; m_actualNotesNum = (m_isReal4op ? 1 : m_notesNum); m_voice1Detune = 0; -- cgit v1.2.3 From 2ba770631ff1dc978d16a874a4ab99930ce12d2d Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Wed, 19 Aug 2020 02:11:01 +0300 Subject: Use new banks database format However, it's stil need to clean-up and fix gen_adldata for a correct work! --- utils/gen_adldata/gen_adldata.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'utils') diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index 2b94ab6..35967b2 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -575,7 +575,8 @@ int main(int argc, char**argv) measureCounter.waitAll(); measureCounter.SaveCacheX("fm_banks/adldata-cache-x.dat"); } - db.exportBanks(std::string(outFile_s) + "x"); + + db.exportBanks(std::string(outFile_s)); std::printf("Generation of ADLMIDI data has been completed!\n"); std::fflush(stdout); -- cgit v1.2.3 From e4db1c263355202a9cb033f9e07d42c31e3ff4a5 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Thu, 20 Aug 2020 00:01:06 +0300 Subject: gen_adldata: First step of old code clean-up Verify that all code here is in safe --- utils/gen_adldata/file_formats/load_ail.h | 36 ++-- utils/gen_adldata/file_formats/load_bisqwit.h | 16 +- utils/gen_adldata/file_formats/load_bnk.h | 20 +-- utils/gen_adldata/file_formats/load_bnk2.h | 20 +-- utils/gen_adldata/file_formats/load_ea.h | 32 ++-- utils/gen_adldata/file_formats/load_ibk.h | 18 +- utils/gen_adldata/file_formats/load_jv.h | 20 +-- utils/gen_adldata/file_formats/load_op2.h | 20 +-- utils/gen_adldata/file_formats/load_tmb.h | 16 +- utils/gen_adldata/file_formats/load_wopl.h | 38 ++--- utils/gen_adldata/gen_adldata.cc | 151 +++++------------ utils/gen_adldata/measurer.cpp | 116 +++++++------ utils/gen_adldata/measurer.h | 6 + utils/gen_adldata/progs_cache.cpp | 230 +++++++++++++------------- utils/gen_adldata/progs_cache.h | 52 +++--- 15 files changed, 365 insertions(+), 426 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_ail.h b/utils/gen_adldata/file_formats/load_ail.h index a12789b..abeda95 100644 --- a/utils/gen_adldata/file_formats/load_ail.h +++ b/utils/gen_adldata/file_formats/load_ail.h @@ -89,10 +89,10 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, BanksDump::MidiBank &bnk = isPerc ? bnkPercussion : bnkMelodic[h.bank]; int gmno = isPerc ? int(h.patch + 0x80) : int(h.patch); - int midi_index = gmno < 128 ? gmno - : gmno < 128 + 35 ? -1 - : gmno < 128 + 88 ? gmno - 35 - : -1; +// 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]); @@ -107,7 +107,7 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, insdata tmp[200]; const unsigned inscount = (length - 3) / 11; - bool twoOp = (inscount == 1); +// bool twoOp = (inscount == 1); for(unsigned i = 0; i < inscount; ++i) { @@ -156,13 +156,13 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, 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); - } +// 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(notenum) : 0; inst.noteOffset1 = isPerc ? 0 : notenum; @@ -173,12 +173,12 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, } } - AdlBankSetup setup; - setup.volumeModel = VOLUME_Generic; - setup.deepTremolo = true; - setup.deepVibrato = true; - setup.scaleModulators = false; - SetBankSetup(bank, setup); +// AdlBankSetup setup; +// setup.volumeModel = VOLUME_Generic; +// setup.deepTremolo = true; +// setup.deepVibrato = true; +// setup.scaleModulators = false; +// SetBankSetup(bank, setup); for(auto &b : bnkMelodic) db.addMidiBank(bankDb, false, b); diff --git a/utils/gen_adldata/file_formats/load_bisqwit.h b/utils/gen_adldata/file_formats/load_bisqwit.h index 7ea3a38..2c803dd 100644 --- a/utils/gen_adldata/file_formats/load_bisqwit.h +++ b/utils/gen_adldata/file_formats/load_bisqwit.h @@ -58,8 +58,8 @@ bool BankFormats::LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, cons tmp[1].diff = (tmp[0] != tmp[1]); tmp2.real4op = tmp[1].diff; - size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2, (tmp[0] == tmp[1])); - SetBank(bank, gmno, resno); +// size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2, (tmp[0] == tmp[1])); +// SetBank(bank, gmno, resno); db.toOps(tmp[0], ops, 0); if(tmp[0] != tmp[1]) @@ -78,12 +78,12 @@ bool BankFormats::LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, cons db.addMidiBank(bankDb, false, bnkMelodique); db.addMidiBank(bankDb, true, bnkPercussion); - AdlBankSetup setup; - setup.volumeModel = VOLUME_Generic; - setup.deepTremolo = true; - setup.deepVibrato = true; - setup.scaleModulators = false; - SetBankSetup(bank, setup); +// AdlBankSetup setup; +// setup.volumeModel = VOLUME_Generic; +// setup.deepTremolo = true; +// setup.deepVibrato = true; +// setup.scaleModulators = false; +// SetBankSetup(bank, setup); return true; } diff --git a/utils/gen_adldata/file_formats/load_bnk.h b/utils/gen_adldata/file_formats/load_bnk.h index 9379de5..4021831 100644 --- a/utils/gen_adldata/file_formats/load_bnk.h +++ b/utils/gen_adldata/file_formats/load_bnk.h @@ -127,17 +127,17 @@ bool BankFormats::LoadBNK(BanksDump &db, const char *fn, unsigned bank, 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); +// size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2); if(!is_fat) { - SetBank(bank, (unsigned int)gmno, resno); +// SetBank(bank, (unsigned int)gmno, resno); db.addInstrument(bnk, n & 127, inst, ops, fn); } else { - if(name[2] == 'O' || name[1] == 'M') SetBank(bank + 0, (unsigned int)gmno, resno); - if(name[2] == 'S' || name[1] == 'M') SetBank(bank + 1, (unsigned int)gmno, resno); +// if(name[2] == 'O' || name[1] == 'M') SetBank(bank + 0, (unsigned int)gmno, resno); +// if(name[2] == 'S' || name[1] == 'M') SetBank(bank + 1, (unsigned int)gmno, resno); } /* @@ -166,12 +166,12 @@ bool BankFormats::LoadBNK(BanksDump &db, const char *fn, unsigned bank, db.addMidiBank(bankDb, percussive, bnk); - AdlBankSetup setup; - setup.volumeModel = VOLUME_Generic; - setup.deepTremolo = false; - setup.deepVibrato = false; - setup.scaleModulators = false; - SetBankSetup(bank, setup); +// AdlBankSetup setup; +// setup.volumeModel = VOLUME_Generic; +// setup.deepTremolo = false; +// setup.deepVibrato = false; +// setup.scaleModulators = false; +// SetBankSetup(bank, setup); return true; } diff --git a/utils/gen_adldata/file_formats/load_bnk2.h b/utils/gen_adldata/file_formats/load_bnk2.h index 5468cb5..fc36dd2 100644 --- a/utils/gen_adldata/file_formats/load_bnk2.h +++ b/utils/gen_adldata/file_formats/load_bnk2.h @@ -120,8 +120,8 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, // dual-op tmp2.real4op = true; 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); +// 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, fn); @@ -129,8 +129,8 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, else { // single-op - size_t resno = InsertIns(tmp[0], tmp2, std::string(1, '\377') + name, name2); - SetBank(bank, (unsigned int)gmno, resno); +// 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, fn); } @@ -139,12 +139,12 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, db.addMidiBank(bankDb, false, bnkMelodic); db.addMidiBank(bankDb, true, bnkPercussion); - AdlBankSetup setup; - setup.volumeModel = VOLUME_Generic; - setup.deepTremolo = false; - setup.deepVibrato = false; - setup.scaleModulators = false; - SetBankSetup(bank, setup); +// AdlBankSetup setup; +// setup.volumeModel = VOLUME_Generic; +// setup.deepTremolo = false; +// setup.deepVibrato = false; +// setup.scaleModulators = false; +// SetBankSetup(bank, setup); return true; } diff --git a/utils/gen_adldata/file_formats/load_ea.h b/utils/gen_adldata/file_formats/load_ea.h index 4b40b0f..0e2d294 100644 --- a/utils/gen_adldata/file_formats/load_ea.h +++ b/utils/gen_adldata/file_formats/load_ea.h @@ -16,10 +16,10 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, 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]; - for(unsigned gmno = 35; gmno < 80; ++gmno) - progs[bank][0x80 + gmno] = progs[0][0x80 + gmno]; +// for(unsigned gmno = 0; gmno < 128; ++gmno) +// progs[bank][gmno] = progs[0][gmno]; +// for(unsigned gmno = 35; gmno < 80; ++gmno) +// progs[bank][0x80 + gmno] = progs[0][0x80 + gmno]; uint16_t sources[20 + 8]; // Copy also the unused instruments @@ -110,15 +110,15 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, { snprintf(name2, 512, "%sunk%04X", prefix, offset); } - size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2); - SetBank(bank, gmno, resno); +// size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2); +// SetBank(bank, gmno, resno); db.addInstrument(bnkMelodic, gmno, inst, ops, fn); 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")); +// 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, fn); } @@ -126,7 +126,7 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, 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")); +// 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, fn); } @@ -134,7 +134,7 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, 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")); +// 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, fn); } @@ -142,7 +142,7 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, 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")); +// 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, fn); } @@ -150,12 +150,12 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, std::fclose(fp); - AdlBankSetup setup; - setup.volumeModel = VOLUME_CMF; - setup.deepTremolo = false; - setup.deepVibrato = false; - setup.scaleModulators = false; - SetBankSetup(bank, setup); +// AdlBankSetup setup; +// setup.volumeModel = VOLUME_CMF; +// setup.deepTremolo = false; +// setup.deepVibrato = false; +// setup.scaleModulators = false; +// SetBankSetup(bank, setup); db.addMidiBank(bankDb, false, bnkMelodic); db.addMidiBank(bankDb, true, bnkPercussion); diff --git a/utils/gen_adldata/file_formats/load_ibk.h b/utils/gen_adldata/file_formats/load_ibk.h index d4b54f6..6ae907e 100644 --- a/utils/gen_adldata/file_formats/load_ibk.h +++ b/utils/gen_adldata/file_formats/load_ibk.h @@ -107,25 +107,25 @@ bool BankFormats::LoadIBK(BanksDump &db, const char *fn, unsigned bank, break; default: // IBK logic: make non-percussion instrument be silent - tmp = MakeNoSoundIns(); +// tmp = MakeNoSoundIns(); break; } } - size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2); - SetBank(bank, (unsigned int)gmno, resno); +// size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2); +// SetBank(bank, (unsigned int)gmno, resno); db.addInstrument(bnk, a, inst, ops, fn); } db.addMidiBank(bankDb, percussive, bnk); - AdlBankSetup setup; - setup.volumeModel = VOLUME_Generic; - setup.deepTremolo = false; - setup.deepVibrato = false; - setup.scaleModulators = false; - SetBankSetup(bank, setup); +// AdlBankSetup setup; +// setup.volumeModel = VOLUME_Generic; +// setup.deepTremolo = false; +// setup.deepVibrato = false; +// setup.scaleModulators = false; +// SetBankSetup(bank, setup); return true; } diff --git a/utils/gen_adldata/file_formats/load_jv.h b/utils/gen_adldata/file_formats/load_jv.h index bb4fbdb..1cb6a16 100644 --- a/utils/gen_adldata/file_formats/load_jv.h +++ b/utils/gen_adldata/file_formats/load_jv.h @@ -109,13 +109,13 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, if(!data[offset]) { - size_t resno = InsertIns(tmp[0], tmp2, name, name2); - SetBank(bank, gmno, resno); +// size_t resno = InsertIns(tmp[0], tmp2, name, name2); +// SetBank(bank, gmno, resno); } else // Double instrument { - size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); - SetBank(bank, gmno, resno); +// size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); +// SetBank(bank, gmno, resno); } db.addInstrument(bnk, patchId, inst, ops, fn); } @@ -123,12 +123,12 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, db.addMidiBank(bankDb, false, bnkMelodique); db.addMidiBank(bankDb, true, bnkPercussion); - AdlBankSetup setup; - setup.volumeModel = VOLUME_9X; - setup.deepTremolo = true; - setup.deepVibrato = true; - setup.scaleModulators = false; - SetBankSetup(bank, setup); +// AdlBankSetup setup; +// setup.volumeModel = VOLUME_9X; +// setup.deepTremolo = true; +// setup.deepVibrato = true; +// setup.scaleModulators = false; +// SetBankSetup(bank, setup); return true; } diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h index e31a803..70b23de 100644 --- a/utils/gen_adldata/file_formats/load_op2.h +++ b/utils/gen_adldata/file_formats/load_op2.h @@ -139,8 +139,8 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s if(!(ins.flags & FL_DOUBLE_VOICE)) { - size_t resno = InsertIns(tmp[0], tmp2, std::string(1, '\377') + name, name2); - SetBank(bank, (unsigned int)gmno, resno); +// size_t resno = InsertIns(tmp[0], tmp2, std::string(1, '\377') + name, name2); +// SetBank(bank, (unsigned int)gmno, resno); } else // Double instrument { @@ -151,8 +151,8 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s else if(ins.finetune == 127) tmp2.voice2_fine_tune = -0.000025; //printf("/*DOOM FINE TUNE (flags %000X instrument is %d) IS %d -> %lf*/\n", ins.flags, a, ins.finetune, tmp2.fine_tune); - size_t resno = InsertIns(tmp[0], tmp[1], tmp2, std::string(1, '\377') + name, name2); - SetBank(bank, (unsigned int)gmno, resno); +// size_t resno = InsertIns(tmp[0], tmp[1], tmp2, std::string(1, '\377') + name, name2); +// SetBank(bank, (unsigned int)gmno, resno); } db.addInstrument(bnk, patchId, inst, ops, fn); @@ -181,12 +181,12 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s db.addMidiBank(bankDb, false, bnkMelodique); db.addMidiBank(bankDb, true, bnkPercussion); - AdlBankSetup setup; - setup.volumeModel = VOLUME_DMX; - setup.deepTremolo = false; - setup.deepVibrato = false; - setup.scaleModulators = false; - SetBankSetup(bank, setup); +// AdlBankSetup setup; +// setup.volumeModel = VOLUME_DMX; +// setup.deepTremolo = false; +// setup.deepVibrato = false; +// setup.scaleModulators = false; +// SetBankSetup(bank, setup); return true; } diff --git a/utils/gen_adldata/file_formats/load_tmb.h b/utils/gen_adldata/file_formats/load_tmb.h index d9d57dd..e0b0e31 100644 --- a/utils/gen_adldata/file_formats/load_tmb.h +++ b/utils/gen_adldata/file_formats/load_tmb.h @@ -77,8 +77,8 @@ bool BankFormats::LoadTMB(BanksDump &db, const char *fn, unsigned bank, const st sprintf(name2, "%s%c%u", prefix, (gmno < 128 ? 'M' : 'P'), gmno & 127); - size_t resno = InsertIns(tmp, tmp2, name, name2); - SetBank(bank, gmno, resno); +// size_t resno = InsertIns(tmp, tmp2, name, name2); +// SetBank(bank, gmno, resno); db.addInstrument(bnk, patchId, inst, ops, fn); } @@ -86,12 +86,12 @@ bool BankFormats::LoadTMB(BanksDump &db, const char *fn, unsigned bank, const st db.addMidiBank(bankDb, false, bnkMelodique); db.addMidiBank(bankDb, true, bnkPercussion); - AdlBankSetup setup; - setup.volumeModel = VOLUME_APOGEE; - setup.deepTremolo = false; - setup.deepVibrato = false; - setup.scaleModulators = false; - SetBankSetup(bank, setup); +// AdlBankSetup setup; +// setup.volumeModel = VOLUME_APOGEE; +// setup.deepTremolo = false; +// setup.deepVibrato = false; +// setup.scaleModulators = false; +// SetBankSetup(bank, setup); return true; } diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h index 047ed7b..265c6bf 100644 --- a/utils/gen_adldata/file_formats/load_wopl.h +++ b/utils/gen_adldata/file_formats/load_wopl.h @@ -58,11 +58,11 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s uint16_t mbanks_count = toUint16BE((const uint8_t *)data.data() + 0x0d); uint16_t pbanks_count = toUint16BE((const uint8_t *)data.data() + 0x0f); - AdlBankSetup setup; - setup.deepTremolo = (data[0x11] & 0x01) != 0; - setup.deepVibrato = (data[0x11] & 0x02) != 0; - setup.volumeModel = (int)data[0x12]; - setup.scaleModulators = false; +// AdlBankSetup setup; +// setup.deepTremolo = (data[0x11] & 0x01) != 0; +// setup.deepVibrato = (data[0x11] & 0x02) != 0; +// setup.volumeModel = (int)data[0x12]; +// setup.scaleModulators = false; size_t bankDb = db.initBank(bank, bankTitle, static_cast((static_cast(data[0x11]) << 8) | static_cast(data[0x12]))); @@ -258,26 +258,26 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s else snprintf(name2, 512, "%sM%u", prefix, i); - if(bankno == 0) - { - if(!real4op && !tmp2.pseudo4op) - { - size_t resno = InsertIns(tmp[0], tmp2, name, name2); - SetBank(bank, gmno, resno); - } - else - { - size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); - SetBank(bank, gmno, resno); - } - } +// if(bankno == 0) +// { +// if(!real4op && !tmp2.pseudo4op) +// { +// size_t resno = InsertIns(tmp[0], tmp2, name, name2); +// SetBank(bank, gmno, resno); +// } +// else +// { +// size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); +// SetBank(bank, gmno, resno); +// } +// } db.addInstrument(bnk, i, inst, ops, fn); } db.addMidiBank(bankDb, is_percussion, bnk); } } - SetBankSetup(bank, setup); +// SetBankSetup(bank, setup); return true; } diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index 35967b2..e62ddf2 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -28,15 +28,18 @@ int main(int argc, char**argv) const char *outFile_s = argv[1]; +#if 0 FILE *outFile = std::fopen(outFile_s, "w"); if(!outFile) { std::fprintf(stderr, "Can't open %s file for write!\n", outFile_s); return 1; } +#endif BanksDump db; +#if 0 std::fprintf(outFile, "\ #include \"adldata.hh\"\n\ \n\ @@ -45,6 +48,9 @@ int main(int argc, char**argv) * PREPROCESSED, CONVERTED, AND POSTPROCESSED OFF-SCREEN.\n\ */\n\ "); +#endif + + { IniProcessing ini; if(!ini.open("banks.ini")) @@ -97,7 +103,7 @@ int main(int argc, char**argv) return 1; } - banknames.push_back(bank_name); +// banknames.push_back(bank_name); //printf("Loading %s...\n", filepath.c_str()); @@ -251,119 +257,34 @@ int main(int argc, char**argv) } #endif - std::printf("Writing raw instrument data...\n"); - std::fflush(stdout); - { - std::fprintf(outFile, - /* - "static const struct\n" - "{\n" - " unsigned modulator_E862, carrier_E862; // See below\n" - " unsigned char modulator_40, carrier_40; // KSL/attenuation settings\n" - " unsigned char feedconn; // Feedback/connection bits for the channel\n" - " signed char finetune; // Finetune\n" - "} adl[] =\n"*/ - "const adldata adl[%u] =\n" - "{ // ,---------+-------- Wave select settings\n" - " // | ,-------ч-+------ Sustain/release rates\n" - " // | | ,-----ч-ч-+---- Attack/decay rates\n" - " // | | | ,---ч-ч-ч-+-- AM/VIB/EG/KSR/Multiple bits\n" - " // | | | | | | | |\n" - " // | | | | | | | | ,----+-- KSL/attenuation settings\n" - " // | | | | | | | | | | ,----- Feedback/connection bits\n" - " // | | | | | | | | | | | ,----- Fine tune\n\n" - " // | | | | | | | | | | | |\n" - " // | | | | | | | | | | | |\n", (unsigned)insdatatab.size()); - - for(size_t b = insdatatab.size(), c = 0; c < b; ++c) - { - for(std::map > > - ::const_iterator - i = insdatatab.begin(); - i != insdatatab.end(); - ++i) - { - if(i->second.first != c) continue; - std::fprintf(outFile, " { "); - - uint32_t carrier_E862 = - uint32_t(i->first.data[6] << 24) - + uint32_t(i->first.data[4] << 16) - + uint32_t(i->first.data[2] << 8) - + uint32_t(i->first.data[0] << 0); - uint32_t modulator_E862 = - uint32_t(i->first.data[7] << 24) - + uint32_t(i->first.data[5] << 16) - + uint32_t(i->first.data[3] << 8) - + uint32_t(i->first.data[1] << 0); - - std::fprintf(outFile, "0x%07X,0x%07X, 0x%02X,0x%02X, 0x%X, %+d", - carrier_E862, - modulator_E862, - i->first.data[8], - i->first.data[9], - i->first.data[10], - i->first.finetune); - -#ifdef ADLDATA_WITH_COMMENTS - std::string names; - for(std::set::const_iterator - j = i->second.second.begin(); - j != i->second.second.end(); - ++j) - { - if(!names.empty()) names += "; "; - if((*j)[0] == '\377') - names += j->substr(1); - else - names += *j; - } - std::fprintf(outFile, " }, // %u: %s\n", (unsigned)c, names.c_str()); -#else - std::fprintf(outFile, " },\n"); -#endif - } - } - std::fprintf(outFile, "};\n"); - } - - /*std::fprintf(outFile, "static const struct\n" - "{\n" - " unsigned short adlno1, adlno2;\n" - " unsigned char tone;\n" - " unsigned char flags;\n" - " long ms_sound_kon; // Number of milliseconds it produces sound;\n" - " long ms_sound_koff;\n" - " double voice2_fine_tune;\n" - "} adlins[] =\n");*/ - - std::fprintf(outFile, "const struct adlinsdata adlins[%u] =\n", (unsigned)instab.size()); - std::fprintf(outFile, "{\n"); +// std::printf("Writing raw instrument data...\n"); +// std::fflush(stdout); MeasureThreaded measureCounter; -#ifndef GEN_ADLDATA_DEEP_DEBUG // Skip slowest place to work with a debug - { - std::printf("Beginning to generate measures data... (hardware concurrency of %d)\n", std::thread::hardware_concurrency()); - std::fflush(stdout); - measureCounter.LoadCache("fm_banks/adldata-cache.dat"); - measureCounter.m_total = instab.size(); - for(size_t b = instab.size(), c = 0; c < b; ++c) - { - for(std::map > >::const_iterator i = instab.begin(); i != instab.end(); ++i) - { - if(i->second.first != c) continue; - measureCounter.run(i); - } - } - std::fflush(stdout); - measureCounter.waitAll(); - measureCounter.SaveCache("fm_banks/adldata-cache.dat"); - } -#endif +//#ifndef GEN_ADLDATA_DEEP_DEBUG // Skip slowest place to work with a debug +// { +// std::printf("Beginning to generate measures data... (hardware concurrency of %d)\n", std::thread::hardware_concurrency()); +// std::fflush(stdout); +// measureCounter.LoadCache("fm_banks/adldata-cache.dat"); +// measureCounter.m_total = instab.size(); +// for(size_t b = instab.size(), c = 0; c < b; ++c) +// { +// for(std::map > >::const_iterator i = instab.begin(); i != instab.end(); ++i) +// { +// if(i->second.first != c) continue; +// measureCounter.run(i); +// } +// } +// std::fflush(stdout); +// measureCounter.waitAll(); +// measureCounter.SaveCache("fm_banks/adldata-cache.dat"); +// } +//#endif - std::printf("Writing generated measure data...\n"); - std::fflush(stdout); +// std::printf("Writing generated measure data...\n"); +// std::fflush(stdout); +#if 0 std::vector adlins_flags; for(size_t b = instab.size(), c = 0; c < b; ++c) @@ -469,6 +390,7 @@ int main(int argc, char**argv) } std::set listed; + std::fprintf(outFile, "\n\n//Returns total number of generated banks\n" "int maxAdlBanks()\n" @@ -531,6 +453,10 @@ int main(int argc, char**argv) #endif } +#endif + + +#if 0 std::fprintf(outFile, "};\n\n"); std::fflush(outFile); @@ -557,9 +483,10 @@ int main(int argc, char**argv) std::fflush(outFile); std::fclose(outFile); +#endif { - measureCounter.LoadCacheX("fm_banks/adldata-cache-x.dat"); + measureCounter.LoadCacheX("fm_banks/adldata-cache.dat"); measureCounter.m_durationInfo.clear(); measureCounter.m_cache_matches = 0; measureCounter.m_done = 0; @@ -573,7 +500,7 @@ int main(int argc, char**argv) } std::fflush(stdout); measureCounter.waitAll(); - measureCounter.SaveCacheX("fm_banks/adldata-cache-x.dat"); + measureCounter.SaveCacheX("fm_banks/adldata-cache.dat"); } db.exportBanks(std::string(outFile_s)); diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 4663072..f491b5d 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -175,59 +175,59 @@ struct TinySynth writeReg((uint16_t)initdata[a], (uint8_t)initdata[a + 1]); } - void setInstrument(const ins &in) - { - insdata rawData[2]; - bool found[2] = {false, false}; - for(InstrumentDataTab::const_iterator j = insdatatab.begin(); - j != insdatatab.end(); - ++j) - { - if(j->second.first == in.insno1) - { - rawData[0] = j->first; - found[0] = true; - if(found[1]) break; - } - if(j->second.first == in.insno2) - { - rawData[1] = j->first; - found[1] = true; - if(found[0]) break; - } - } - - std::memset(m_x, 0, sizeof(m_x)); - m_isRhythmMode = false; - m_playNoteNum = in.notenum >= 128 ? (in.notenum - 128) : in.notenum; - m_isReal4op = in.real4op && !in.pseudo4op; - m_isPseudo4op = in.pseudo4op; - if(m_playNoteNum == 0) - m_playNoteNum = 25; - m_notesNum = in.insno1 == in.insno2 ? 1 : 2; - m_actualNotesNum = (m_isReal4op ? 1 : m_notesNum); - m_voice1Detune = 0; - m_noteOffsets[0] = rawData[0].finetune; - m_noteOffsets[1] = rawData[1].finetune; - if(in.pseudo4op) - m_voice1Detune = in.voice2_fine_tune; - writeReg(0x104, in.real4op ? (1 << 6) - 1 : 0x00); - - //For cleaner measurement, disable tremolo and vibrato - rawData[0].data[0] &= 0x3F; - rawData[0].data[1] &= 0x3F; - rawData[1].data[0] &= 0x3F; - rawData[1].data[1] &= 0x3F; - - for(unsigned n = 0; n < m_notesNum; ++n) - { - static const unsigned char patchdata[11] = - {0x20, 0x23, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0x40, 0x43, 0xC0}; - for(unsigned a = 0; a < 10; ++a) - writeReg(patchdata[a] + n * 8, rawData[n].data[a]); - writeReg(patchdata[10] + n * 8, rawData[n].data[10] | 0x30); - } - } +// void setInstrument(const ins &in) +// { +// insdata rawData[2]; +// bool found[2] = {false, false}; +// for(InstrumentDataTab::const_iterator j = insdatatab.begin(); +// j != insdatatab.end(); +// ++j) +// { +// if(j->second.first == in.insno1) +// { +// rawData[0] = j->first; +// found[0] = true; +// if(found[1]) break; +// } +// if(j->second.first == in.insno2) +// { +// rawData[1] = j->first; +// found[1] = true; +// if(found[0]) break; +// } +// } + +// std::memset(m_x, 0, sizeof(m_x)); +// m_isRhythmMode = false; +// m_playNoteNum = in.notenum >= 128 ? (in.notenum - 128) : in.notenum; +// m_isReal4op = in.real4op && !in.pseudo4op; +// m_isPseudo4op = in.pseudo4op; +// if(m_playNoteNum == 0) +// m_playNoteNum = 25; +// m_notesNum = in.insno1 == in.insno2 ? 1 : 2; +// m_actualNotesNum = (m_isReal4op ? 1 : m_notesNum); +// m_voice1Detune = 0; +// m_noteOffsets[0] = rawData[0].finetune; +// m_noteOffsets[1] = rawData[1].finetune; +// if(in.pseudo4op) +// m_voice1Detune = in.voice2_fine_tune; +// writeReg(0x104, in.real4op ? (1 << 6) - 1 : 0x00); + +// //For cleaner measurement, disable tremolo and vibrato +// rawData[0].data[0] &= 0x3F; +// rawData[0].data[1] &= 0x3F; +// rawData[1].data[0] &= 0x3F; +// rawData[1].data[1] &= 0x3F; + +// for(unsigned n = 0; n < m_notesNum; ++n) +// { +// static const unsigned char patchdata[11] = +// {0x20, 0x23, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0x40, 0x43, 0xC0}; +// for(unsigned a = 0; a < 10; ++a) +// writeReg(patchdata[a] + n * 8, rawData[n].data[a]); +// writeReg(patchdata[10] + n * 8, rawData[n].data[10] | 0x30); +// } +// } void setInstrument(const BanksDump &db, const BanksDump::InstrumentEntry &ins) { @@ -332,7 +332,7 @@ struct TinySynth } }; - +#if 0 DurationInfo MeasureDurations(const ins &in, OPLChipBase *chip) { AudioHistory audioHistory; @@ -522,7 +522,7 @@ DurationInfo MeasureDurations(const ins &in, OPLChipBase *chip) return result; } - +#endif DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &ins, OPLChipBase *chip) { @@ -791,6 +791,7 @@ MeasureThreaded::MeasureThreaded() : DosBoxOPL3::globalPreInit(); } +#if 0 void MeasureThreaded::LoadCache(const char *fileName) { m_durationInfo.clear(); @@ -1025,6 +1026,7 @@ void MeasureThreaded::SaveCache(const char *fileName) } std::fclose(out); } +#endif void MeasureThreaded::LoadCacheX(const char *fileName) { @@ -1193,6 +1195,7 @@ void MeasureThreaded::printFinal() std::fflush(stdout); } +#if 0 void MeasureThreaded::run(InstrumentsData::const_iterator i) { m_semaphore.wait(); @@ -1221,6 +1224,7 @@ void MeasureThreaded::run(InstrumentsData::const_iterator i) printProgress(); #endif } +#endif void MeasureThreaded::run(BanksDump &bd, BanksDump::InstrumentEntry &e) { @@ -1305,6 +1309,7 @@ void MeasureThreaded::destData::callback(void *myself) } else { +#if 0 const ins &ok = s->i->first; s->myself->m_durationInfo_mx.lock(); DurationInfoCache::iterator cachedEntry = s->myself->m_durationInfo.find(ok); @@ -1321,6 +1326,7 @@ void MeasureThreaded::destData::callback(void *myself) s->myself->m_durationInfo_mx.lock(); s->myself->m_durationInfo.insert({ok, info}); s->myself->m_durationInfo_mx.unlock(); +#endif } endWork: diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index 60fdcb7..f49b9bf 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -70,8 +70,10 @@ struct MeasureThreaded std::atomic m_done; std::atomic m_cache_matches; +#if 0 void LoadCache(const char *fileName); void SaveCache(const char *fileName); +#endif void LoadCacheX(const char *fileName); void SaveCacheX(const char *fileName); @@ -101,13 +103,17 @@ struct MeasureThreaded void printProgress(); void printFinal(); +#if 0 void run(InstrumentsData::const_iterator i); +#endif void run(BanksDump &bd, BanksDump::InstrumentEntry &e); void waitAll(); }; class OPLChipBase; +#if 0 extern DurationInfo MeasureDurations(const ins &in, OPLChipBase *chip); +#endif extern DurationInfo MeasureDurations(const BanksDump &db, const BanksDump::InstrumentEntry &ins, OPLChipBase *chip); #endif // MEASURER_H diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index fa67da3..73b05da 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -11,126 +11,126 @@ #include "file_formats/load_wopl.h" #include "file_formats/load_ea.h" -InstrumentDataTab insdatatab; +//InstrumentDataTab insdatatab; -InstrumentsData instab; -InstProgsData progs; -BankSetupData banksetup; +//InstrumentsData instab; +//InstProgsData progs; +//BankSetupData banksetup; -std::vector banknames; +//std::vector banknames; //unsigned maxvalues[30] = { 0 }; -void SetBank(size_t bank, unsigned patch, size_t insno) -{ - progs[bank][patch] = insno + 1; -} - -void SetBankSetup(size_t bank, const AdlBankSetup &setup) -{ - banksetup[bank] = setup; -} - -size_t InsertIns(const insdata &id, ins &in, const std::string &name, const std::string &name2) -{ - return InsertIns(id, id, in, name, name2, true); -} - -size_t InsertIns( - const insdata &id, - const insdata &id2, - ins &in, - const std::string &name, - const std::string &name2, - bool oneVoice) -{ - { - InstrumentDataTab::iterator i = insdatatab.lower_bound(id); - - size_t insno = ~size_t(0); - if(i == insdatatab.end() || i->first != id) - { - std::pair > > res; - res.first = id; - res.second.first = insdatatab.size(); - if(!name.empty()) res.second.second.insert(name); - if(!name2.empty()) res.second.second.insert(name2); - insdatatab.insert(i, res); - insno = res.second.first; - } - else - { - if(!name.empty()) i->second.second.insert(name); - if(!name2.empty()) i->second.second.insert(name2); - insno = i->second.first; - } - - in.insno1 = insno; - in.instCache1 = id; - } - - if(oneVoice || (id == id2)) - { - in.insno2 = in.insno1; - in.instCache2 = in.instCache1; - } - else - { - InstrumentDataTab::iterator i = insdatatab.lower_bound(id2); - - size_t insno2 = ~size_t(0); - if(i == insdatatab.end() || i->first != id2) - { - std::pair > > res; - res.first = id2; - res.second.first = insdatatab.size(); - if(!name.empty()) res.second.second.insert(name); - if(!name2.empty()) res.second.second.insert(name2); - insdatatab.insert(i, res); - insno2 = res.second.first; - } - else - { - if(!name.empty()) i->second.second.insert(name); - if(!name2.empty()) i->second.second.insert(name2); - insno2 = i->second.first; - } - in.insno2 = insno2; - in.instCache2 = id2; - } - - { - InstrumentsData::iterator i = instab.lower_bound(in); - - size_t resno = ~size_t(0); - if(i == instab.end() || i->first != in) - { - std::pair > > res; - res.first = in; - res.second.first = instab.size(); - if(!name.empty()) res.second.second.insert(name); - if(!name2.empty()) res.second.second.insert(name2); - instab.insert(i, res); - resno = res.second.first; - } - else - { - if(!name.empty()) i->second.second.insert(name); - if(!name2.empty()) i->second.second.insert(name2); - resno = i->second.first; - } - return resno; - } -} - -// Create silent 'nosound' instrument -size_t InsertNoSoundIns() -{ - // { 0x0F70700,0x0F70710, 0xFF,0xFF, 0x0,+0 }, - insdata tmp1 = MakeNoSoundIns(); - struct ins tmp2; - return InsertIns(tmp1, tmp1, tmp2, "nosound", ""); -} +//void SetBank(size_t bank, unsigned patch, size_t insno) +//{ +// progs[bank][patch] = insno + 1; +//} + +//void SetBankSetup(size_t bank, const AdlBankSetup &setup) +//{ +// banksetup[bank] = setup; +//} + +//size_t InsertIns(const insdata &id, ins &in, const std::string &name, const std::string &name2) +//{ +// return InsertIns(id, id, in, name, name2, true); +//} + +//size_t InsertIns( +// const insdata &id, +// const insdata &id2, +// ins &in, +// const std::string &name, +// const std::string &name2, +// bool oneVoice) +//{ +// { +// InstrumentDataTab::iterator i = insdatatab.lower_bound(id); + +// size_t insno = ~size_t(0); +// if(i == insdatatab.end() || i->first != id) +// { +// std::pair > > res; +// res.first = id; +// res.second.first = insdatatab.size(); +// if(!name.empty()) res.second.second.insert(name); +// if(!name2.empty()) res.second.second.insert(name2); +// insdatatab.insert(i, res); +// insno = res.second.first; +// } +// else +// { +// if(!name.empty()) i->second.second.insert(name); +// if(!name2.empty()) i->second.second.insert(name2); +// insno = i->second.first; +// } + +// in.insno1 = insno; +// in.instCache1 = id; +// } + +// if(oneVoice || (id == id2)) +// { +// in.insno2 = in.insno1; +// in.instCache2 = in.instCache1; +// } +// else +// { +// InstrumentDataTab::iterator i = insdatatab.lower_bound(id2); + +// size_t insno2 = ~size_t(0); +// if(i == insdatatab.end() || i->first != id2) +// { +// std::pair > > res; +// res.first = id2; +// res.second.first = insdatatab.size(); +// if(!name.empty()) res.second.second.insert(name); +// if(!name2.empty()) res.second.second.insert(name2); +// insdatatab.insert(i, res); +// insno2 = res.second.first; +// } +// else +// { +// if(!name.empty()) i->second.second.insert(name); +// if(!name2.empty()) i->second.second.insert(name2); +// insno2 = i->second.first; +// } +// in.insno2 = insno2; +// in.instCache2 = id2; +// } + +// { +// InstrumentsData::iterator i = instab.lower_bound(in); + +// size_t resno = ~size_t(0); +// if(i == instab.end() || i->first != in) +// { +// std::pair > > res; +// res.first = in; +// res.second.first = instab.size(); +// if(!name.empty()) res.second.second.insert(name); +// if(!name2.empty()) res.second.second.insert(name2); +// instab.insert(i, res); +// resno = res.second.first; +// } +// else +// { +// if(!name.empty()) i->second.second.insert(name); +// if(!name2.empty()) i->second.second.insert(name2); +// resno = i->second.first; +// } +// return resno; +// } +//} + +//// Create silent 'nosound' instrument +//size_t InsertNoSoundIns() +//{ +// // { 0x0F70700,0x0F70710, 0xFF,0xFF, 0x0,+0 }, +// insdata tmp1 = MakeNoSoundIns(); +// struct ins tmp2; +// return InsertIns(tmp1, tmp1, tmp2, "nosound", ""); +//} insdata MakeNoSoundIns() { diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 195c5f1..10e29aa 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -144,44 +144,44 @@ enum VolumesModels VOLUME_9X }; -struct AdlBankSetup -{ - int volumeModel; - bool deepTremolo; - bool deepVibrato; - bool scaleModulators; -}; +//struct AdlBankSetup +//{ +// int volumeModel; +// bool deepTremolo; +// bool deepVibrato; +// bool scaleModulators; +//}; -typedef std::map > > InstrumentDataTab; -extern InstrumentDataTab insdatatab; +//typedef std::map > > InstrumentDataTab; +//extern InstrumentDataTab insdatatab; -typedef std::map > > InstrumentsData; -extern InstrumentsData instab; +//typedef std::map > > InstrumentsData; +//extern InstrumentsData instab; -typedef std::map > InstProgsData; -extern InstProgsData progs; +//typedef std::map > InstProgsData; +//extern InstProgsData progs; -typedef std::map BankSetupData; -extern BankSetupData banksetup; +//typedef std::map BankSetupData; +//extern BankSetupData banksetup; -extern std::vector banknames; +//extern std::vector banknames; //static std::map > Correlate; //extern unsigned maxvalues[30]; -void SetBank(size_t bank, unsigned patch, size_t insno); -void SetBankSetup(size_t bank, const AdlBankSetup &setup); +//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); +///* 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); +///* 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(); +//size_t InsertNoSoundIns(); insdata MakeNoSoundIns(); -- cgit v1.2.3 From baf7ea95709451989f02e0d2e2f27750e3ce74e5 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Thu, 20 Aug 2020 00:12:49 +0300 Subject: MidiPlay: Fixed too big time print delay on emulated playback --- utils/midiplay/adlmidiplay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'utils') diff --git a/utils/midiplay/adlmidiplay.cpp b/utils/midiplay/adlmidiplay.cpp index 9cfe4c4..d374751 100644 --- a/utils/midiplay/adlmidiplay.cpp +++ b/utils/midiplay/adlmidiplay.cpp @@ -837,7 +837,7 @@ int main(int argc, char **argv) char posHMS[25]; uint64_t milliseconds_prev = ~0u; int printsCounter = 0; - int printsCounterPeriod = 100; + int printsCounterPeriod = 2; # ifdef HARDWARE_OPL3 printsCounterPeriod = 1000; # endif -- cgit v1.2.3 From f0bdcdb297b41f29c3a51a8b3a1a2d12c929d7ba Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Sun, 23 Aug 2020 20:42:08 +0300 Subject: gen_adldata: Fixed DMX bank importing A silly mistake causes a wrong value of FB-CONN byte on some instruments that distorts sounding of them. --- utils/gen_adldata/file_formats/load_op2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h index 494655d..169ed34 100644 --- a/utils/gen_adldata/file_formats/load_op2.h +++ b/utils/gen_adldata/file_formats/load_op2.h @@ -111,7 +111,7 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s tmp[index].data[9] = src.scale_2 | src.level_2; tmp[index].data[10] = src.feedback; tmp[index].finetune = int8_t(src.basenote + 12); - inst.fbConn |= (uint_fast16_t(src.feedback) << (a == 1 ? 8 : 0)); + inst.fbConn |= (uint_fast16_t(src.feedback) << (index == 1 ? 8 : 0)); db.toOps(tmp[index], ops, index * 2); } struct ins tmp2; -- cgit v1.2.3 From 5c34909e6c77fabc2e5bfa33190b9994707e6b9e Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Sun, 23 Aug 2020 21:14:28 +0300 Subject: gen_adldata: Smaller release time recognizing This should help releasing sounds (like pick bass at bank 14) being not muted too fast --- utils/gen_adldata/measurer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'utils') diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index b9738be..3eb6dbd 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -578,7 +578,7 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i unsigned max_period_off = max_off * interval; const double min_coefficient_on = 0.008; - const double min_coefficient_off = 0.2; + const double min_coefficient_off = 0.003; unsigned windows_passed_on = 0; unsigned windows_passed_off = 0; -- cgit v1.2.3 From f656802667e93be893ebc30a18b0f12482586e6f Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Sun, 23 Aug 2020 22:10:46 +0300 Subject: gen_adldata: remove the rest of old code --- utils/gen_adldata/file_formats/load_ail.h | 11 +- utils/gen_adldata/file_formats/load_bisqwit.h | 7 - utils/gen_adldata/file_formats/load_bnk.h | 24 +- utils/gen_adldata/file_formats/load_bnk2.h | 13 - utils/gen_adldata/file_formats/load_ea.h | 13 - utils/gen_adldata/file_formats/load_ibk.h | 14 +- utils/gen_adldata/file_formats/load_jv.h | 25 +- utils/gen_adldata/file_formats/load_op2.h | 21 +- utils/gen_adldata/file_formats/load_tmb.h | 14 +- utils/gen_adldata/file_formats/load_wopl.h | 21 - utils/gen_adldata/gen_adldata.cc | 274 ------------ utils/gen_adldata/measurer.cpp | 594 ++------------------------ utils/gen_adldata/measurer.h | 12 +- utils/gen_adldata/progs_cache.cpp | 120 ------ utils/gen_adldata/progs_cache.h | 38 -- 15 files changed, 46 insertions(+), 1155 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/load_ail.h b/utils/gen_adldata/file_formats/load_ail.h index abeda95..3ab38ef 100644 --- a/utils/gen_adldata/file_formats/load_ail.h +++ b/utils/gen_adldata/file_formats/load_ail.h @@ -15,9 +15,9 @@ struct GTL_Head // GTL file header entry structure bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix) { - #ifdef HARD_BANKS +#ifdef HARD_BANKS writeIni("AIL", fn, prefix, bank, INI_Both); - #endif +#endif FILE *fp = std::fopen(fn, "rb"); if(!fp) return false; @@ -173,13 +173,6 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, } } -// AdlBankSetup setup; -// setup.volumeModel = VOLUME_Generic; -// setup.deepTremolo = true; -// setup.deepVibrato = true; -// setup.scaleModulators = false; -// SetBankSetup(bank, setup); - for(auto &b : bnkMelodic) db.addMidiBank(bankDb, false, b); db.addMidiBank(bankDb, true, bnkPercussion); diff --git a/utils/gen_adldata/file_formats/load_bisqwit.h b/utils/gen_adldata/file_formats/load_bisqwit.h index 2c803dd..478935f 100644 --- a/utils/gen_adldata/file_formats/load_bisqwit.h +++ b/utils/gen_adldata/file_formats/load_bisqwit.h @@ -78,13 +78,6 @@ bool BankFormats::LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, cons db.addMidiBank(bankDb, false, bnkMelodique); db.addMidiBank(bankDb, true, bnkPercussion); -// AdlBankSetup setup; -// setup.volumeModel = VOLUME_Generic; -// setup.deepTremolo = true; -// setup.deepVibrato = true; -// setup.scaleModulators = false; -// SetBankSetup(bank, setup); - return true; } diff --git a/utils/gen_adldata/file_formats/load_bnk.h b/utils/gen_adldata/file_formats/load_bnk.h index 4021831..ed47567 100644 --- a/utils/gen_adldata/file_formats/load_bnk.h +++ b/utils/gen_adldata/file_formats/load_bnk.h @@ -11,9 +11,9 @@ 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 +#ifdef HARD_BANKS writeIni("HMI", fn, prefix, bank, percussive ? INI_Drums : INI_Melodic); - #endif +#endif FILE *fp = std::fopen(fn, "rb"); if(!fp) return false; @@ -121,24 +121,15 @@ bool BankFormats::LoadBNK(BanksDump &db, const char *fn, unsigned bank, tmp2.midi_velocity_offset = 0; tmp2.rhythmModeDrum = 0; - if(is_fat) tmp.data[10] ^= 1; + 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, fn); - } - else - { -// if(name[2] == 'O' || name[1] == 'M') SetBank(bank + 0, (unsigned int)gmno, resno); -// if(name[2] == 'S' || name[1] == 'M') SetBank(bank + 1, (unsigned int)gmno, resno); - } /* for(unsigned p=0; p<30; ++p) @@ -166,13 +157,6 @@ bool BankFormats::LoadBNK(BanksDump &db, const char *fn, unsigned bank, db.addMidiBank(bankDb, percussive, bnk); -// AdlBankSetup setup; -// setup.volumeModel = VOLUME_Generic; -// setup.deepTremolo = false; -// setup.deepVibrato = false; -// setup.scaleModulators = false; -// SetBankSetup(bank, setup); - return true; } diff --git a/utils/gen_adldata/file_formats/load_bnk2.h b/utils/gen_adldata/file_formats/load_bnk2.h index fc36dd2..1d78c4b 100644 --- a/utils/gen_adldata/file_formats/load_bnk2.h +++ b/utils/gen_adldata/file_formats/load_bnk2.h @@ -120,18 +120,12 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, // dual-op tmp2.real4op = true; 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, fn); } 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, fn); } } @@ -139,13 +133,6 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, db.addMidiBank(bankDb, false, bnkMelodic); db.addMidiBank(bankDb, true, bnkPercussion); -// AdlBankSetup setup; -// setup.volumeModel = VOLUME_Generic; -// setup.deepTremolo = false; -// setup.deepVibrato = false; -// setup.scaleModulators = false; -// SetBankSetup(bank, setup); - return true; } diff --git a/utils/gen_adldata/file_formats/load_ea.h b/utils/gen_adldata/file_formats/load_ea.h index 0e2d294..43d4d5d 100644 --- a/utils/gen_adldata/file_formats/load_ea.h +++ b/utils/gen_adldata/file_formats/load_ea.h @@ -110,15 +110,12 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, { snprintf(name2, 512, "%sunk%04X", prefix, offset); } -// size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2); -// SetBank(bank, gmno, resno); db.addInstrument(bnkMelodic, gmno, inst, ops, fn); 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, fn); } @@ -126,7 +123,6 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, 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, fn); } @@ -134,7 +130,6 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, 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, fn); } @@ -142,7 +137,6 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, 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, fn); } @@ -150,13 +144,6 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, std::fclose(fp); -// AdlBankSetup setup; -// setup.volumeModel = VOLUME_CMF; -// setup.deepTremolo = false; -// setup.deepVibrato = false; -// setup.scaleModulators = false; -// SetBankSetup(bank, setup); - db.addMidiBank(bankDb, false, bnkMelodic); db.addMidiBank(bankDb, true, bnkPercussion); diff --git a/utils/gen_adldata/file_formats/load_ibk.h b/utils/gen_adldata/file_formats/load_ibk.h index 6ae907e..d5794c5 100644 --- a/utils/gen_adldata/file_formats/load_ibk.h +++ b/utils/gen_adldata/file_formats/load_ibk.h @@ -7,9 +7,9 @@ bool BankFormats::LoadIBK(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix, bool percussive, bool noRhythmMode) { - #ifdef HARD_BANKS +#ifdef HARD_BANKS writeIni("IBK", fn, prefix, bank, percussive ? INI_Drums : INI_Melodic); - #endif +#endif FILE *fp = std::fopen(fn, "rb"); if(!fp) return false; @@ -112,21 +112,11 @@ bool BankFormats::LoadIBK(BanksDump &db, const char *fn, unsigned bank, } } -// size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2); -// SetBank(bank, (unsigned int)gmno, resno); - db.addInstrument(bnk, a, inst, ops, fn); } db.addMidiBank(bankDb, percussive, bnk); -// AdlBankSetup setup; -// setup.volumeModel = VOLUME_Generic; -// setup.deepTremolo = false; -// setup.deepVibrato = false; -// setup.scaleModulators = false; -// SetBankSetup(bank, setup); - return true; } diff --git a/utils/gen_adldata/file_formats/load_jv.h b/utils/gen_adldata/file_formats/load_jv.h index 1cb6a16..381f562 100644 --- a/utils/gen_adldata/file_formats/load_jv.h +++ b/utils/gen_adldata/file_formats/load_jv.h @@ -6,9 +6,9 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix) { - #ifdef HARD_BANKS +#ifdef HARD_BANKS writeIni("Junglevision", fn, prefix, bank, INI_Both); - #endif +#endif FILE *fp = std::fopen(fn, "rb"); if(!fp) return false; @@ -101,37 +101,20 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, db.toOps(tmp[1], ops, 2); std::string name; - if(midi_index >= 0) name = std::string(1, '\377') + MidiInsName[midi_index]; + if(midi_index >= 0) + name = std::string(1, '\377') + MidiInsName[midi_index]; char name2[512]; sprintf(name2, "%s%c%u", prefix, (gmno < 128 ? 'M' : 'P'), gmno & 127); - if(!data[offset]) - { -// size_t resno = InsertIns(tmp[0], tmp2, name, name2); -// SetBank(bank, gmno, resno); - } - else // Double instrument - { -// size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); -// SetBank(bank, gmno, resno); - } db.addInstrument(bnk, patchId, inst, ops, fn); } db.addMidiBank(bankDb, false, bnkMelodique); db.addMidiBank(bankDb, true, bnkPercussion); -// AdlBankSetup setup; -// setup.volumeModel = VOLUME_9X; -// setup.deepTremolo = true; -// setup.deepVibrato = true; -// setup.scaleModulators = false; -// SetBankSetup(bank, setup); - return true; } #endif // LOAD_JV_H - diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h index 169ed34..0c56ef6 100644 --- a/utils/gen_adldata/file_formats/load_op2.h +++ b/utils/gen_adldata/file_formats/load_op2.h @@ -51,9 +51,9 @@ struct Doom_opl_instr bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix) { - #ifdef HARD_BANKS +#ifdef HARD_BANKS writeIni("OP2", fn, prefix, bank, INI_Both); - #endif +#endif FILE *fp = std::fopen(fn, "rb"); if(!fp) return false; @@ -137,19 +137,11 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s inst.percussionKeyNumber = tmp2.notenum; inst.secondVoiceDetune = static_cast(static_cast(ins.finetune) - 128); - if(!(ins.flags & FL_DOUBLE_VOICE)) - { -// size_t resno = InsertIns(tmp[0], tmp2, std::string(1, '\377') + name, name2); -// SetBank(bank, (unsigned int)gmno, resno); - } - else // Double instrument + if((ins.flags & FL_DOUBLE_VOICE) != 0) { tmp2.pseudo4op = true; // Simulate behavior of DMX second voice detune tmp2.voice2_fine_tune = (double)((ins.finetune >> 1) - 64) / 32.0; - //printf("/*DOOM FINE TUNE (flags %000X instrument is %d) IS %d -> %lf*/\n", ins.flags, a, ins.finetune, tmp2.fine_tune); -// size_t resno = InsertIns(tmp[0], tmp[1], tmp2, std::string(1, '\377') + name, name2); -// SetBank(bank, (unsigned int)gmno, resno); } db.addInstrument(bnk, patchId, inst, ops, fn); @@ -178,13 +170,6 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s db.addMidiBank(bankDb, false, bnkMelodique); db.addMidiBank(bankDb, true, bnkPercussion); -// AdlBankSetup setup; -// setup.volumeModel = VOLUME_DMX; -// setup.deepTremolo = false; -// setup.deepVibrato = false; -// setup.scaleModulators = false; -// SetBankSetup(bank, setup); - return true; } diff --git a/utils/gen_adldata/file_formats/load_tmb.h b/utils/gen_adldata/file_formats/load_tmb.h index e0b0e31..76478d1 100644 --- a/utils/gen_adldata/file_formats/load_tmb.h +++ b/utils/gen_adldata/file_formats/load_tmb.h @@ -6,9 +6,9 @@ bool BankFormats::LoadTMB(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix) { - #ifdef HARD_BANKS +#ifdef HARD_BANKS writeIni("TMB", fn, prefix, bank, INI_Both); - #endif +#endif FILE *fp = std::fopen(fn, "rb"); if(!fp) return false; @@ -77,22 +77,12 @@ bool BankFormats::LoadTMB(BanksDump &db, const char *fn, unsigned bank, const st sprintf(name2, "%s%c%u", prefix, (gmno < 128 ? 'M' : 'P'), gmno & 127); -// size_t resno = InsertIns(tmp, tmp2, name, name2); -// SetBank(bank, gmno, resno); - db.addInstrument(bnk, patchId, inst, ops, fn); } db.addMidiBank(bankDb, false, bnkMelodique); db.addMidiBank(bankDb, true, bnkPercussion); -// AdlBankSetup setup; -// setup.volumeModel = VOLUME_APOGEE; -// setup.deepTremolo = false; -// setup.deepVibrato = false; -// setup.scaleModulators = false; -// SetBankSetup(bank, setup); - return true; } diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h index a60cbc4..1d24dc6 100644 --- a/utils/gen_adldata/file_formats/load_wopl.h +++ b/utils/gen_adldata/file_formats/load_wopl.h @@ -58,12 +58,6 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s uint16_t mbanks_count = toUint16BE((const uint8_t *)data.data() + 0x0d); uint16_t pbanks_count = toUint16BE((const uint8_t *)data.data() + 0x0f); -// AdlBankSetup setup; -// setup.deepTremolo = (data[0x11] & 0x01) != 0; -// setup.deepVibrato = (data[0x11] & 0x02) != 0; -// setup.volumeModel = (int)data[0x12]; -// setup.scaleModulators = false; - size_t bankDb = db.initBank(bank, bankTitle, static_cast((static_cast(data[0x11]) << 8) | static_cast(data[0x12]))); // Validate file format by size calculation @@ -254,27 +248,12 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s else snprintf(name2, 512, "%sM%u", prefix, i); -// if(bankno == 0) -// { -// if(!real4op && !tmp2.pseudo4op) -// { -// size_t resno = InsertIns(tmp[0], tmp2, name, name2); -// SetBank(bank, gmno, resno); -// } -// else -// { -// size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2); -// SetBank(bank, gmno, resno); -// } -// } db.addInstrument(bnk, i, inst, ops, fn); } db.addMidiBank(bankDb, is_percussion, bnk); } } -// SetBankSetup(bank, setup); - return true; } diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index e62ddf2..b67e53b 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -28,29 +28,8 @@ int main(int argc, char**argv) const char *outFile_s = argv[1]; -#if 0 - FILE *outFile = std::fopen(outFile_s, "w"); - if(!outFile) - { - std::fprintf(stderr, "Can't open %s file for write!\n", outFile_s); - return 1; - } -#endif - BanksDump db; -#if 0 - std::fprintf(outFile, "\ -#include \"adldata.hh\"\n\ -\n\ -/* THIS OPL-3 FM INSTRUMENT DATA IS AUTOMATICALLY GENERATED\n\ - * FROM A NUMBER OF SOURCES, MOSTLY PC GAMES.\n\ - * PREPROCESSED, CONVERTED, AND POSTPROCESSED OFF-SCREEN.\n\ - */\n\ -"); -#endif - - { IniProcessing ini; if(!ini.open("banks.ini")) @@ -230,260 +209,7 @@ int main(int argc, char**argv) std::fflush(stdout); } - #if 0 - for(unsigned a = 0; a < 36 * 8; ++a) - { - if((1 << (a % 8)) > maxvalues[a / 8]) continue; - - const std::map &data = Correlate[a]; - if(data.empty()) continue; - std::vector< std::pair > correlations; - for(std::map::const_iterator - i = data.begin(); - i != data.end(); - ++i) - { - correlations.push_back(std::make_pair(i->second, i->first)); - } - std::sort(correlations.begin(), correlations.end()); - std::fprintf(outFile, "Byte %2u bit %u=mask %02X:\n", a / 8, a % 8, 1 << (a % 8)); - for(size_t c = 0; c < correlations.size() && c < 10; ++c) - { - unsigned count = correlations[correlations.size() - 1 - c ].first; - unsigned index = correlations[correlations.size() - 1 - c ].second; - std::fprintf(outFile, "\tAdldata index %u, bit %u=mask %02X (%u matches)\n", - index / 8, index % 8, 1 << (index % 8), count); - } - } - #endif - -// std::printf("Writing raw instrument data...\n"); -// std::fflush(stdout); - MeasureThreaded measureCounter; -//#ifndef GEN_ADLDATA_DEEP_DEBUG // Skip slowest place to work with a debug -// { -// std::printf("Beginning to generate measures data... (hardware concurrency of %d)\n", std::thread::hardware_concurrency()); -// std::fflush(stdout); -// measureCounter.LoadCache("fm_banks/adldata-cache.dat"); -// measureCounter.m_total = instab.size(); -// for(size_t b = instab.size(), c = 0; c < b; ++c) -// { -// for(std::map > >::const_iterator i = instab.begin(); i != instab.end(); ++i) -// { -// if(i->second.first != c) continue; -// measureCounter.run(i); -// } -// } -// std::fflush(stdout); -// measureCounter.waitAll(); -// measureCounter.SaveCache("fm_banks/adldata-cache.dat"); -// } -//#endif - -// std::printf("Writing generated measure data...\n"); -// std::fflush(stdout); - -#if 0 - std::vector adlins_flags; - - for(size_t b = instab.size(), c = 0; c < b; ++c) - for(std::map > > - ::const_iterator - i = instab.begin(); - i != instab.end(); - ++i) - { - if(i->second.first != c) continue; - //DurationInfo info = MeasureDurations(i->first); - MeasureThreaded::DurationInfoCache::iterator indo_i = measureCounter.m_durationInfo.find(i->first); - DurationInfo info = indo_i->second; -#ifdef ADLDATA_WITH_COMMENTS - { - if(info.peak_amplitude_time == 0) - { - std::fprintf(outFile, - " // Amplitude begins at %6.1f,\n" - " // fades to 20%% at %.1fs, keyoff fades to 20%% in %.1fs.\n", - info.begin_amplitude, - info.quarter_amplitude_time / double(info.interval), - info.keyoff_out_time / double(info.interval)); - } - else - { - std::fprintf(outFile, - " // Amplitude begins at %6.1f, peaks %6.1f at %.1fs,\n" - " // fades to 20%% at %.1fs, keyoff fades to 20%% in %.1fs.\n", - info.begin_amplitude, - info.peak_amplitude_value, - info.peak_amplitude_time / double(info.interval), - info.quarter_amplitude_time / double(info.interval), - info.keyoff_out_time / double(info.interval)); - } - } -#endif - - unsigned flags = (i->first.pseudo4op ? ins::Flag_Pseudo4op : 0)| - (i->first.real4op ? ins::Flag_Real4op : 0) | - (info.nosound ? ins::Flag_NoSound : 0) | i->first.rhythmModeDrum; - - std::fprintf(outFile, " {"); - std::fprintf(outFile, "%4d,%4d,%3d, %d, %6" PRId64 ",%6" PRId64 ", %6d, %g", - (unsigned) i->first.insno1, - (unsigned) i->first.insno2, - (int)(i->first.notenum), - flags, - info.ms_sound_kon, - info.ms_sound_koff, - i->first.midi_velocity_offset, - i->first.voice2_fine_tune); - std::string names; - for(std::set::const_iterator - j = i->second.second.begin(); - j != i->second.second.end(); - ++j) - { - if(!names.empty()) names += "; "; - if((*j)[0] == '\377') - names += j->substr(1); - else - names += *j; - } -#ifdef ADLDATA_WITH_COMMENTS - std::fprintf(outFile, " }, // %u: %s\n\n", (unsigned)c, names.c_str()); -#else - std::fprintf(outFile, " },\n"); -#endif - std::fflush(outFile); - adlins_flags.push_back(flags); - } - std::fprintf(outFile, "};\n\n"); - - - std::printf("Writing banks data...\n"); - std::fflush(stdout); - - //fprintf(outFile, "static const unsigned short banks[][256] =\n"); -#ifdef HARD_BANKS - const unsigned bankcount = sizeof(banknames) / sizeof(*banknames); -#else - const size_t bankcount = banknames.size(); -#endif - - size_t nosound = InsertNoSoundIns(); - - std::map > bank_data; - for(size_t bank = 0; bank < bankcount; ++bank) - { - //bool redundant = true; - std::vector data(256); - for(size_t p = 0; p < 256; ++p) - { - size_t v = progs[bank][p]; - if(v == 0 || (adlins_flags[v - 1] & 2)) - v = nosound; // Blank.in - else - v -= 1; - data[p] = v; - } - bank_data[bank] = data; - } - std::set listed; - - - std::fprintf(outFile, - "\n\n//Returns total number of generated banks\n" - "int maxAdlBanks()\n" - "{\n" - " return %u;\n" - "}\n\n" - "const char* const banknames[%u] =\n", - (unsigned int)bankcount, - (unsigned int)(bankcount + 1)); - std::fprintf(outFile, "{\n"); - for(size_t bank = 0; bank < bankcount; ++bank) - std::fprintf(outFile, " \"%s\",\n", banknames[bank].c_str()); - std::fprintf(outFile, " NULL\n};\n"); - - std::fprintf(outFile, "const unsigned short banks[%u][256] =\n", (unsigned int)bankcount); - std::fprintf(outFile, "{\n"); - for(size_t bank = 0; bank < bankcount; ++bank) - { -#ifdef ADLDATA_WITH_COMMENTS - std::fprintf(outFile, " { // bank %u, %s\n", bank, banknames[bank].c_str()); -#else - std::fprintf(outFile, " {\n"); - #endif -#ifdef ADLDATA_WITH_COMMENTS - bool redundant = true; -#endif - for(size_t p = 0; p < 256; ++p) - { - size_t v = bank_data[bank][p]; - if(listed.find(v) == listed.end()) - { - listed.insert(v); -#ifdef ADLDATA_WITH_COMMENTS - redundant = false; -#endif - } - std::fprintf(outFile, "%4d,", (unsigned int)v); - if(p % 16 == 15) fprintf(outFile, "\n"); - } - std::fprintf(outFile, " },\n"); -#ifdef ADLDATA_WITH_COMMENTS - if(redundant) - { - std::fprintf(outFile, " // Bank %u defines nothing new.\n", bank); - for(unsigned refbank = 0; refbank < bank; ++refbank) - { - bool match = true; - for(unsigned p = 0; p < 256; ++p) - if(bank_data[bank][p] != nosound - && bank_data[bank][p] != bank_data[refbank][p]) - { - match = false; - break; - } - if(match) - std::fprintf(outFile, " // Bank %u is just a subset of bank %u!\n", - bank, refbank); - } - } -#endif - } - -#endif - - -#if 0 - std::fprintf(outFile, "};\n\n"); - std::fflush(outFile); - - std::fprintf(outFile, "const AdlBankSetup adlbanksetup[%u] =\n", (unsigned)banksetup.size()); - std::fprintf(outFile, "{\n"); - { - BankSetupData::iterator last = banksetup.end(); - last--; - for(BankSetupData::iterator it = banksetup.begin(); it != banksetup.end(); it++) - { - AdlBankSetup &setup = it->second; - std::fprintf(outFile, " {%d, %d, %d, %d}", - setup.volumeModel, - setup.deepTremolo, - setup.deepVibrato, - setup.scaleModulators); - if(it != last) - std::fprintf(outFile, ", //Bank %u, %s\n", (unsigned)it->first, banknames[it->first].c_str()); - else - std::fprintf(outFile, " //Bank %u, %s\n", (unsigned)it->first, banknames[it->first].c_str()); - } - } - std::fprintf(outFile, "};\n"); - std::fflush(outFile); - - std::fclose(outFile); -#endif { measureCounter.LoadCacheX("fm_banks/adldata-cache.dat"); diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 3eb6dbd..d9df679 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -175,60 +175,6 @@ struct TinySynth writeReg((uint16_t)initdata[a], (uint8_t)initdata[a + 1]); } -// void setInstrument(const ins &in) -// { -// insdata rawData[2]; -// bool found[2] = {false, false}; -// for(InstrumentDataTab::const_iterator j = insdatatab.begin(); -// j != insdatatab.end(); -// ++j) -// { -// if(j->second.first == in.insno1) -// { -// rawData[0] = j->first; -// found[0] = true; -// if(found[1]) break; -// } -// if(j->second.first == in.insno2) -// { -// rawData[1] = j->first; -// found[1] = true; -// if(found[0]) break; -// } -// } - -// std::memset(m_x, 0, sizeof(m_x)); -// m_isRhythmMode = false; -// m_playNoteNum = in.notenum >= 128 ? (in.notenum - 128) : in.notenum; -// m_isReal4op = in.real4op && !in.pseudo4op; -// m_isPseudo4op = in.pseudo4op; -// if(m_playNoteNum == 0) -// m_playNoteNum = 25; -// m_notesNum = in.insno1 == in.insno2 ? 1 : 2; -// m_actualNotesNum = (m_isReal4op ? 1 : m_notesNum); -// m_voice1Detune = 0; -// m_noteOffsets[0] = rawData[0].finetune; -// m_noteOffsets[1] = rawData[1].finetune; -// if(in.pseudo4op) -// m_voice1Detune = in.voice2_fine_tune; -// writeReg(0x104, in.real4op ? (1 << 6) - 1 : 0x00); - -// //For cleaner measurement, disable tremolo and vibrato -// rawData[0].data[0] &= 0x3F; -// rawData[0].data[1] &= 0x3F; -// rawData[1].data[0] &= 0x3F; -// rawData[1].data[1] &= 0x3F; - -// for(unsigned n = 0; n < m_notesNum; ++n) -// { -// static const unsigned char patchdata[11] = -// {0x20, 0x23, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0x40, 0x43, 0xC0}; -// for(unsigned a = 0; a < 10; ++a) -// writeReg(patchdata[a] + n * 8, rawData[n].data[a]); -// writeReg(patchdata[10] + n * 8, rawData[n].data[10] | 0x30); -// } -// } - void setInstrument(const BanksDump &db, const BanksDump::InstrumentEntry &ins) { bool isPseudo4ops = ((ins.instFlags & BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op) != 0); @@ -332,198 +278,6 @@ struct TinySynth } }; -#if 0 -DurationInfo MeasureDurations(const ins &in, OPLChipBase *chip) -{ - AudioHistory audioHistory; - - const unsigned interval = 150; - const unsigned samples_per_interval = g_outputRate / interval; - - const double historyLength = 0.1; // maximum duration to memorize (seconds) - audioHistory.reset(std::ceil(historyLength * g_outputRate)); - - std::unique_ptr window; - window.reset(new double[audioHistory.capacity()]); - unsigned winsize = 0; - - TinySynth synth; - synth.m_chip = chip; - synth.resetChip(); - synth.setInstrument(in); - synth.noteOn(); - - /* For capturing */ - const unsigned max_silent = 6; - const unsigned max_on = 40; - const unsigned max_off = 60; - - unsigned max_period_on = max_on * interval; - unsigned max_period_off = max_off * interval; - - const double min_coefficient_on = 0.008; - const double min_coefficient_off = 0.003; - - unsigned windows_passed_on = 0; - unsigned windows_passed_off = 0; - - /* For Analyze the results */ - double begin_amplitude = 0; - double peak_amplitude_value = 0; - size_t peak_amplitude_time = 0; - size_t quarter_amplitude_time = max_period_on; - bool quarter_amplitude_time_found = false; - size_t keyoff_out_time = 0; - bool keyoff_out_time_found = false; - - const size_t audioBufferLength = 256; - const size_t audioBufferSize = 2 * audioBufferLength; - int16_t audioBuffer[audioBufferSize]; - - // For up to 40 seconds, measure mean amplitude. - double highest_sofar = 0; - short sound_min = 0, sound_max = 0; - - for(unsigned period = 0; period < max_period_on; ++period, ++windows_passed_on) - { - for(unsigned i = 0; i < samples_per_interval;) - { - size_t blocksize = samples_per_interval - i; - blocksize = (blocksize < audioBufferLength) ? blocksize : audioBufferLength; - synth.generate(audioBuffer, blocksize); - for (unsigned j = 0; j < blocksize; ++j) - { - int16_t s = audioBuffer[2 * j]; - audioHistory.add(s); - if(sound_min > s) sound_min = s; - if(sound_max < s) sound_max = s; - } - i += blocksize; - } - - if(winsize != audioHistory.size()) - { - winsize = audioHistory.size(); - HannWindow(window.get(), winsize); - } - - double rms = MeasureRMS(audioHistory.data(), window.get(), winsize); - /* ======== Peak time detection ======== */ - if(period == 0) - { - begin_amplitude = rms; - peak_amplitude_value = rms; - peak_amplitude_time = 0; - } - else if(rms > peak_amplitude_value) - { - peak_amplitude_value = rms; - peak_amplitude_time = period; - // In next step, update the quater amplitude time - quarter_amplitude_time_found = false; - } - else if(!quarter_amplitude_time_found && (rms <= peak_amplitude_value * min_coefficient_on)) - { - quarter_amplitude_time = period; - quarter_amplitude_time_found = true; - } - /* ======== Peak time detection =END==== */ - if(rms > highest_sofar) - highest_sofar = rms; - - if((period > max_silent * interval) && - ( (rms < highest_sofar * min_coefficient_on) || (sound_min >= -1 && sound_max <= 1) ) - ) - break; - } - - if(!quarter_amplitude_time_found) - quarter_amplitude_time = windows_passed_on; - - if(windows_passed_on >= max_period_on) - { - // Just Keyoff the note - synth.noteOff(); - } - else - { - // Reset the emulator and re-run the "ON" simulation until reaching the peak time - synth.resetChip(); - synth.setInstrument(in); - synth.noteOn(); - - audioHistory.reset(std::ceil(historyLength * g_outputRate)); - for(unsigned period = 0; - ((period < peak_amplitude_time) || (period == 0)) && (period < max_period_on); - ++period) - { - for(unsigned i = 0; i < samples_per_interval;) - { - size_t blocksize = samples_per_interval - i; - blocksize = (blocksize < audioBufferLength) ? blocksize : audioBufferLength; - synth.generate(audioBuffer, blocksize); - for (unsigned j = 0; j < blocksize; ++j) - audioHistory.add(audioBuffer[2 * j]); - i += blocksize; - } - } - synth.noteOff(); - } - - // Now, for up to 60 seconds, measure mean amplitude. - for(unsigned period = 0; period < max_period_off; ++period, ++windows_passed_off) - { - for(unsigned i = 0; i < samples_per_interval;) - { - size_t blocksize = samples_per_interval - i; - blocksize = (blocksize < 256) ? blocksize : 256; - synth.generate(audioBuffer, blocksize); - for (unsigned j = 0; j < blocksize; ++j) - { - int16_t s = audioBuffer[2 * j]; - audioHistory.add(s); - if(sound_min > s) sound_min = s; - if(sound_max < s) sound_max = s; - } - i += blocksize; - } - - if(winsize != audioHistory.size()) - { - winsize = audioHistory.size(); - HannWindow(window.get(), winsize); - } - - double rms = MeasureRMS(audioHistory.data(), window.get(), winsize); - /* ======== Find Key Off time ======== */ - if(!keyoff_out_time_found && (rms <= peak_amplitude_value * min_coefficient_off)) - { - keyoff_out_time = period; - keyoff_out_time_found = true; - } - /* ======== Find Key Off time ==END=== */ - if(rms < highest_sofar * min_coefficient_off) - break; - - if((period > max_silent * interval) && (sound_min >= -1 && sound_max <= 1)) - break; - } - - DurationInfo result; - result.peak_amplitude_time = peak_amplitude_time; - result.peak_amplitude_value = peak_amplitude_value; - result.begin_amplitude = begin_amplitude; - result.quarter_amplitude_time = (double)quarter_amplitude_time; - result.keyoff_out_time = (double)keyoff_out_time; - - result.ms_sound_kon = (int64_t)(quarter_amplitude_time * 1000.0 / interval); - result.ms_sound_koff = (int64_t)(keyoff_out_time * 1000.0 / interval); - result.nosound = (peak_amplitude_value < 0.5) || ((sound_min >= -1) && (sound_max <= 1)); - - return result; -} -#endif - DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &ins, OPLChipBase *chip) { AudioHistory audioHistory; @@ -791,243 +545,6 @@ MeasureThreaded::MeasureThreaded() : DosBoxOPL3::globalPreInit(); } -#if 0 -void MeasureThreaded::LoadCache(const char *fileName) -{ - m_durationInfo.clear(); - - FILE *in = std::fopen(fileName, "rb"); - if(!in) - { - std::printf("Failed to load cache: file is not exists.\n" - "Complete data will be generated from scratch.\n"); - std::fflush(stdout); - return; - } - - char magic[32]; - if(std::fread(magic, 1, 32, in) != 32) - { - std::fclose(in); - std::printf("Failed to load cache: can't read magic.\n" - "Complete data will be generated from scratch.\n"); - std::fflush(stdout); - return; - } - - if(memcmp(magic, "ADLMIDI-DURATION-CACHE-FILE-V1.0", 32) != 0) - { - std::fclose(in); - std::printf("Failed to load cache: magic missmatch.\n" - "Complete data will be generated from scratch.\n"); - std::fflush(stdout); - return; - } - - while(!std::feof(in)) - { - DurationInfo info; - ins inst; - //got by instrument - insdata id[2]; - size_t insNo[2] = {0, 0}; - bool found[2] = {false, false}; - //got from file - insdata id_f[2]; - bool found_f[2] = {false, false}; - bool isMatches = false; - - memset(id, 0, sizeof(insdata) * 2); - memset(id_f, 0, sizeof(insdata) * 2); - memset(&info, 0, sizeof(DurationInfo)); - memset(&inst, 0, sizeof(ins)); - - //Instrument - uint64_t inval; - if(std::fread(&inval, 1, sizeof(uint64_t), in) != sizeof(uint64_t)) - break; - inst.insno1 = inval; - if(std::fread(&inval, 1, sizeof(uint64_t), in) != sizeof(uint64_t)) - break; - inst.insno2 = inval; - if(std::fread(&inst.instCache1.data, 1, 11, in) != 11) - break; - if(std::fread(&inst.instCache1.finetune, 1, 1, in) != 1) - break; - if(std::fread(&inst.instCache1.diff, 1, sizeof(bool), in) != sizeof(bool)) - break; - if(std::fread(&inst.instCache2.data, 1, 11, in) != 11) - break; - if(std::fread(&inst.instCache2.finetune, 1, 1, in) != 1) - break; - if(std::fread(&inst.instCache2.diff, 1, sizeof(bool), in) != sizeof(bool)) - break; - - if(std::fread(&inst.notenum, 1, 1, in) != 1) - break; - if(std::fread(&inst.real4op, 1, 1, in) != 1) - break; - if(std::fread(&inst.pseudo4op, 1, 1, in) != 1) - break; - int64_t voice2detune = 0; - if(std::fread(&voice2detune, sizeof(int64_t), 1, in) != 1) - break; - inst.voice2_fine_tune = static_cast(voice2detune) / 1000000.0; - - //Instrument data - if(fread(found_f, 1, 2 * sizeof(bool), in) != sizeof(bool) * 2) - break; - for(size_t i = 0; i < 2; i++) - { - if(fread(id_f[i].data, 1, 11, in) != 11) - break; - if(fread(&id_f[i].finetune, 1, 1, in) != 1) - break; - if(fread(&id_f[i].diff, 1, sizeof(bool), in) != sizeof(bool)) - break; - } - - if(found_f[0] || found_f[1]) - { - for(InstrumentDataTab::const_iterator j = insdatatab.begin(); j != insdatatab.end(); ++j) - { - if(j->second.first == inst.insno1) - { - id[0] = j->first; - found[0] = (id[0] == id_f[0]); - insNo[0] = inst.insno1; - if(found[1]) break; - } - if(j->second.first == inst.insno2) - { - id[1] = j->first; - found[1] = (id[1] == id_f[1]); - insNo[1] = inst.insno2; - if(found[0]) break; - } - } - - //Find instrument entries are matching - if((found[0] != found_f[0]) || (found[1] != found_f[1])) - { - for(InstrumentDataTab::const_iterator j = insdatatab.begin(); j != insdatatab.end(); ++j) - { - if(found_f[0] && (j->first == id_f[0])) - { - found[0] = true; - insNo[0] = j->second.first; - } - if(found_f[1] && (j->first == id_f[1])) - { - found[1] = true; - insNo[1] = j->second.first; - } - if(found[0] && !found_f[1]) - { - isMatches = true; - break; - } - if(found[0] && found[1]) - { - isMatches = true; - break; - } - } - } - else - { - isMatches = true; - } - - //Then find instrument entry that uses found instruments - if(isMatches) - { - inst.insno1 = insNo[0]; - inst.insno2 = insNo[1]; - InstrumentsData::iterator d = instab.find(inst); - if(d == instab.end()) - isMatches = false; - } - } - - //Duration data - if(std::fread(&info.ms_sound_kon, 1, sizeof(int64_t), in) != sizeof(int64_t)) - break; - if(std::fread(&info.ms_sound_koff, 1, sizeof(int64_t), in) != sizeof(int64_t)) - break; - if(std::fread(&info.nosound, 1, sizeof(bool), in) != sizeof(bool)) - break; - - if(isMatches)//Store only if cached entry matches actual raw instrument data - m_durationInfo.insert({inst, info}); - } - - std::printf("Cache loaded!\n"); - std::fflush(stdout); - - std::fclose(in); -} - -void MeasureThreaded::SaveCache(const char *fileName) -{ - FILE *out = std::fopen(fileName, "wb"); - fprintf(out, "ADLMIDI-DURATION-CACHE-FILE-V1.0"); - for(DurationInfoCache::iterator it = m_durationInfo.begin(); it != m_durationInfo.end(); it++) - { - const ins &in = it->first; - insdata id[2]; - bool found[2] = {false, false}; - memset(id, 0, sizeof(insdata) * 2); - - uint64_t outval; - outval = in.insno1; - fwrite(&outval, 1, sizeof(uint64_t), out); - outval = in.insno2; - fwrite(&outval, 1, sizeof(uint64_t), out); - fwrite(&in.instCache1.data, 1, 11, out); - fwrite(&in.instCache1.finetune, 1, 1, out); - fwrite(&in.instCache1.diff, 1, sizeof(bool), out); - fwrite(&in.instCache2.data, 1, 11, out); - fwrite(&in.instCache2.finetune, 1, 1, out); - fwrite(&in.instCache2.diff, 1, sizeof(bool), out); - fwrite(&in.notenum, 1, 1, out); - fwrite(&in.real4op, 1, 1, out); - fwrite(&in.pseudo4op, 1, 1, out); - int64_t voice2detune = static_cast(in.voice2_fine_tune * 1000000.0); - fwrite(&voice2detune, sizeof(int64_t), 1, out); - - for(InstrumentDataTab::const_iterator j = insdatatab.begin(); j != insdatatab.end(); ++j) - { - if(j->second.first == in.insno1) - { - id[0] = j->first; - found[0] = true; - if(found[1]) break; - } - if(j->second.first == in.insno2) - { - id[1] = j->first; - found[1] = true; - if(found[0]) break; - } - } - - fwrite(found, 1, 2 * sizeof(bool), out); - for(size_t i = 0; i < 2; i++) - { - fwrite(id[i].data, 1, 11, out); - fwrite(&id[i].finetune, 1, 1, out); - fwrite(&id[i].diff, 1, sizeof(bool), out); - } - - fwrite(&it->second.ms_sound_kon, 1, sizeof(int64_t), out); - fwrite(&it->second.ms_sound_koff, 1, sizeof(int64_t), out); - fwrite(&it->second.nosound, 1, sizeof(bool), out); - } - std::fclose(out); -} -#endif - void MeasureThreaded::LoadCacheX(const char *fileName) { m_durationInfoX.clear(); @@ -1195,37 +712,6 @@ void MeasureThreaded::printFinal() std::fflush(stdout); } -#if 0 -void MeasureThreaded::run(InstrumentsData::const_iterator i) -{ - m_semaphore.wait(); - if(m_threads.size() > 0) - { - for(std::vector::iterator it = m_threads.begin(); it != m_threads.end();) - { - if(!(*it)->m_works) - { - delete(*it); - it = m_threads.erase(it); - } - else - it++; - } - } - - destData *dd = new destData; - dd->i = i; - dd->bd = nullptr; - dd->bd_ins = nullptr; - dd->myself = this; - dd->start(); - m_threads.push_back(dd); -#ifdef ADL_GENDATA_PRINT_PROGRESS - printProgress(); -#endif -} -#endif - void MeasureThreaded::run(BanksDump &bd, BanksDump::InstrumentEntry &e) { m_semaphore.wait(); @@ -1276,58 +762,34 @@ void MeasureThreaded::destData::callback(void *myself) { destData *s = reinterpret_cast(myself); DurationInfo info; - DosBoxOPL3 dosbox; - // NukedOPL3 dosbox; - - if(s->bd) - { - OperatorsKey ok = {s->bd_ins->ops[0], s->bd_ins->ops[1], s->bd_ins->ops[2], s->bd_ins->ops[3], - static_cast(s->bd_ins->fbConn), - s->bd_ins->noteOffset1, s->bd_ins->noteOffset2, - static_cast(s->bd_ins->percussionKeyNumber), - static_cast(s->bd_ins->instFlags), - static_cast(s->bd_ins->secondVoiceDetune)}; - s->myself->m_durationInfo_mx.lock(); - DurationInfoCacheX::iterator cachedEntry = s->myself->m_durationInfoX.find(ok); - bool atEnd = cachedEntry == s->myself->m_durationInfoX.end(); - s->myself->m_durationInfo_mx.unlock(); - - if(!atEnd) - { - const DurationInfo &di = cachedEntry->second; - s->bd_ins->delay_on_ms = di.ms_sound_kon; - s->bd_ins->delay_off_ms = di.ms_sound_koff; - if(di.nosound) - s->bd_ins->instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_IsBlank; - s->myself->m_cache_matches++; - goto endWork; - } - info = MeasureDurations(*s->bd, *s->bd_ins, &dosbox); - s->myself->m_durationInfo_mx.lock(); - s->myself->m_durationInfoX.insert({ok, info}); - s->myself->m_durationInfo_mx.unlock(); - } - else - { -#if 0 - const ins &ok = s->i->first; - s->myself->m_durationInfo_mx.lock(); - DurationInfoCache::iterator cachedEntry = s->myself->m_durationInfo.find(ok); - bool atEnd = cachedEntry == s->myself->m_durationInfo.end(); - s->myself->m_durationInfo_mx.unlock(); - - if(!atEnd) - { - s->myself->m_cache_matches++; - goto endWork; - } - - info = MeasureDurations(ok, &dosbox); - s->myself->m_durationInfo_mx.lock(); - s->myself->m_durationInfo.insert({ok, info}); - s->myself->m_durationInfo_mx.unlock(); -#endif - } + DosBoxOPL3 chip; + // NukedOPL3 chip; + + OperatorsKey ok = {s->bd_ins->ops[0], s->bd_ins->ops[1], s->bd_ins->ops[2], s->bd_ins->ops[3], + static_cast(s->bd_ins->fbConn), + s->bd_ins->noteOffset1, s->bd_ins->noteOffset2, + static_cast(s->bd_ins->percussionKeyNumber), + static_cast(s->bd_ins->instFlags), + static_cast(s->bd_ins->secondVoiceDetune)}; + s->myself->m_durationInfo_mx.lock(); + DurationInfoCacheX::iterator cachedEntry = s->myself->m_durationInfoX.find(ok); + bool atEnd = cachedEntry == s->myself->m_durationInfoX.end(); + s->myself->m_durationInfo_mx.unlock(); + + if(!atEnd) + { + const DurationInfo &di = cachedEntry->second; + s->bd_ins->delay_on_ms = di.ms_sound_kon; + s->bd_ins->delay_off_ms = di.ms_sound_koff; + if(di.nosound) + s->bd_ins->instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_IsBlank; + s->myself->m_cache_matches++; + goto endWork; + } + info = MeasureDurations(*s->bd, *s->bd_ins, &chip); + s->myself->m_durationInfo_mx.lock(); + s->myself->m_durationInfoX.insert({ok, info}); + s->myself->m_durationInfo_mx.unlock(); endWork: s->myself->m_semaphore.notify(); diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index f49b9bf..5a6acd1 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -70,11 +70,6 @@ struct MeasureThreaded std::atomic m_done; std::atomic m_cache_matches; -#if 0 - void LoadCache(const char *fileName); - void SaveCache(const char *fileName); -#endif - void LoadCacheX(const char *fileName); void SaveCacheX(const char *fileName); @@ -103,17 +98,12 @@ struct MeasureThreaded void printProgress(); void printFinal(); -#if 0 - void run(InstrumentsData::const_iterator i); -#endif + void run(BanksDump &bd, BanksDump::InstrumentEntry &e); void waitAll(); }; class OPLChipBase; -#if 0 -extern DurationInfo MeasureDurations(const ins &in, OPLChipBase *chip); -#endif extern DurationInfo MeasureDurations(const BanksDump &db, const BanksDump::InstrumentEntry &ins, OPLChipBase *chip); #endif // MEASURER_H diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index 73b05da..3ae5514 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -11,126 +11,6 @@ #include "file_formats/load_wopl.h" #include "file_formats/load_ea.h" -//InstrumentDataTab insdatatab; - -//InstrumentsData instab; -//InstProgsData progs; -//BankSetupData banksetup; - -//std::vector banknames; - -//unsigned maxvalues[30] = { 0 }; - -//void SetBank(size_t bank, unsigned patch, size_t insno) -//{ -// progs[bank][patch] = insno + 1; -//} - -//void SetBankSetup(size_t bank, const AdlBankSetup &setup) -//{ -// banksetup[bank] = setup; -//} - -//size_t InsertIns(const insdata &id, ins &in, const std::string &name, const std::string &name2) -//{ -// return InsertIns(id, id, in, name, name2, true); -//} - -//size_t InsertIns( -// const insdata &id, -// const insdata &id2, -// ins &in, -// const std::string &name, -// const std::string &name2, -// bool oneVoice) -//{ -// { -// InstrumentDataTab::iterator i = insdatatab.lower_bound(id); - -// size_t insno = ~size_t(0); -// if(i == insdatatab.end() || i->first != id) -// { -// std::pair > > res; -// res.first = id; -// res.second.first = insdatatab.size(); -// if(!name.empty()) res.second.second.insert(name); -// if(!name2.empty()) res.second.second.insert(name2); -// insdatatab.insert(i, res); -// insno = res.second.first; -// } -// else -// { -// if(!name.empty()) i->second.second.insert(name); -// if(!name2.empty()) i->second.second.insert(name2); -// insno = i->second.first; -// } - -// in.insno1 = insno; -// in.instCache1 = id; -// } - -// if(oneVoice || (id == id2)) -// { -// in.insno2 = in.insno1; -// in.instCache2 = in.instCache1; -// } -// else -// { -// InstrumentDataTab::iterator i = insdatatab.lower_bound(id2); - -// size_t insno2 = ~size_t(0); -// if(i == insdatatab.end() || i->first != id2) -// { -// std::pair > > res; -// res.first = id2; -// res.second.first = insdatatab.size(); -// if(!name.empty()) res.second.second.insert(name); -// if(!name2.empty()) res.second.second.insert(name2); -// insdatatab.insert(i, res); -// insno2 = res.second.first; -// } -// else -// { -// if(!name.empty()) i->second.second.insert(name); -// if(!name2.empty()) i->second.second.insert(name2); -// insno2 = i->second.first; -// } -// in.insno2 = insno2; -// in.instCache2 = id2; -// } - -// { -// InstrumentsData::iterator i = instab.lower_bound(in); - -// size_t resno = ~size_t(0); -// if(i == instab.end() || i->first != in) -// { -// std::pair > > res; -// res.first = in; -// res.second.first = instab.size(); -// if(!name.empty()) res.second.second.insert(name); -// if(!name2.empty()) res.second.second.insert(name2); -// instab.insert(i, res); -// resno = res.second.first; -// } -// else -// { -// if(!name.empty()) i->second.second.insert(name); -// if(!name2.empty()) i->second.second.insert(name2); -// resno = i->second.first; -// } -// return resno; -// } -//} - -//// Create silent 'nosound' instrument -//size_t InsertNoSoundIns() -//{ -// // { 0x0F70700,0x0F70710, 0xFF,0xFF, 0x0,+0 }, -// insdata tmp1 = MakeNoSoundIns(); -// struct ins tmp2; -// return InsertIns(tmp1, tmp1, tmp2, "nosound", ""); -//} insdata MakeNoSoundIns() { diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 10e29aa..2780345 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -144,44 +144,6 @@ enum VolumesModels VOLUME_9X }; -//struct AdlBankSetup -//{ -// int volumeModel; -// bool deepTremolo; -// bool deepVibrato; -// bool scaleModulators; -//}; - -//typedef std::map > > InstrumentDataTab; -//extern InstrumentDataTab insdatatab; - -//typedef std::map > > InstrumentsData; -//extern InstrumentsData instab; - -//typedef std::map > InstProgsData; -//extern InstProgsData progs; - -//typedef std::map BankSetupData; -//extern BankSetupData banksetup; - -//extern std::vector banknames; - -//static std::map > 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(); -- cgit v1.2.3 From 1b4237dffce60e8546e550767b2816c1979bbb9d Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Sun, 23 Aug 2020 23:54:07 +0300 Subject: gen_adldata: Remove more old code --- utils/gen_adldata/file_formats/common.h | 1 + utils/gen_adldata/file_formats/load_ail.h | 23 ++--- utils/gen_adldata/file_formats/load_bisqwit.h | 31 ++----- utils/gen_adldata/file_formats/load_bnk.h | 14 +-- utils/gen_adldata/file_formats/load_bnk2.h | 16 +--- utils/gen_adldata/file_formats/load_ea.h | 15 +-- utils/gen_adldata/file_formats/load_ibk.h | 18 +--- utils/gen_adldata/file_formats/load_jv.h | 35 +++---- utils/gen_adldata/file_formats/load_op2.h | 86 ++++++++--------- utils/gen_adldata/file_formats/load_tmb.h | 14 +-- utils/gen_adldata/file_formats/load_wopl.h | 72 ++++++-------- utils/gen_adldata/gen_adldata.cc | 1 - utils/gen_adldata/measurer.h | 3 - utils/gen_adldata/progs_cache.cpp | 29 +++--- utils/gen_adldata/progs_cache.h | 129 +++++++------------------- 15 files changed, 157 insertions(+), 330 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/file_formats/common.h b/utils/gen_adldata/file_formats/common.h index a03ca5d..644e7a6 100644 --- a/utils/gen_adldata/file_formats/common.h +++ b/utils/gen_adldata/file_formats/common.h @@ -1,3 +1,4 @@ +#pragma once #ifndef COMMON_H #define COMMON_H diff --git a/utils/gen_adldata/file_formats/load_ail.h b/utils/gen_adldata/file_formats/load_ail.h index 3ab38ef..d6fa014 100644 --- a/utils/gen_adldata/file_formats/load_ail.h +++ b/utils/gen_adldata/file_formats/load_ail.h @@ -104,7 +104,7 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, sprintf(name2, "%s%c%u", prefix, (gmno < 128 ? 'M' : 'P'), gmno & 127); - insdata tmp[200]; + InstBuffer tmp[200]; const unsigned inscount = (length - 3) / 11; // bool twoOp = (inscount == 1); @@ -114,8 +114,8 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, 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].finetune = (gmno < 128 && i == 0) ? notenum : 0; +// tmp[i].diff = (i == 1); uint8_t temp[11] = {0}; if(o < data.size()) @@ -144,18 +144,19 @@ bool BankFormats::LoadMiles(BanksDump &db, const char *fn, unsigned bank, 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); + db.toOps(tmp[i].d, 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; +// 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) diff --git a/utils/gen_adldata/file_formats/load_bisqwit.h b/utils/gen_adldata/file_formats/load_bisqwit.h index 478935f..63d133f 100644 --- a/utils/gen_adldata/file_formats/load_bisqwit.h +++ b/utils/gen_adldata/file_formats/load_bisqwit.h @@ -6,9 +6,9 @@ bool BankFormats::LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, const std::string &bankTitle, const char *prefix) { - #ifdef HARD_BANKS +#ifdef HARD_BANKS writeIni("Bisqwit", fn, prefix, bank, INI_Both); - #endif +#endif FILE *fp = std::fopen(fn, "rb"); if(!fp) return false; @@ -33,18 +33,12 @@ bool BankFormats::LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, cons BanksDump::InstrumentEntry inst; BanksDump::Operator ops[5]; - struct ins tmp2; - tmp2.notenum = (uint8_t)std::fgetc(fp); - tmp2.pseudo4op = false; - tmp2.voice2_fine_tune = 0.0; - tmp2.midi_velocity_offset = 0; - tmp2.rhythmModeDrum = 0; + uint8_t notenum = static_cast(std::fgetc(fp)); - insdata tmp[2]; + InstBuffer tmp[2]; for(int side = 0; side < 2; ++side) { - tmp[side].finetune = (int8_t)std::fgetc(fp); - tmp[side].diff = false; + std::fseek(fp, +1, SEEK_CUR); // skip first byte, unused "fine tune" if(std::fread(tmp[side].data, 1, 11, fp) != 11) return false; } @@ -56,21 +50,16 @@ bool BankFormats::LoadBisqwit(BanksDump &db, const char *fn, unsigned bank, cons sprintf(name2, "%s%c%u", prefix, (gmno < 128 ? 'M' : 'P'), gmno & 127); - tmp[1].diff = (tmp[0] != tmp[1]); - tmp2.real4op = tmp[1].diff; -// size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2, (tmp[0] == tmp[1])); -// SetBank(bank, gmno, resno); - - db.toOps(tmp[0], ops, 0); - if(tmp[0] != tmp[1]) + db.toOps(tmp[0].d, ops, 0); + if(tmp[0].d != tmp[1].d) { inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op; - db.toOps(tmp[1], ops, 2); + db.toOps(tmp[1].d, ops, 2); } inst.fbConn = uint_fast16_t(tmp[0].data[10]) | (uint_fast16_t(tmp[1].data[10]) << 8); - inst.percussionKeyNumber = a >= 128 ? tmp2.notenum : 0; - inst.noteOffset1 = a < 128 ? tmp2.notenum : 0; + inst.percussionKeyNumber = a >= 128 ? notenum : 0; + inst.noteOffset1 = a < 128 ? notenum : 0; db.addInstrument(bnk, patchId, inst, ops, fn); } std::fclose(fp); diff --git a/utils/gen_adldata/file_formats/load_bnk.h b/utils/gen_adldata/file_formats/load_bnk.h index ed47567..29f5494 100644 --- a/utils/gen_adldata/file_formats/load_bnk.h +++ b/utils/gen_adldata/file_formats/load_bnk.h @@ -88,7 +88,7 @@ bool BankFormats::LoadBNK(BanksDump &db, const char *fn, unsigned bank, BanksDump::InstrumentEntry inst; BanksDump::Operator ops[5]; - insdata tmp; + InstBuffer tmp; tmp.data[0] = uint8_t( (op1[ 9] << 7) // TREMOLO FLAG + (op1[10] << 6) // VIBRATO FLAG @@ -110,21 +110,13 @@ bool BankFormats::LoadBNK(BanksDump &db, const char *fn, unsigned bank, tmp.data[8] = op1[0] * 0x40 + op1[8]; // KSL , LEVEL tmp.data[9] = op2[0] * 0x40 + op2[8]; // KSL , LEVEL tmp.data[10] = op1[2] * 2 + op1[12]; // FEEDBACK, ADDITIVEFLAG - tmp.finetune = 0; - tmp.diff = false; + // Note: op2[2] and op2[12] are unused and contain garbage. - ins tmp2; - tmp2.notenum = is_fat ? voice_num : (percussive ? usage_flag : 0); - tmp2.pseudo4op = false; - tmp2.real4op = false; - tmp2.voice2_fine_tune = 0.0; - tmp2.midi_velocity_offset = 0; - tmp2.rhythmModeDrum = 0; if(is_fat) tmp.data[10] ^= 1; - db.toOps(tmp, ops, 0); + db.toOps(tmp.d, ops, 0); inst.percussionKeyNumber = is_fat ? voice_num : (percussive ? usage_flag : 0); inst.setFbConn(op1[2] * 2 + op1[12]); diff --git a/utils/gen_adldata/file_formats/load_bnk2.h b/utils/gen_adldata/file_formats/load_bnk2.h index 1d78c4b..46ba604 100644 --- a/utils/gen_adldata/file_formats/load_bnk2.h +++ b/utils/gen_adldata/file_formats/load_bnk2.h @@ -83,7 +83,7 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, BanksDump::InstrumentEntry inst; BanksDump::Operator opsD[5]; - struct insdata tmp[2]; + InstBuffer tmp[2]; for(unsigned a = 0; a < 2; ++a) { tmp[a].data[0] = ops[a * 2 + 0][0]; @@ -96,21 +96,11 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, tmp[a].data[7] = ops[a * 2 + 1][4] & 0x07; tmp[a].data[8] = ops[a * 2 + 0][1]; 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); + db.toOps(tmp[a].d, opsD, a * 2); } tmp[0].data[10] = C4xxxFFFC & 0x0F; tmp[1].data[10] = (tmp[0].data[10] & 0x0E) | (C4xxxFFFC >> 7); - ins tmp2; - tmp2.notenum = (gmno & 128) ? 35 : 0; - tmp2.pseudo4op = false; - tmp2.real4op = false; - tmp2.voice2_fine_tune = 0.0; - 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; @@ -118,8 +108,6 @@ bool BankFormats::LoadBNK2(BanksDump &db, const char *fn, unsigned bank, if(xxP24NNN & 8) { // dual-op - tmp2.real4op = true; - tmp[1].diff = true; inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op; db.addInstrument(bnk, patchId, inst, opsD, fn); } diff --git a/utils/gen_adldata/file_formats/load_ea.h b/utils/gen_adldata/file_formats/load_ea.h index 43d4d5d..5e5711e 100644 --- a/utils/gen_adldata/file_formats/load_ea.h +++ b/utils/gen_adldata/file_formats/load_ea.h @@ -69,7 +69,7 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, BanksDump::InstrumentEntry inst; BanksDump::Operator ops[5]; - insdata tmp; + InstBuffer tmp; tmp.data[0] = bytes[0]; // reg 0x20: modulator AM/VIG/EG/KSR tmp.data[8] = bytes[1]; // reg 0x40: modulator ksl/attenuation tmp.data[2] = bytes[2]; // reg 0x60: modulator attack/decay @@ -86,17 +86,10 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, tmp.data[10] = bytes[8]; // reg 0xC0 (feedback and connection) - tmp.finetune = int8_t(bytes[9] + 12); // finetune tmp.data[6] = 0; // reg 0xE0: modulator, never seems to be set tmp.data[7] = 0; // reg 0xE0: carrier, never seems to be set - ins tmp2; - tmp2.notenum = 0; - tmp2.pseudo4op = false; - tmp2.real4op = false; - tmp2.rhythmModeDrum = 0; - - db.toOps(tmp, ops, 0); + db.toOps(tmp.d, ops, 0); inst.setFbConn(bytes[8]); inst.noteOffset1 = int8_t(bytes[9] + 12); @@ -115,28 +108,24 @@ bool BankFormats::LoadEA(BanksDump &db, const char *fn, unsigned bank, if(gmno == 10) { - /*tmp.finetune=0;*/ tmp2.notenum = 0x49; inst.percussionKeyNumber = 0x49; db.addInstrument(bnkPercussion, 0x36, inst, ops, fn); } if(gmno == 18) { - /*tmp.finetune=0;*/ tmp2.notenum = 0x17; inst.percussionKeyNumber = 0x17; db.addInstrument(bnkPercussion, 0x2A, inst, ops, fn); } if(gmno == 16) { - /*tmp.finetune=0;*/ tmp2.notenum = 0x0C; inst.percussionKeyNumber = 0x0C; db.addInstrument(bnkPercussion, 0x24, inst, ops, fn); } if(gmno == 17) { - /*tmp.finetune=0;*/ tmp2.notenum = 0x01; inst.percussionKeyNumber = 0x01; db.addInstrument(bnkPercussion, 0x26, inst, ops, fn); } diff --git a/utils/gen_adldata/file_formats/load_ibk.h b/utils/gen_adldata/file_formats/load_ibk.h index d5794c5..f95a244 100644 --- a/utils/gen_adldata/file_formats/load_ibk.h +++ b/utils/gen_adldata/file_formats/load_ibk.h @@ -51,7 +51,7 @@ bool BankFormats::LoadIBK(BanksDump &db, const char *fn, unsigned bank, BanksDump::InstrumentEntry inst; BanksDump::Operator ops[5]; - insdata tmp; + InstBuffer tmp; tmp.data[0] = data[offset2 + 0]; tmp.data[1] = data[offset2 + 1]; tmp.data[8] = data[offset2 + 2]; @@ -65,44 +65,30 @@ bool BankFormats::LoadIBK(BanksDump &db, const char *fn, unsigned bank, tmp.data[10] = data[offset2 + 10]; // bisqwit: [+11] seems to be used also, what is it for? // Wohlstand: You wanna know? It's the rhythm-mode drum number! If 0 - melodic, >0 - rhythm-mode drum - tmp.finetune = percussive ? 0 : data[offset2 + 12]; - tmp.diff = false; - struct ins tmp2; - tmp2.notenum = percussive ? data[offset2 + 13] : 0; - tmp2.pseudo4op = false; - tmp2.real4op = false; - tmp2.voice2_fine_tune = 0.0; - tmp2.midi_velocity_offset = 0; - db.toOps(tmp, ops, 0); + db.toOps(tmp.d, 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) { int rm = data[offset2 + 11]; switch(rm) { 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: diff --git a/utils/gen_adldata/file_formats/load_jv.h b/utils/gen_adldata/file_formats/load_jv.h index 381f562..9281114 100644 --- a/utils/gen_adldata/file_formats/load_jv.h +++ b/utils/gen_adldata/file_formats/load_jv.h @@ -47,8 +47,9 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, BanksDump::MidiBank &bnk = isPercussion ? bnkPercussion : bnkMelodique; BanksDump::InstrumentEntry inst; BanksDump::Operator ops[5]; + uint8_t notenum; - insdata tmp[2]; + InstBuffer tmp[2]; tmp[0].data[0] = data[offset + 2]; tmp[0].data[1] = data[offset + 8]; @@ -61,8 +62,7 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, tmp[0].data[8] = data[offset + 3]; tmp[0].data[9] = data[offset + 9]; tmp[0].data[10] = data[offset + 7] & 0x0F;//~0x30; - tmp[0].finetune = 0; - tmp[0].diff = false; + inst.noteOffset1 = 0; tmp[1].data[0] = data[offset + 2 + 11]; tmp[1].data[1] = data[offset + 8 + 11]; @@ -75,30 +75,23 @@ bool BankFormats::LoadJunglevision(BanksDump &db, const char *fn, unsigned bank, tmp[1].data[8] = data[offset + 3 + 11]; tmp[1].data[9] = data[offset + 9 + 11]; tmp[1].data[10] = data[offset + 7 + 11] & 0x0F;//~0x30; - tmp[1].finetune = 0; - tmp[1].diff = (data[offset] != 0); - - struct ins tmp2; - tmp2.notenum = data[offset + 1]; - tmp2.pseudo4op = false; - tmp2.real4op = (data[offset] != 0); - tmp2.voice2_fine_tune = 0.0; - tmp2.midi_velocity_offset = 0; - tmp2.rhythmModeDrum = 0; - - while(tmp2.notenum && tmp2.notenum < 20) + inst.noteOffset2 = 0; + + notenum = data[offset + 1]; + + while(notenum && notenum < 20) { - tmp2.notenum += 12; - tmp[0].finetune -= 12; - tmp[1].finetune -= 12; + notenum += 12; + inst.noteOffset1 -= 12; + inst.noteOffset2 -= 12; } if(data[offset] != 0) inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op; - inst.percussionKeyNumber = data[offset + 1]; + inst.percussionKeyNumber = notenum; inst.setFbConn(data[offset + 7], data[offset + 7 + 11]); - db.toOps(tmp[0], ops, 0); - db.toOps(tmp[1], ops, 2); + db.toOps(tmp[0].d, ops, 0); + db.toOps(tmp[1].d, ops, 2); std::string name; if(midi_index >= 0) diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h index 0c56ef6..e43f17f 100644 --- a/utils/gen_adldata/file_formats/load_op2.h +++ b/utils/gen_adldata/file_formats/load_op2.h @@ -2,6 +2,9 @@ #define LOAD_OP2_H #include "../progs_cache.h" +#ifndef COMMON_H +#include "common.h" +#endif #ifndef _MSC_VER #define PACKED_STRUCT __attribute__((packed)) @@ -15,32 +18,32 @@ struct Doom_OPL2instrument { - unsigned char trem_vibr_1; /* OP 1: tremolo/vibrato/sustain/KSR/multi */ - unsigned char att_dec_1; /* OP 1: attack rate/decay rate */ - unsigned char sust_rel_1; /* OP 1: sustain level/release rate */ - unsigned char wave_1; /* OP 1: waveform select */ - unsigned char scale_1; /* OP 1: key scale level */ - unsigned char level_1; /* OP 1: output level */ - unsigned char feedback; /* feedback/AM-FM (both operators) */ - unsigned char trem_vibr_2; /* OP 2: tremolo/vibrato/sustain/KSR/multi */ - unsigned char att_dec_2; /* OP 2: attack rate/decay rate */ - unsigned char sust_rel_2; /* OP 2: sustain level/release rate */ - unsigned char wave_2; /* OP 2: waveform select */ - unsigned char scale_2; /* OP 2: key scale level */ - unsigned char level_2; /* OP 2: output level */ - unsigned char unused; - short basenote; /* base note offset */ + uint8_t trem_vibr_1; /* OP 1: tremolo/vibrato/sustain/KSR/multi */ + uint8_t att_dec_1; /* OP 1: attack rate/decay rate */ + uint8_t sust_rel_1; /* OP 1: sustain level/release rate */ + uint8_t wave_1; /* OP 1: waveform select */ + uint8_t scale_1; /* OP 1: key scale level */ + uint8_t level_1; /* OP 1: output level */ + uint8_t feedback; /* feedback/AM-FM (both operators) */ + uint8_t trem_vibr_2; /* OP 2: tremolo/vibrato/sustain/KSR/multi */ + uint8_t att_dec_2; /* OP 2: attack rate/decay rate */ + uint8_t sust_rel_2; /* OP 2: sustain level/release rate */ + uint8_t wave_2; /* OP 2: waveform select */ + uint8_t scale_2; /* OP 2: key scale level */ + uint8_t level_2; /* OP 2: output level */ + uint8_t unused; + uint8_t basenote[2]; /* base note offset */ } PACKED_STRUCT; struct Doom_opl_instr { - unsigned short flags; + uint8_t flags[2]; #define FL_FIXED_PITCH 0x0001 // note has fixed pitch (drum note) -#define FL_UNKNOWN 0x0002 // ??? (used in instrument #65 only) +#define FL_VIB_DELAY 0x0002 // vib_delay (used in instrument #65 only) #define FL_DOUBLE_VOICE 0x0004 // use two voices instead of one - unsigned char finetune; - unsigned char note; + uint8_t finetune; + uint8_t note; struct Doom_OPL2instrument patchdata[2]; } PACKED_STRUCT; @@ -92,10 +95,11 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s snprintf(name2, 512, "%s%c%u", prefix, (gmno < 128 ? 'M' : 'P'), gmno & 127); Doom_opl_instr &ins = *(Doom_opl_instr *) &data[offset2]; + uint16_t flags = toSint16LE(ins.flags); + + InstBuffer tmp[2] = {MakeNoSoundIns1(), MakeNoSoundIns1()}; + int16_t noteOffset[2]; - insdata tmp[2] = {MakeNoSoundIns(), MakeNoSoundIns()}; - tmp[0].diff = false; - tmp[1].diff = false; for(size_t index = 0; index < 2; ++index) { const Doom_OPL2instrument &src = ins.patchdata[index]; @@ -110,40 +114,28 @@ bool BankFormats::LoadDoom(BanksDump &db, const char *fn, unsigned bank, const s tmp[index].data[8] = src.scale_1 | src.level_1; tmp[index].data[9] = src.scale_2 | src.level_2; tmp[index].data[10] = src.feedback; - tmp[index].finetune = int8_t(src.basenote + 12); + noteOffset[index] = toSint16LE(src.basenote) + 12; inst.fbConn |= (uint_fast16_t(src.feedback) << (index == 1 ? 8 : 0)); - db.toOps(tmp[index], ops, index * 2); + db.toOps(tmp[index].d, ops, index * 2); } - struct ins tmp2; - tmp2.notenum = ins.note; - tmp2.pseudo4op = false; - tmp2.real4op = false; - tmp2.voice2_fine_tune = 0.0; - tmp2.midi_velocity_offset = 0; - tmp2.rhythmModeDrum = 0; - - while(tmp2.notenum && tmp2.notenum < 20) + + uint8_t notenum = ins.note; + + while(notenum && notenum < 20) { - tmp2.notenum += 12; - tmp[0].finetune -= 12; - tmp[1].finetune -= 12; + notenum += 12; + noteOffset[0] -= 12; + noteOffset[1] -= 12; } - inst.noteOffset1 = int8_t(tmp[0].finetune); - inst.noteOffset2 = int8_t(tmp[1].finetune); + inst.noteOffset1 = noteOffset[0]; + inst.noteOffset2 = noteOffset[1]; - if((ins.flags & FL_DOUBLE_VOICE) != 0) + if((flags & FL_DOUBLE_VOICE) != 0) inst.instFlags |= BanksDump::InstrumentEntry::WOPL_Ins_4op | BanksDump::InstrumentEntry::WOPL_Ins_Pseudo4op; - inst.percussionKeyNumber = tmp2.notenum; + inst.percussionKeyNumber = notenum; inst.secondVoiceDetune = static_cast(static_cast(ins.finetune) - 128); - if((ins.flags & FL_DOUBLE_VOICE) != 0) - { - tmp2.pseudo4op = true; - // Simulate behavior of DMX second voice detune - tmp2.voice2_fine_tune = (double)((ins.finetune >> 1) - 64) / 32.0; - } - db.addInstrument(bnk, patchId, inst, ops, fn); /*const Doom_OPL2instrument& A = ins.patchdata[0]; diff --git a/utils/gen_adldata/file_formats/load_tmb.h b/utils/gen_adldata/file_formats/load_tmb.h index 76478d1..d6fa588 100644 --- a/utils/gen_adldata/file_formats/load_tmb.h +++ b/utils/gen_adldata/file_formats/load_tmb.h @@ -41,7 +41,7 @@ bool BankFormats::LoadTMB(BanksDump &db, const char *fn, unsigned bank, const st BanksDump::InstrumentEntry inst; BanksDump::Operator ops[5]; - insdata tmp; + InstBuffer tmp; tmp.data[0] = data[offset + 0]; tmp.data[1] = data[offset + 1]; @@ -54,21 +54,11 @@ bool BankFormats::LoadTMB(BanksDump &db, const char *fn, unsigned bank, const st tmp.data[8] = data[offset + 2]; tmp.data[9] = data[offset + 3]; tmp.data[10] = data[offset + 10]; - tmp.finetune = 0; - tmp.diff = false; - - struct ins tmp2; - tmp2.notenum = data[offset + 11]; - tmp2.pseudo4op = false; - tmp2.real4op = false; - tmp2.voice2_fine_tune = 0.0; - tmp2.midi_velocity_offset = (int8_t)data[offset + 12]; - tmp2.rhythmModeDrum = 0; inst.percussionKeyNumber = data[offset + 11]; inst.midiVelocityOffset = (int8_t)data[offset + 12]; inst.fbConn = data[offset + 10]; - db.toOps(tmp, ops, 0); + db.toOps(tmp.d, ops, 0); std::string name; if(midi_index >= 0) name = std::string(1, '\377') + MidiInsName[midi_index]; diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h index 1d24dc6..6705bd9 100644 --- a/utils/gen_adldata/file_formats/load_wopl.h +++ b/utils/gen_adldata/file_formats/load_wopl.h @@ -128,7 +128,7 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s { uint32_t offset = bank_offset + uint32_t(i * insSize); std::string name; - insdata tmp[2]; + InstBuffer tmp[2]; BanksDump::InstrumentEntry inst; BanksDump::Operator ops[5]; @@ -151,53 +151,40 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s 8 Systain and Release register data 9 Wave form */ - tmp[0].data[0] = data[offset + 42 + 5];//AMVIB op1 - tmp[0].data[1] = data[offset + 42 + 0];//AMVIB op2 - tmp[0].data[2] = data[offset + 42 + 7];//AtDec op1 - tmp[0].data[3] = data[offset + 42 + 2];//AtDec op2 - tmp[0].data[4] = data[offset + 42 + 8];//SusRel op1 - tmp[0].data[5] = data[offset + 42 + 3];//SusRel op2 - tmp[0].data[6] = data[offset + 42 + 9];//Wave op1 - tmp[0].data[7] = data[offset + 42 + 4];//Wave op2 - tmp[0].data[8] = data[offset + 42 + 6];//KSL op1 - tmp[0].data[9] = data[offset + 42 + 1];//KSL op2 - tmp[0].data[10] = data[offset + 40]; //FeedBack/Connection - - tmp[1].data[0] = data[offset + 52 + 5]; - tmp[1].data[1] = data[offset + 52 + 0]; - tmp[1].data[2] = data[offset + 52 + 7]; - tmp[1].data[3] = data[offset + 52 + 2]; - tmp[1].data[4] = data[offset + 52 + 8]; - tmp[1].data[5] = data[offset + 52 + 3]; - tmp[1].data[6] = data[offset + 52 + 9]; - tmp[1].data[7] = data[offset + 52 + 4]; - tmp[1].data[8] = data[offset + 52 + 6]; - tmp[1].data[9] = data[offset + 52 + 1]; - tmp[1].data[10] = data[offset + 41]; + tmp[0].d.op1_amvib = data[offset + 42 + 5];//AMVIB op1 + tmp[0].d.op2_amvib = data[offset + 42 + 0];//AMVIB op2 + tmp[0].d.op1_atdec = data[offset + 42 + 7];//AtDec op1 + tmp[0].d.op2_atdec = data[offset + 42 + 2];//AtDec op2 + tmp[0].d.op1_susrel = data[offset + 42 + 8];//SusRel op1 + tmp[0].d.op2_susrel = data[offset + 42 + 3];//SusRel op2 + tmp[0].d.op1_wave = data[offset + 42 + 9];//Wave op1 + tmp[0].d.op2_wave = data[offset + 42 + 4];//Wave op2 + tmp[0].d.op1_ksltl = data[offset + 42 + 6];//KSL op1 + tmp[0].d.op2_ksltl = data[offset + 42 + 1];//KSL op2 + tmp[0].d.fbconn = data[offset + 40]; //FeedBack/Connection + + tmp[1].d.op1_amvib = data[offset + 52 + 5]; + tmp[1].d.op2_amvib = data[offset + 52 + 0]; + tmp[1].d.op1_atdec = data[offset + 52 + 7]; + tmp[1].d.op2_atdec = data[offset + 52 + 2]; + tmp[1].d.op1_susrel = data[offset + 52 + 8]; + tmp[1].d.op2_susrel = data[offset + 52 + 3]; + tmp[1].d.op1_wave = data[offset + 52 + 9]; + tmp[1].d.op2_wave = data[offset + 52 + 4]; + tmp[1].d.op1_ksltl = data[offset + 52 + 6]; + tmp[1].d.op2_ksltl = data[offset + 52 + 1]; + tmp[1].d.fbconn = data[offset + 41]; /* * We will don't read two millisecond delays on tail of instrument * as there are will be re-calculated by measurer here. * Those fields are made for hot-loading while runtime, but not * for generation of embedded banks database. */ - db.toOps(tmp[0], ops, 0); - db.toOps(tmp[1], ops, 2); + db.toOps(tmp[0].d, ops, 0); + db.toOps(tmp[1].d, ops, 2); - - tmp[0].finetune = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 32)); - tmp[1].finetune = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 34)); uint8_t flags = data[offset + 39]; - struct ins tmp2; - tmp2.notenum = is_percussion ? data[offset + 38] : 0; - bool real4op = (flags & (uint8_t)WOPL_Flags::Mode_4op) != 0; - tmp2.pseudo4op = (flags & (uint8_t)WOPL_Flags::Mode_DoubleVoice) != 0; - tmp2.real4op = real4op && !tmp2.pseudo4op; - tmp2.voice2_fine_tune = 0; - tmp2.midi_velocity_offset = (int8_t)data[offset + 36]; - tmp2.rhythmModeDrum = (flags & (uint8_t)WOPL_Flags::WOPL_RhythmModeMask); - tmp[0].diff = false; - tmp[1].diff = real4op && !tmp2.pseudo4op; //---------------- inst.instFlags = flags; inst.percussionKeyNumber = is_percussion ? data[offset + 38] : 0; @@ -214,13 +201,6 @@ bool BankFormats::LoadWopl(BanksDump &db, const char *fn, unsigned bank, const s } //---------------- - int8_t fine_tune = (int8_t)data[offset + 37]; - if(fine_tune != 0) - { - // Simulate behavior of DMX second voice detune - tmp2.voice2_fine_tune = (double)((((int)fine_tune + 128) >> 1) - 64) / 32.0; - } - uint32_t gmno = is_percussion ? i + 128 : i; if(is_percussion) diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index b67e53b..fe369d9 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -213,7 +213,6 @@ int main(int argc, char**argv) { measureCounter.LoadCacheX("fm_banks/adldata-cache.dat"); - measureCounter.m_durationInfo.clear(); measureCounter.m_cache_matches = 0; measureCounter.m_done = 0; measureCounter.m_total = db.instruments.size(); diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index 5a6acd1..ca05532 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -56,14 +56,12 @@ private: struct MeasureThreaded { typedef std::array OperatorsKey; - typedef std::map DurationInfoCache; typedef std::map DurationInfoCacheX; MeasureThreaded(); Semaphore m_semaphore; std::mutex m_durationInfo_mx; - DurationInfoCache m_durationInfo; DurationInfoCacheX m_durationInfoX; std::atomic_bool m_delete_tail; size_t m_total = 0; @@ -84,7 +82,6 @@ struct MeasureThreaded m_work.join(); } MeasureThreaded *myself; - std::map > >::const_iterator i; BanksDump *bd; BanksDump::InstrumentEntry *bd_ins; std::thread m_work; diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp index 3ae5514..60518ba 100644 --- a/utils/gen_adldata/progs_cache.cpp +++ b/utils/gen_adldata/progs_cache.cpp @@ -12,31 +12,28 @@ #include "file_formats/load_ea.h" -insdata MakeNoSoundIns() +InstBuffer MakeNoSoundIns1() { - insdata nosnd; + InstBuffer nosnd; uint8_t d[] = {0x00, 0x10, 0x07, 0x07, 0xF7, 0xF7, 0x00, 0x00, 0xFF, 0xFF, 0x00}; std::memcpy(nosnd.data, d, 11); - nosnd.finetune = 0; - nosnd.diff = false; return nosnd; } - -void BanksDump::toOps(const insdata &inData, BanksDump::Operator *outData, size_t begin) +void BanksDump::toOps(const InstBuffer_t &inData, BanksDump::Operator *outData, size_t begin) { outData[begin + 0].d_E862 = - uint_fast32_t(inData.data[6] << 24) - + uint_fast32_t(inData.data[4] << 16) - + uint_fast32_t(inData.data[2] << 8) - + uint_fast32_t(inData.data[0] << 0); + uint_fast32_t(inData.op1_wave << 24) + + uint_fast32_t(inData.op1_susrel << 16) + + uint_fast32_t(inData.op1_atdec << 8) + + uint_fast32_t(inData.op1_amvib << 0); outData[begin + 1].d_E862 = - uint_fast32_t(inData.data[7] << 24) - + uint_fast32_t(inData.data[5] << 16) - + uint_fast32_t(inData.data[3] << 8) - + uint_fast32_t(inData.data[1] << 0); - outData[begin + 0].d_40 = inData.data[8]; - outData[begin + 1].d_40 = inData.data[9]; + uint_fast32_t(inData.op2_wave << 24) + + uint_fast32_t(inData.op2_susrel << 16) + + uint_fast32_t(inData.op2_atdec << 8) + + uint_fast32_t(inData.op2_amvib << 0); + outData[begin + 0].d_40 = inData.op1_ksltl; + outData[begin + 1].d_40 = inData.op2_ksltl; } size_t BanksDump::initBank(size_t bankId, const std::string &title, uint_fast16_t bankSetup) diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index 2780345..6573307 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -1,3 +1,4 @@ +#pragma once #ifndef PROGS_H #define PROGS_H @@ -17,45 +18,49 @@ #include -struct insdata +struct InstBuffer_t { - uint8_t data[11]; - int8_t finetune; - bool diff; - explicit insdata() + uint8_t op1_amvib; // 0 + uint8_t op2_amvib; // 1 + uint8_t op1_atdec; // 2 + uint8_t op2_atdec; // 3 + uint8_t op1_susrel; // 4 + uint8_t op2_susrel; // 5 + uint8_t op1_wave; // 6 + uint8_t op2_wave; // 7 + uint8_t op1_ksltl; // 8 + uint8_t op2_ksltl; // 9 + uint8_t fbconn; // 10 + + bool operator==(const InstBuffer_t &b) const { - std::memset(data, 0, 11); - finetune = 0; - diff = false; + return std::memcmp(this, &b, sizeof(InstBuffer_t)) == 0; } - insdata(const insdata &b) - { - std::memcpy(data, b.data, 11); - finetune = b.finetune; - diff = b.diff; - } - bool operator==(const insdata &b) const - { - return (std::memcmp(data, b.data, 11) == 0) && (finetune == b.finetune) && (diff == b.diff); - } - bool operator!=(const insdata &b) const + + bool operator!=(const InstBuffer_t &b) const { return !operator==(b); } - bool operator<(const insdata &b) const + + bool operator<(const InstBuffer_t &b) const { - int c = std::memcmp(data, b.data, 11); + int c = std::memcmp(this, &b, 11); if(c != 0) return c < 0; - if(finetune != b.finetune) return finetune < b.finetune; - if(diff != b.diff) return (diff) == (!b.diff); return 0; } - bool operator>(const insdata &b) const + + bool operator>(const InstBuffer_t &b) const { return !operator<(b) && operator!=(b); } }; +union InstBuffer +{ + InstBuffer_t d; + uint8_t data[11]; +}; + inline bool equal_approx(double const a, double const b) { int_fast64_t ai = static_cast(a * 1000000.0); @@ -63,78 +68,6 @@ inline bool equal_approx(double const a, double const b) return ai == bi; } -struct ins -{ - enum { Flag_Pseudo4op = 0x01, Flag_NoSound = 0x02, Flag_Real4op = 0x04 }; - - enum { Flag_RM_BassDrum = 0x08, Flag_RM_Snare = 0x10, Flag_RM_TomTom = 0x18, - Flag_RM_Cymbal = 0x20, Flag_RM_HiHat = 0x28, Mask_RhythmMode = 0x38 }; - - size_t insno1, insno2; - insdata instCache1, instCache2; - unsigned char notenum; - bool pseudo4op; - bool real4op; - uint32_t rhythmModeDrum; - double voice2_fine_tune; - int8_t midi_velocity_offset; - explicit ins() : - insno1(0), - insno2(0), - notenum(0), - pseudo4op(false), - real4op(false), - rhythmModeDrum(false), - voice2_fine_tune(0.0), - midi_velocity_offset(0) - {} - - ins(const ins &o) : - insno1(o.insno1), - insno2(o.insno2), - instCache1(o.instCache1), - instCache2(o.instCache2), - notenum(o.notenum), - pseudo4op(o.pseudo4op), - real4op(o.real4op), - rhythmModeDrum(o.rhythmModeDrum), - voice2_fine_tune(o.voice2_fine_tune), - midi_velocity_offset(o.midi_velocity_offset) - {} - - bool operator==(const ins &b) const - { - return notenum == b.notenum - && insno1 == b.insno1 - && insno2 == b.insno2 - && instCache1 == b.instCache2 - && instCache2 == b.instCache2 - && pseudo4op == b.pseudo4op - && real4op == b.real4op - && rhythmModeDrum == b.rhythmModeDrum - && equal_approx(voice2_fine_tune, b.voice2_fine_tune) - && midi_velocity_offset == b.midi_velocity_offset; - } - bool operator< (const ins &b) const - { - if(insno1 != b.insno1) return insno1 < b.insno1; - if(insno2 != b.insno2) return insno2 < b.insno2; - if(instCache1 != b.instCache1) return instCache1 < b.instCache1; - if(instCache2 != b.instCache2) return instCache2 < b.instCache2; - if(notenum != b.notenum) return notenum < b.notenum; - if(pseudo4op != b.pseudo4op) return pseudo4op < b.pseudo4op; - if(real4op != b.real4op) return real4op < b.real4op; - if(rhythmModeDrum != b.rhythmModeDrum) return rhythmModeDrum < b.rhythmModeDrum; - if(!equal_approx(voice2_fine_tune, b.voice2_fine_tune)) return voice2_fine_tune < b.voice2_fine_tune; - if(midi_velocity_offset != b.midi_velocity_offset) return midi_velocity_offset < b.midi_velocity_offset; - return 0; - } - bool operator!=(const ins &b) const - { - return !operator==(b); - } -}; - enum VolumesModels { VOLUME_Generic, @@ -144,7 +77,7 @@ enum VolumesModels VOLUME_9X }; -insdata MakeNoSoundIns(); +InstBuffer MakeNoSoundIns1(); @@ -360,7 +293,7 @@ struct BanksDump std::vector instruments; std::vector operators; - static void toOps(const insdata &inData, Operator *outData, size_t begin = 0); + static void toOps(const InstBuffer_t &inData, Operator *outData, size_t begin = 0); //! WIP static bool isSilent(const BanksDump &db, const BanksDump::InstrumentEntry &ins, bool moreInfo = false); static bool isSilent(const Operator *ops, uint_fast16_t fbConn, size_t countOps = 2, bool pseudo4op = false, bool moreInfo = false); -- cgit v1.2.3 From 30504f2ff0fc73ecb4ee6330b17cc768a8686d86 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 24 Aug 2020 00:49:32 +0300 Subject: gen_adldata: rename some *X suffixes As old calls has been removed, they no longer need to have X suffix --- utils/gen_adldata/gen_adldata.cc | 4 ++-- utils/gen_adldata/measurer.cpp | 18 +++++++++--------- utils/gen_adldata/measurer.h | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) (limited to 'utils') diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc index fe369d9..45f0c7c 100644 --- a/utils/gen_adldata/gen_adldata.cc +++ b/utils/gen_adldata/gen_adldata.cc @@ -212,7 +212,7 @@ int main(int argc, char**argv) MeasureThreaded measureCounter; { - measureCounter.LoadCacheX("fm_banks/adldata-cache.dat"); + measureCounter.LoadCache("fm_banks/adldata-cache.dat"); measureCounter.m_cache_matches = 0; measureCounter.m_done = 0; measureCounter.m_total = db.instruments.size(); @@ -225,7 +225,7 @@ int main(int argc, char**argv) } std::fflush(stdout); measureCounter.waitAll(); - measureCounter.SaveCacheX("fm_banks/adldata-cache.dat"); + measureCounter.SaveCache("fm_banks/adldata-cache.dat"); } db.exportBanks(std::string(outFile_s)); diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index d9df679..af9e0da 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -545,9 +545,9 @@ MeasureThreaded::MeasureThreaded() : DosBoxOPL3::globalPreInit(); } -void MeasureThreaded::LoadCacheX(const char *fileName) +void MeasureThreaded::LoadCache(const char *fileName) { - m_durationInfoX.clear(); + m_durationInfo.clear(); FILE *in = std::fopen(fileName, "rb"); if(!in) @@ -626,7 +626,7 @@ void MeasureThreaded::LoadCacheX(const char *fileName) v.ms_sound_koff = static_cast(toUint16LE(data_k + 2)); v.nosound = (data_k[4] == 0x01); - m_durationInfoX.insert({k, v}); + m_durationInfo.insert({k, v}); itemsCount--; } @@ -636,12 +636,12 @@ void MeasureThreaded::LoadCacheX(const char *fileName) std::fclose(in); } -void MeasureThreaded::SaveCacheX(const char *fileName) +void MeasureThreaded::SaveCache(const char *fileName) { FILE *out = std::fopen(fileName, "wb"); std::fprintf(out, "ADLMIDI-DURATION-CACHE-FILE-V2.0"); - uint_fast32_t itemsCount = static_cast(m_durationInfoX.size()); + uint_fast32_t itemsCount = static_cast(m_durationInfo.size()); uint8_t itemsCountA[4] = { static_cast((itemsCount >> 0) & 0xFF), @@ -651,7 +651,7 @@ void MeasureThreaded::SaveCacheX(const char *fileName) }; std::fwrite(itemsCountA, 1, 4, out); - for(DurationInfoCacheX::iterator it = m_durationInfoX.begin(); it != m_durationInfoX.end(); it++) + for(DurationInfoCacheX::iterator it = m_durationInfo.begin(); it != m_durationInfo.end(); it++) { const OperatorsKey &k = it->first; const DurationInfo &v = it->second; @@ -772,8 +772,8 @@ void MeasureThreaded::destData::callback(void *myself) static_cast(s->bd_ins->instFlags), static_cast(s->bd_ins->secondVoiceDetune)}; s->myself->m_durationInfo_mx.lock(); - DurationInfoCacheX::iterator cachedEntry = s->myself->m_durationInfoX.find(ok); - bool atEnd = cachedEntry == s->myself->m_durationInfoX.end(); + DurationInfoCacheX::iterator cachedEntry = s->myself->m_durationInfo.find(ok); + bool atEnd = cachedEntry == s->myself->m_durationInfo.end(); s->myself->m_durationInfo_mx.unlock(); if(!atEnd) @@ -788,7 +788,7 @@ void MeasureThreaded::destData::callback(void *myself) } info = MeasureDurations(*s->bd, *s->bd_ins, &chip); s->myself->m_durationInfo_mx.lock(); - s->myself->m_durationInfoX.insert({ok, info}); + s->myself->m_durationInfo.insert({ok, info}); s->myself->m_durationInfo_mx.unlock(); endWork: diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index ca05532..e521451 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -62,14 +62,14 @@ struct MeasureThreaded Semaphore m_semaphore; std::mutex m_durationInfo_mx; - DurationInfoCacheX m_durationInfoX; + DurationInfoCacheX m_durationInfo; std::atomic_bool m_delete_tail; size_t m_total = 0; std::atomic m_done; std::atomic m_cache_matches; - void LoadCacheX(const char *fileName); - void SaveCacheX(const char *fileName); + void LoadCache(const char *fileName); + void SaveCache(const char *fileName); struct destData { -- cgit v1.2.3 From 98e239c7aa86a73e1fa29e331c2258990be0470e Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 24 Aug 2020 23:21:53 +0300 Subject: ADLMIDI2: Fixed an "bank always 0" bug --- utils/adlmidi-2/midiplay.cc | 3 +++ 1 file changed, 3 insertions(+) (limited to 'utils') diff --git a/utils/adlmidi-2/midiplay.cc b/utils/adlmidi-2/midiplay.cc index 773e766..c77d180 100644 --- a/utils/adlmidi-2/midiplay.cc +++ b/utils/adlmidi-2/midiplay.cc @@ -1902,6 +1902,9 @@ int main(int argc, char **argv) AdlInstrumentTester InstrumentTester(myDevice); + if(DoingInstrumentTesting) + InstrumentTester.start(); + //static std::vector sample_buf; #ifdef __DJGPP__ double tick_delay = 0.0; -- cgit v1.2.3 From 3b4096c9d36cfd28c8995a3f37614da0c3ce0d10 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Tue, 25 Aug 2020 21:15:49 +0300 Subject: Back-port a recent update of reverb code for adlmidi2 https://github.com/bisqwit/adlmidi/commit/8f749a2b3370fb1c25f6340fcab7baf57cb9b5d0 --- utils/adlmidi-2/midiplay.cc | 372 +++++++++++++++++++++++++++----------------- 1 file changed, 225 insertions(+), 147 deletions(-) (limited to 'utils') diff --git a/utils/adlmidi-2/midiplay.cc b/utils/adlmidi-2/midiplay.cc index c77d180..7867968 100644 --- a/utils/adlmidi-2/midiplay.cc +++ b/utils/adlmidi-2/midiplay.cc @@ -94,7 +94,6 @@ static const unsigned OPLBase = 0x388; #endif static unsigned NumCards = 2; static bool AdlPercussionMode = false; -static bool ReverbIsOn = true; static bool QuitFlag = false, FakeDOSshell = false; static bool DoingInstrumentTesting = false; static bool WritePCMfile = false; @@ -765,10 +764,10 @@ struct Reverb /* This reverb implementation is based on Freeverb impl. in Sox */ std::vector out[2]; std::deque input_fifo; - void Create(double sample_rate_Hz, - double wet_gain_dB, - double room_scale, double reverberance, double fhf_damping, /* 0..1 */ - double pre_delay_s, double stereo_depth, + void Create(float sample_rate_Hz, + float wet_gain_dB, + float room_scale, float reverberance, float fhf_damping, /* 0..1 */ + float pre_delay_s, float stereo_depth, size_t buffer_size) { size_t delay = static_cast(pre_delay_s * sample_rate_Hz + .5); @@ -796,25 +795,116 @@ struct Reverb /* This reverb implementation is based on Freeverb impl. in Sox */ input_fifo.erase(input_fifo.begin(), input_fifo.begin() + length); } }; +static union ReverbSpecs +{ + float array[7]; + struct byname + { + float do_reverb; // boolean... + float wet_gain_db; // wet_gain_dB (-10..10) + float room_scale; // room_scale (0..1) + float reverberance; // reverberance (0..1) + float hf_damping; // hf_damping (0..1) + float pre_delay_s; // pre_delay_s (0.. 0.5) + float stereo_depth; // stereo_depth (0..1) + } byname = {1.f, 6.f, .7f, .6f, .8f, 0.f, 1.f}; +} ReverbSpecs; static struct MyReverbData { - bool wetonly; + float wetonly; Reverb chan[2]; - MyReverbData() : wetonly(false) + MyReverbData() { - for(size_t i = 0; i < 2; ++i) + ReInit(); + } + void ReInit() + { + wetonly = ReverbSpecs.byname.do_reverb; + for(std::size_t i=0; i<2; ++i) + { chan[i].Create(PCM_RATE, - 6.0, // wet_gain_dB (-10..10) - .7, // room_scale (0..1) - .6, // reverberance (0..1) - .8, // hf_damping (0..1) - .000, // pre_delay_s (0.. 0.5) - 1, // stereo_depth (0..1) - MaxSamplesAtTime); + ReverbSpecs.byname.wet_gain_db, + ReverbSpecs.byname.room_scale, + ReverbSpecs.byname.reverberance, + ReverbSpecs.byname.hf_damping, + ReverbSpecs.byname.pre_delay_s, + ReverbSpecs.byname.stereo_depth, + MaxSamplesAtTime); + } } } reverb_data; +static void ParseReverb(std::string specs) +{ + while(!specs.empty()) + { + std::size_t colon = specs.find(':'); + if(colon == 0) + { + specs.erase(0, 1); + continue; + } + if(colon == specs.npos) + { + colon = specs.size(); + } + std::string term(&specs[0], colon); + if(!term.empty()) + { + std::size_t eq = specs.find('='); + std::size_t key_end = (eq == specs.npos) ? specs.size() : eq; + std::size_t value_begin = (eq == specs.npos) ? specs.size() : (eq+1); + std::string key(&term[0], key_end); + std::string value(&term[value_begin], term.size()-value_begin); + float floatvalue = std::strtof(&value[0], nullptr); // FIXME: Requires specs to be nul-terminated + //if(!value.empty()) + // std::from_chars(&value[0], &value[value.size()], floatvalue); // Not implemented in GCC + + // Create a hash of the key + //Good: start=0x266191FB6907,mul=0x1,add=0x3238000,perm=0xF3B47F00, mod=21,shift=12 distance = 21 min=0 max=20 + std::uint_fast64_t a=0xF5A9AADABAC7, b=0xC08F0800, c=0xA06C000, d=0x336A683E37B6, result=a + d*key.size(); + unsigned mod=19, shift=3; + for(unsigned char ch: key) + { + result += ch; + result = (result ^ (result >> (1 + 1 * ((shift>>0) & 7)))) * b; + result = (result ^ (result >> (1 + 1 * ((shift>>3) & 7)))) * c; + } + unsigned index = result % mod; + // switch(index) { + // case 0: index = 2; break; // room, room_scale, scale, room-scale, roomscale + // case 1: index = 1; break; // g + // case 2: index = 6; break; // stereo, depth, stereo_depth, stereo-depth, stereodepth, width, s + // case 3: index = 3; break; // reverberance, factor, f + // case 4: index = 0; break; // none, off + // case 5: index = 0; break; // false + // case 6: index = 4; break; // hf, hf_damping, hf-damping, damping, dampening + // case 7: index = 0; break; // no + // case 8: index = 6; break; // wide + // case 9: index = 5; break; // delay, pre_delay, pre-delay, predelay, seconds, wait + // case 10: index = 4; break; // damp, d + // case 11: index = 1; break; // gain, wet_gain, wetgain, wet + // case 13: index = 2; break; // r + // case 15: index = 3; break; // amount + // case 16: index = 3; break; // reverb + // case 18: index = 5; break; // w + // } + index = (05733727145604003612 >> (index * 3)) & 7; + if(index < 7) ReverbSpecs.array[index] = floatvalue; + } + specs.erase(specs.begin(), specs.begin() + colon); + } + std::fprintf(stderr, "Reverb settings: Wet-dry=%g gain=%g room=%g reverb=%g damping=%g delay=%g stereo=%g\n", + ReverbSpecs.array[0], + ReverbSpecs.byname.wet_gain_db, + ReverbSpecs.byname.room_scale, + ReverbSpecs.byname.reverberance, + ReverbSpecs.byname.hf_damping, + ReverbSpecs.byname.pre_delay_s, + ReverbSpecs.byname.stereo_depth); +} + #ifdef _WIN32 namespace WindowsAudio { @@ -989,16 +1079,15 @@ struct FourChars }; - -static void SendStereoAudio(unsigned long count, short *samples) +static void SendStereoAudio(unsigned long count, short* samples) { if(count > MaxSamplesAtTime) { SendStereoAudio(MaxSamplesAtTime, samples); - SendStereoAudio(count - MaxSamplesAtTime, samples + MaxSamplesAtTime); + SendStereoAudio(count-MaxSamplesAtTime, samples+MaxSamplesAtTime); return; } - #if 0 +#if 0 if(count % 2 == 1) { // An uneven number of samples? To avoid complicating matters, @@ -1006,22 +1095,21 @@ static void SendStereoAudio(unsigned long count, short *samples) count -= 1; samples += 1; } - #endif +#endif if(!count) return; // Attempt to filter out the DC component. However, avoid doing // sudden changes to the offset, for it can be audible. - double average[2] = {0, 0}; - for(unsigned w = 0; w < 2; ++w) + double average[2]={0,0}; + for(unsigned w=0; w<2; ++w) for(unsigned long p = 0; p < count; ++p) - average[w] += samples[p * 2 + w]; - static float prev_avg_flt[2] = {0, 0}; + average[w] += samples[p*2+w]; + static float prev_avg_flt[2] = {0,0}; float average_flt[2] = { - prev_avg_flt[0] = (float)((double(prev_avg_flt[0]) + average[0] * 0.04 / double(count)) / 1.04), - prev_avg_flt[1] = (float)((double(prev_avg_flt[1]) + average[1] * 0.04 / double(count)) / 1.04) + prev_avg_flt[0] = (prev_avg_flt[0] + average[0]*0.04/double(count)) / 1.04, + prev_avg_flt[1] = (prev_avg_flt[1] + average[1]*0.04/double(count)) / 1.04 }; - // Figure out the amplitude of both channels if(!DoingInstrumentTesting) { @@ -1029,17 +1117,17 @@ static void SendStereoAudio(unsigned long count, short *samples) if(!amplitude_display_counter--) { amplitude_display_counter = (PCM_RATE / count) / 24; - double amp[2] = {0, 0}; - for(unsigned w = 0; w < 2; ++w) + double amp[2]={0,0}; + for(unsigned w=0; w<2; ++w) { average[w] /= double(count); for(unsigned long p = 0; p < count; ++p) - amp[w] += std::fabs(samples[p * 2 + w] - average[w]); + amp[w] += std::fabs(samples[p*2+w] - average[w]); amp[w] /= double(count); // Turn into logarithmic scale - const double dB = std::log(amp[w] < 1 ? 1 : amp[w]) * 4.328085123; - const double maxdB = 3 * 16; // = 3 * log2(65536) - amp[w] = dB / maxdB; + const double dB = std::log(amp[w]<1 ? 1 : amp[w]) * 4.328085123; + const double maxdB = 3*16; // = 3 * log2(65536) + amp[w] = dB/maxdB; } UI.IllustrateVolumes(amp[0], amp[1]); } @@ -1047,108 +1135,87 @@ static void SendStereoAudio(unsigned long count, short *samples) //static unsigned counter = 0; if(++counter < 8000) return; - #if defined(_WIN32) && 0 +#if defined(__WIN32__) && 0 // Cheat on dosbox recording: easier on the cpu load. + {count*=2; + std::vector AudioBuffer(count); + for(unsigned long p = 0; p < count; ++p) + AudioBuffer[p] = samples[p]; + WindowsAudio::Write( (const unsigned char*) &AudioBuffer[0], count*2); + return;} +#endif + + // Convert input to float format + std::vector dry[2]; + for(unsigned w=0; w<2; ++w) { - count *= 2; - std::vector AudioBuffer(count); + dry[w].resize(count); + float a = average_flt[w]; for(unsigned long p = 0; p < count; ++p) - AudioBuffer[p] = samples[p]; - WindowsAudio::Write((const unsigned char *) &AudioBuffer[0], count * 2); - return; + { + int s = samples[p*2+w]; + dry[w][p] = (s - a) * double(0.3/32768.0); + } + // ^ Note: ftree-vectorize causes an error in this loop on g++-4.4.5 + reverb_data.chan[w].input_fifo.insert( + reverb_data.chan[w].input_fifo.end(), + dry[w].begin(), dry[w].end()); } - #endif + // Reverbify it + for(unsigned w=0; w<2; ++w) + reverb_data.chan[w].Process(count); - #ifdef _WIN32 - std::vector AudioBuffer(count * 2); + // Convert to signed 16-bit int format and put to playback queue +#ifdef __WIN32__ + std::vector AudioBuffer(count*2); const size_t pos = 0; - #else +#else AudioBuffer_lock.Lock(); size_t pos = AudioBuffer.size(); - AudioBuffer.resize(pos + count * 2); - #endif - - if(ReverbIsOn) - { - // Convert input to float format - std::vector dry[2]; - for(unsigned w = 0; w < 2; ++w) + AudioBuffer.resize(pos + count*2); +#endif + for(unsigned long p = 0; p < count; ++p) + for(unsigned w=0; w<2; ++w) { - dry[w].resize(count); - float a = average_flt[w]; - for(unsigned long p = 0; p < count; ++p) - { - int s = samples[p * 2 + w]; - dry[w][p] = static_cast((s - a) * double(0.3 / 32768.0)); - } - // ^ Note: ftree-vectorize causes an error in this loop on g++-4.4.5 - reverb_data.chan[w].input_fifo.insert( - reverb_data.chan[w].input_fifo.end(), - dry[w].begin(), dry[w].end()); + float out = ((1 - reverb_data.wetonly) * dry[w][p] + + reverb_data.wetonly * ( + .5 * (reverb_data.chan[0].out[w][p] + + reverb_data.chan[1].out[w][p])) + ) * 32768.0f + + average_flt[w]; + AudioBuffer[pos+p*2+w] = + out<-32768.f ? -32768 : + out>32767.f ? 32767 : out; } - // Reverbify it - for(unsigned w = 0; w < 2; ++w) - reverb_data.chan[w].Process(count); - - // Convert to signed 16-bit int format and put to playback queue - for(unsigned long p = 0; p < count; ++p) - for(unsigned w = 0; w < 2; ++w) - { - float out = static_cast((1 - reverb_data.wetonly) * dry[w][p] + - .5 * (reverb_data.chan[0].out[w][p] - + reverb_data.chan[1].out[w][p])) * 32768.0f - + average_flt[w]; - AudioBuffer[pos + p * 2 + w] = - static_cast( - out < -32768.f ? -32768 : - out > 32767.f ? 32767 : out - ); - } - } - else - { - for(unsigned long p = 0; p < count; ++p) - for(unsigned w = 0; w < 2; ++w) - { -// float out = ((1 - reverb_data.wetonly) * dry[w][p] + -// .5 * (reverb_data.chan[0].out[w][p] -// + reverb_data.chan[1].out[w][p])) * 32768.0f -// + average_flt[w]; - AudioBuffer[pos + p * 2 + w] = samples[p * 2 + w]; - } - } - - if(WritePCMfile) { /* HACK: Cheat on DOSBox recording: Record audio separately on Windows. */ - static FILE *fp = nullptr; + static FILE* fp = nullptr; if(!fp) { fp = PCMfilepath == "-" ? stdout - : fopen(PCMfilepath.c_str(), "wb"); + : fopen(PCMfilepath.c_str(), "wb"); if(fp) { - FourChars Bufs[] = - { + FourChars Bufs[] = { "RIFF", (0x24u), // RIFF type, file length - 8 "WAVE", // WAVE file "fmt ", (0x10u), // fmt subchunk, which is 16 bytes: - "\1\0\2\0", // PCM (1) & stereo (2) - (48000u), // sampling rate - (48000u * 2 * 2), // byte rate - "\2\0\20\0", // block align & bits per sample + "\1\0\2\0", // PCM (1) & stereo (2) + (48000u ), // sampling rate + (48000u*2*2), // byte rate + "\2\0\20\0", // block align & bits per sample "data", (0x00u) // data subchunk, which is so far 0 bytes. }; - for(unsigned c = 0; c < sizeof(Bufs) / sizeof(*Bufs); ++c) + for(unsigned c=0; c= 48000*4*10*60) // raise(SIGINT); } - - #ifdef SUPPORT_VIDEO_OUTPUT +#ifdef SUPPORT_VIDEO_OUTPUT if(WriteVideoFile) { static constexpr unsigned framerate = 15; - static FILE *fp = nullptr; + static FILE* fp = nullptr; static unsigned long samples_carry = 0; if(!fp) @@ -1200,7 +1266,7 @@ static void SendStereoAudio(unsigned long count, short *samples) { UI.VidRender(); - const unsigned char *source = (const unsigned char *)&UI.PixelBuffer; + const unsigned char* source = (const unsigned char*)&UI.PixelBuffer; std::size_t bytes_remain = sizeof(UI.PixelBuffer); while(bytes_remain) { @@ -1213,14 +1279,13 @@ static void SendStereoAudio(unsigned long count, short *samples) } } } - #endif - - #ifndef _WIN32 +#endif +#ifndef __WIN32__ AudioBuffer_lock.Unlock(); - #else +#else if(!WritePCMfile) - WindowsAudio::Write((const unsigned char *) &AudioBuffer[0], static_cast(2 * AudioBuffer.size())); - #endif + WindowsAudio::Write( (const unsigned char*) &AudioBuffer[0], 2*AudioBuffer.size()); +#endif } #endif /* not DJGPP */ @@ -1605,21 +1670,26 @@ int main(int argc, char **argv) "\n\n" "Usage: adlmidi [ ] [ [ [ ] ] ]\n" " adlmidi -1 To enter instrument tester\n" - // " -p Enables adlib percussion instrument mode (use with CMF files)\n" - " -t Enables tremolo amplification mode\n" - " -v Enables vibrato amplification mode\n" - " -s Enables scaling of modulator volumes\n" - " -frb Enables full-ranged CC74 XG Brightness controller\n" - " -nl Quit without looping\n" - " -nr Disables the reverb effect\n" - " -w [] Write WAV file rather than playing\n" - " -d [] Write video file using ffmpeg\n" - #ifndef HARDWARE_OPL3 - " -fp Enables full-panning stereo support\n" - " --emu-nuked Uses Nuked OPL3 v 1.8 emulator\n" - " --emu-nuked7 Uses Nuked OPL3 v 1.7.4 emulator\n" - " --emu-dosbox Uses DosBox 0.74 OPL3 emulator\n" - #endif + // " -p Enables adlib percussion instrument mode (use with CMF files)\n" + " -t Enables tremolo amplification mode\n" + " -v Enables vibrato amplification mode\n" + " -s Enables scaling of modulator volumes\n" + " -frb Enables full-ranged CC74 XG Brightness controller\n" + " -nl Quit without looping\n" +#ifndef HARDWARE_OPL3 + " -reverb Controls reverb (default: gain=6:room=.7:factor=.6:damping=.8:predelay=0:stereo=1)\n" + " -reverb none Disables reverb (also -nr)\n" +#endif + " -w [] Write WAV file rather than playing\n" +#ifdef SUPPORT_VIDEO_OUTPUT + " -d [] Write video file using ffmpeg\n" +#endif +#ifndef HARDWARE_OPL3 + " -fp Enables full-panning stereo support\n" + " --emu-nuked Uses Nuked OPL3 v 1.8 emulator\n" + " --emu-nuked7 Uses Nuked OPL3 v 1.7.4 emulator\n" + " --emu-dosbox Uses DosBox 0.74 OPL3 emulator\n" +#endif ); int banksCount = adl_getBanksCount(); const char *const *bankNames = adl_getBankNames(); @@ -1693,6 +1763,15 @@ int main(int argc, char **argv) emulator = ADLMIDI_EMU_NUKED_174; else if(!std::strcmp("--emu-dosbox", argv[2])) emulator = ADLMIDI_EMU_DOSBOX; +#endif +#ifndef __DJGPP__ + else if(!std::strcmp("-nr", argv[2])) + ParseReverb("none"); + else if(!std::strcmp("-reverb", argv[2])) + { + ParseReverb(argv[3]); + had_option = true; + } #endif else if(!std::strcmp("-w", argv[2])) { @@ -1712,7 +1791,7 @@ int main(int argc, char **argv) } } } - #ifdef SUPPORT_VIDEO_OUTPUT +#ifdef SUPPORT_VIDEO_OUTPUT else if(!std::strcmp("-d", argv[2])) { loopEnabled = 0; @@ -1727,11 +1806,9 @@ int main(int argc, char **argv) } } } - #endif +#endif else if(!std::strcmp("-s", argv[2])) adl_setScaleModulators(myDevice, 1); - else if(!std::strcmp("-nr", argv[2])) - ReverbIsOn = false; else break; std::copy(argv + (had_option ? 4 : 3), argv + argc, argv + 2); @@ -1878,7 +1955,7 @@ int main(int argc, char **argv) return 2; } - #ifdef __DJGPP__ +#ifdef __DJGPP__ unsigned TimerPeriod = 0x1234DDul / NewTimerFreq; //disable(); @@ -1888,17 +1965,18 @@ int main(int argc, char **argv) //enable(); unsigned long BIOStimer_begin = BIOStimer; - #else +#else //const double maxdelay = MaxSamplesAtTime / (double)PCM_RATE; + reverb_data.ReInit(); - #ifdef _WIN32 +#ifdef _WIN32 WindowsAudio::Open(PCM_RATE, 2, 16); - #else +#else SDL_PauseAudio(0); - #endif +#endif - #endif /* djgpp */ +#endif /* djgpp */ AdlInstrumentTester InstrumentTester(myDevice); @@ -1906,14 +1984,14 @@ int main(int argc, char **argv) InstrumentTester.start(); //static std::vector sample_buf; - #ifdef __DJGPP__ +#ifdef __DJGPP__ double tick_delay = 0.0; - #endif +#endif - #ifndef __DJGPP__ +#ifndef __DJGPP__ //sample_buf.resize(1024); short buff[1024]; - #endif +#endif UI.TetrisLaunched = true; while(!QuitFlag) -- cgit v1.2.3