shithub: dumb

Download patch

ref: 01f8ce4b56e460057d6cca3bfc2d58e3600300aa
parent: b9aea1412d1645766b9373c432ac498abed34b63
author: Chris Moeller <[email protected]>
date: Thu Jul 18 04:23:11 EDT 2013

Fixed envelope carry to only occur if the running note has not already been cut or released

--- a/dumb/src/it/itrender.c
+++ b/dumb/src/it/itrender.c
@@ -1626,7 +1626,7 @@
 	int flags = 0;
 	if (channel->sample) {
 		if (sigdata->flags & IT_USE_INSTRUMENTS) {
-			if (channel->playing->env_instrument == &sigdata->instrument[channel->instrument-1]) {
+			if (!(channel->playing->flags & IT_PLAYING_SUSTAINOFF)) {
 				if (channel->playing->env_instrument->volume_envelope.flags & IT_ENVELOPE_CARRY)
 					flags |= 1;
 				if (channel->playing->env_instrument->pan_envelope.flags & IT_ENVELOPE_CARRY)
@@ -1751,10 +1751,13 @@
 			nna = channel->playing->instrument->new_note_action;
 #endif
 
-		vol_env_tick = channel->playing->volume_envelope.tick;
-		pan_env_tick = channel->playing->pan_envelope.tick;
-		pitch_env_tick = channel->playing->pitch_envelope.tick;
-		envelopes_copied = 1;
+		if (!(channel->playing->flags & IT_PLAYING_SUSTAINOFF))
+		{
+			vol_env_tick = channel->playing->volume_envelope.tick;
+			pan_env_tick = channel->playing->pan_envelope.tick;
+			pitch_env_tick = channel->playing->pitch_envelope.tick;
+			envelopes_copied = 1;
+		}
 
 		switch (nna) {
 			case NNA_NOTE_CUT:
@@ -1861,9 +1864,11 @@
 		for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
 			IT_PLAYING * playing = sigrenderer->playing[i];
 			if (!playing || playing->channel != channel) continue;
+			if (playing->flags & IT_PLAYING_SUSTAINOFF) continue;
 			vol_env_tick = playing->volume_envelope.tick;
 			pan_env_tick = playing->pan_envelope.tick;
 			pitch_env_tick = playing->pitch_envelope.tick;
+			envelopes_copied = 1;
 			break;
 		}
 	}				
@@ -1924,17 +1929,17 @@
 	channel->playing->slide = 0;
 	channel->playing->finetune = channel->playing->sample->finetune;
 
-	if (channel->playing->env_instrument->volume_envelope.flags & IT_ENVELOPE_CARRY) {
+	if (envelopes_copied && channel->playing->env_instrument->volume_envelope.flags & IT_ENVELOPE_CARRY) {
 		channel->playing->volume_envelope.tick = vol_env_tick;
 	} else {
 		channel->playing->volume_envelope.tick = 0;
 	}
-	if (channel->playing->env_instrument->pan_envelope.flags & IT_ENVELOPE_CARRY) {
+	if (envelopes_copied && channel->playing->env_instrument->pan_envelope.flags & IT_ENVELOPE_CARRY) {
 		channel->playing->pan_envelope.tick = pan_env_tick;
 	} else {
 		channel->playing->pan_envelope.tick = 0;
 	}
-	if (channel->playing->env_instrument->pitch_envelope.flags & IT_ENVELOPE_CARRY) {
+	if (envelopes_copied && channel->playing->env_instrument->pitch_envelope.flags & IT_ENVELOPE_CARRY) {
 		channel->playing->pitch_envelope.tick = pitch_env_tick;
 	} else {
 		channel->playing->pitch_envelope.tick = 0;