the first step to deprecating Defle compat

Furnace will support .dmf loading/saving
however in a far future, compatibility may not be guaranteed... I am not sure

this setting is off by default (for now)
This commit is contained in:
tildearrow 2023-07-29 03:17:15 -05:00
parent 9d567d8cca
commit 1aef0079d1
3 changed files with 81 additions and 66 deletions

View File

@ -142,76 +142,78 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
} }
// compatibility flags // compatibility flags
ds.limitSlides=true; if (!getConfInt("noDMFCompat",0)) {
ds.linearPitch=1; ds.limitSlides=true;
ds.loopModality=0; ds.linearPitch=1;
ds.properNoiseLayout=false; ds.loopModality=0;
ds.waveDutyIsVol=false; ds.properNoiseLayout=false;
// TODO: WHAT?! geodude.dmf fails when this is true ds.waveDutyIsVol=false;
// but isn't that how Defle behaves??? // TODO: WHAT?! geodude.dmf fails when this is true
ds.resetMacroOnPorta=false; // but isn't that how Defle behaves???
ds.legacyVolumeSlides=true; ds.resetMacroOnPorta=false;
ds.compatibleArpeggio=true; ds.legacyVolumeSlides=true;
ds.noteOffResetsSlides=true; ds.compatibleArpeggio=true;
ds.targetResetsSlides=true; ds.noteOffResetsSlides=true;
ds.arpNonPorta=false; ds.targetResetsSlides=true;
ds.algMacroBehavior=false; ds.arpNonPorta=false;
ds.brokenShortcutSlides=false; ds.algMacroBehavior=false;
ds.ignoreDuplicateSlides=true; ds.brokenShortcutSlides=false;
ds.brokenDACMode=true; ds.ignoreDuplicateSlides=true;
ds.oneTickCut=false; ds.brokenDACMode=true;
ds.newInsTriggersInPorta=true; ds.oneTickCut=false;
ds.arp0Reset=true; ds.newInsTriggersInPorta=true;
ds.brokenSpeedSel=true; ds.arp0Reset=true;
ds.noSlidesOnFirstTick=false; ds.brokenSpeedSel=true;
ds.rowResetsArpPos=false; ds.noSlidesOnFirstTick=false;
ds.ignoreJumpAtEnd=true; ds.rowResetsArpPos=false;
ds.buggyPortaAfterSlide=true; ds.ignoreJumpAtEnd=true;
ds.gbInsAffectsEnvelope=true; ds.buggyPortaAfterSlide=true;
ds.ignoreDACModeOutsideIntendedChannel=false; ds.gbInsAffectsEnvelope=true;
ds.e1e2AlsoTakePriority=true; ds.ignoreDACModeOutsideIntendedChannel=false;
ds.fbPortaPause=true; ds.e1e2AlsoTakePriority=true;
ds.snDutyReset=true; ds.fbPortaPause=true;
ds.oldOctaveBoundary=false; ds.snDutyReset=true;
ds.noOPN2Vol=true; ds.oldOctaveBoundary=false;
ds.newVolumeScaling=false; ds.noOPN2Vol=true;
ds.volMacroLinger=false; ds.newVolumeScaling=false;
ds.brokenOutVol=true; ds.volMacroLinger=false;
ds.brokenOutVol2=true; ds.brokenOutVol=true;
ds.e1e2StopOnSameNote=true; ds.brokenOutVol2=true;
ds.brokenPortaArp=false; ds.e1e2StopOnSameNote=true;
ds.snNoLowPeriods=true; ds.brokenPortaArp=false;
ds.disableSampleMacro=true; ds.snNoLowPeriods=true;
ds.delayBehavior=0; ds.disableSampleMacro=true;
ds.jumpTreatment=2; ds.delayBehavior=0;
ds.jumpTreatment=2;
// 1.1 compat flags // 1.1 compat flags
if (ds.version>24) { if (ds.version>24) {
ds.waveDutyIsVol=true; ds.waveDutyIsVol=true;
ds.legacyVolumeSlides=false; ds.legacyVolumeSlides=false;
} }
// Neo Geo detune is caused by Defle running Neo Geo at the wrong clock. // Neo Geo detune is caused by Defle running Neo Geo at the wrong clock.
/* /*
if (ds.system[0]==DIV_SYSTEM_YM2610 || ds.system[0]==DIV_SYSTEM_YM2610_EXT if (ds.system[0]==DIV_SYSTEM_YM2610 || ds.system[0]==DIV_SYSTEM_YM2610_EXT
|| ds.system[0]==DIV_SYSTEM_YM2610_FULL || ds.system[0]==DIV_SYSTEM_YM2610_FULL_EXT || ds.system[0]==DIV_SYSTEM_YM2610_FULL || ds.system[0]==DIV_SYSTEM_YM2610_FULL_EXT
|| ds.system[0]==DIV_SYSTEM_YM2610B || ds.system[0]==DIV_SYSTEM_YM2610B_EXT) { || ds.system[0]==DIV_SYSTEM_YM2610B || ds.system[0]==DIV_SYSTEM_YM2610B_EXT) {
ds.tuning=443.23; ds.tuning=443.23;
} }
*/ */
// Genesis detuned on Defle v10 and earlier // Genesis detuned on Defle v10 and earlier
/*if (ds.version<19 && ds.system[0]==DIV_SYSTEM_GENESIS) { /*if (ds.version<19 && ds.system[0]==DIV_SYSTEM_GENESIS) {
ds.tuning=443.23; ds.tuning=443.23;
}*/ }*/
// C64 detuned on Defle v11 and earlier // C64 detuned on Defle v11 and earlier
/*if (ds.version<21 && (ds.system[0]==DIV_SYSTEM_C64_6581 || ds.system[0]==DIV_SYSTEM_C64_8580)) { /*if (ds.version<21 && (ds.system[0]==DIV_SYSTEM_C64_6581 || ds.system[0]==DIV_SYSTEM_C64_8580)) {
ds.tuning=433.2; ds.tuning=433.2;
}*/ }*/
// Game Boy arp+soundLen screwery // Game Boy arp+soundLen screwery
if (ds.system[0]==DIV_SYSTEM_GB) { if (ds.system[0]==DIV_SYSTEM_GB) {
ds.systemFlags[0].set("enoughAlready",true); ds.systemFlags[0].set("enoughAlready",true);
}
} }
logI("reading module data..."); logI("reading module data...");

View File

@ -1523,6 +1523,7 @@ class FurnaceGUI {
int newSongBehavior; int newSongBehavior;
int memUsageUnit; int memUsageUnit;
int cursorFollowsWheel; int cursorFollowsWheel;
int noDMFCompat;
unsigned int maxUndoSteps; unsigned int maxUndoSteps;
String mainFontPath; String mainFontPath;
String patFontPath; String patFontPath;
@ -1677,6 +1678,7 @@ class FurnaceGUI {
newSongBehavior(0), newSongBehavior(0),
memUsageUnit(1), memUsageUnit(1),
cursorFollowsWheel(0), cursorFollowsWheel(0),
noDMFCompat(0),
maxUndoSteps(100), maxUndoSteps(100),
mainFontPath(""), mainFontPath(""),
patFontPath(""), patFontPath(""),

View File

@ -676,6 +676,14 @@ void FurnaceGUI::drawSettings() {
settings.blankIns=blankInsB; settings.blankIns=blankInsB;
} }
bool noDMFCompatB=settings.noDMFCompat;
if (ImGui::Checkbox("Don't apply compatibility flags when loading .dmf",&noDMFCompatB)) {
settings.noDMFCompat=noDMFCompatB;
}
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("do not report any issues arising from the use of this option!");
}
bool saveUnusedPatternsB=settings.saveUnusedPatterns; bool saveUnusedPatternsB=settings.saveUnusedPatterns;
if (ImGui::Checkbox("Save unused patterns",&saveUnusedPatternsB)) { if (ImGui::Checkbox("Save unused patterns",&saveUnusedPatternsB)) {
settings.saveUnusedPatterns=saveUnusedPatternsB; settings.saveUnusedPatterns=saveUnusedPatternsB;
@ -2821,6 +2829,7 @@ void FurnaceGUI::syncSettings() {
settings.newSongBehavior=e->getConfInt("newSongBehavior",0); settings.newSongBehavior=e->getConfInt("newSongBehavior",0);
settings.memUsageUnit=e->getConfInt("memUsageUnit",1); settings.memUsageUnit=e->getConfInt("memUsageUnit",1);
settings.cursorFollowsWheel=e->getConfInt("cursorFollowsWheel",0); settings.cursorFollowsWheel=e->getConfInt("cursorFollowsWheel",0);
settings.noDMFCompat=e->getConfInt("noDMFCompat",0);
clampSetting(settings.mainFontSize,2,96); clampSetting(settings.mainFontSize,2,96);
clampSetting(settings.patFontSize,2,96); clampSetting(settings.patFontSize,2,96);
@ -2950,6 +2959,7 @@ void FurnaceGUI::syncSettings() {
clampSetting(settings.newSongBehavior,0,1); clampSetting(settings.newSongBehavior,0,1);
clampSetting(settings.memUsageUnit,0,1); clampSetting(settings.memUsageUnit,0,1);
clampSetting(settings.cursorFollowsWheel,0,1); clampSetting(settings.cursorFollowsWheel,0,1);
clampSetting(settings.noDMFCompat,0,1);
if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportLoops<0.0) settings.exportLoops=0.0;
if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0;
@ -3175,6 +3185,7 @@ void FurnaceGUI::commitSettings() {
e->setConf("newSongBehavior",settings.newSongBehavior); e->setConf("newSongBehavior",settings.newSongBehavior);
e->setConf("memUsageUnit",settings.memUsageUnit); e->setConf("memUsageUnit",settings.memUsageUnit);
e->setConf("cursorFollowsWheel",settings.cursorFollowsWheel); e->setConf("cursorFollowsWheel",settings.cursorFollowsWheel);
e->setConf("noDMFCompat",settings.noDMFCompat);
// colors // colors
for (int i=0; i<GUI_COLOR_MAX; i++) { for (int i=0; i<GUI_COLOR_MAX; i++) {