From d9b59ef468b071ac14a2418068fdc3b210ac9b18 Mon Sep 17 00:00:00 2001 From: ekeeke31 Date: Fri, 19 Sep 2008 17:13:19 +0000 Subject: [PATCH] fixed SSG-EG decay level --- history.txt | 3 ++- source/sound/fm.c | 41 ++++++++++++----------------------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/history.txt b/history.txt index be10714..9371a28 100644 --- a/history.txt +++ b/history.txt @@ -4,10 +4,11 @@ Genesis Plus for Gamecube CURRENT: --------- [Genesis] -- YM2612(MAME): improved Enveloppe Generator accuracy, fix tracks #3 and #9 in Mega Turrican +- YM2612(MAME): fixed EG Decay->Substain transition when SL & DR are minimals, fix tracks #3 and #9 in Mega Turrican - YM2612(MAME): fixed a bug in SSG-EG emulation code, fix Level 1 music in Alisia Dragoon - YM2612(MAME): improved Detune overflow accuracy, fix high-frequency sound effects & musics in many games - YM2612(MAME): fixed registers 0x20-0x26 Reset state, fix intro music in B.O.B +- YM2612(MAME): removed previous fix with KEY ON, fix "Flamethrower" sfx in Alien 3 - adjusted HCounter values, fix Sonic 3D bonus stage diff --git a/source/sound/fm.c b/source/sound/fm.c index fd7addf..fe90ab9 100644 --- a/source/sound/fm.c +++ b/source/sound/fm.c @@ -17,12 +17,12 @@ ** - removed unused multichip support and YMxxx support ** - fixed CH3 CSM mode (which games actually use this ?), credits to Nemesis ** - implemented Detune overflow (Ariel, Comix Zone, Shaq Fu, Spiderman & many others), credits to Nemesis -** - fixed SSG-EG support (Asterix, Bubba'n Six & many others), thanks to Nemesis for his tests +** - fixed SSG-EG support (Asterix, Bubba'n Six & many others), credits to Nemesis ** - modified EG rates, tested by Nemesis on real hardware ** - implemented LFO phase update for CH3 special mode (Warlock birds, Alladin bug sound) ** - fixed Attack Rate update (Batman & Robin intro) ** - fixed attenuation level at the start of Substain (Gynoug explosions) -** - fixed EG when AR is maximal and/or SL minimal (Mega Turrican tracks 03,09...) +** - fixed EG decay->substain transition to handle special cases, like SL=0 and Decay rate is very slow (Mega Turrican tracks 03,09...) ** ** 03-08-2003 Jarek Burczynski: ** - fixed YM2608 initial values (after the reset) @@ -649,9 +649,9 @@ INLINE void FM_KEYON(FM_CH *CH , int s ) } else { - /* directly switch to Decay (or Substain) */ + /* directly switch to Decay */ SLOT->volume = MIN_ATT_INDEX; - SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC; + SLOT->state = EG_DEC; } } } @@ -665,7 +665,6 @@ INLINE void FM_KEYOFF(FM_CH *CH , int s ) if (SLOT->state>EG_REL) { SLOT->state = EG_REL; /* phase -> Release */ - SLOT->ssgn = 0; /* reset Invert Flag (from Nemesis) */ } } } @@ -916,41 +915,28 @@ INLINE void advance_eg_channel(FM_SLOT *SLOT) SLOT->volume += (~SLOT->volume * (eg_inc[SLOT->eg_sel_ar + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_ar)&7)]))>>4; if (SLOT->volume <= MIN_ATT_INDEX) { - /* switch to Release or Substain Phase (Eke-Eke) */ SLOT->volume = MIN_ATT_INDEX; - SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC; + SLOT->state = EG_DEC; } } break; case EG_DEC: /* decay phase */ - if (SLOT->ssg&0x08) /* SSG EG type envelope selected */ - { if ( !(ym2612.OPN.eg_cnt & ((1<eg_sh_d1r)-1) ) ) { - /* Nemesis */ + if (SLOT->ssg&0x08) /* SSG EG type envelope selected */ SLOT->volume += 6 * eg_inc[SLOT->eg_sel_d1r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d1r)&7)]; - - if ( SLOT->volume >= (INT32)(SLOT->sl) ) - { - SLOT->volume = (INT32)(SLOT->sl); - SLOT->state = EG_SUS; - } - } - } else - { - if ( !(ym2612.OPN.eg_cnt & ((1<eg_sh_d1r)-1) ) ) - { SLOT->volume += eg_inc[SLOT->eg_sel_d1r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d1r)&7)]; + } + /* check transition even if no volume update: this fixes the case when SL = MIN_ATT_INDEX */ if ( SLOT->volume >= (INT32)(SLOT->sl) ) { SLOT->volume = (INT32)(SLOT->sl); SLOT->state = EG_SUS; } - } - } + break; case EG_SUS: /* sustain phase */ @@ -960,8 +946,9 @@ INLINE void advance_eg_channel(FM_SLOT *SLOT) { /* Nemesis */ SLOT->volume += 6 * eg_inc[SLOT->eg_sel_d2r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d2r)&7)]; + } - if ( SLOT->volume >= MAX_ATT_INDEX) + if ( SLOT->volume >= 992) { SLOT->volume = MAX_ATT_INDEX; @@ -973,7 +960,6 @@ INLINE void advance_eg_channel(FM_SLOT *SLOT) } else swap_flag = (SLOT->ssg&0x02) | 1 ; /* bit 1 = alternate */ - } else { @@ -994,7 +980,7 @@ INLINE void advance_eg_channel(FM_SLOT *SLOT) } swap_flag = (SLOT->ssg&0x02); /* bit 1 = alternate */ - } + } } } @@ -1005,13 +991,10 @@ INLINE void advance_eg_channel(FM_SLOT *SLOT) SLOT->volume += eg_inc[SLOT->eg_sel_d2r + ((ym2612.OPN.eg_cnt>>SLOT->eg_sh_d2r)&7)]; if ( SLOT->volume >= MAX_ATT_INDEX ) - { SLOT->volume = MAX_ATT_INDEX; /* do not change SLOT->state (verified on real chip) */ } } - - } break; case EG_REL: /* release phase */