OPM/NES ins type split, part 4
This commit is contained in:
parent
d2a417e1d5
commit
3eb4f997da
|
@ -337,7 +337,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
|
||||||
}
|
}
|
||||||
logD("%d name: %s",i,ins->name.c_str());
|
logD("%d name: %s",i,ins->name.c_str());
|
||||||
if (ds.version<0x0b) {
|
if (ds.version<0x0b) {
|
||||||
// instruments in ancient versions were all FM or STD.
|
// instruments in ancient versions were all FM.
|
||||||
mode=1;
|
mode=1;
|
||||||
} else {
|
} else {
|
||||||
mode=reader.readC();
|
mode=reader.readC();
|
||||||
|
@ -366,6 +366,12 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
|
||||||
if (ds.system[0]==DIV_SYSTEM_YMU759) {
|
if (ds.system[0]==DIV_SYSTEM_YMU759) {
|
||||||
ins->type=DIV_INS_OPL;
|
ins->type=DIV_INS_OPL;
|
||||||
}
|
}
|
||||||
|
if (ds.system[0]==DIV_SYSTEM_ARCADE) {
|
||||||
|
ins->type=DIV_INS_OPM;
|
||||||
|
}
|
||||||
|
if ((ds.system[0]==DIV_SYSTEM_NES || ds.system[0]==DIV_SYSTEM_NES_VRC7 || ds.system[0]==DIV_SYSTEM_NES_FDS) && ins->type==DIV_INS_STD) {
|
||||||
|
ins->type=DIV_INS_NES;
|
||||||
|
}
|
||||||
|
|
||||||
if (mode) { // FM
|
if (mode) { // FM
|
||||||
if (ds.version>0x05) {
|
if (ds.version>0x05) {
|
||||||
|
@ -1919,6 +1925,57 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// convert OPM/NES instrument types
|
||||||
|
if (ds.version<117) {
|
||||||
|
int opnCount=0;
|
||||||
|
int opmCount=0;
|
||||||
|
int snCount=0;
|
||||||
|
int nesCount=0;
|
||||||
|
for (int i=0; i<ds.systemLen; i++) {
|
||||||
|
switch (ds.system[i]) {
|
||||||
|
case DIV_SYSTEM_NES:
|
||||||
|
case DIV_SYSTEM_MMC5:
|
||||||
|
nesCount++;
|
||||||
|
break;
|
||||||
|
case DIV_SYSTEM_SMS:
|
||||||
|
snCount++;
|
||||||
|
break;
|
||||||
|
case DIV_SYSTEM_YM2151:
|
||||||
|
case DIV_SYSTEM_OPZ:
|
||||||
|
opmCount++;
|
||||||
|
break;
|
||||||
|
case DIV_SYSTEM_YM2610:
|
||||||
|
case DIV_SYSTEM_YM2610_EXT:
|
||||||
|
case DIV_SYSTEM_YM2610_FULL:
|
||||||
|
case DIV_SYSTEM_YM2610_FULL_EXT:
|
||||||
|
case DIV_SYSTEM_YM2610B:
|
||||||
|
case DIV_SYSTEM_YM2610B_EXT:
|
||||||
|
case DIV_SYSTEM_OPN:
|
||||||
|
case DIV_SYSTEM_OPN_EXT:
|
||||||
|
case DIV_SYSTEM_PC98:
|
||||||
|
case DIV_SYSTEM_PC98_EXT:
|
||||||
|
case DIV_SYSTEM_YM2612:
|
||||||
|
case DIV_SYSTEM_YM2612_EXT:
|
||||||
|
case DIV_SYSTEM_YM2612_FRAC:
|
||||||
|
case DIV_SYSTEM_YM2612_FRAC_EXT:
|
||||||
|
opnCount++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opmCount>opnCount) {
|
||||||
|
for (DivInstrument* i: ds.ins) {
|
||||||
|
if (i->type==DIV_INS_FM) i->type=DIV_INS_OPM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nesCount>snCount) {
|
||||||
|
for (DivInstrument* i: ds.ins) {
|
||||||
|
if (i->type==DIV_INS_STD) i->type=DIV_INS_NES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (active) quitDispatch();
|
if (active) quitDispatch();
|
||||||
BUSY_BEGIN_SOFT;
|
BUSY_BEGIN_SOFT;
|
||||||
saveLock.lock();
|
saveLock.lock();
|
||||||
|
@ -3237,7 +3294,7 @@ bool DivEngine::loadFTM(unsigned char* file, size_t len) {
|
||||||
unsigned char insType=reader.readC();
|
unsigned char insType=reader.readC();
|
||||||
switch (insType) {
|
switch (insType) {
|
||||||
case 1:
|
case 1:
|
||||||
ins->type=DIV_INS_STD;
|
ins->type=DIV_INS_NES;
|
||||||
break;
|
break;
|
||||||
case 2: // TODO: tell VRC6 and VRC6 saw instruments apart
|
case 2: // TODO: tell VRC6 and VRC6 saw instruments apart
|
||||||
ins->type=DIV_INS_VRC6;
|
ins->type=DIV_INS_VRC6;
|
||||||
|
@ -3264,7 +3321,7 @@ bool DivEngine::loadFTM(unsigned char* file, size_t len) {
|
||||||
|
|
||||||
// instrument data
|
// instrument data
|
||||||
switch (ins->type) {
|
switch (ins->type) {
|
||||||
case DIV_INS_STD: {
|
case DIV_INS_NES: {
|
||||||
unsigned int totalSeqs=reader.readI();
|
unsigned int totalSeqs=reader.readI();
|
||||||
if (totalSeqs>5) {
|
if (totalSeqs>5) {
|
||||||
logE("%d: too many sequences!",insIndex);
|
logE("%d: too many sequences!",insIndex);
|
||||||
|
@ -4183,7 +4240,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (DivInstrument* i: song.ins) {
|
for (DivInstrument* i: song.ins) {
|
||||||
if (i->type==DIV_INS_FM) {
|
if (i->type==DIV_INS_FM || i->type==DIV_INS_OPM) {
|
||||||
addWarning("no FM macros in .dmf format");
|
addWarning("no FM macros in .dmf format");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4194,11 +4251,14 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
|
||||||
w->writeString(i->name,true);
|
w->writeString(i->name,true);
|
||||||
|
|
||||||
// safety check
|
// safety check
|
||||||
if (!isFMSystem(sys) && i->type!=DIV_INS_STD && i->type!=DIV_INS_FDS) {
|
if (!isFMSystem(sys) && i->type!=DIV_INS_STD && i->type!=DIV_INS_NES && i->type!=DIV_INS_FDS) {
|
||||||
switch (song.system[0]) {
|
switch (song.system[0]) {
|
||||||
case DIV_SYSTEM_GB:
|
case DIV_SYSTEM_GB:
|
||||||
i->type=DIV_INS_GB;
|
i->type=DIV_INS_GB;
|
||||||
break;
|
break;
|
||||||
|
case DIV_SYSTEM_NES:
|
||||||
|
i->type=DIV_INS_NES;
|
||||||
|
break;
|
||||||
case DIV_SYSTEM_C64_6581:
|
case DIV_SYSTEM_C64_6581:
|
||||||
case DIV_SYSTEM_C64_8580:
|
case DIV_SYSTEM_C64_8580:
|
||||||
i->type=DIV_INS_C64;
|
i->type=DIV_INS_C64;
|
||||||
|
@ -4215,12 +4275,16 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!isSTDSystem(sys) && i->type!=DIV_INS_FM) {
|
if (!isSTDSystem(sys) && i->type!=DIV_INS_FM && i->type!=DIV_INS_OPM) {
|
||||||
|
if (sys==DIV_SYSTEM_ARCADE) {
|
||||||
|
i->type=DIV_INS_OPM;
|
||||||
|
} else {
|
||||||
i->type=DIV_INS_FM;
|
i->type=DIV_INS_FM;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
w->writeC((i->type==DIV_INS_FM || i->type==DIV_INS_OPLL)?1:0);
|
w->writeC((i->type==DIV_INS_FM || i->type==DIV_INS_OPM || i->type==DIV_INS_OPLL)?1:0);
|
||||||
if (i->type==DIV_INS_FM || i->type==DIV_INS_OPLL) { // FM
|
if (i->type==DIV_INS_FM || i->type==DIV_INS_OPM || i->type==DIV_INS_OPLL) { // FM
|
||||||
w->writeC(i->fm.alg);
|
w->writeC(i->fm.alg);
|
||||||
w->writeC(i->fm.fb);
|
w->writeC(i->fm.fb);
|
||||||
w->writeC(i->fm.fms);
|
w->writeC(i->fm.fms);
|
||||||
|
|
Loading…
Reference in a new issue