diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 47a837899..0d8817ebf 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -337,7 +337,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { } logD("%d name: %s",i,ins->name.c_str()); if (ds.version<0x0b) { - // instruments in ancient versions were all FM or STD. + // instruments in ancient versions were all FM. mode=1; } else { mode=reader.readC(); @@ -366,6 +366,12 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { if (ds.system[0]==DIV_SYSTEM_YMU759) { 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 (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; iopnCount) { + 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(); BUSY_BEGIN_SOFT; saveLock.lock(); @@ -3237,7 +3294,7 @@ bool DivEngine::loadFTM(unsigned char* file, size_t len) { unsigned char insType=reader.readC(); switch (insType) { case 1: - ins->type=DIV_INS_STD; + ins->type=DIV_INS_NES; break; case 2: // TODO: tell VRC6 and VRC6 saw instruments apart ins->type=DIV_INS_VRC6; @@ -3264,7 +3321,7 @@ bool DivEngine::loadFTM(unsigned char* file, size_t len) { // instrument data switch (ins->type) { - case DIV_INS_STD: { + case DIV_INS_NES: { unsigned int totalSeqs=reader.readI(); if (totalSeqs>5) { logE("%d: too many sequences!",insIndex); @@ -4183,7 +4240,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { } 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"); break; } @@ -4194,11 +4251,14 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { w->writeString(i->name,true); // 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]) { case DIV_SYSTEM_GB: i->type=DIV_INS_GB; break; + case DIV_SYSTEM_NES: + i->type=DIV_INS_NES; + break; case DIV_SYSTEM_C64_6581: case DIV_SYSTEM_C64_8580: i->type=DIV_INS_C64; @@ -4215,12 +4275,16 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { break; } } - if (!isSTDSystem(sys) && i->type!=DIV_INS_FM) { - 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; + } } - w->writeC((i->type==DIV_INS_FM || i->type==DIV_INS_OPLL)?1:0); - if (i->type==DIV_INS_FM || i->type==DIV_INS_OPLL) { // FM + 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_OPM || i->type==DIV_INS_OPLL) { // FM w->writeC(i->fm.alg); w->writeC(i->fm.fb); w->writeC(i->fm.fms);