diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-02-16 15:56:22 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-02-16 15:56:22 +0300 |
commit | 4091cf15cd5273f1381f1ed6d3e836774f9ac0e8 (patch) | |
tree | ee1bf4c4f779f4588c900ecf2a50d587b96aba44 /src/gen_adldata/gen_adldata.cc | |
parent | c633aca82114442ecc94ae4bc443daa9f3f947b5 (diff) | |
download | libADLMIDI-4091cf15cd5273f1381f1ed6d3e836774f9ac0e8.tar.gz libADLMIDI-4091cf15cd5273f1381f1ed6d3e836774f9ac0e8.tar.bz2 libADLMIDI-4091cf15cd5273f1381f1ed6d3e836774f9ac0e8.zip |
Fix processing of the drums of AIL banks!
The field B_transpose on drums means note number, and is no need extra calculations
Here is a right specification for AIL's bank format, gotten from AIL 2 sources which are been published by Miles
```
//GTL - "Global Timbre Bank"
struct GTL Head // GTL file header entry structure
{
uint8_t patch;
uint8_t bank;
uint32_t offset;
}
//- Length is 6 bytes
//Look for timbre until .patch will equal to 0xFF, then look for each instrument
Note:
DW - Define Word - uint16_t
DB - Define Byte - uint8_t
BNK STRUC ;.BNK-style timbre definition
B_length dw ? ; lenght of timbre entry
B_transpose db ?
B_mod_AVEKM db ? ;op_0 = FM modulator
B_mod_KSLTL db ?
B_mod_AD db ?
B_mod_SR db ?
B_mod_WS db ?
B_fb_c db ?
B_car_AVEKM db ? ;op_1 = FM carrier
B_car_KSLTL db ?
B_car_AD db ?
B_car_SR db ?
B_car_WS db ?
ENDS
OPL3BNK STRUC ;.BNK-style OPL3 timbre definition
BNK <>
O_mod_AVEKM db ? ;op_2
O_mod_KSLTL db ?
O_mod_AD db ?
O_mod_SR db ?
O_mod_WS db ?
O_fb_c db ?
O_car_AVEKM db ? ;op_3
O_car_KSLTL db ?
O_car_AD db ?
O_car_SR db ?
O_car_WS db ?
ENDS
```
Diffstat (limited to 'src/gen_adldata/gen_adldata.cc')
-rw-r--r-- | src/gen_adldata/gen_adldata.cc | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/gen_adldata/gen_adldata.cc b/src/gen_adldata/gen_adldata.cc index 187d079..78dfbbc 100644 --- a/src/gen_adldata/gen_adldata.cc +++ b/src/gen_adldata/gen_adldata.cc @@ -517,18 +517,20 @@ static void LoadMiles(const char* fn, unsigned bank, const char* prefix) for(unsigned a=0; a<2000; ++a) { - unsigned gmnumber = data[a*6+0]; - unsigned gmnumber2 = data[a*6+1]; + unsigned gm_patch = data[a*6+0]; + unsigned gm_bank = data[a*6+1]; unsigned offset = *(unsigned*)&data[a*6+2]; - if(gmnumber == 0xFF) break; - int gmno = gmnumber2==0x7F ? gmnumber+0x80 : gmnumber; + if(gm_patch == 0xFF) + break; + + int gmno = gm_bank==0x7F ? gm_patch + 0x80 : 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 = data[offset+2]; + signed char notenum = ((signed char)data[offset+2]); /*printf("%02X %02X %08X ", gmnumber,gmnumber2, offset); for(unsigned b=0; b<length; ++b) @@ -538,10 +540,11 @@ static void LoadMiles(const char* fn, unsigned bank, const char* prefix) } printf("\n");*/ - if(gmnumber2 != 0 && gmnumber2 != 0x7F) continue; + if(gm_bank != 0 && gm_bank != 0x7F) + continue; char name2[512]; sprintf(name2, "%s%c%u", prefix, - (gmno<128?'M':'P'), gmno&127); + (gmno < 128 ? 'M':'P'), gmno & 127); insdata tmp[200]; @@ -550,7 +553,7 @@ static void LoadMiles(const char* fn, unsigned bank, const char* prefix) { unsigned o = offset + 3 + i*11; tmp[i].finetune = (gmno < 128 && i == 0) ? notenum : 0; - tmp[i].diff=false; + tmp[i].diff = false; 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 @@ -570,11 +573,13 @@ static void LoadMiles(const char* fn, unsigned bank, const char* prefix) tmp[1].data[10] = (fb_c & 0x0E) | (fb_c >> 7); } } - if(inscount == 1) tmp[1] = tmp[0]; + if(inscount == 1) + tmp[1] = tmp[0]; + if(inscount <= 2) { struct ins tmp2; - tmp2.notenum = gmno < 128 ? 0 : data[offset+3]; + tmp2.notenum = gmno < 128 ? 0 : notenum; tmp2.pseudo4op = false; tmp2.fine_tune = 0.0; std::string name; |