Skip to content

Commit

Permalink
FM Instrument format fixes
Browse files Browse the repository at this point in the history
1,2 operator swap, fix key on.
CH3 mode 2 bits.
CH3 Frequences
  • Loading branch information
realmonster committed Feb 23, 2013
1 parent 779b0e9 commit baa1951
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 23 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -13,3 +13,4 @@
*.lai
*.la
*.a
*.lib
13 changes: 9 additions & 4 deletions gems_instruments.cpp
Expand Up @@ -10,7 +10,7 @@ char *fm_format[] =
{
"??????tt",
"????ovvv",
"?m??????",
"mm??????",
"??fffaaa",
"lraa?fff",

Expand Down Expand Up @@ -228,8 +228,8 @@ int main(int argc, char **args)
printf("AMS: %X\n", (int)fm.AMS);
printf("FB: %X\n", (int)fm.FB);
printf("ALG: %X\n", (int)fm.ALG);
printf("LR: %c%c\n", (int)fm.L,(int)fm.R);
printf("CH3_on: %X\n", (int)fm.CH3_on);
printf("LR: %d%d\n", (int)fm.L,(int)fm.R);
printf("CH3: %X\n", (int)fm.CH3);
printf("LFO_on: %X\n", (int)fm.LFO_on);
printf("LFO_val: %X\n", (int)fm.LFO_val);
printf("KEY: ");
Expand All @@ -240,7 +240,10 @@ int main(int argc, char **args)
{
printf("Operator %d:\n", i+1);
printf("TL: %X\n", (int)fm.OP[i].TL);
printf("DT: %X\n", (int)fm.OP[i].DT);
printf("DT: %X=%d\n", (int)fm.OP[i].DT,
fm.OP[i].DT&4
? -((fm.OP[i].DT)&3)
: fm.OP[i].DT);
printf("MT: %X\n", (int)fm.OP[i].MT);
printf("RS: %X\n", (int)fm.OP[i].RS);
printf("AR: %X\n", (int)fm.OP[i].AR);
Expand All @@ -251,6 +254,8 @@ int main(int argc, char **args)
printf("RR: %X\n", (int)fm.OP[i].RR);
printf("\n");
}
for (int i=0; i<4; ++i)
printf("Channel 3 Operator %d Frequency: %X\n", i+1,(int)fm.CH3_F[i]);
}
else if (it == GEMSI_DAC)
{
Expand Down
18 changes: 8 additions & 10 deletions instruments.cpp
Expand Up @@ -24,36 +24,34 @@ void GemsFM::Set(BYTE *data)
LFO_val = data[1]&7;

// Offset 2
unk2 = data[2]>>7;
CH3_on = (data[2]>>6)&1;
unk3 = data[2]&0x3F;
CH3 = data[2]>>6;
unk2 = data[2]&0x3F;

// Offset 3
unk4 = data[3]>>6;
unk3 = data[3]>>6;
FB = (data[3]>>3)&7;
ALG = data[3]&7;

// Offset 4
L = data[4]>>7;
R = (data[4]>>6)&1;
AMS = (data[4]>>4)&3;
unk5 = (data[4]>>3)&1;
unk4 = (data[4]>>3)&1;
FMS = data[4]&7;

for (int i = 0; i < 4; ++i)
OP[i].Set(data + 5 + i*6);
OP[i].Set(data + 5 + ((i<<1|i>>1)&3)*6);

for (int i = 0; i < 4; ++i)
unk6[i] = GetWordBE(data + 29 + i*2);
CH3_F[i] = GetWordBE(data + 29 + i*2);

unk7 = data[37]>>4;
unk6 = data[37]>>4;
KEY = data[37]&0xF;
unk8 = data[38];
unk7 = data[38];
}

bool GemsFM::IsOn(int op)
{
op = ((op<<1)|(op>>1))&3; // swap bits
return KEY&(1<<op);
}

Expand Down
17 changes: 8 additions & 9 deletions instruments.h
Expand Up @@ -53,29 +53,28 @@ struct GemsFM : GemsInstrument
BYTE LFO_val; // : 3; // Low Frequency Oscilator value

// Offset 2:
BYTE unk2 ; // : 1;
BYTE CH3_on ; // : 1; // Channel 3 mode on
BYTE unk3 ; // : 6;
BYTE CH3 ; // : 1; // Channel 3 mode
BYTE unk2 ; // : 6;

// Offset 3:
BYTE unk4 ; // : 2;
BYTE unk3 ; // : 2;
BYTE FB ; // : 3; // Feedback
BYTE ALG ; // : 3; // Algorithm

// Offset 4:
BYTE L ; // : 1; // Left channel on
BYTE R ; // : 1; // Right channel on
BYTE AMS ; // : 2; // AMS
BYTE unk5 ; // : 1;
BYTE unk4 ; // : 1;
BYTE FMS ; // : 3; // FMS

// Offset 5;
GemsFMOperator OP[4];
short unk6[4];
BYTE unk7 ; // : 4;
short CH3_F[4]; // Channel 3 Frequency
BYTE unk6 ; // : 4;
BYTE KEY ; // : 4; // Operator On[4]
BYTE unk8 ; // : 8;
BYTE unk9[0];
BYTE unk7 ; // : 8;
BYTE unk8[0];

void Set(BYTE *data);

Expand Down

0 comments on commit baa1951

Please sign in to comment.