shithub: dumb

Download patch

ref: 79c6f2cb09edeebcebd3e8e6422caf38720df82a
parent: 885cabebbfc78ad7a3e4c4ecf80b1b6045faa139
author: Chris Moeller <kode54@gmail.com>
date: Mon Jan 11 04:00:42 EST 2010

{1/24/2007 5:57:52 AM}2007-01-24 08:34 UTC - kode54
- Implemented 669 running effects correctly.

2007-01-22 18:54 UTC - kode54
- Implemented 669 running effects, nasty stuff.

2007-01-21 14:21 UTC - kode54
- Fixed a bug in IT renderer / get_true_pan that caused it to crash on IT files with instruments enabled upon hitting an invalid instrument change.

git-tfs-id: [http://localhost:8080/tfs/DefaultCollection/]$/foobar2000/files/plugins.root;C165

--- a/dumb/src/it/itrender.c
+++ b/dumb/src/it/itrender.c
@@ -725,6 +725,36 @@
 
 
 
+static void reset_channel_effects(IT_CHANNEL *channel)
+{
+	channel->volslide = 0;
+	channel->xm_volslide = 0;
+	channel->panslide = 0;
+	channel->channelvolslide = 0;
+	channel->arpeggio = 0;
+	channel->retrig = 0;
+	if (channel->xm_retrig) {
+		channel->xm_retrig = 0;
+		channel->retrig_tick = 0;
+	}
+	channel->tremor_time &= 127;
+	channel->portamento = 0;
+	channel->toneporta = 0;
+	if (channel->ptm_toneslide) {
+		channel->ptm_last_toneslide = channel->ptm_toneslide;
+		channel->last_toneslide_tick = channel->toneslide_tick;
+	} else
+		channel->ptm_last_toneslide = 0;
+	channel->ptm_toneslide = 0;
+	channel->toneslide_tick = 0;
+	if (channel->playing) {
+		channel->playing->vibrato_n = 0;
+		channel->playing->tremolo_speed = 0;
+		channel->playing->tremolo_depth = 0;
+		channel->playing->panbrello_speed = 0;
+	}
+}
+
 static void reset_effects(DUMB_IT_SIGRENDERER *sigrenderer)
 {
 	int i;
@@ -733,33 +763,7 @@
 	sigrenderer->temposlide = 0;
 
 	for (i = 0; i < DUMB_IT_N_CHANNELS; i++) {
-		IT_CHANNEL *channel = &sigrenderer->channel[i];
-		channel->volslide = 0;
-		channel->xm_volslide = 0;
-		channel->panslide = 0;
-		channel->channelvolslide = 0;
-		channel->arpeggio = 0;
-		channel->retrig = 0;
-		if (channel->xm_retrig) {
-			channel->xm_retrig = 0;
-			channel->retrig_tick = 0;
-		}
-		channel->tremor_time &= 127;
-		channel->portamento = 0;
-		channel->toneporta = 0;
-		if (channel->ptm_toneslide) {
-			channel->ptm_last_toneslide = channel->ptm_toneslide;
-			channel->last_toneslide_tick = channel->toneslide_tick;
-		} else
-			channel->ptm_last_toneslide = 0;
-		channel->ptm_toneslide = 0;
-		channel->toneslide_tick = 0;
-		if (channel->playing) {
-			channel->playing->vibrato_n = 0;
-			channel->playing->tremolo_speed = 0;
-			channel->playing->tremolo_depth = 0;
-			channel->playing->panbrello_speed = 0;
-		}
+		reset_channel_effects(&sigrenderer->channel[i]);
 	}
 }
 
@@ -1150,7 +1154,7 @@
 		switch (entry->effect) {
 			case IT_JUMP_TO_ORDER:
 				/* XXX jump and break in same row */
-				if ( ( sigrenderer->processrow | 0xC00 == 0xFFFE ) &&
+				if ( ( ( sigrenderer->processrow | 0xC00 ) == 0xFFFE ) &&
 					! ( sigrenderer->processrow & 0x800 ) ) {
 					sigrenderer->processrow = 0xFFFE & ~0xC00;
 				} else {
@@ -1250,7 +1254,7 @@
 #endif
 										channel->pat_loop_count = v;
 										sigrenderer->breakrow = channel->pat_loop_row;
-										if (!(sigrenderer->sigdata->flags & IT_WAS_AN_XM) || ( sigrenderer->processrow | 0xC00 == 0xFFFE ) ) {
+										if (!(sigrenderer->sigdata->flags & IT_WAS_AN_XM) || ( ( sigrenderer->processrow | 0xC00 ) == 0xFFFE ) ) {
 											sigrenderer->processorder = 0xFFFF; /* special case: don't trigger loop callback */
 											sigrenderer->processrow = 0xFFFE;
 										}
@@ -1264,7 +1268,7 @@
 										}
 #endif
 										sigrenderer->breakrow = channel->pat_loop_row;
-										if (!(sigrenderer->sigdata->flags & IT_WAS_AN_XM) || ( sigrenderer->processrow | 0xC00 == 0xFFFE ) ) {
+										if (!(sigrenderer->sigdata->flags & IT_WAS_AN_XM) || ( ( sigrenderer->processrow | 0xC00 ) == 0xFFFE ) ) {
 											sigrenderer->processorder = 0xFFFF; /* special case: don't trigger loop callback */
 											sigrenderer->processrow = 0xFFFE;
 										}
@@ -1707,7 +1711,7 @@
 {
 	channel->truepan = channel->pan << IT_ENVELOPE_SHIFT;
 
-	if (!IT_IS_SURROUND_SHIFTED(channel->truepan) && (sigdata->flags & IT_USE_INSTRUMENTS)) {
+	if (channel->sample && !IT_IS_SURROUND_SHIFTED(channel->truepan) && (sigdata->flags & IT_USE_INSTRUMENTS)) {
 		IT_INSTRUMENT *instrument = &sigdata->instrument[channel->instrument-1];
 		int truepan = channel->truepan;
 		truepan += (channel->note - instrument->pp_centre) * instrument->pp_separation << (IT_ENVELOPE_SHIFT - 3);
@@ -1906,7 +1910,7 @@
 				if (ignore_cxx) break;
 				sigrenderer->breakrow = entry->effectvalue;
 				/* XXX jump and break on the same row */
-				if ( ( sigrenderer->processrow | 0xC00 == 0xFFFE ) &&
+				if ( ( ( sigrenderer->processrow | 0xC00 ) == 0xFFFE ) &&
 					! ( sigrenderer->processrow & 0x400 ) ) {
 					sigrenderer->processrow = 0xFFFE & ~0xC00;
 				} else {
@@ -1976,7 +1980,7 @@
 			case IT_PORTAMENTO_DOWN:
 				{
 					unsigned char v = entry->effectvalue;
-					if (sigdata->flags & IT_WAS_AN_XM) {
+					if (sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_669)) {
 						if (!(sigdata->flags & IT_WAS_A_MOD)) {
 							if (v == 0xF0)
 								v |= channel->xm_lastE2;
@@ -1997,6 +2001,8 @@
 							channel->playing->slide -= (v & 15) << 4;
 						else if ((v & 0xF0) == 0xE0)
 							channel->playing->slide -= (v & 15) << 2;
+						else if (sigdata->flags & IT_WAS_A_669)
+							channel->portamento -= v << 3;
 						else
 							channel->portamento -= v << 4;
 					}
@@ -2005,7 +2011,7 @@
 			case IT_PORTAMENTO_UP:
 				{
 					unsigned char v = entry->effectvalue;
-					if (sigdata->flags & IT_WAS_AN_XM) {
+					if (sigdata->flags & (IT_WAS_AN_XM|IT_WAS_A_669)) {
 						if (!(sigdata->flags & IT_WAS_A_MOD)) {
 							if (v == 0xF0)
 								v |= channel->xm_lastE1;
@@ -2026,6 +2032,8 @@
 							channel->playing->slide += (v & 15) << 4;
 						else if ((v & 0xF0) == 0xE0)
 							channel->playing->slide += (v & 15) << 2;
+						else if (sigdata->flags & IT_WAS_A_669)
+							channel->portamento += v << 3;
 						else
 							channel->portamento += v << 4;
 					}
@@ -2061,25 +2069,27 @@
 				break;
 			case IT_VIBRATO:
 				{
-					unsigned char speed = entry->effectvalue >> 4;
-					unsigned char depth = entry->effectvalue & 15;
-					if (speed == 0)
-						speed = channel->lastHspeed;
-					channel->lastHspeed = speed;
-					if (depth == 0)
-						depth = channel->lastHdepth;
-					else {
-						if (sigdata->flags & IT_OLD_EFFECTS)
-							depth <<= 3;
-						else
-							depth <<= 2;
-						channel->lastHdepth = depth;
+					if (entry->effectvalue || !(sigdata->flags & IT_WAS_A_669)) {
+						unsigned char speed = entry->effectvalue >> 4;
+						unsigned char depth = entry->effectvalue & 15;
+						if (speed == 0)
+							speed = channel->lastHspeed;
+						channel->lastHspeed = speed;
+						if (depth == 0)
+							depth = channel->lastHdepth;
+						else {
+							if (sigdata->flags & IT_OLD_EFFECTS)
+								depth <<= 3;
+							else
+								depth <<= 2;
+							channel->lastHdepth = depth;
+						}
+						if (channel->playing) {
+							channel->playing->vibrato_speed = speed;
+							channel->playing->vibrato_depth = depth;
+							channel->playing->vibrato_n++;
+						}
 					}
-					if (channel->playing) {
-						channel->playing->vibrato_speed = speed;
-						channel->playing->vibrato_depth = depth;
-						channel->playing->vibrato_n++;
-					}
 				}
 				break;
 			case IT_TREMOR:
@@ -2736,7 +2746,7 @@
 					v = channel->lastG;
 				channel->lastG = v;
 			} else {
-				if (v == 0)
+				if (v == 0 && !(sigdata->flags & IT_WAS_A_669))
 					v = channel->lastEF;
 				channel->lastEF = v;
 			}
@@ -3145,6 +3155,12 @@
 	if (entry->mask & IT_ENTRY_NOTE)
 		channel->note = entry->note;
 
+	if ((entry->mask & (IT_ENTRY_NOTE|IT_ENTRY_EFFECT)) && (sigrenderer->sigdata->flags & IT_WAS_A_669)) {
+		reset_channel_effects(channel);
+		// XXX unknown
+		if (channel->playing) channel->playing->finetune = 0;
+	}
+
 	if ((entry->mask & IT_ENTRY_EFFECT) && entry->effect == IT_S) {
 		/* channel->lastS was set in update_pattern_variables(). */
 		unsigned char effectvalue = channel->lastS;
@@ -3845,7 +3861,8 @@
 				}
 			}
 
-			reset_effects(sigrenderer);
+			if (!(sigdata->flags & IT_WAS_A_669))
+				reset_effects(sigrenderer);
 
 			{
 				IT_ENTRY *entry = sigrenderer->entry;
@@ -4573,6 +4590,9 @@
 		channel->played_patjump_order = 0xFFFE;
 #endif
 	}
+
+	if (sigdata->flags & IT_WAS_A_669)
+		reset_effects(sigrenderer);
 
 	for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++)
 		sigrenderer->playing[i] = NULL;