diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index 6eaa10d44..37211ef65 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -180,6 +180,10 @@ int DivPlatformAmiga::dispatch(DivCommand c) { chan[c.chan].keyOff=true; chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_INSTRUMENT: if (chan[c.chan].ins!=c.value || c.value2==1) { chan[c.chan].ins=c.value; diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 1713e9d8f..f3badf19c 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -532,6 +532,14 @@ int DivPlatformArcade::dispatch(DivCommand c) { chan[c.chan].keyOff=true; chan[c.chan].active=false; break; + case DIV_CMD_NOTE_OFF_ENV: + chan[c.chan].keyOff=true; + chan[c.chan].active=false; + chan[c.chan].std.release(); + break; + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_VOLUME: { chan[c.chan].vol=c.value; if (!chan[c.chan].std.hasVol) { diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index b45749602..590d577b0 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -202,6 +202,10 @@ int DivPlatformAY8910::dispatch(DivCommand c) { chan[c.chan].active=false; chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_VOLUME: { chan[c.chan].vol=c.value; if (!chan[c.chan].std.hasVol) { diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index 9bbc8084f..bd616fc84 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -243,6 +243,10 @@ int DivPlatformAY8930::dispatch(DivCommand c) { chan[c.chan].active=false; chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_VOLUME: { chan[c.chan].vol=c.value; if (!chan[c.chan].std.hasVol) { diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 2add935ff..2e544924e 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -195,6 +195,14 @@ int DivPlatformC64::dispatch(DivCommand c) { chan[c.chan].keyOff=true; //chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + chan[c.chan].active=false; + chan[c.chan].keyOff=true; + chan[c.chan].std.release(); + break; + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_INSTRUMENT: if (chan[c.chan].ins!=c.value || c.value2==1) { chan[c.chan].insChanged=true; diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 3b9d2d2c6..cf3708f43 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -237,6 +237,10 @@ int DivPlatformGB::dispatch(DivCommand c) { chan[c.chan].keyOff=true; chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_INSTRUMENT: if (chan[c.chan].ins!=c.value || c.value2==1) { chan[c.chan].ins=c.value; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 7c5a84e78..76c2dab39 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -495,6 +495,18 @@ int DivPlatformGenesis::dispatch(DivCommand c) { chan[c.chan].keyOff=true; chan[c.chan].active=false; break; + case DIV_CMD_NOTE_OFF_ENV: + if (c.chan==5) { + dacSample=-1; + if (dumpWrites) addWrite(0xffff0002,0); + } + chan[c.chan].keyOff=true; + chan[c.chan].active=false; + chan[c.chan].std.release(); + break; + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_VOLUME: { chan[c.chan].vol=c.value; if (!chan[c.chan].std.hasVol) { diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index 34281026b..3fb1322a3 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -289,6 +289,10 @@ int DivPlatformNES::dispatch(DivCommand c) { chan[c.chan].keyOff=true; chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_INSTRUMENT: if (chan[c.chan].ins!=c.value || c.value2==1) { chan[c.chan].ins=c.value; diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index c0c1f00e1..96b0f024d 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -272,6 +272,10 @@ int DivPlatformPCE::dispatch(DivCommand c) { chan[c.chan].keyOff=true; chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_INSTRUMENT: if (chan[c.chan].ins!=c.value || c.value2==1) { chan[c.chan].ins=c.value; diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index 6e23569c2..c9301594a 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -177,6 +177,10 @@ int DivPlatformSAA1099::dispatch(DivCommand c) { chan[c.chan].active=false; chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_VOLUME: { chan[c.chan].vol=c.value; if (!chan[c.chan].std.hasVol) { diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index af7629ecd..08e853b74 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -127,6 +127,10 @@ int DivPlatformSMS::dispatch(DivCommand c) { rWrite(0x9f|c.chan<<5); chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_INSTRUMENT: chan[c.chan].ins=c.value; //chan[c.chan].std.init(parent->getIns(chan[c.chan].ins)); diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index e29e01009..6a6ff2628 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -144,6 +144,10 @@ int DivPlatformTIA::dispatch(DivCommand c) { chan[c.chan].active=false; chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_VOLUME: { chan[c.chan].vol=c.value; if (!chan[c.chan].std.hasVol) { diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 4e99b4f01..84711fc88 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -416,6 +416,22 @@ int DivPlatformYM2610::dispatch(DivCommand c) { chan[c.chan].active=false; chan[c.chan].std.init(NULL); break; + case DIV_CMD_NOTE_OFF_ENV: + if (c.chan>6) { + immWrite(0x100,0x80|(1<<(c.chan-7))); + break; + } + if (c.chan>3) { + chan[c.chan].std.release(); + break; + } + chan[c.chan].keyOff=true; + chan[c.chan].active=false; + chan[c.chan].std.release(); + break; + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; case DIV_CMD_VOLUME: { chan[c.chan].vol=c.value; if (!chan[c.chan].std.hasVol) {