From da6d0b1702470cc219b32bb40c594dddaa835fdc Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 12 Feb 2023 14:33:04 +0900 Subject: [PATCH 1/4] ES5506:Fixes? --- src/engine/platform/es5506.cpp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index 556c5492..50e30c8b 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -386,13 +386,13 @@ void DivPlatformES5506::tick(bool sysTick) { // calculate volume (16 bit) if (chan[i].volChanged.lVol) { chan[i].resLVol=VOL_SCALE_LOG(chan[i].outVol,chan[i].outLVol,0xffff); - if (!chan[i].keyOn && chan[i].active) { + if (chan[i].active) { pageWrite(0x00|i,0x02,chan[i].resLVol); } } if (chan[i].volChanged.rVol) { chan[i].resRVol=VOL_SCALE_LOG(chan[i].outVol,chan[i].outRVol,0xffff); - if (!chan[i].keyOn && chan[i].active) { + if (chan[i].active) { pageWrite(0x00|i,0x04,chan[i].resRVol); } } @@ -700,6 +700,10 @@ void DivPlatformES5506::tick(bool sysTick) { // Run sample pageWrite(0x00|i,0x06,chan[i].envelope.ecount); // Clear ECOUNT pageWriteMask(0x00|i,0x5f,0x00,loopFlag,0x3cff); + if (!chan[i].std.vol.had) { + chan[i].outVol=(0xffff*chan[i].vol)/0xff; + chan[i].volChanged.changed=0xff; + } } } if (chan[i].keyOff) { @@ -759,18 +763,22 @@ int DivPlatformES5506::dispatch(DivCommand c) { chan[c.chan].noteChanged.changed=0xff; chan[c.chan].volChanged.changed=0xff; } - if (!chan[c.chan].std.vol.will) { - chan[c.chan].outVol=(0xffff*chan[c.chan].vol)/0xff; - } - if (!chan[c.chan].std.panL.will) { - chan[c.chan].outLVol=(0xffff*chan[c.chan].lVol)/0xff; - } - if (!chan[c.chan].std.panR.will) { - chan[c.chan].outRVol=(0xffff*chan[c.chan].rVol)/0xff; - } chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!chan[c.chan].std.vol.will) { + chan[c.chan].outVol=(0xffff*chan[c.chan].vol)/0xff; + chan[c.chan].volChanged.lVol=1; + chan[c.chan].volChanged.rVol=1; + } + if (!chan[c.chan].std.panL.will) { + chan[c.chan].outLVol=(0xffff*chan[c.chan].lVol)/0xff; + chan[c.chan].volChanged.lVol=1; + } + if (!chan[c.chan].std.panR.will) { + chan[c.chan].outRVol=(0xffff*chan[c.chan].rVol)/0xff; + chan[c.chan].volChanged.rVol=1; + } break; } case DIV_CMD_NOTE_OFF: @@ -793,7 +801,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { if (chan[c.chan].vol!=(unsigned int)(c.value)) { chan[c.chan].vol=c.value; if (!chan[c.chan].std.vol.has) { - chan[c.chan].outVol=(0xffff*c.value)/0xff; + chan[c.chan].outVol=(0xffff*chan[c.chan].vol)/0xff; chan[c.chan].volChanged.changed=0xff; } } From a1d83e869d8e8c9ba78fae6905b03b3a8627a117 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 12 Feb 2023 14:36:24 +0900 Subject: [PATCH 2/4] Reduce duplicates --- src/engine/platform/es5506.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index 50e30c8b..27056409 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -23,6 +23,7 @@ #include #include +#define VOL_CALC(vol) ((0xffff*(vol))/0xff) #define PITCH_OFFSET ((double)(16*2048*(chanMax+1))) #define NOTE_ES5506(c,note) (parent->calcBaseFreq(chipClock,chan[c].pcm.freqOffs,note,false)) @@ -190,7 +191,7 @@ void DivPlatformES5506::tick(bool sysTick) { signed int k1=chan[i].k1Prev,k2=chan[i].k2Prev; // volume/panning macros if (chan[i].std.vol.had) { - const unsigned int nextVol=VOL_SCALE_LOG((0xffff*chan[i].vol)/0xff,(0xffff*(unsigned int)chan[i].std.vol.val)/chan[i].volMacroMax,0xffff); + const unsigned int nextVol=VOL_SCALE_LOG(VOL_CALC(chan[i].vol),(0xffff*(unsigned int)chan[i].std.vol.val)/chan[i].volMacroMax,0xffff); if (chan[i].outVol!=nextVol) { chan[i].outVol=nextVol; chan[i].volChanged.lVol=1; @@ -198,14 +199,14 @@ void DivPlatformES5506::tick(bool sysTick) { } } if (chan[i].std.panL.had) { - const unsigned int nextLVol=VOL_SCALE_LOG((0xffff*chan[i].lVol)/0xff,(0xffff*(unsigned int)chan[i].std.panL.val)/chan[i].panMacroMax,0xffff); + const unsigned int nextLVol=VOL_SCALE_LOG(VOL_CALC(chan[i].lVol),(0xffff*(unsigned int)chan[i].std.panL.val)/chan[i].panMacroMax,0xffff); if (chan[i].outLVol!=nextLVol) { chan[i].outLVol=nextLVol; chan[i].volChanged.lVol=1; } } if (chan[i].std.panR.had) { - const unsigned int nextRVol=VOL_SCALE_LOG((0xffff*chan[i].rVol)/0xff,(0xffff*(unsigned int)chan[i].std.panR.val)/chan[i].panMacroMax,0xffff); + const unsigned int nextRVol=VOL_SCALE_LOG(VOL_CALC(chan[i].rVol),(0xffff*(unsigned int)chan[i].std.panR.val)/chan[i].panMacroMax,0xffff); if (chan[i].outRVol!=nextRVol) { chan[i].outRVol=nextRVol; chan[i].volChanged.rVol=1; @@ -701,7 +702,7 @@ void DivPlatformES5506::tick(bool sysTick) { pageWrite(0x00|i,0x06,chan[i].envelope.ecount); // Clear ECOUNT pageWriteMask(0x00|i,0x5f,0x00,loopFlag,0x3cff); if (!chan[i].std.vol.had) { - chan[i].outVol=(0xffff*chan[i].vol)/0xff; + chan[i].outVol=VOL_CALC(chan[i].vol); chan[i].volChanged.changed=0xff; } } @@ -767,16 +768,16 @@ int DivPlatformES5506::dispatch(DivCommand c) { chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); if (!chan[c.chan].std.vol.will) { - chan[c.chan].outVol=(0xffff*chan[c.chan].vol)/0xff; + chan[c.chan].outVol=VOL_CALC(chan[c.chan].vol); chan[c.chan].volChanged.lVol=1; chan[c.chan].volChanged.rVol=1; } if (!chan[c.chan].std.panL.will) { - chan[c.chan].outLVol=(0xffff*chan[c.chan].lVol)/0xff; + chan[c.chan].outLVol=VOL_CALC(chan[c.chan].lVol); chan[c.chan].volChanged.lVol=1; } if (!chan[c.chan].std.panR.will) { - chan[c.chan].outRVol=(0xffff*chan[c.chan].rVol)/0xff; + chan[c.chan].outRVol=VOL_CALC(chan[c.chan].rVol); chan[c.chan].volChanged.rVol=1; } break; @@ -801,7 +802,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { if (chan[c.chan].vol!=(unsigned int)(c.value)) { chan[c.chan].vol=c.value; if (!chan[c.chan].std.vol.has) { - chan[c.chan].outVol=(0xffff*chan[c.chan].vol)/0xff; + chan[c.chan].outVol=VOL_CALC(chan[c.chan].vol); chan[c.chan].volChanged.changed=0xff; } } @@ -821,7 +822,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { if (chan[c.chan].lVol!=(unsigned int)(c.value)) { chan[c.chan].lVol=c.value; if (!chan[c.chan].std.panL.has) { - chan[c.chan].outLVol=(0xffff*c.value)/0xff; + chan[c.chan].outLVol=VOL_CALC(c.value); chan[c.chan].volChanged.lVol=1; } } @@ -829,7 +830,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { if (chan[c.chan].rVol!=(unsigned int)(c.value2)) { chan[c.chan].rVol=c.value2; if (!chan[c.chan].std.panR.has) { - chan[c.chan].outRVol=(0xffff*c.value2)/0xff; + chan[c.chan].outRVol=VOL_CALC(c.value2); chan[c.chan].volChanged.rVol=1; } } @@ -846,7 +847,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { if (chan[c.chan].lVol!=(unsigned int)(c.value2)) { chan[c.chan].lVol=c.value2; if (!chan[c.chan].std.panL.has) { - chan[c.chan].outLVol=(0xffff*c.value2)/0xff; + chan[c.chan].outLVol=VOL_CALC(c.value2); chan[c.chan].volChanged.lVol=1; } } @@ -856,7 +857,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { if (chan[c.chan].rVol!=(unsigned int)(c.value2)) { chan[c.chan].rVol=c.value2; if (!chan[c.chan].std.panR.has) { - chan[c.chan].outRVol=(0xffff*c.value2)/0xff; + chan[c.chan].outRVol=VOL_CALC(c.value2); chan[c.chan].volChanged.rVol=1; } } From 799d54106ff1f763e64fe6a8165363d5854afa21 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 12 Feb 2023 14:45:29 +0900 Subject: [PATCH 3/4] Change to int --- src/engine/platform/es5506.cpp | 16 ++++++++-------- src/engine/platform/es5506.h | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index 27056409..aa6bc081 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -191,7 +191,7 @@ void DivPlatformES5506::tick(bool sysTick) { signed int k1=chan[i].k1Prev,k2=chan[i].k2Prev; // volume/panning macros if (chan[i].std.vol.had) { - const unsigned int nextVol=VOL_SCALE_LOG(VOL_CALC(chan[i].vol),(0xffff*(unsigned int)chan[i].std.vol.val)/chan[i].volMacroMax,0xffff); + const int nextVol=VOL_SCALE_LOG(VOL_CALC(chan[i].vol),(0xffff*(unsigned int)chan[i].std.vol.val)/chan[i].volMacroMax,0xffff); if (chan[i].outVol!=nextVol) { chan[i].outVol=nextVol; chan[i].volChanged.lVol=1; @@ -199,14 +199,14 @@ void DivPlatformES5506::tick(bool sysTick) { } } if (chan[i].std.panL.had) { - const unsigned int nextLVol=VOL_SCALE_LOG(VOL_CALC(chan[i].lVol),(0xffff*(unsigned int)chan[i].std.panL.val)/chan[i].panMacroMax,0xffff); + const int nextLVol=VOL_SCALE_LOG(VOL_CALC(chan[i].lVol),(0xffff*(unsigned int)chan[i].std.panL.val)/chan[i].panMacroMax,0xffff); if (chan[i].outLVol!=nextLVol) { chan[i].outLVol=nextLVol; chan[i].volChanged.lVol=1; } } if (chan[i].std.panR.had) { - const unsigned int nextRVol=VOL_SCALE_LOG(VOL_CALC(chan[i].rVol),(0xffff*(unsigned int)chan[i].std.panR.val)/chan[i].panMacroMax,0xffff); + const int nextRVol=VOL_SCALE_LOG(VOL_CALC(chan[i].rVol),(0xffff*(unsigned int)chan[i].std.panR.val)/chan[i].panMacroMax,0xffff); if (chan[i].outRVol!=nextRVol) { chan[i].outRVol=nextRVol; chan[i].volChanged.rVol=1; @@ -799,7 +799,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { } break; case DIV_CMD_VOLUME: - if (chan[c.chan].vol!=(unsigned int)(c.value)) { + if (chan[c.chan].vol!=c.value) { chan[c.chan].vol=c.value; if (!chan[c.chan].std.vol.has) { chan[c.chan].outVol=VOL_CALC(chan[c.chan].vol); @@ -819,7 +819,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { chan[c.chan].volChanged.ca=1; } // Left volume - if (chan[c.chan].lVol!=(unsigned int)(c.value)) { + if (chan[c.chan].lVol!=c.value) { chan[c.chan].lVol=c.value; if (!chan[c.chan].std.panL.has) { chan[c.chan].outLVol=VOL_CALC(c.value); @@ -827,7 +827,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { } } // Right volume - if (chan[c.chan].rVol!=(unsigned int)(c.value2)) { + if (chan[c.chan].rVol!=c.value2) { chan[c.chan].rVol=c.value2; if (!chan[c.chan].std.panR.has) { chan[c.chan].outRVol=VOL_CALC(c.value2); @@ -844,7 +844,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { } if ((c.value&1)==0) { // Left volume - if (chan[c.chan].lVol!=(unsigned int)(c.value2)) { + if (chan[c.chan].lVol!=c.value2) { chan[c.chan].lVol=c.value2; if (!chan[c.chan].std.panL.has) { chan[c.chan].outLVol=VOL_CALC(c.value2); @@ -854,7 +854,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { } else if ((c.value&1)==1) { // Right volume - if (chan[c.chan].rVol!=(unsigned int)(c.value2)) { + if (chan[c.chan].rVol!=c.value2) { chan[c.chan].rVol=c.value2; if (!chan[c.chan].std.panR.has) { chan[c.chan].outRVol=VOL_CALC(c.value2); diff --git a/src/engine/platform/es5506.h b/src/engine/platform/es5506.h index cb358a20..3bd158a8 100644 --- a/src/engine/platform/es5506.h +++ b/src/engine/platform/es5506.h @@ -28,7 +28,7 @@ #include "vgsound_emu/src/es550x/es5506.hpp" class DivPlatformES5506: public DivDispatch, public es550x_intf { - struct Channel : public SharedChannel { + struct Channel : public SharedChannel { struct PCM { bool isNoteMap; int index, next; @@ -184,7 +184,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf { DivInstrumentES5506::Filter filter; DivInstrumentES5506::Envelope envelope; Channel(): - SharedChannel(0xff), + SharedChannel(0xff), pcm(PCM()), nextFreq(0), nextNote(0), From fc4b2718c0a2924a38e5d655057920fa46c12ca5 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 12 Feb 2023 14:53:44 +0900 Subject: [PATCH 4/4] Fix volume effect --- src/engine/platform/es5506.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index aa6bc081..b234ee03 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -811,7 +811,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { if (chan[c.chan].std.vol.has) { return chan[c.chan].vol; } - return chan[c.chan].outVol; + return chan[c.chan].outVol/0xff; break; case DIV_CMD_PANNING: { if (chan[c.chan].ca!=0) {