aboutsummaryrefslogtreecommitdiff
path: root/src/gen_adldata/gen_adldata.cc
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2017-02-16 15:56:22 +0300
committerWohlstand <admin@wohlnet.ru>2017-02-16 15:56:22 +0300
commit4091cf15cd5273f1381f1ed6d3e836774f9ac0e8 (patch)
treeee1bf4c4f779f4588c900ecf2a50d587b96aba44 /src/gen_adldata/gen_adldata.cc
parentc633aca82114442ecc94ae4bc443daa9f3f947b5 (diff)
downloadlibADLMIDI-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.cc25
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;