From eb45a7913d83fe2a3dc03033230950e78fb9755d Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Fri, 20 Oct 2017 04:28:53 +0300 Subject: Added CMake support --- utils/dumpbank/dumpbank.cpp | 179 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 utils/dumpbank/dumpbank.cpp (limited to 'utils/dumpbank/dumpbank.cpp') diff --git a/utils/dumpbank/dumpbank.cpp b/utils/dumpbank/dumpbank.cpp new file mode 100644 index 0000000..6996681 --- /dev/null +++ b/utils/dumpbank/dumpbank.cpp @@ -0,0 +1,179 @@ +//#ifdef __MINGW32__ +//typedef struct vswprintf {} swprintf; +//#endif +#include +#include +#include + +struct BNK1_header +{ + char maj_vers, min_vers; + char signature[6]; // "ADLIB-" + unsigned short ins_used, ins_entries; + unsigned name_list, inst_data; +} __attribute__((packed)); +struct BNK1_record +{ + unsigned short index; + unsigned char used; + char name[9]; +} __attribute__((packed)); +struct OPL2_op +{ + unsigned char key_scale_lvl; + unsigned char freq_mult; + unsigned char feedback; + unsigned char attack; + unsigned char sustain_lvl; + unsigned char sustain_sound; + unsigned char decay; + unsigned char release; + unsigned char out_lvl; + unsigned char amp_vib; + unsigned char pitch_vib; + unsigned char env_scaling; + unsigned char connection; +} __attribute__((packed)); +struct BNK1_instrument +{ + unsigned char sound_mode; + unsigned char voice_num; + OPL2_op ops[2]; + unsigned char waveforms[2]; +} __attribute__((packed)); // conventional Ad Lib instrument maker bankfile patch + +struct BNK2_header +{ + char signature[28]; // "Accomp. Bank, (C) AdLib Inc" + unsigned short file_ver; + char filler[10]; + unsigned short ins_entries, ins_used; + int lostSpace; +} __attribute__((packed)); +struct BNK2_record +{ + char O3_sig[3]; + char key[12]; + char used; + int attrib, dataOffset; + unsigned short blockSize, allocBSize; +} __attribute__((packed)); +struct OPL3_op +{ + unsigned char AVEKMMMM, KKLLLLLL; + unsigned char AAAADDDD, SSSSRRRR; + unsigned char DxxxxWWW, xxxxxxxx; +} __attribute__((packed)); +struct BNK2_instrument +{ + OPL3_op ops[4]; + unsigned char C4xxxFFFC; + unsigned char xxP24NNN; + unsigned char TTTTTTTT; + unsigned char xxxxxxxx; +} __attribute__((packed)); // Ad Lib Gold instrument maker bankfile patch + +static void LoadBNK1(const std::vector& data) +{ + const BNK1_header& bnk1 = *(const BNK1_header*) &data[0]; + const BNK1_record* names = (const BNK1_record*) &data[ bnk1.name_list ]; + const BNK1_instrument* ins = (const BNK1_instrument*) &data[ bnk1.inst_data ]; + std::printf("BNK1 version: %d.%d\n", bnk1.maj_vers, bnk1.min_vers); + for(unsigned a=0; a& data) +{ + const BNK2_header& bnk2 = *(const BNK2_header*) &data[0]; + const BNK2_record* names = (const BNK2_record*) &data[ sizeof(bnk2) ]; + std::printf("BNK2 version: %d, lost space %d\n", bnk2.file_ver, bnk2.lostSpace); + for(unsigned a=0; a data(ftell(fp)); + std::rewind(fp); + size_t got = std::fread(&data[0], 1, data.size(), fp); + std::fclose(fp); + + if(got == 0) + { + std::fprintf(stderr, "ERROR: Can't read %s file!", fn); + return; + } + + const BNK1_header& bnk1 = *(const BNK1_header*) &data[0]; + const BNK2_header& bnk2 = *(const BNK2_header*) &data[0]; + + if(std::memcmp(bnk1.signature, "ADLIB-", 6) == 0) + LoadBNK1(data); + else if(std::memcmp(bnk2.signature, "Accomp. Bank, (C) AdLib Inc", 28) == 0) + LoadBNK2(data); + else + std::fprintf(stderr, "%s: Unknown format\n", fn); +} + +int main(int argc, const char* const* argv) +{ + LoadBNK(argv[1]); +} -- cgit v1.2.3