diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 3ca6f1ad5..5f7b2b555 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -1471,6 +1471,9 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { if (song.system[0]==DIV_SYSTEM_SMS && song.system[1]==DIV_SYSTEM_OPLL) { isFlat=true; } + if (song.system[0]==DIV_SYSTEM_NES && song.system[1]==DIV_SYSTEM_VRC7) { + isFlat=true; + } } // fail if more than one system if (!isFlat && song.systemLen!=1) { @@ -1490,6 +1493,12 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { lastError="Master System FM expansion not supported in 1.0/legacy .dmf!"; return NULL; } + // fail if the system is NES+VRC7 and version<25 + if (version<25 && song.system[0]==DIV_SYSTEM_NES && song.system[1]==DIV_SYSTEM_VRC7) { + logE("NES + VRC7 not supported in 1.0/legacy .dmf!\n"); + lastError="NES + VRC7 not supported in 1.0/legacy .dmf!"; + return NULL; + } // fail if the system is Furnace-exclusive if (!isFlat && systemToFile(song.system[0])&0x80) { logE("cannot save Furnace-exclusive system song!\n"); @@ -1519,6 +1528,9 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { } else if (song.system[0]==DIV_SYSTEM_SMS && song.system[1]==DIV_SYSTEM_OPLL) { w->writeC(systemToFile(DIV_SYSTEM_SMS_OPLL)); sys=DIV_SYSTEM_SMS_OPLL; + } else if (song.system[0]==DIV_SYSTEM_NES && song.system[1]==DIV_SYSTEM_VRC7) { + w->writeC(systemToFile(DIV_SYSTEM_NES_VRC7)); + sys=DIV_SYSTEM_NES_VRC7; } else { w->writeC(systemToFile(song.system[0])); sys=song.system[0]; @@ -1599,12 +1611,12 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { w->writeC(op.rr); w->writeC(op.sl); w->writeC(op.tl); - if (sys==DIV_SYSTEM_SMS_OPLL && j==0) { + if ((sys==DIV_SYSTEM_SMS_OPLL || sys==DIV_SYSTEM_NES_VRC7) && j==0) { w->writeC(i->fm.opllPreset); } else { w->writeC(op.dt2); } - if (sys==DIV_SYSTEM_SMS_OPLL) { + if (sys==DIV_SYSTEM_SMS_OPLL || sys==DIV_SYSTEM_NES_VRC7) { w->writeC(op.ksr); w->writeC(op.vib); w->writeC(op.ksl); diff --git a/src/engine/sample.h b/src/engine/sample.h index c61ba868c..713c8af1a 100644 --- a/src/engine/sample.h +++ b/src/engine/sample.h @@ -24,15 +24,34 @@ struct DivSample { int length, rate, centerRate, loopStart, loopOffP; signed char vol, pitch; // valid values are: - // - 0: ZX Spectrum overlay drum (1-bit PCM) - // - 1: 1-bit NES DPCM - // - 4: BRR - // - 5: raw ADPCM-A - // - 6: raw ADPCM-B + // - 0: ZX Spectrum overlay drum (1-bit) + // - 1: 1-bit NES DPCM (1-bit) + // - 4: QSound ADPCM () + // - 5: ADPCM-A + // - 6: ADPCM-B + // - 7: X68000 ADPCM // - 8: 8-bit PCM + // - 9: BRR (SNES) + // - 10: VOX // - 16: 16-bit PCM unsigned char depth; + + // TODO: drop short* data; + + // these are the new data structures. + signed char* data8; + short* data16; + unsigned char* data1; + unsigned char* dataDPCM; + unsigned char* dataQSound; + unsigned char* dataA; + unsigned char* dataB; + unsigned char* dataX68; + unsigned char* dataBRR; + unsigned char* dataVOX; + + unsigned int rendLength, adpcmRendLength, rendOff, rendOffP, rendOffContiguous, rendOffQsound; short* rendData; unsigned char* adpcmRendData; diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index ece7e370b..54589e37d 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -816,6 +816,7 @@ bool DivEngine::isFMSystem(DivSystem sys) { return (sys==DIV_SYSTEM_GENESIS || sys==DIV_SYSTEM_GENESIS_EXT || sys==DIV_SYSTEM_SMS_OPLL || + sys==DIV_SYSTEM_NES_VRC7 || sys==DIV_SYSTEM_ARCADE || sys==DIV_SYSTEM_YM2610 || sys==DIV_SYSTEM_YM2610_EXT ||