trunk/src/emu/sound/ymf271.c
| r23985 | r23986 | |
| 57 | 57 | |
| 58 | 58 | #define ENV_VOLUME_SHIFT 16 |
| 59 | 59 | |
| 60 | | #define INF 100000000.0 |
| 60 | #define INF -1.0 |
| 61 | 61 | |
| 62 | | static const double ARTime[] = |
| 62 | static const double ARTime[64] = |
| 63 | 63 | { |
| 64 | 64 | INF, INF, INF, INF, 6188.12, 4980.68, 4144.76, 3541.04, |
| 65 | 65 | 3094.06, 2490.34, 2072.38, 1770.52, 1547.03, 1245.17, 1036.19, 885.26, |
| r23985 | r23986 | |
| 71 | 71 | 0.88, 0.70, 0.57, 0.48, 0.43, 0.43, 0.43, 0.07 |
| 72 | 72 | }; |
| 73 | 73 | |
| 74 | | static const double DCTime[] = |
| 74 | static const double DCTime[64] = |
| 75 | 75 | { |
| 76 | 76 | INF, INF, INF, INF, 93599.64, 74837.91, 62392.02, 53475.56, |
| 77 | 77 | 46799.82, 37418.96, 31196.01, 26737.78, 23399.91, 18709.48, 15598.00, 13368.89, |
| r23985 | r23986 | |
| 354 | 354 | void ymf271_device::init_envelope(YMF271Slot *slot) |
| 355 | 355 | { |
| 356 | 356 | int keycode, rate; |
| 357 | | int attack_length, decay1_length, decay2_length, release_length; |
| 358 | 357 | int decay_level = 255 - (slot->decay1lvl << 4); |
| 359 | 358 | |
| 360 | 359 | double time; |
| r23985 | r23986 | |
| 371 | 370 | |
| 372 | 371 | // init attack state |
| 373 | 372 | rate = GET_KEYSCALED_RATE(slot->ar * 2, keycode, slot->keyscale); |
| 374 | | time = ARTime[rate]; |
| 373 | time = (ARTime[rate] * 44100.0) / 1000.0; // attack end time in samples |
| 374 | slot->env_attack_step = time < 0 ? 0 : (int)(((double)(255-0) / time) * 65536.0); |
| 375 | 375 | |
| 376 | | attack_length = (UINT32)((time * 44100.0) / 1000.0); // attack end time in samples |
| 377 | | slot->env_attack_step = (int)(((double)(160-0) / (double)(attack_length)) * 65536.0); |
| 378 | | |
| 379 | 376 | // init decay1 state |
| 380 | 377 | rate = GET_KEYSCALED_RATE(slot->decay1rate * 2, keycode, slot->keyscale); |
| 381 | | time = DCTime[rate]; |
| 378 | time = (DCTime[rate] * 44100.0) / 1000.0; |
| 379 | slot->env_decay1_step = time < 0 ? 0 : (int)(((double)(255-decay_level) / time) * 65536.0); |
| 382 | 380 | |
| 383 | | decay1_length = (UINT32)((time * 44100.0) / 1000.0); |
| 384 | | slot->env_decay1_step = (int)(((double)(255-decay_level) / (double)(decay1_length)) * 65536.0); |
| 385 | | |
| 386 | 381 | // init decay2 state |
| 387 | 382 | rate = GET_KEYSCALED_RATE(slot->decay2rate * 2, keycode, slot->keyscale); |
| 388 | | time = DCTime[rate]; |
| 383 | time = (DCTime[rate] * 44100.0) / 1000.0; |
| 384 | slot->env_decay2_step = time < 0 ? 0 : (int)(((double)(255-0) / time) * 65536.0); |
| 389 | 385 | |
| 390 | | decay2_length = (UINT32)((time * 44100.0) / 1000.0); |
| 391 | | slot->env_decay2_step = (int)(((double)(255-0) / (double)(decay2_length)) * 65536.0); |
| 392 | | |
| 393 | 386 | // init release state |
| 394 | 387 | rate = GET_KEYSCALED_RATE(slot->relrate * 4, keycode, slot->keyscale); |
| 395 | | time = ARTime[rate]; |
| 388 | time = (ARTime[rate] * 44100.0) / 1000.0; |
| 389 | slot->env_release_step = time < 0 ? 0 : (int)(((double)(255-0) / time) * 65536.0); |
| 396 | 390 | |
| 397 | | release_length = (UINT32)((time * 44100.0) / 1000.0); |
| 398 | | slot->env_release_step = (int)(((double)(255-0) / (double)(release_length)) * 65536.0); |
| 399 | | |
| 400 | 391 | slot->volume = (255-160) << ENV_VOLUME_SHIFT; // -60db |
| 401 | 392 | slot->env_state = ENV_ATTACK; |
| 402 | 393 | } |