From 96983e3d48fe52ad913688d966725ae1d87e8036 Mon Sep 17 00:00:00 2001 From: cam900 Date: Thu, 5 Jan 2023 09:49:21 +0900 Subject: [PATCH 1/3] Add SSG and FM/ADPCM volume mixer config for OPN/A/B --- src/engine/platform/fmshared_OPN.h | 4 +++ src/engine/platform/ym2203.cpp | 7 +++-- src/engine/platform/ym2608.cpp | 12 +++++--- src/engine/platform/ym2610.cpp | 10 ++++--- src/engine/platform/ym2610b.cpp | 10 ++++--- src/engine/platform/ym2610shared.h | 2 ++ src/gui/sysConf.cpp | 48 ++++++++++++++++++++++++++++++ 7 files changed, 79 insertions(+), 14 deletions(-) diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index d83ad0770..427a231cf 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 3419a1b6e..85c566d49 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 fc0b08de6..503b1a423 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 9251a39f3..1aaeddef2 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 593ecfa0b..9d79c0be5 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 ab1bd0528..45c330cd3 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 8e41fa00c..363ed1add 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; From fcc5b6e5eb80523cc15d20480f7449d2de6d5ce6 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sat, 14 Jan 2023 11:55:40 +0900 Subject: [PATCH 2/3] Replace divider to shift --- src/engine/platform/fmshared_OPN.h | 8 +++---- src/engine/platform/ym2203.cpp | 10 ++++----- src/engine/platform/ym2608.cpp | 16 ++++++------- src/engine/platform/ym2610.cpp | 12 +++++----- src/engine/platform/ym2610b.cpp | 12 +++++----- src/engine/platform/ym2610shared.h | 4 ++-- src/gui/sysConf.cpp | 36 +++++++++++++++--------------- 7 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index 427a231cf..387e7d61e 100644 --- a/src/engine/platform/fmshared_OPN.h +++ b/src/engine/platform/fmshared_OPN.h @@ -154,8 +154,8 @@ class DivPlatformOPN: public DivPlatformFMBase { unsigned int ayDiv; unsigned char csmChan; unsigned char lfoValue; - unsigned char ssgVol; - unsigned char fmVol; + unsigned short ssgVol; + unsigned short fmVol; bool extSys, useCombo, fbAllOps; DivConfig ayFlags; @@ -174,8 +174,8 @@ class DivPlatformOPN: public DivPlatformFMBase { ayDiv(a), csmChan(cc), lfoValue(0), - ssgVol(255), - fmVol(255), + ssgVol(256), + fmVol(256), extSys(isExtSys), useCombo(false), fbAllOps(false) {} diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index d9cccae2b..8f3059199 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -210,12 +210,12 @@ void DivPlatformYM2203::acquire_combo(short** buf, size_t len) { ); os&=~3; - os=(os*fmVol)/255; + os=(os*fmVol)>>8; // ymfm part fm->generate(&fmout); - os+=(((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1)*ssgVol)/255; + os+=(((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1)*ssgVol)>>8; if (os<-32768) os=-32768; if (os>32767) os=32767; @@ -256,7 +256,7 @@ void DivPlatformYM2203::acquire_ymfm(short** buf, size_t len) { fm->generate(&fmout); - os=((fmout.data[0]*fmVol)/255)+((((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1)*ssgVol)/255); + os=((fmout.data[0]*fmVol)>>8)+((((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1)*ssgVol)>>8); if (os<-32768) os=-32768; if (os>32767) os=32767; @@ -1043,8 +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); + ssgVol=flags.getInt("ssgVol",256); + fmVol=flags.getInt("fmVol",256); 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 f5487fe68..ed6afe460 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -374,17 +374,17 @@ void DivPlatformYM2608::acquire_combo(short** buf, size_t len) { os[0]>>=1; os[1]>>=1; - os[0]=(os[0]*fmVol)/255; - os[1]=(os[1]*fmVol)/255; + os[0]=(os[0]*fmVol)>>8; + os[1]=(os[1]*fmVol)>>8; // ymfm part fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -441,11 +441,11 @@ void DivPlatformYM2608::acquire_ymfm(short** buf, size_t len) { fm->generate(&fmout); - os[0]=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[0]=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[1]=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -1552,8 +1552,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); + ssgVol=flags.getInt("ssgVol",256); + fmVol=flags.getInt("fmVol",256); 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 99aa6929d..938e000a5 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -305,17 +305,17 @@ void DivPlatformYM2610::acquire_combo(short** buf, size_t len) { os[0]>>=1; os[1]>>=1; - os[0]=(os[0]*fmVol)/255; - os[1]=(os[1]*fmVol)/255; + os[0]=(os[0]*fmVol)>>8; + os[1]=(os[1]*fmVol)>>8; // ymfm part fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -374,11 +374,11 @@ void DivPlatformYM2610::acquire_ymfm(short** buf, size_t len) { fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); 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 55a1dfe53..343232e74 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -373,17 +373,17 @@ void DivPlatformYM2610B::acquire_combo(short** buf, size_t len) { os[0]>>=1; os[1]>>=1; - os[0]=(os[0]*fmVol)/255; - os[1]=(os[1]*fmVol)/255; + os[0]=(os[0]*fmVol)>>8; + os[1]=(os[1]*fmVol)>>8; // ymfm part fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -440,11 +440,11 @@ void DivPlatformYM2610B::acquire_ymfm(short** buf, size_t len) { fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)/255)+(((fmout.data[2]>>1)*ssgVol)/255); + os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); 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 ba1ab0306..89865b0a6 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -222,8 +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); + ssgVol=flags.getInt("ssgVol",256); + fmVol=flags.getInt("fmVol",256); 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 c7e561a8f..a72342dee 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -472,8 +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); + int ssgVol=flags.getInt("ssgVol",256); + int fmVol=flags.getInt("fmVol",256); if (ImGui::RadioButton("8MHz (Neo Geo MVS)",clockSel==0)) { clockSel=0; @@ -493,15 +493,15 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo } } - if (CWSliderInt("SSG Volume",&ssgVol,0,255)) { + if (CWSliderInt("SSG Volume",&ssgVol,0,256)) { if (ssgVol<0) ssgVol=0; - if (ssgVol>255) ssgVol=255; + if (ssgVol>256) ssgVol=256; altered=true; } rightClickable - if (CWSliderInt("FM/ADPCM Volume",&fmVol,0,255)) { + if (CWSliderInt("FM/ADPCM Volume",&fmVol,0,256)) { if (fmVol<0) fmVol=0; - if (fmVol>255) fmVol=255; + if (fmVol>256) fmVol=256; altered=true; } rightClickable @@ -870,8 +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); + int ssgVol=flags.getInt("ssgVol",256); + int fmVol=flags.getInt("fmVol",256); ImGui::Text("Clock rate:"); if (ImGui::RadioButton("3.58MHz (NTSC)",clockSel==0)) { @@ -912,15 +912,15 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo altered=true; } - if (CWSliderInt("SSG Volume",&ssgVol,0,255)) { + if (CWSliderInt("SSG Volume",&ssgVol,0,256)) { if (ssgVol<0) ssgVol=0; - if (ssgVol>255) ssgVol=255; + if (ssgVol>256) ssgVol=256; altered=true; } rightClickable - if (CWSliderInt("FM Volume",&fmVol,0,255)) { + if (CWSliderInt("FM Volume",&fmVol,0,256)) { if (fmVol<0) fmVol=0; - if (fmVol>255) fmVol=255; + if (fmVol>256) fmVol=256; altered=true; } rightClickable @@ -952,8 +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); + int ssgVol=flags.getInt("ssgVol",256); + int fmVol=flags.getInt("fmVol",256); ImGui::Text("Clock rate:"); if (ImGui::RadioButton("8MHz (Arcade)",clockSel==0)) { @@ -978,15 +978,15 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo altered=true; } - if (CWSliderInt("SSG Volume",&ssgVol,0,255)) { + if (CWSliderInt("SSG Volume",&ssgVol,0,256)) { if (ssgVol<0) ssgVol=0; - if (ssgVol>255) ssgVol=255; + if (ssgVol>256) ssgVol=256; altered=true; } rightClickable - if (CWSliderInt("FM/ADPCM Volume",&fmVol,0,255)) { + if (CWSliderInt("FM/ADPCM Volume",&fmVol,0,256)) { if (fmVol<0) fmVol=0; - if (fmVol>255) fmVol=255; + if (fmVol>256) fmVol=256; altered=true; } rightClickable From fda333a76bb1ca0bb4474f3fe8bbe2b55bdfae39 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 5 Feb 2023 04:57:09 -0500 Subject: [PATCH 3/3] default SSG vol is now 128 to eliminate one shift --- src/engine/platform/fmshared_OPN.h | 2 +- src/engine/platform/ym2203.cpp | 6 +++--- src/engine/platform/ym2608.cpp | 10 +++++----- src/engine/platform/ym2610.cpp | 8 ++++---- src/engine/platform/ym2610b.cpp | 8 ++++---- src/engine/platform/ym2610shared.h | 2 +- src/gui/sysConf.cpp | 6 +++--- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index 387e7d61e..a74adcd2c 100644 --- a/src/engine/platform/fmshared_OPN.h +++ b/src/engine/platform/fmshared_OPN.h @@ -174,7 +174,7 @@ class DivPlatformOPN: public DivPlatformFMBase { ayDiv(a), csmChan(cc), lfoValue(0), - ssgVol(256), + ssgVol(128), fmVol(256), extSys(isExtSys), useCombo(false), diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 8f3059199..c8b5ad900 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -215,7 +215,7 @@ void DivPlatformYM2203::acquire_combo(short** buf, size_t len) { // ymfm part fm->generate(&fmout); - os+=(((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1)*ssgVol)>>8; + os+=((fmout.data[1]+fmout.data[2]+fmout.data[3])*ssgVol)>>8; if (os<-32768) os=-32768; if (os>32767) os=32767; @@ -256,7 +256,7 @@ void DivPlatformYM2203::acquire_ymfm(short** buf, size_t len) { fm->generate(&fmout); - os=((fmout.data[0]*fmVol)>>8)+((((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1)*ssgVol)>>8); + os=((fmout.data[0]*fmVol)>>8)+(((fmout.data[1]+fmout.data[2]+fmout.data[3])*ssgVol)>>8); if (os<-32768) os=-32768; if (os>32767) os=32767; @@ -1043,7 +1043,7 @@ void DivPlatformYM2203::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); fbAllOps=flags.getBool("fbAllOps",false); - ssgVol=flags.getInt("ssgVol",256); + ssgVol=flags.getInt("ssgVol",128); fmVol=flags.getInt("fmVol",256); rate=fm->sample_rate(chipClock); for (int i=0; i<6; i++) { diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index ed6afe460..2fa133cf9 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -380,11 +380,11 @@ void DivPlatformYM2608::acquire_combo(short** buf, size_t len) { // ymfm part fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[0]+=((fmout.data[0]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[1]+=((fmout.data[1]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -441,11 +441,11 @@ void DivPlatformYM2608::acquire_ymfm(short** buf, size_t len) { fm->generate(&fmout); - os[0]=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[0]=((fmout.data[0]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[1]=((fmout.data[1]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -1552,7 +1552,7 @@ void DivPlatformYM2608::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); fbAllOps=flags.getBool("fbAllOps",false); - ssgVol=flags.getInt("ssgVol",256); + ssgVol=flags.getInt("ssgVol",128); fmVol=flags.getInt("fmVol",256); rate=fm->sample_rate(chipClock); for (int i=0; i<16; i++) { diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 938e000a5..eb398d179 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -311,11 +311,11 @@ void DivPlatformYM2610::acquire_combo(short** buf, size_t len) { // ymfm part fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[0]+=((fmout.data[0]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[1]+=((fmout.data[1]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -374,11 +374,11 @@ void DivPlatformYM2610::acquire_ymfm(short** buf, size_t len) { fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[0]+=((fmout.data[0]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[1]+=((fmout.data[1]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); 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 343232e74..8d4b16ad7 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -379,11 +379,11 @@ void DivPlatformYM2610B::acquire_combo(short** buf, size_t len) { // ymfm part fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[0]+=((fmout.data[0]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[1]+=((fmout.data[1]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -440,11 +440,11 @@ void DivPlatformYM2610B::acquire_ymfm(short** buf, size_t len) { fm->generate(&fmout); - os[0]+=((fmout.data[0]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[0]+=((fmout.data[0]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]+=((fmout.data[1]*fmVol)>>8)+(((fmout.data[2]>>1)*ssgVol)>>8); + os[1]+=((fmout.data[1]*fmVol)>>8)+((fmout.data[2]*ssgVol)>>8); 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 89865b0a6..dfcf571da 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -222,7 +222,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN { CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); fbAllOps=flags.getBool("fbAllOps",false); - ssgVol=flags.getInt("ssgVol",256); + ssgVol=flags.getInt("ssgVol",128); fmVol=flags.getInt("fmVol",256); rate=fm->sample_rate(chipClock); for (int i=0; i<16; i++) { diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index a72342dee..1229b0db6 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -472,7 +472,7 @@ 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",256); + int ssgVol=flags.getInt("ssgVol",128); int fmVol=flags.getInt("fmVol",256); if (ImGui::RadioButton("8MHz (Neo Geo MVS)",clockSel==0)) { @@ -870,7 +870,7 @@ 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",256); + int ssgVol=flags.getInt("ssgVol",128); int fmVol=flags.getInt("fmVol",256); ImGui::Text("Clock rate:"); @@ -952,7 +952,7 @@ 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",256); + int ssgVol=flags.getInt("ssgVol",128); int fmVol=flags.getInt("fmVol",256); ImGui::Text("Clock rate:");