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;
+ }
}
}
}