diff --git a/papers/format.md b/papers/format.md index 242e8bcc4..1a5a466a0 100644 --- a/papers/format.md +++ b/papers/format.md @@ -364,7 +364,8 @@ size | description 1 | disable new NES DPCM features (>=183) 1 | reset arp effect phase on new note (>=184) 1 | linear volume scaling rounds up (>=188) - 2 | reserved + 1 | legacy "always set volume" behavior (>=191) + 1 | reserved --- | **speed pattern of first song** (>=139) 1 | length of speed pattern (fail if this is lower than 0 or higher than 16) 16 | speed pattern (this overrides speed 1 and speed 2 settings) diff --git a/src/engine/cmdStreamOps.cpp b/src/engine/cmdStreamOps.cpp index b3be6dddf..4ba6cd893 100644 --- a/src/engine/cmdStreamOps.cpp +++ b/src/engine/cmdStreamOps.cpp @@ -312,8 +312,6 @@ SafeWriter* DivEngine::saveCommand(bool binary) { for (DivCommand& i: cmdStream) { switch (i.cmd) { // strip away hinted/useless commands - case DIV_ALWAYS_SET_VOLUME: - break; case DIV_CMD_GET_VOLUME: break; case DIV_CMD_VOLUME: diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index fef7dd78f..4f9812caa 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -248,8 +248,6 @@ enum DivDispatchCmds { DIV_CMD_ESFM_MODIN, // (op, value) DIV_CMD_ESFM_ENV_DELAY, // (op, value) - DIV_ALWAYS_SET_VOLUME, // () -> alwaysSetVol - DIV_CMD_MAX }; @@ -611,6 +609,13 @@ class DivDispatch { */ virtual int getPortaFloor(int ch); + /** + * check whether to always set volume on volume change (even when same volume). + * only for compatibility purposes! + * @return truth. + */ + virtual bool getLegacyAlwaysSetVolume(); + /** * get the required amplification level of this dispatch's output. * @return the amplification level. diff --git a/src/engine/engine.h b/src/engine/engine.h index 3bf2a9826..1e13e3ccb 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -54,8 +54,8 @@ class DivWorkPool; #define DIV_UNSTABLE -#define DIV_VERSION "dev190" -#define DIV_ENGINE_VERSION 190 +#define DIV_VERSION "dev191" +#define DIV_ENGINE_VERSION 191 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 9faf0923d..d4c02347a 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -187,6 +187,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { ds.oldDPCM=true; ds.delayBehavior=0; ds.jumpTreatment=2; + ds.oldAlwaysSetVolume=true; // 1.1 compat flags if (ds.version>24) { @@ -1876,6 +1877,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { if (ds.version<188) { ds.ceilVolumeScaling=false; } + if (ds.version<191) { + ds.oldAlwaysSetVolume=true; + } ds.isDMF=false; reader.readS(); // reserved @@ -2424,7 +2428,12 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { } else { reader.readC(); } - for (int i=0; i<2; i++) { + if (ds.version>=191) { + ds.oldAlwaysSetVolume=reader.readC(); + } else { + reader.readC(); + } + for (int i=0; i<1; i++) { reader.readC(); } } @@ -5522,7 +5531,8 @@ SafeWriter* DivEngine::saveFur(bool notPrimary, bool newPatternFormat) { w->writeC(song.oldDPCM); w->writeC(song.resetArpPhaseOnNewNote); w->writeC(song.ceilVolumeScaling); - for (int i=0; i<2; i++) { + w->writeC(song.oldAlwaysSetVolume); + for (int i=0; i<1; i++) { w->writeC(0); } diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 6da4b3e79..ae16c7d2f 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -111,6 +111,10 @@ int DivDispatch::getPortaFloor(int ch) { return 0x00; } +bool DivDispatch::getLegacyAlwaysSetVolume() { + return true; +} + float DivDispatch::getPostAmp() { return 1.0f; } diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index d9a8fca82..107c1493a 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -721,9 +721,6 @@ int DivPlatformAmiga::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index a84259009..b760d8e6a 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -783,9 +783,6 @@ int DivPlatformArcade::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 127; break; diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index ed352e982..823b0b3a1 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -651,9 +651,6 @@ int DivPlatformAY8910::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 15; break; @@ -779,6 +776,10 @@ bool DivPlatformAY8910::keyOffAffectsArp(int ch) { return true; } +bool DivPlatformAY8910::getLegacyAlwaysSetVolume() { + return false; +} + void DivPlatformAY8910::notifyInsDeletion(void* ins) { for (int i=0; i<3; i++) { chan[i].std.notifyInsDeletion((DivInstrument*)ins); diff --git a/src/engine/platform/ay.h b/src/engine/platform/ay.h index 480e23f4e..fe0a6758a 100644 --- a/src/engine/platform/ay.h +++ b/src/engine/platform/ay.h @@ -144,6 +144,7 @@ class DivPlatformAY8910: public DivDispatch { bool keyOffAffectsArp(int ch); DivMacroInt* getChanMacroInt(int ch); DivSamplePos getSamplePos(int ch); + bool getLegacyAlwaysSetVolume(); bool getDCOffRequired(); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index 9fd4c1629..4fc32ac5c 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -653,9 +653,6 @@ int DivPlatformAY8930::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 31; break; @@ -778,6 +775,10 @@ bool DivPlatformAY8930::keyOffAffectsArp(int ch) { return true; } +bool DivPlatformAY8930::getLegacyAlwaysSetVolume() { + return false; +} + void DivPlatformAY8930::notifyInsDeletion(void* ins) { for (int i=0; i<3; i++) { chan[i].std.notifyInsDeletion((DivInstrument*)ins); diff --git a/src/engine/platform/ay8930.h b/src/engine/platform/ay8930.h index 902c69517..b43ec0fcd 100644 --- a/src/engine/platform/ay8930.h +++ b/src/engine/platform/ay8930.h @@ -144,6 +144,7 @@ class DivPlatformAY8930: public DivDispatch { bool keyOffAffectsArp(int ch); DivMacroInt* getChanMacroInt(int ch); DivSamplePos getSamplePos(int ch); + bool getLegacyAlwaysSetVolume(); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); diff --git a/src/engine/platform/bubsyswsg.cpp b/src/engine/platform/bubsyswsg.cpp index 1429c55b3..452fb8f89 100644 --- a/src/engine/platform/bubsyswsg.cpp +++ b/src/engine/platform/bubsyswsg.cpp @@ -246,9 +246,6 @@ int DivPlatformBubSysWSG::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/c140.cpp b/src/engine/platform/c140.cpp index bcfae3773..46f793a9a 100644 --- a/src/engine/platform/c140.cpp +++ b/src/engine/platform/c140.cpp @@ -441,9 +441,6 @@ int DivPlatformC140::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 3a80a43ef..4c3245b82 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -536,9 +536,6 @@ int DivPlatformC64::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index 85c70d17e..0121d19d5 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -1022,9 +1022,6 @@ int DivPlatformES5506::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/esfm.cpp b/src/engine/platform/esfm.cpp index 0df388084..1981b855d 100644 --- a/src/engine/platform/esfm.cpp +++ b/src/engine/platform/esfm.cpp @@ -920,9 +920,6 @@ int DivPlatformESFM::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 63; break; @@ -1015,6 +1012,10 @@ bool DivPlatformESFM::keyOffAffectsPorta(int ch) { return false; } +bool DivPlatformESFM::getLegacyAlwaysSetVolume() { + return false; +} + void DivPlatformESFM::notifyInsChange(int ins) { for (int i=0; i<18; i++) { if (chan[i].ins==ins) { diff --git a/src/engine/platform/esfm.h b/src/engine/platform/esfm.h index d7a5a574d..58fafbfab 100644 --- a/src/engine/platform/esfm.h +++ b/src/engine/platform/esfm.h @@ -193,6 +193,7 @@ class DivPlatformESFM: public DivDispatch { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); bool keyOffAffectsPorta(int ch); + bool getLegacyAlwaysSetVolume(); void toggleRegisterDump(bool enable); void notifyInsChange(int ins); void notifyInsDeletion(void* ins); diff --git a/src/engine/platform/fds.cpp b/src/engine/platform/fds.cpp index 66b713ca2..1afcd0df0 100644 --- a/src/engine/platform/fds.cpp +++ b/src/engine/platform/fds.cpp @@ -387,9 +387,6 @@ int DivPlatformFDS::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/fmsharedbase.h b/src/engine/platform/fmsharedbase.h index 63669002b..3f5db9229 100644 --- a/src/engine/platform/fmsharedbase.h +++ b/src/engine/platform/fmsharedbase.h @@ -136,6 +136,10 @@ class DivPlatformFMBase: public DivDispatch { return CLAMP(round(128.0-(56.0-log2(vel*127.0)*8.0)),0,127); } + bool getLegacyAlwaysSetVolume() { + return true; + } + friend void putDispatchChan(void*,int,int); DivPlatformFMBase(): diff --git a/src/engine/platform/ga20.cpp b/src/engine/platform/ga20.cpp index af7fbed90..a2ff81eb3 100644 --- a/src/engine/platform/ga20.cpp +++ b/src/engine/platform/ga20.cpp @@ -311,9 +311,6 @@ int DivPlatformGA20::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index c1af65415..4f9c85960 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -553,9 +553,6 @@ int DivPlatformGB::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 393b0c07f..9a2b514d0 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1183,9 +1183,6 @@ int DivPlatformGenesis::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 127; break; diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index bdfb8bfc6..a3860f09d 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -418,9 +418,6 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: opChan[ch].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_PRE_PORTA: break; default: diff --git a/src/engine/platform/k007232.cpp b/src/engine/platform/k007232.cpp index 7d84e6d35..ba742a2dc 100644 --- a/src/engine/platform/k007232.cpp +++ b/src/engine/platform/k007232.cpp @@ -395,9 +395,6 @@ int DivPlatformK007232::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index 12128308c..2af1d5bd3 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -345,9 +345,6 @@ int DivPlatformK053260::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 722b139cc..909e4b20c 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -353,9 +353,6 @@ int DivPlatformLynx::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; default: break; } @@ -438,6 +435,10 @@ bool DivPlatformLynx::keyOffAffectsPorta(int ch) { return true; } +bool DivPlatformLynx::getLegacyAlwaysSetVolume() { + return false; +} + //int DivPlatformLynx::getPortaFloor(int ch) { // return 12; //} diff --git a/src/engine/platform/lynx.h b/src/engine/platform/lynx.h index 1ce093187..7d705261d 100644 --- a/src/engine/platform/lynx.h +++ b/src/engine/platform/lynx.h @@ -84,6 +84,7 @@ class DivPlatformLynx: public DivDispatch { int getOutputCount(); bool keyOffAffectsArp(int ch); bool keyOffAffectsPorta(int ch); + bool getLegacyAlwaysSetVolume(); //int getPortaFloor(int ch); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); diff --git a/src/engine/platform/mmc5.cpp b/src/engine/platform/mmc5.cpp index ad3e44431..656288c6a 100644 --- a/src/engine/platform/mmc5.cpp +++ b/src/engine/platform/mmc5.cpp @@ -327,9 +327,6 @@ int DivPlatformMMC5::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/msm5232.cpp b/src/engine/platform/msm5232.cpp index d1a24ba56..ef4e14afc 100644 --- a/src/engine/platform/msm5232.cpp +++ b/src/engine/platform/msm5232.cpp @@ -297,9 +297,6 @@ int DivPlatformMSM5232::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index d60535e91..1b7b2434b 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -268,9 +268,6 @@ int DivPlatformMSM6258::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 8; break; @@ -371,6 +368,10 @@ bool DivPlatformMSM6258::keyOffAffectsArp(int ch) { return false; } +bool DivPlatformMSM6258::getLegacyAlwaysSetVolume() { + return false; +} + void DivPlatformMSM6258::notifyInsChange(int ins) { for (int i=0; i<1; i++) { if (chan[i].ins==ins) { diff --git a/src/engine/platform/msm6258.h b/src/engine/platform/msm6258.h index c31c083c3..9b84c2236 100644 --- a/src/engine/platform/msm6258.h +++ b/src/engine/platform/msm6258.h @@ -75,6 +75,7 @@ class DivPlatformMSM6258: public DivDispatch { void muteChannel(int ch, bool mute); int getOutputCount(); bool keyOffAffectsArp(int ch); + bool getLegacyAlwaysSetVolume(); void notifyInsChange(int ins); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index d770a845e..8ca92d9fb 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -226,9 +226,6 @@ int DivPlatformMSM6295::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 8; break; @@ -312,6 +309,10 @@ bool DivPlatformMSM6295::keyOffAffectsArp(int ch) { return false; } +bool DivPlatformMSM6295::getLegacyAlwaysSetVolume() { + return false; +} + float DivPlatformMSM6295::getPostAmp() { return 3.0f; } diff --git a/src/engine/platform/msm6295.h b/src/engine/platform/msm6295.h index d8778926a..b7ebf5bf9 100644 --- a/src/engine/platform/msm6295.h +++ b/src/engine/platform/msm6295.h @@ -77,6 +77,7 @@ class DivPlatformMSM6295: public DivDispatch, public vgsound_emu_mem_intf { virtual void tick(bool sysTick=true) override; virtual void muteChannel(int ch, bool mute) override; virtual bool keyOffAffectsArp(int ch) override; + virtual bool getLegacyAlwaysSetVolume() override; virtual float getPostAmp() override; virtual void notifyInsChange(int ins) override; virtual void notifyInsDeletion(void* ins) override; diff --git a/src/engine/platform/n163.cpp b/src/engine/platform/n163.cpp index f96d13216..c1320ef1a 100644 --- a/src/engine/platform/n163.cpp +++ b/src/engine/platform/n163.cpp @@ -452,9 +452,6 @@ int DivPlatformN163::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index abc762de7..7c56b1c5e 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -445,9 +445,6 @@ int DivPlatformNamcoWSG::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index e1e883673..1b15c5da5 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -659,9 +659,6 @@ int DivPlatformNES::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index b64d4f020..088c72f38 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -1343,7 +1343,7 @@ void DivPlatformOPL::commitState(int ch, DivInstrument* ins) { int DivPlatformOPL::dispatch(DivCommand c) { if (c.chan>=totalChans && c.chan!=adpcmChan) return 0; // ineffective in 4-op mode - if (oplType==3 && c.chan!=adpcmChan && c.chan<14 && (c.chan&1) && c.cmd!=DIV_CMD_GET_VOLMAX && c.cmd!=DIV_ALWAYS_SET_VOLUME) { + if (oplType==3 && c.chan!=adpcmChan && c.chan<14 && (c.chan&1) && c.cmd!=DIV_CMD_GET_VOLMAX) { if (chan[c.chan-1].fourOp) return 0; } switch (c.cmd) { @@ -1970,9 +1970,6 @@ int DivPlatformOPL::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: if (c.chan==adpcmChan) return 255; if (pretendYMU) return 127; @@ -2279,6 +2276,10 @@ bool DivPlatformOPL::keyOffAffectsPorta(int ch) { return false; } +bool DivPlatformOPL::getLegacyAlwaysSetVolume() { + return false; +} + void DivPlatformOPL::notifyInsChange(int ins) { for (int i=0; i& wlist); diff --git a/src/engine/platform/scc.cpp b/src/engine/platform/scc.cpp index 251e1e3f6..f0075822e 100644 --- a/src/engine/platform/scc.cpp +++ b/src/engine/platform/scc.cpp @@ -261,9 +261,6 @@ int DivPlatformSCC::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 975052073..c2dc6f3d5 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -339,9 +339,6 @@ int DivPlatformSegaPCM::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 127; break; @@ -372,6 +369,10 @@ void DivPlatformSegaPCM::forceIns() { } } +bool DivPlatformSegaPCM::getLegacyAlwaysSetVolume() { + return false; +} + void DivPlatformSegaPCM::notifyInsChange(int ins) { for (int i=0; i<16; i++) { if (chan[i].ins==ins) { diff --git a/src/engine/platform/segapcm.h b/src/engine/platform/segapcm.h index 192c47be0..f99da7317 100644 --- a/src/engine/platform/segapcm.h +++ b/src/engine/platform/segapcm.h @@ -103,6 +103,7 @@ class DivPlatformSegaPCM: public DivDispatch { void renderSamples(int chipID); void setFlags(const DivConfig& flags); int getOutputCount(); + bool getLegacyAlwaysSetVolume(); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const void* getSampleMem(int index=0); diff --git a/src/engine/platform/sm8521.cpp b/src/engine/platform/sm8521.cpp index f1ec91e91..55430c552 100644 --- a/src/engine/platform/sm8521.cpp +++ b/src/engine/platform/sm8521.cpp @@ -277,9 +277,6 @@ int DivPlatformSM8521::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index 57cd02aea..83351e855 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -420,9 +420,6 @@ int DivPlatformSMS::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; default: break; } @@ -509,6 +506,10 @@ bool DivPlatformSMS::keyOffAffectsPorta(int ch) { return true; } +bool DivPlatformSMS::getLegacyAlwaysSetVolume() { + return false; +} + int DivPlatformSMS::getPortaFloor(int ch) { return 12; } diff --git a/src/engine/platform/sms.h b/src/engine/platform/sms.h index 199a87d87..d2d0c901f 100644 --- a/src/engine/platform/sms.h +++ b/src/engine/platform/sms.h @@ -89,6 +89,7 @@ class DivPlatformSMS: public DivDispatch { int getOutputCount(); bool keyOffAffectsArp(int ch); bool keyOffAffectsPorta(int ch); + bool getLegacyAlwaysSetVolume(); float getPostAmp(); int getPortaFloor(int ch); void setFlags(const DivConfig& flags); diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 0a3f22545..891bab206 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -502,9 +502,6 @@ int DivPlatformSoundUnit::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index d50e2dddd..0f7b6911f 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -446,9 +446,6 @@ int DivPlatformSwan::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/t6w28.cpp b/src/engine/platform/t6w28.cpp index 0c0e388cf..138d395be 100644 --- a/src/engine/platform/t6w28.cpp +++ b/src/engine/platform/t6w28.cpp @@ -271,9 +271,6 @@ int DivPlatformT6W28::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/ted.cpp b/src/engine/platform/ted.cpp index 3b9c61aab..5078a9a37 100644 --- a/src/engine/platform/ted.cpp +++ b/src/engine/platform/ted.cpp @@ -236,9 +236,6 @@ int DivPlatformTED::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index 50bb82d64..d49d00af6 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -258,9 +258,6 @@ int DivPlatformTIA::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 15; break; @@ -340,6 +337,10 @@ bool DivPlatformTIA::keyOffAffectsArp(int ch) { return true; } +bool DivPlatformTIA::getLegacyAlwaysSetVolume() { + return false; +} + void DivPlatformTIA::notifyInsDeletion(void* ins) { for (int i=0; i<2; i++) { chan[i].std.notifyInsDeletion((DivInstrument*)ins); diff --git a/src/engine/platform/tia.h b/src/engine/platform/tia.h index fbc7dacfe..a66de9cbd 100644 --- a/src/engine/platform/tia.h +++ b/src/engine/platform/tia.h @@ -59,6 +59,7 @@ class DivPlatformTIA: public DivDispatch { float getPostAmp(); int getOutputCount(); bool keyOffAffectsArp(int ch); + bool getLegacyAlwaysSetVolume(); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index 40bcd9a39..7d68342be 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -880,9 +880,6 @@ int DivPlatformTX81Z::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: return 127; break; diff --git a/src/engine/platform/vb.cpp b/src/engine/platform/vb.cpp index 28651b7d3..c0e5b49af 100644 --- a/src/engine/platform/vb.cpp +++ b/src/engine/platform/vb.cpp @@ -395,9 +395,6 @@ int DivPlatformVB::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/vera.cpp b/src/engine/platform/vera.cpp index 830cd2ece..48b800672 100644 --- a/src/engine/platform/vera.cpp +++ b/src/engine/platform/vera.cpp @@ -437,9 +437,6 @@ int DivPlatformVERA::dispatch(DivCommand c) { case DIV_CMD_EXTERNAL: rWriteZSMSync(c.value); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; default: break; } @@ -470,6 +467,10 @@ int DivPlatformVERA::getRegisterPoolSize() { return 67; } +bool DivPlatformVERA::getLegacyAlwaysSetVolume() { + return false; +} + void DivPlatformVERA::muteChannel(int ch, bool mute) { isMuted[ch]=mute; if (ch<16) { diff --git a/src/engine/platform/vera.h b/src/engine/platform/vera.h index d23ac8100..db2005bd7 100644 --- a/src/engine/platform/vera.h +++ b/src/engine/platform/vera.h @@ -73,6 +73,7 @@ class DivPlatformVERA: public DivDispatch { void tick(bool sysTick=true); void muteChannel(int ch, bool mute); void setFlags(const DivConfig& flags); + bool getLegacyAlwaysSetVolume(); void notifyInsDeletion(void* ins); float getPostAmp(); int getOutputCount(); diff --git a/src/engine/platform/vic20.cpp b/src/engine/platform/vic20.cpp index 8d12ce24e..66a11fadd 100644 --- a/src/engine/platform/vic20.cpp +++ b/src/engine/platform/vic20.cpp @@ -252,9 +252,6 @@ int DivPlatformVIC20::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/vrc6.cpp b/src/engine/platform/vrc6.cpp index 0610cb2fa..3b2f660ac 100644 --- a/src/engine/platform/vrc6.cpp +++ b/src/engine/platform/vrc6.cpp @@ -412,9 +412,6 @@ int DivPlatformVRC6::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index 70cd77f53..e5cfe72ac 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -832,9 +832,6 @@ int DivPlatformX1_010::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 9f6f54f50..a666a62b9 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -861,9 +861,6 @@ int DivPlatformYM2203::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: if (c.chan>2) return 15; return 127; diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index c2587f53c..bd2e6c4a5 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -375,9 +375,6 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: opChan[ch].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_PRE_PORTA: break; default: diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index dcda75982..7738ae979 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1352,9 +1352,6 @@ int DivPlatformYM2608::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: if (c.chan>14) return 255; if (c.chan>8) return 31; diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index c2428993c..d27703c58 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -399,9 +399,6 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: opChan[ch].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_PRE_PORTA: break; default: diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 50cccd3a3..e982fe086 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -1324,9 +1324,6 @@ int DivPlatformYM2610::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: if (c.chan>=adpcmBChanOffs) return 255; if (c.chan>=adpcmAChanOffs) return 31; diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 9d83c1a0e..6c183a57d 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -1391,9 +1391,6 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_GET_VOLMAX: if (c.chan>=adpcmBChanOffs) return 255; if (c.chan>=adpcmAChanOffs) return 31; diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index 09efc620c..519c7004e 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -395,9 +395,6 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: opChan[ch].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_PRE_PORTA: break; default: diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index c468c02e7..d9a111114 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -395,9 +395,6 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: opChan[ch].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 0; - break; case DIV_CMD_PRE_PORTA: break; default: diff --git a/src/engine/platform/ymz280b.cpp b/src/engine/platform/ymz280b.cpp index 02b701b20..4158b4fa9 100644 --- a/src/engine/platform/ymz280b.cpp +++ b/src/engine/platform/ymz280b.cpp @@ -321,9 +321,6 @@ int DivPlatformYMZ280B::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/zxbeeper.cpp b/src/engine/platform/zxbeeper.cpp index 7e48662c8..70272613a 100644 --- a/src/engine/platform/zxbeeper.cpp +++ b/src/engine/platform/zxbeeper.cpp @@ -218,9 +218,6 @@ int DivPlatformZXBeeper::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/platform/zxbeeperquadtone.cpp b/src/engine/platform/zxbeeperquadtone.cpp index dc93c2455..35a8a5d1d 100644 --- a/src/engine/platform/zxbeeperquadtone.cpp +++ b/src/engine/platform/zxbeeperquadtone.cpp @@ -288,9 +288,6 @@ int DivPlatformZXBeeperQuadTone::dispatch(DivCommand c) { case DIV_CMD_MACRO_ON: chan[c.chan].std.mask(c.value,false); break; - case DIV_ALWAYS_SET_VOLUME: - return 1; - break; default: break; } diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 357e43361..06ce4ed1c 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -246,9 +246,6 @@ const char* cmdName[]={ "ESFM_OUTLVL", "ESFM_MODIN", "ESFM_ENV_DELAY", - - "ALWAYS_SET_VOLUME", - }; static_assert((sizeof(cmdName)/sizeof(void*))==DIV_CMD_MAX,"update cmdName!"); @@ -273,8 +270,6 @@ int DivEngine::dispatchCmd(DivCommand c) { if (!skipping) { switch (c.cmd) { // strip away hinted/useless commands - case DIV_ALWAYS_SET_VOLUME: - break; case DIV_CMD_GET_VOLUME: break; case DIV_CMD_VOLUME: @@ -621,7 +616,7 @@ void DivEngine::processRow(int i, bool afterDelay) { // volume if (pat->data[whatRow][3]!=-1) { - if (dispatchCmd(DivCommand(DIV_ALWAYS_SET_VOLUME,i)) || (MIN(chan[i].volMax,chan[i].volume)>>8)!=pat->data[whatRow][3]) { + if (!song.oldAlwaysSetVolume || disCont[dispatchOfChan[i]].dispatch->getLegacyAlwaysSetVolume() || (MIN(chan[i].volMax,chan[i].volume)>>8)!=pat->data[whatRow][3]) { if (pat->data[whatRow][0]==0 && pat->data[whatRow][1]==0) { chan[i].midiAftertouch=true; } diff --git a/src/engine/song.h b/src/engine/song.h index 6f5ab68f5..7f29ddb69 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -383,6 +383,7 @@ struct DivSong { bool oldDPCM; bool resetArpPhaseOnNewNote; bool ceilVolumeScaling; + bool oldAlwaysSetVolume; std::vector ins; std::vector wave; @@ -505,7 +506,8 @@ struct DivSong { preNoteNoEffect(false), oldDPCM(false), resetArpPhaseOnNewNote(false), - ceilVolumeScaling(false) { + ceilVolumeScaling(false), + oldAlwaysSetVolume(false) { for (int i=0; isong.oldAlwaysSetVolume); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("behavior changed in 0.6.1\nthis flag will be removed if I find out that none of the songs break after disabling it."); + } ImGui::EndTabItem(); } if (ImGui::BeginTabItem(".mod import")) { diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 2e4db92cc..762d8ceca 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -1463,7 +1463,6 @@ void FurnaceGUI::drawPattern() { if (i.cmd==DIV_CMD_PRE_NOTE) continue; if (i.cmd==DIV_CMD_SAMPLE_BANK) continue; if (i.cmd==DIV_CMD_GET_VOLUME) continue; - if (i.cmd==DIV_ALWAYS_SET_VOLUME) continue; if (i.cmd==DIV_CMD_HINT_VOLUME || i.cmd==DIV_CMD_HINT_PORTA || i.cmd==DIV_CMD_HINT_LEGATO ||