diff --git a/TODO.md b/TODO.md index 603f0cb70..1b212d95b 100644 --- a/TODO.md +++ b/TODO.md @@ -3,9 +3,9 @@ - additional YM2612 features - CSM - MSM6258 pitch and clock select -- the last three compat flags +- the last compat flags + - newSegaPCM - newVolumeScaling - - brokenOutVol - collapse/expand pattern and song - Game Boy envelope macro/sequence - rewrite the system name detection function anyway diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index ed0d2ad95..03961b0a3 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -271,6 +271,9 @@ int DivPlatformAmiga::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (chan[c.chan].useWave) { chan[c.chan].ws.init(ins,chan[c.chan].audLen<<1,255,chan[c.chan].insChanged); } diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index 6e86a47f5..a3d325ade 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -315,6 +315,9 @@ int DivPlatformAY8910::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (isMuted[c.chan]) { rWrite(0x08+c.chan,0); } else if (intellivision && (chan[c.chan].psgMode&4)) { diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index 3168bca70..fb498b2c7 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -346,6 +346,9 @@ int DivPlatformAY8930::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (isMuted[c.chan]) { rWrite(0x08+c.chan,0); } else { diff --git a/src/engine/platform/bubsyswsg.cpp b/src/engine/platform/bubsyswsg.cpp index f25e6da9c..5793277dd 100644 --- a/src/engine/platform/bubsyswsg.cpp +++ b/src/engine/platform/bubsyswsg.cpp @@ -169,6 +169,9 @@ int DivPlatformBubSysWSG::dispatch(DivCommand c) { chan[c.chan].keyOn=true; rWrite(2+c.chan,(chan[c.chan].wave<<5)|chan[c.chan].vol); chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (chan[c.chan].wave<0) { chan[c.chan].wave=0; chan[c.chan].ws.changeWave1(chan[c.chan].wave); diff --git a/src/engine/platform/fds.cpp b/src/engine/platform/fds.cpp index ebf69fa2a..eba371834 100644 --- a/src/engine/platform/fds.cpp +++ b/src/engine/platform/fds.cpp @@ -285,6 +285,9 @@ int DivPlatformFDS::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (chan[c.chan].wave<0) { chan[c.chan].wave=0; ws.changeWave1(chan[c.chan].wave); diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index af17053b1..dce2fb044 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -297,6 +297,9 @@ int DivPlatformLynx::dispatch(DivCommand c) { chan[c.chan].active=true; WRITE_VOLUME(c.chan,(isMuted[c.chan]?0:(chan[c.chan].vol&127))); chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_MIKEY)); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } break; } case DIV_CMD_NOTE_OFF: diff --git a/src/engine/platform/mmc5.cpp b/src/engine/platform/mmc5.cpp index 65c8d0450..920b9a061 100644 --- a/src/engine/platform/mmc5.cpp +++ b/src/engine/platform/mmc5.cpp @@ -241,6 +241,9 @@ int DivPlatformMMC5::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_STD)); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } rWrite(0x5000+c.chan*4,0x30|chan[c.chan].vol|((chan[c.chan].duty&3)<<6)); break; case DIV_CMD_NOTE_OFF: diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index 021ddf6cd..88cba3606 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -349,6 +349,9 @@ int DivPlatformNamcoWSG::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (chan[c.chan].wave<0) { chan[c.chan].wave=0; chan[c.chan].ws.changeWave1(chan[c.chan].wave); diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index 35acc5809..dfc9108bc 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -446,6 +446,9 @@ int DivPlatformNES::dispatch(DivCommand c) { chan[c.chan].active=true; chan[c.chan].keyOn=true; chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_STD)); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (c.chan==2) { rWrite(0x4000+c.chan*4,0xff); } else { diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 68301f730..be104fb91 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -328,6 +328,9 @@ int DivPlatformPCE::dispatch(DivCommand c) { chan[c.chan].keyOn=true; chWrite(c.chan,0x04,0x80|chan[c.chan].vol); chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } if (chan[c.chan].wave<0) { chan[c.chan].wave=0; chan[c.chan].ws.changeWave1(chan[c.chan].wave);