OPZ: add FMS2/AMS2 macros
This commit is contained in:
parent
beb7411ba7
commit
2e9621073e
|
@ -130,6 +130,9 @@ the following instrument types are available:
|
|||
- 61: GBA MinMod
|
||||
- 62: Bifurcator
|
||||
- 63: SID2
|
||||
- 64: Supervision
|
||||
- 65: µPD1771C
|
||||
- 66: SID3
|
||||
|
||||
the following feature codes are recognized:
|
||||
|
||||
|
@ -255,6 +258,8 @@ size | description
|
|||
| - 17: ex6
|
||||
| - 18: ex7
|
||||
| - 19: ex8
|
||||
| - 20: ex9
|
||||
| - 21: ex10
|
||||
| - 255: stop reading and move on
|
||||
1 | macro length
|
||||
1 | macro loop
|
||||
|
|
|
@ -221,6 +221,8 @@ SafeWriter* DivEngine::saveText(bool separatePatterns) {
|
|||
writeTextMacro(w,ins->std.ex6Macro,"ex6",header);
|
||||
writeTextMacro(w,ins->std.ex7Macro,"ex7",header);
|
||||
writeTextMacro(w,ins->std.ex8Macro,"ex8",header);
|
||||
writeTextMacro(w,ins->std.ex9Macro,"ex9",header);
|
||||
writeTextMacro(w,ins->std.ex10Macro,"ex10",header);
|
||||
writeTextMacro(w,ins->std.algMacro,"alg",header);
|
||||
writeTextMacro(w,ins->std.fbMacro,"fb",header);
|
||||
writeTextMacro(w,ins->std.fmsMacro,"fms",header);
|
||||
|
|
|
@ -360,6 +360,8 @@ DivInstrumentMacro* DivInstrumentSTD::macroByType(DivMacroType type) {
|
|||
CONSIDER(ex6Macro,DIV_MACRO_EX6)
|
||||
CONSIDER(ex7Macro,DIV_MACRO_EX7)
|
||||
CONSIDER(ex8Macro,DIV_MACRO_EX8)
|
||||
CONSIDER(ex9Macro,DIV_MACRO_EX9)
|
||||
CONSIDER(ex10Macro,DIV_MACRO_EX10)
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -648,6 +650,8 @@ void DivInstrument::writeFeatureMA(SafeWriter* w) {
|
|||
writeMacro(w,std.ex6Macro);
|
||||
writeMacro(w,std.ex7Macro);
|
||||
writeMacro(w,std.ex8Macro);
|
||||
writeMacro(w,std.ex9Macro);
|
||||
writeMacro(w,std.ex10Macro);
|
||||
|
||||
// "stop reading" code
|
||||
w->writeC(-1);
|
||||
|
@ -1520,7 +1524,9 @@ void DivInstrument::putInsData2(SafeWriter* w, bool fui, const DivSong* song, bo
|
|||
std.ex5Macro.len ||
|
||||
std.ex6Macro.len ||
|
||||
std.ex7Macro.len ||
|
||||
std.ex8Macro.len) {
|
||||
std.ex8Macro.len ||
|
||||
std.ex9Macro.len ||
|
||||
std.ex10Macro.len) {
|
||||
featureMA=true;
|
||||
}
|
||||
|
||||
|
@ -1874,6 +1880,12 @@ void DivInstrument::readFeatureMA(SafeReader& reader, short version) {
|
|||
case 19:
|
||||
target=&std.ex8Macro;
|
||||
break;
|
||||
case 20:
|
||||
target=&std.ex9Macro;
|
||||
break;
|
||||
case 21:
|
||||
target=&std.ex10Macro;
|
||||
break;
|
||||
default:
|
||||
logW("invalid macro code %d!");
|
||||
break;
|
||||
|
|
|
@ -123,7 +123,9 @@ enum DivMacroType: unsigned char {
|
|||
DIV_MACRO_EX5,
|
||||
DIV_MACRO_EX6,
|
||||
DIV_MACRO_EX7,
|
||||
DIV_MACRO_EX8
|
||||
DIV_MACRO_EX8,
|
||||
DIV_MACRO_EX9,
|
||||
DIV_MACRO_EX10
|
||||
};
|
||||
|
||||
enum DivMacroTypeOp: unsigned char {
|
||||
|
@ -301,6 +303,8 @@ struct DivInstrumentSTD {
|
|||
DivInstrumentMacro ex6Macro;
|
||||
DivInstrumentMacro ex7Macro;
|
||||
DivInstrumentMacro ex8Macro;
|
||||
DivInstrumentMacro ex9Macro;
|
||||
DivInstrumentMacro ex10Macro;
|
||||
|
||||
struct OpMacro {
|
||||
// ar, dr, mult, rr, sl, tl, dt2, rs, dt, d2r, ssgEnv;
|
||||
|
@ -354,7 +358,9 @@ struct DivInstrumentSTD {
|
|||
ex5Macro(DIV_MACRO_EX5),
|
||||
ex6Macro(DIV_MACRO_EX6),
|
||||
ex7Macro(DIV_MACRO_EX7),
|
||||
ex8Macro(DIV_MACRO_EX8) {
|
||||
ex8Macro(DIV_MACRO_EX8),
|
||||
ex9Macro(DIV_MACRO_EX9),
|
||||
ex10Macro(DIV_MACRO_EX10) {
|
||||
for (int i=0; i<4; i++) {
|
||||
opMacros[i].amMacro.macroType=DIV_MACRO_OP_AM+(i<<5);
|
||||
opMacros[i].arMacro.macroType=DIV_MACRO_OP_AR+(i<<5);
|
||||
|
|
|
@ -242,6 +242,8 @@ void DivMacroInt::mask(unsigned char id, bool enabled) {
|
|||
CONSIDER(ex6,17)
|
||||
CONSIDER(ex7,18)
|
||||
CONSIDER(ex8,19)
|
||||
CONSIDER(ex9,20)
|
||||
CONSIDER(ex10,21)
|
||||
|
||||
CONSIDER_OP(0,0x20)
|
||||
CONSIDER_OP(2,0x40)
|
||||
|
@ -309,6 +311,8 @@ void DivMacroInt::restart(unsigned char id) {
|
|||
CONSIDER(ex6,ex6Macro,17)
|
||||
CONSIDER(ex7,ex7Macro,18)
|
||||
CONSIDER(ex8,ex8Macro,19)
|
||||
CONSIDER(ex9,ex9Macro,20)
|
||||
CONSIDER(ex10,ex10Macro,21)
|
||||
|
||||
CONSIDER_OP(0,0x20)
|
||||
CONSIDER_OP(2,0x40)
|
||||
|
@ -418,6 +422,12 @@ void DivMacroInt::init(DivInstrument* which) {
|
|||
if (ins->std.ex8Macro.len>0) {
|
||||
ADD_MACRO(ex8,ins->std.ex8Macro);
|
||||
}
|
||||
if (ins->std.ex9Macro.len>0) {
|
||||
ADD_MACRO(ex9,ins->std.ex9Macro);
|
||||
}
|
||||
if (ins->std.ex10Macro.len>0) {
|
||||
ADD_MACRO(ex10,ins->std.ex10Macro);
|
||||
}
|
||||
|
||||
// prepare FM operator macros
|
||||
for (int i=0; i<4; i++) {
|
||||
|
@ -559,6 +569,8 @@ DivMacroStruct* DivMacroInt::structByType(unsigned char type) {
|
|||
CONSIDER(ex6,DIV_MACRO_EX6)
|
||||
CONSIDER(ex7,DIV_MACRO_EX7)
|
||||
CONSIDER(ex8,DIV_MACRO_EX8)
|
||||
CONSIDER(ex9,DIV_MACRO_EX9)
|
||||
CONSIDER(ex10,DIV_MACRO_EX10)
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
|
@ -75,6 +75,7 @@ class DivMacroInt {
|
|||
DivMacroStruct duty, wave, pitch, ex1, ex2, ex3;
|
||||
DivMacroStruct alg, fb, fms, ams;
|
||||
DivMacroStruct panL, panR, phaseReset, ex4, ex5, ex6, ex7, ex8;
|
||||
DivMacroStruct ex9, ex10;
|
||||
|
||||
// FM operator macro
|
||||
struct IntOp {
|
||||
|
@ -180,6 +181,8 @@ class DivMacroInt {
|
|||
ex6(DIV_MACRO_EX6),
|
||||
ex7(DIV_MACRO_EX7),
|
||||
ex8(DIV_MACRO_EX8),
|
||||
ex9(DIV_MACRO_EX9),
|
||||
ex10(DIV_MACRO_EX10),
|
||||
hasRelease(false) {
|
||||
memset(macroList,0,128*sizeof(void*));
|
||||
memset(macroSource,0,128*sizeof(void*));
|
||||
|
|
|
@ -255,6 +255,14 @@ void DivPlatformTX81Z::tick(bool sysTick) {
|
|||
chan[i].state.ams=chan[i].std.ams.val;
|
||||
rWrite(chanOffs[i]+ADDR_FMS_AMS,((chan[i].state.fms&7)<<4)|(chan[i].state.ams&3));
|
||||
}
|
||||
if (chan[i].std.ex9.had) {
|
||||
chan[i].state.fms2=chan[i].std.ex9.val;
|
||||
rWrite(chanOffs[i]+ADDR_FMS2_AMS2,((chan[i].state.fms2&7)<<4)|(chan[i].state.ams2&3));
|
||||
}
|
||||
if (chan[i].std.ex10.had) {
|
||||
chan[i].state.ams2=chan[i].std.ex10.val;
|
||||
rWrite(chanOffs[i]+ADDR_FMS2_AMS2,((chan[i].state.fms2&7)<<4)|(chan[i].state.ams2&3));
|
||||
}
|
||||
for (int j=0; j<4; j++) {
|
||||
unsigned short baseAddr=chanOffs[i]|opOffs[j];
|
||||
DivInstrumentFM::Operator& op=chan[i].state.op[j];
|
||||
|
|
|
@ -6649,9 +6649,10 @@ void FurnaceGUI::drawInsEdit() {
|
|||
macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_FB),&ins->std.fbMacro,0,7,96,uiColors[GUI_COLOR_MACRO_OTHER]));
|
||||
if (ins->type!=DIV_INS_OPL && ins->type!=DIV_INS_OPL_DRUMS) {
|
||||
if (ins->type==DIV_INS_OPZ) {
|
||||
// TODO: FMS2/AMS2 macros
|
||||
macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_FMS),&ins->std.fmsMacro,0,7,96,uiColors[GUI_COLOR_MACRO_OTHER]));
|
||||
macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_AMS),&ins->std.amsMacro,0,3,48,uiColors[GUI_COLOR_MACRO_OTHER]));
|
||||
macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_FMS2),&ins->std.ex9Macro,0,7,96,uiColors[GUI_COLOR_MACRO_OTHER]));
|
||||
macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_AMS2),&ins->std.ex10Macro,0,3,48,uiColors[GUI_COLOR_MACRO_OTHER]));
|
||||
} else {
|
||||
macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_FMS),&ins->std.fmsMacro,0,7,96,uiColors[GUI_COLOR_MACRO_OTHER]));
|
||||
macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_AMS),&ins->std.amsMacro,0,3,48,uiColors[GUI_COLOR_MACRO_OTHER]));
|
||||
|
|
Loading…
Reference in a new issue