Mercurial > repos > blastem
comparison ym2612.c @ 513:24ebabd89162
Properly clamp envelope value to zero when it overflows during the attack phase. This fixes a number of instruments that sounded rather wrong as well as the missing melody line from Mushroom Hill Zone in Sonic and Knuckles
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 07 Feb 2014 00:41:51 -0800 |
parents | b7b7a1cab44a |
children | 7565ec2ac652 |
comparison
equal
deleted
inserted
replaced
512:6800d30437c9 | 513:24ebabd89162 |
---|---|
313 if (operator->env_phase == PHASE_ATTACK) { | 313 if (operator->env_phase == PHASE_ATTACK) { |
314 //this can probably be optimized to a single shift rather than a multiply + shift | 314 //this can probably be optimized to a single shift rather than a multiply + shift |
315 if (first_key_on) { | 315 if (first_key_on) { |
316 dfprintf(debug_file, "Changing op %d envelope %d by %d(%d * %d) in attack phase\n", op, operator->envelope, (~operator->envelope * envelope_inc) >> 4, ~operator->envelope, envelope_inc); | 316 dfprintf(debug_file, "Changing op %d envelope %d by %d(%d * %d) in attack phase\n", op, operator->envelope, (~operator->envelope * envelope_inc) >> 4, ~operator->envelope, envelope_inc); |
317 } | 317 } |
318 uint16_t old_env = operator->envelope; | |
318 operator->envelope += (~operator->envelope * envelope_inc) >> 4; | 319 operator->envelope += (~operator->envelope * envelope_inc) >> 4; |
319 operator->envelope &= MAX_ENVELOPE; | 320 if (operator->envelope > old_env) { |
321 //Handle overflow | |
322 operator->envelope = 0; | |
323 } | |
320 if (!operator->envelope) { | 324 if (!operator->envelope) { |
321 operator->envelope = 0; | |
322 operator->env_phase = PHASE_DECAY; | 325 operator->env_phase = PHASE_DECAY; |
323 } | 326 } |
324 } else { | 327 } else { |
325 if (first_key_on) { | 328 if (first_key_on) { |
326 dfprintf(debug_file, "Changing op %d envelope %d by %d in %s phase\n", op, operator->envelope, envelope_inc, | 329 dfprintf(debug_file, "Changing op %d envelope %d by %d in %s phase\n", op, operator->envelope, envelope_inc, |