dev242 - OPL4: add options for default FM/PCM leve

issue #2711
This commit is contained in:
tildearrow 2026-01-13 19:08:05 -05:00
parent 60f384f0b0
commit a862a8ae59
5 changed files with 65 additions and 7 deletions

View file

@ -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

View file

@ -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; i<ds.systemLen; i++) {
if (ds.system[i]==DIV_SYSTEM_OPL4 || ds.system[i]==DIV_SYSTEM_OPL4_DRUMS) {
ds.systemFlags[i].set("fmMixL",7);
ds.systemFlags[i].set("fmMixR",7);
ds.systemFlags[i].set("pcmMixL",7);
ds.systemFlags[i].set("pcmMixR",7);
}
}
}
// warn on partial pitch linearity
if (ds.compatFlags.linearPitch>1) {
ds.compatFlags.linearPitch=1;

View file

@ -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);
}

View file

@ -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];

View file

@ -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;