diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index d83ad077..427a231c 100644 --- a/src/engine/platform/fmshared_OPN.h +++ b/src/engine/platform/fmshared_OPN.h @@ -154,6 +154,8 @@ class DivPlatformOPN: public DivPlatformFMBase { unsigned int ayDiv; unsigned char csmChan; unsigned char lfoValue; + unsigned char ssgVol; + unsigned char fmVol; bool extSys, useCombo, fbAllOps; DivConfig ayFlags; @@ -172,6 +174,8 @@ class DivPlatformOPN: public DivPlatformFMBase { ayDiv(a), csmChan(cc), lfoValue(0), + ssgVol(255), + fmVol(255), extSys(isExtSys), useCombo(false), fbAllOps(false) {} diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 3419a1b6..85c566d4 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -210,11 +210,12 @@ void DivPlatformYM2203::acquire_combo(short* bufL, short* bufR, size_t start, si ); os&=~3; + os=(os*fmVol)/255; // ymfm part fm->generate(&fmout); - os+=((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1); + os+=(((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1)*ssgVol)/255; if (os<-32768) os=-32768; if (os>32767) os=32767; @@ -255,7 +256,7 @@ void DivPlatformYM2203::acquire_ymfm(short* bufL, short* bufR, size_t start, siz fm->generate(&fmout); - os=fmout.data[0]+((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1); + os=((fmout.data[0]*fmVol)/255)+((((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1)*ssgVol)/255); if (os<-32768) os=-32768; if (os>32767) os=32767; @@ -1042,6 +1043,8 @@ void DivPlatformYM2203::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); fbAllOps=flags.getBool("fbAllOps",false); + ssgVol=flags.getInt("ssgVol",255); + fmVol=flags.getInt("fmVol",255); rate=fm->sample_rate(chipClock); for (int i=0; i<6; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index fc0b08de..503b1a42 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -374,15 +374,17 @@ void DivPlatformYM2608::acquire_combo(short* bufL, short* bufR, size_t start, si os[0]>>=1; os[1]>>=1; + os[0]=(os[0]*fmVol)/255; + os[1]=(os[1]*fmVol)/255; // ymfm part fm->generate(&fmout); - os[0]+=fmout.data[0]+(fmout.data[2]>>1); + os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=fmout.data[1]+(fmout.data[2]>>1); + os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -439,11 +441,11 @@ void DivPlatformYM2608::acquire_ymfm(short* bufL, short* bufR, size_t start, siz fm->generate(&fmout); - os[0]=fmout.data[0]+(fmout.data[2]>>1); + os[0]=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]=fmout.data[1]+(fmout.data[2]>>1); + os[1]=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -1539,6 +1541,8 @@ void DivPlatformYM2608::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); fbAllOps=flags.getBool("fbAllOps",false); + ssgVol=flags.getInt("ssgVol",255); + fmVol=flags.getInt("fmVol",255); rate=fm->sample_rate(chipClock); for (int i=0; i<16; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 9251a39f..1aaeddef 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -305,15 +305,17 @@ void DivPlatformYM2610::acquire_combo(short* bufL, short* bufR, size_t start, si os[0]>>=1; os[1]>>=1; + os[0]=(os[0]*fmVol)/255; + os[1]=(os[1]*fmVol)/255; // ymfm part fm->generate(&fmout); - os[0]+=fmout.data[0]+(fmout.data[2]>>1); + os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=fmout.data[1]+(fmout.data[2]>>1); + os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -372,11 +374,11 @@ void DivPlatformYM2610::acquire_ymfm(short* bufL, short* bufR, size_t start, siz fm->generate(&fmout); - os[0]=fmout.data[0]+(fmout.data[2]>>1); + os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]=fmout.data[1]+(fmout.data[2]>>1); + os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 593ecfa0..9d79c0be 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -373,15 +373,17 @@ void DivPlatformYM2610B::acquire_combo(short* bufL, short* bufR, size_t start, s os[0]>>=1; os[1]>>=1; + os[0]=(os[0]*fmVol)/255; + os[1]=(os[1]*fmVol)/255; // ymfm part fm->generate(&fmout); - os[0]+=fmout.data[0]+(fmout.data[2]>>1); + os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=fmout.data[1]+(fmout.data[2]>>1); + os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -438,11 +440,11 @@ void DivPlatformYM2610B::acquire_ymfm(short* bufL, short* bufR, size_t start, si fm->generate(&fmout); - os[0]=fmout.data[0]+(fmout.data[2]>>1); + os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]=fmout.data[1]+(fmout.data[2]>>1); + os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index ab1bd052..45c330cd 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -222,6 +222,8 @@ class DivPlatformYM2610Base: public DivPlatformOPN { CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); fbAllOps=flags.getBool("fbAllOps",false); + ssgVol=flags.getInt("ssgVol",255); + fmVol=flags.getInt("fmVol",255); rate=fm->sample_rate(chipClock); for (int i=0; i<16; i++) { oscBuf[i]->rate=rate; diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 8e41fa00..363ed1ad 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -472,6 +472,8 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo int clockSel=flags.getInt("clockSel",0); bool noExtMacros=flags.getBool("noExtMacros",false); bool fbAllOps=flags.getBool("fbAllOps",false); + int ssgVol=flags.getInt("ssgVol",255); + int fmVol=flags.getInt("fmVol",255); if (ImGui::RadioButton("8MHz (Neo Geo MVS)",clockSel==0)) { clockSel=0; @@ -491,11 +493,25 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo } } + if (CWSliderInt("SSG Volume",&ssgVol,0,255)) { + if (ssgVol<0) ssgVol=0; + if (ssgVol>255) ssgVol=255; + altered=true; + } rightClickable + + if (CWSliderInt("FM/ADPCM Volume",&fmVol,0,255)) { + if (fmVol<0) fmVol=0; + if (fmVol>255) fmVol=255; + altered=true; + } rightClickable + if (altered) { e->lockSave([&]() { flags.set("clockSel",clockSel); flags.set("noExtMacros",noExtMacros); flags.set("fbAllOps",fbAllOps); + flags.set("ssgVol",ssgVol); + flags.set("fmVol",fmVol); }); } break; @@ -854,6 +870,8 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo int prescale=flags.getInt("prescale",0); bool noExtMacros=flags.getBool("noExtMacros",false); bool fbAllOps=flags.getBool("fbAllOps",false); + int ssgVol=flags.getInt("ssgVol",255); + int fmVol=flags.getInt("fmVol",255); ImGui::Text("Clock rate:"); if (ImGui::RadioButton("3.58MHz (NTSC)",clockSel==0)) { @@ -894,6 +912,18 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo altered=true; } + if (CWSliderInt("SSG Volume",&ssgVol,0,255)) { + if (ssgVol<0) ssgVol=0; + if (ssgVol>255) ssgVol=255; + altered=true; + } rightClickable + + if (CWSliderInt("FM Volume",&fmVol,0,255)) { + if (fmVol<0) fmVol=0; + if (fmVol>255) fmVol=255; + altered=true; + } rightClickable + if (type==DIV_SYSTEM_YM2203_EXT || type==DIV_SYSTEM_YM2203_CSM) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) { altered=true; @@ -909,6 +939,8 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo flags.set("prescale",prescale); flags.set("noExtMacros",noExtMacros); flags.set("fbAllOps",fbAllOps); + flags.set("ssgVol",ssgVol); + flags.set("fmVol",fmVol); }); } break; @@ -920,6 +952,8 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo int prescale=flags.getInt("prescale",0); bool noExtMacros=flags.getBool("noExtMacros",false); bool fbAllOps=flags.getBool("fbAllOps",false); + int ssgVol=flags.getInt("ssgVol",255); + int fmVol=flags.getInt("fmVol",255); ImGui::Text("Clock rate:"); if (ImGui::RadioButton("8MHz (Arcade)",clockSel==0)) { @@ -944,6 +978,18 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo altered=true; } + if (CWSliderInt("SSG Volume",&ssgVol,0,255)) { + if (ssgVol<0) ssgVol=0; + if (ssgVol>255) ssgVol=255; + altered=true; + } rightClickable + + if (CWSliderInt("FM/ADPCM Volume",&fmVol,0,255)) { + if (fmVol<0) fmVol=0; + if (fmVol>255) fmVol=255; + altered=true; + } rightClickable + if (type==DIV_SYSTEM_YM2608_EXT || type==DIV_SYSTEM_YM2608_CSM) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) { altered=true; @@ -959,6 +1005,8 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo flags.set("prescale",prescale); flags.set("noExtMacros",noExtMacros); flags.set("fbAllOps",fbAllOps); + flags.set("ssgVol",ssgVol); + flags.set("fmVol",fmVol); }); } break;