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,