ref: a42b6bcdc28e200a751baf4414e6f4c6ebb36c71
parent: 0bc29b4eb63b5758cf0d174258b6b072a3041a33
author: Chris Moeller <kode54@gmail.com>
date: Wed Jul 17 14:34:09 EDT 2013
Reimplemented envelope carry to be more like other players
--- a/dumb/src/it/itrender.c
+++ b/dumb/src/it/itrender.c
@@ -1689,15 +1689,40 @@
}
+static void recalculate_it_envelope_node(IT_PLAYING_ENVELOPE *pe, IT_ENVELOPE *e)
+{
+ int envpos = pe->tick;
+ unsigned int pt = e->n_nodes - 1;
+ unsigned int i;
+ for (i = 0; i < (unsigned int)(e->n_nodes - 1); ++i)
+ {
+ if (envpos <= e->node_t[i])
+ {
+ pt = i;
+ break;
+ }
+ }
+ pe->next_node = pt;
+}
+
+
+static void recalculate_it_envelope_nodes(IT_PLAYING *playing)
+{
+ recalculate_it_envelope_node(&playing->volume_envelope, &playing->env_instrument->volume_envelope);
+ recalculate_it_envelope_node(&playing->pan_envelope, &playing->env_instrument->pitch_envelope);
+ recalculate_it_envelope_node(&playing->pitch_envelope, &playing->env_instrument->pitch_envelope);
+}
+
+
static void it_retrigger_note(DUMB_IT_SIGRENDERER *sigrenderer, IT_CHANNEL *channel)
{
- IT_PLAYING_ENVELOPE volume_envelope;
- IT_PLAYING_ENVELOPE pan_envelope;
- IT_PLAYING_ENVELOPE pitch_envelope;
+ int vol_env_tick = 0;
+ int pan_env_tick = 0;
+ int pitch_env_tick = 0;
DUMB_IT_SIGDATA *sigdata = sigrenderer->sigdata;
unsigned char nna;
- int i, flags = 0;
+ int i, envelopes_copied = 0;
if (channel->playing) {
#ifdef INVALID_NOTES_CAUSE_NOTE_CUT
@@ -1726,22 +1751,10 @@
nna = channel->playing->instrument->new_note_action;
#endif
- if (!(channel->playing->flags & IT_PLAYING_DEAD) && (sigdata->flags & IT_USE_INSTRUMENTS) && (channel->playing->enabled_envelopes) && channel->playing->instnum == channel->instrument) {
- IT_PLAYING * playing = channel->playing;
- IT_INSTRUMENT * inst = &sigdata->instrument[channel->instrument-1];
- if ((playing->enabled_envelopes & IT_ENV_VOLUME) && (inst->volume_envelope.flags & IT_ENVELOPE_CARRY)) {
- flags |= 1;
- volume_envelope = playing->volume_envelope;
- }
- if ((playing->enabled_envelopes & IT_ENV_PANNING) && (inst->pan_envelope.flags & IT_ENVELOPE_CARRY)) {
- flags |= 2;
- pan_envelope = playing->pan_envelope;
- }
- if ((playing->enabled_envelopes & IT_ENV_PITCH) && (inst->pitch_envelope.flags & IT_ENVELOPE_CARRY)) {
- flags |= 4;
- pitch_envelope = playing->pitch_envelope;
- }
- }
+ 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:
@@ -1844,26 +1857,14 @@
if (!channel->playing)
return;
- if (!flags && sigdata->flags & IT_USE_INSTRUMENTS) {
+ if (!envelopes_copied && sigdata->flags & IT_USE_INSTRUMENTS) {
for (i = 0; i < DUMB_IT_N_NNA_CHANNELS; i++) {
IT_PLAYING * playing = sigrenderer->playing[i];
if (!playing || playing->channel != channel) continue;
- if (playing->enabled_envelopes && playing->instnum == channel->instrument) {
- IT_INSTRUMENT * inst = &sigdata->instrument[channel->instrument-1];
- if ((playing->enabled_envelopes & IT_ENV_VOLUME) && (inst->volume_envelope.flags & IT_ENVELOPE_CARRY)) {
- flags |= 1;
- volume_envelope = playing->volume_envelope;
- }
- if ((playing->enabled_envelopes & IT_ENV_PANNING) && (inst->pan_envelope.flags & IT_ENVELOPE_CARRY)) {
- flags |= 2;
- pan_envelope = playing->pan_envelope;
- }
- if ((playing->enabled_envelopes & IT_ENV_PITCH) && (inst->pitch_envelope.flags & IT_ENVELOPE_CARRY)) {
- flags |= 4;
- pitch_envelope = playing->pitch_envelope;
- }
- break;
- }
+ vol_env_tick = playing->volume_envelope.tick;
+ pan_env_tick = playing->pan_envelope.tick;
+ pitch_env_tick = playing->pitch_envelope.tick;
+ break;
}
}
@@ -1923,24 +1924,22 @@
channel->playing->slide = 0;
channel->playing->finetune = channel->playing->sample->finetune;
- if (flags & 1) {
- channel->playing->volume_envelope = volume_envelope;
+ if (channel->playing->env_instrument->volume_envelope.flags & IT_ENVELOPE_CARRY) {
+ channel->playing->volume_envelope.tick = vol_env_tick;
} else {
- channel->playing->volume_envelope.next_node = 0;
channel->playing->volume_envelope.tick = 0;
}
- if (flags & 2) {
- channel->playing->pan_envelope = pan_envelope;
+ if (channel->playing->env_instrument->pan_envelope.flags & IT_ENVELOPE_CARRY) {
+ channel->playing->pan_envelope.tick = pan_env_tick;
} else {
- channel->playing->pan_envelope.next_node = 0;
channel->playing->pan_envelope.tick = 0;
}
- if (flags & 4) {
- channel->playing->pitch_envelope = pitch_envelope;
+ if (channel->playing->env_instrument->pitch_envelope.flags & IT_ENVELOPE_CARRY) {
+ channel->playing->pitch_envelope.tick = pitch_env_tick;
} else {
- channel->playing->pitch_envelope.next_node = 0;
channel->playing->pitch_envelope.tick = 0;
}
+ recalculate_it_envelope_nodes(channel->playing);
channel->playing->fadeoutcount = 1024;
it_reset_filter_state(&channel->playing->filter_state[0]);
it_reset_filter_state(&channel->playing->filter_state[1]);