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/load_ail.h | 153 +++++++++++++++++++++++++++++- 1 file changed, 151 insertions(+), 2 deletions(-) (limited to 'utils/gen_adldata/file_formats/load_ail.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; -- 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/gen_adldata/file_formats/load_ail.h') 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 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/gen_adldata/file_formats/load_ail.h') 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 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 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'utils/gen_adldata/file_formats/load_ail.h') 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); } } -- 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 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'utils/gen_adldata/file_formats/load_ail.h') 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); -- 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 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'utils/gen_adldata/file_formats/load_ail.h') 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); -- 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/load_ail.h | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'utils/gen_adldata/file_formats/load_ail.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) -- cgit v1.2.3