From a862a8ae5978332e1300d76d73082acdbf3f273d Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 13 Jan 2026 19:08:05 -0500 Subject: [PATCH] dev242 - OPL4: add options for default FM/PCM leve issue #2711 --- src/engine/engine.h | 4 ++-- src/engine/fileOps/fur.cpp | 12 ++++++++++++ src/engine/platform/opl.cpp | 21 +++++++++++++++++---- src/engine/platform/opl.h | 3 ++- src/gui/sysConf.cpp | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index 20220b28f..3c3602544 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -56,8 +56,8 @@ class DivWorkPool; #define DIV_UNSTABLE -#define DIV_VERSION "dev241" -#define DIV_ENGINE_VERSION 241 +#define DIV_VERSION "dev242" +#define DIV_ENGINE_VERSION 242 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps/fur.cpp b/src/engine/fileOps/fur.cpp index 204c2d502..62db6732e 100644 --- a/src/engine/fileOps/fur.cpp +++ b/src/engine/fileOps/fur.cpp @@ -2395,6 +2395,18 @@ bool DivEngine::loadFur(unsigned char* file, size_t len, int variantID) { } } + // OPL4 default mix levels + if (ds.version<242) { + for (int i=0; i1) { ds.compatFlags.linearPitch=1; diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 8dd37fdb7..a63e37658 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -2903,10 +2903,10 @@ void DivPlatformOPL::reset() { // Reset wavetable header immWrite(0x202,PCM_IN_RAM?0x10:0x00); // initialize mixer volume - fmMixL=7; - fmMixR=7; - pcmMixL=7; - pcmMixR=7; + fmMixL=fmMixLDef; + fmMixR=fmMixRDef; + pcmMixL=pcmMixLDef; + pcmMixR=pcmMixRDef; immWrite(PCM_ADDR_MIX_FM,((7-fmMixR)<<3)|(7-fmMixL)); immWrite(PCM_ADDR_MIX_PCM,((7-pcmMixR)<<3)|(7-pcmMixL)); } else { @@ -3190,6 +3190,19 @@ void DivPlatformOPL::setFlags(const DivConfig& flags) { compatPan=flags.getBool("compatPan",false); compatYPitch=flags.getBool("compatYPitch",false); + fmMixLDef=flags.getInt("fmMixL",4); + fmMixRDef=flags.getInt("fmMixR",4); + pcmMixLDef=flags.getInt("pcmMixL",7); + pcmMixRDef=flags.getInt("pcmMixR",7); + if (fmMixLDef<0) fmMixLDef=0; + if (fmMixLDef>7) fmMixLDef=7; + if (fmMixRDef<0) fmMixRDef=0; + if (fmMixRDef>7) fmMixRDef=7; + if (pcmMixLDef<0) pcmMixLDef=0; + if (pcmMixLDef>7) pcmMixLDef=7; + if (pcmMixRDef<0) pcmMixRDef=0; + if (pcmMixRDef>7) pcmMixRDef=7; + for (int i=0; i<44; i++) { oscBuf[i]->setRate(rate); } diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index 676e7d4a9..571a16512 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -133,7 +133,8 @@ class DivPlatformOPL: public DivDispatch { const unsigned char* outChanMap; int chipFreqBase, chipRateBase; int delay, chipType, oplType, chans, melodicChans, totalChans, adpcmChan=-1, pcmChanOffs=-1, totalOutputs, ramSize; - int fmMixL=7, fmMixR=7, pcmMixL=7, pcmMixR=7; + int fmMixL, fmMixR, pcmMixL, pcmMixR; + int fmMixLDef, fmMixRDef, pcmMixLDef, pcmMixRDef; unsigned char lastBusy; unsigned char drumState; unsigned char drumVol[5]; diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 790c4eed4..95a51a0e1 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -2670,6 +2670,10 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl case DIV_SYSTEM_OPL4_DRUMS: { int clockSel=flags.getInt("clockSel",0); int ramSize=flags.getInt("ramSize",0); + int fmMixL=flags.getInt("fmMixL",4); + int fmMixR=flags.getInt("fmMixR",4); + int pcmMixL=flags.getInt("pcmMixL",7); + int pcmMixR=flags.getInt("pcmMixR",7); ImGui::Text(_("Clock rate:")); ImGui::Indent(); @@ -2726,10 +2730,38 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl } ImGui::Unindent(); + ImGui::Text("FM volume:"); + if (CWSliderInt(_("Left##FMMixL"),&fmMixL,0,7)) { + if (fmMixL<0) fmMixL=0; + if (fmMixL>7) fmMixL=7; + altered=true; + } rightClickable + if (CWSliderInt(_("Right##FMMixR"),&fmMixR,0,7)) { + if (fmMixR<0) fmMixR=0; + if (fmMixR>7) fmMixR=7; + altered=true; + } rightClickable + + ImGui::Text("PCM volume:"); + if (CWSliderInt(_("Left##PCMMixL"),&pcmMixL,0,7)) { + if (pcmMixL<0) pcmMixL=0; + if (pcmMixL>7) pcmMixL=7; + altered=true; + } rightClickable + if (CWSliderInt(_("Right##PCMMixR"),&pcmMixR,0,7)) { + if (pcmMixR<0) pcmMixR=0; + if (pcmMixR>7) pcmMixR=7; + altered=true; + } rightClickable + if (altered) { e->lockSave([&]() { flags.set("clockSel",clockSel); flags.set("ramSize",ramSize); + flags.set("fmMixL",fmMixL); + flags.set("fmMixR",fmMixR); + flags.set("pcmMixL",pcmMixL); + flags.set("pcmMixR",pcmMixR); }); } break;