From 5d52ef7f008b7ecae51b99835613e3d6e9a81f09 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 7 Apr 2022 20:13:11 -0500 Subject: [PATCH] support .dmf with 6-bit wavetables --- src/engine/fileOps.cpp | 26 ++++++++++++++++++++++---- src/engine/song.h | 2 ++ src/gui/gui.cpp | 6 +++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 8ed6551b9..e14cd8b3b 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -69,7 +69,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { } ds.version=(unsigned char)reader.readC(); logI("module version %d (0x%.2x)\n",ds.version,ds.version); - if (ds.version>0x19) { + if (ds.version>0x1a) { logE("this version is not supported by Furnace yet!\n"); lastError="this version is not supported by Furnace yet"; delete[] file; @@ -580,6 +580,12 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { wave->data[j]=reader.readI(); } } + // #FDS4Bit + if (ds.system[0]==DIV_SYSTEM_NES_FDS && ds.version<0x1a) { + for (int j=0; jlen; j++) { + wave->data[j]*=4; + } + } ds.wave.push_back(wave); } } @@ -2222,7 +2228,7 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) { SafeWriter* DivEngine::saveDMF(unsigned char version) { // fail if version is not supported - if (version<24 || version>25) { + if (version<24 || version>26) { logE("cannot save in this version!\n"); lastError="invalid version to save in! this is a bug!"; return NULL; @@ -2273,6 +2279,12 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { lastError="NES + VRC7 not supported in 1.0/legacy .dmf!"; return NULL; } + // fail if the system is FDS and version<25 + if (version<25 && song.system[0]==DIV_SYSTEM_NES && song.system[1]==DIV_SYSTEM_FDS) { + logE("FDS not supported in 1.0/legacy .dmf!\n"); + lastError="FDS not supported in 1.0/legacy .dmf!"; + return NULL; + } // fail if the system is Furnace-exclusive if (!isFlat && systemToFileDMF(song.system[0])==0) { logE("cannot save Furnace-exclusive system song!\n"); @@ -2308,7 +2320,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { sys=DIV_SYSTEM_NES_VRC7; } else if (song.system[0]==DIV_SYSTEM_NES && song.system[1]==DIV_SYSTEM_FDS) { w->writeC(systemToFileDMF(DIV_SYSTEM_NES_FDS)); - sys=DIV_SYSTEM_NES_VRC7; + sys=DIV_SYSTEM_NES_FDS; } else { w->writeC(systemToFileDMF(song.system[0])); sys=song.system[0]; @@ -2481,7 +2493,13 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { w->writeC(song.wave.size()); for (DivWavetable* i: song.wave) { w->writeI(i->len); - w->write(i->data,4*i->len); + if (sys==DIV_SYSTEM_NES_FDS && version<26) { + for (int j=0; jlen; j++) { + w->writeI(i->data[j]>>2); + } + } else { + w->write(i->data,4*i->len); + } } for (int i=0; iopenSave( "Save File", {"Furnace song", "*.fur", - "DefleMask 1.1 module", "*.dmf"}, - "Furnace song{.fur},DefleMask 1.1 module{.dmf}", + "DefleMask 1.1.3 module", "*.dmf"}, + "Furnace song{.fur},DefleMask 1.1.3 module{.dmf}", workingDirSong, dpiScale ); @@ -2714,7 +2714,7 @@ bool FurnaceGUI::loop() { showError(fmt::sprintf("Error while saving file! (%s)",lastError)); } } else { - if (save(copyOfName,25)>0) { + if (save(copyOfName,26)>0) { showError(fmt::sprintf("Error while saving file! (%s)",lastError)); } }