shithub: dumb

Download patch

ref: 9e3012a7ce5fb52383f51c99061bc45921699f63
parent: e84e1824fbd0b2b690bd9beb2e25fd308e661982
author: Chris Moeller <kode54@gmail.com>
date: Thu Sep 20 01:28:25 EDT 2012

Fixed pitch slides on non-playing channels

--- a/dumb/src/it/itrender.c
+++ b/dumb/src/it/itrender.c
@@ -1243,50 +1243,52 @@
 				}
 			}
 
-			if (sigrenderer->sigdata->flags & IT_LINEAR_SLIDES) {
-				if (channel->toneporta && channel->destnote < 120) {
-					int currpitch = ((playing->note - 60) << 8) + playing->slide;
-					int destpitch = (channel->destnote - 60) << 8;
-					if (currpitch > destpitch) {
-						currpitch -= channel->toneporta;
-						if (currpitch < destpitch) {
-							currpitch = destpitch;
-							channel->destnote = IT_NOTE_OFF;
-						}
-					} else if (currpitch < destpitch) {
-						currpitch += channel->toneporta;
+			if (playing) {
+				if (sigrenderer->sigdata->flags & IT_LINEAR_SLIDES) {
+					if (channel->toneporta && channel->destnote < 120) {
+						int currpitch = ((playing->note - 60) << 8) + playing->slide;
+						int destpitch = (channel->destnote - 60) << 8;
 						if (currpitch > destpitch) {
-							currpitch = destpitch;
-							channel->destnote = IT_NOTE_OFF;
+							currpitch -= channel->toneporta;
+							if (currpitch < destpitch) {
+								currpitch = destpitch;
+								channel->destnote = IT_NOTE_OFF;
+							}
+						} else if (currpitch < destpitch) {
+							currpitch += channel->toneporta;
+							if (currpitch > destpitch) {
+								currpitch = destpitch;
+								channel->destnote = IT_NOTE_OFF;
+							}
 						}
+						playing->slide = currpitch - ((playing->note - 60) << 8);
 					}
-					playing->slide = currpitch - ((playing->note - 60) << 8);
-				}
-			} else {
-				if (channel->toneporta && channel->destnote < 120) {
-					float amiga_multiplier = playing->sample->C5_speed * (1.0f / AMIGA_DIVISOR);
+				} else {
+					if (channel->toneporta && channel->destnote < 120) {
+						float amiga_multiplier = playing->sample->C5_speed * (1.0f / AMIGA_DIVISOR);
 
-					float deltanote = (float)pow(DUMB_SEMITONE_BASE, 60 - playing->note);
-					/* deltanote is 1.0 for C-5, 0.5 for C-6, etc. */
+						float deltanote = (float)pow(DUMB_SEMITONE_BASE, 60 - playing->note);
+						/* deltanote is 1.0 for C-5, 0.5 for C-6, etc. */
 
-					float deltaslid = deltanote - playing->slide * amiga_multiplier;
+						float deltaslid = deltanote - playing->slide * amiga_multiplier;
 
-					float destdelta = (float)pow(DUMB_SEMITONE_BASE, 60 - channel->destnote);
-					if (deltaslid < destdelta) {
-						playing->slide -= channel->toneporta;
-						deltaslid = deltanote - playing->slide * amiga_multiplier;
-						if (deltaslid > destdelta) {
-							playing->note = channel->destnote;
-							playing->slide = 0;
-							channel->destnote = IT_NOTE_OFF;
-						}
-					} else {
-						playing->slide += channel->toneporta;
-						deltaslid = deltanote - playing->slide * amiga_multiplier;
+						float destdelta = (float)pow(DUMB_SEMITONE_BASE, 60 - channel->destnote);
 						if (deltaslid < destdelta) {
-							playing->note = channel->destnote;
-							playing->slide = 0;
-							channel->destnote = IT_NOTE_OFF;
+							playing->slide -= channel->toneporta;
+							deltaslid = deltanote - playing->slide * amiga_multiplier;
+							if (deltaslid > destdelta) {
+								playing->note = channel->destnote;
+								playing->slide = 0;
+								channel->destnote = IT_NOTE_OFF;
+							}
+						} else {
+							playing->slide += channel->toneporta;
+							deltaslid = deltanote - playing->slide * amiga_multiplier;
+							if (deltaslid < destdelta) {
+								playing->note = channel->destnote;
+								playing->slide = 0;
+								channel->destnote = IT_NOTE_OFF;
+							}
 						}
 					}
 				}