diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index 14427072..60cb13c5 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -129,7 +129,7 @@ void DivPlatformSMS::tick(bool sysTick) { if (chan[i].outVol<0) chan[i].outVol=0; // old formula // ((chan[i].vol&15)*MIN(15,chan[i].std.vol.val))>>4; - rWrite(0,0x90|(i<<5)|(isMuted[i]?15:(15-(chan[i].outVol&15)))); + chan[i].writeVol=true; } if (chan[i].std.arp.had) { if (!chan[i].inPorta) { @@ -235,6 +235,12 @@ void DivPlatformSMS::tick(bool sysTick) { chan[3].freqChanged=false; updateSNMode=false; } + for (int i=0; i<4; i++) { + if (chan[i].writeVol) { + rWrite(0,0x90|(i<<5)|(isMuted[i]?15:(15-(chan[i].outVol&15)))); + chan[i].writeVol=false; + } + } } int DivPlatformSMS::dispatch(DivCommand c) { @@ -250,7 +256,9 @@ int DivPlatformSMS::dispatch(DivCommand c) { } chan[c.chan].active=true; //if (!parent->song.brokenOutVol2) { - rWrite(0,0x90|c.chan<<5|(isMuted[c.chan]?15:(15-(chan[c.chan].vol&15)))); + chan[c.chan].writeVol=true; + chan[c.chan].outVol=chan[c.chan].vol; + //rWrite(0,0x90|c.chan<<5|(isMuted[c.chan]?15:(15-(chan[c.chan].vol&15)))); //} chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_STD)); if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { @@ -276,7 +284,9 @@ int DivPlatformSMS::dispatch(DivCommand c) { if (!chan[c.chan].std.vol.has) { chan[c.chan].outVol=c.value; } - if (chan[c.chan].active) rWrite(0,0x90|c.chan<<5|(isMuted[c.chan]?15:(15-(chan[c.chan].vol&15)))); + if (chan[c.chan].active) { + chan[c.chan].writeVol=true; + } } break; case DIV_CMD_GET_VOLUME: @@ -356,7 +366,7 @@ int DivPlatformSMS::dispatch(DivCommand c) { void DivPlatformSMS::muteChannel(int ch, bool mute) { isMuted[ch]=mute; - if (chan[ch].active) rWrite(0,0x90|ch<<5|(isMuted[ch]?15:(15-(chan[ch].outVol&15)))); + if (chan[ch].active) chan[ch].writeVol=true; } void DivPlatformSMS::forceIns() { diff --git a/src/engine/platform/sms.h b/src/engine/platform/sms.h index 0a4b121f..e636b9d8 100644 --- a/src/engine/platform/sms.h +++ b/src/engine/platform/sms.h @@ -31,7 +31,7 @@ extern "C" { class DivPlatformSMS: public DivDispatch { struct Channel { int freq, baseFreq, pitch, pitch2, note, actualNote, ins; - bool active, insChanged, freqChanged, keyOn, keyOff, inPorta; + bool active, insChanged, freqChanged, keyOn, keyOff, inPorta, writeVol; signed char vol, outVol; DivMacroInt std; void macroInit(DivInstrument* which) { @@ -52,6 +52,7 @@ class DivPlatformSMS: public DivDispatch { keyOn(false), keyOff(false), inPorta(false), + writeVol(false), vol(15), outVol(15) {} };