From e688408c1032192d6a487c8c0cbda45531b55d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Sun, 29 Jun 2008 08:00:32 +0000 Subject: [PATCH] fix adlib key scale levels Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3173 --- src/hardware/fmopl.c | 55 +++++++++++++++++++++++------------------- src/hardware/ymf262.c | 56 +++++++++++++++++++++++-------------------- 2 files changed, 60 insertions(+), 51 deletions(-) diff --git a/src/hardware/fmopl.c b/src/hardware/fmopl.c index 9e1500a6..d29a370e 100644 --- a/src/hardware/fmopl.c +++ b/src/hardware/fmopl.c @@ -333,48 +333,54 @@ static const int slot_array[32]= static const UINT32 ksl_tab[8*16]= { /* OCT 0 */ - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), /* OCT 1 */ - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.750), SC(1.125), SC(1.500), - SC(1.875), SC(2.250), SC(2.625), SC(3.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.750), SC(1.125), SC(1.500), + SC(1.875), SC(2.250), SC(2.625), SC(3.000), /* OCT 2 */ - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(1.125), SC(1.875), SC(2.625), - SC(3.000), SC(3.750), SC(4.125), SC(4.500), - SC(4.875), SC(5.250), SC(5.625), SC(6.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(1.125), SC(1.875), SC(2.625), + SC(3.000), SC(3.750), SC(4.125), SC(4.500), + SC(4.875), SC(5.250), SC(5.625), SC(6.000), /* OCT 3 */ - SC(0.000), SC(0.000), SC(0.000), SC(1.875), - SC(3.000), SC(4.125), SC(4.875), SC(5.625), - SC(6.000), SC(6.750), SC(7.125), SC(7.500), - SC(7.875), SC(8.250), SC(8.625), SC(9.000), + SC(0.000), SC(0.000), SC(0.000), SC(1.875), + SC(3.000), SC(4.125), SC(4.875), SC(5.625), + SC(6.000), SC(6.750), SC(7.125), SC(7.500), + SC(7.875), SC(8.250), SC(8.625), SC(9.000), /* OCT 4 */ - SC(0.000), SC(0.000), SC(3.000), SC(4.875), - SC(6.000), SC(7.125), SC(7.875), SC(8.625), - SC(9.000), SC(9.750),SC(10.125),SC(10.500), + SC(0.000), SC(0.000), SC(3.000), SC(4.875), + SC(6.000), SC(7.125), SC(7.875), SC(8.625), + SC(9.000), SC(9.750),SC(10.125),SC(10.500), SC(10.875),SC(11.250),SC(11.625),SC(12.000), /* OCT 5 */ - SC(0.000), SC(3.000), SC(6.000), SC(7.875), - SC(9.000),SC(10.125),SC(10.875),SC(11.625), + SC(0.000), SC(3.000), SC(6.000), SC(7.875), + SC(9.000),SC(10.125),SC(10.875),SC(11.625), SC(12.000),SC(12.750),SC(13.125),SC(13.500), SC(13.875),SC(14.250),SC(14.625),SC(15.000), /* OCT 6 */ - SC(0.000), SC(6.000), SC(9.000),SC(10.875), + SC(0.000), SC(6.000), SC(9.000),SC(10.875), SC(12.000),SC(13.125),SC(13.875),SC(14.625), SC(15.000),SC(15.750),SC(16.125),SC(16.500), SC(16.875),SC(17.250),SC(17.625),SC(18.000), /* OCT 7 */ - SC(0.000), SC(9.000),SC(12.000),SC(13.875), + SC(0.000), SC(9.000),SC(12.000),SC(13.875), SC(15.000),SC(16.125),SC(16.875),SC(17.625), SC(18.000),SC(18.750),SC(19.125),SC(19.500), SC(19.875),SC(20.250),SC(20.625),SC(21.000) }; #undef SC +/* key scale level lookup */ +static const INT32 ksl_level[4]= +{ + 31,1,2,0 +}; + /* sustain level table (3dB per step) */ /* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/ #define SC(db) (UINT32) ( db * (2.0/ENV_STEP) ) @@ -1394,9 +1400,8 @@ INLINE void set_ksl_tl(FM_OPL *OPL,int slot,int v) { OPL_CH *CH = &OPL->P_CH[slot/2]; OPL_SLOT *SLOT = &CH->SLOT[slot&1]; - int ksl = v>>6; /* 0 / 1.5 / 3.0 / 6.0 dB/OCT */ - SLOT->ksl = ksl ? 3-ksl : 31; + SLOT->ksl = ksl_level[(v>>6)&3]; /* 0 / 3.0 / 1.5 / 6.0 dB/OCT */ SLOT->TL = (v&0x3f)<<(ENV_BITS-1-7); /* 7 bits TL (bit 6 = always 0) */ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); diff --git a/src/hardware/ymf262.c b/src/hardware/ymf262.c index 6e044fc6..2d9bec26 100644 --- a/src/hardware/ymf262.c +++ b/src/hardware/ymf262.c @@ -284,48 +284,54 @@ static const int slot_array[32]= static const UINT32 ksl_tab[8*16]= { /* OCT 0 */ - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), /* OCT 1 */ - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(0.750), SC(1.125), SC(1.500), - SC(1.875), SC(2.250), SC(2.625), SC(3.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(0.750), SC(1.125), SC(1.500), + SC(1.875), SC(2.250), SC(2.625), SC(3.000), /* OCT 2 */ - SC(0.000), SC(0.000), SC(0.000), SC(0.000), - SC(0.000), SC(1.125), SC(1.875), SC(2.625), - SC(3.000), SC(3.750), SC(4.125), SC(4.500), - SC(4.875), SC(5.250), SC(5.625), SC(6.000), + SC(0.000), SC(0.000), SC(0.000), SC(0.000), + SC(0.000), SC(1.125), SC(1.875), SC(2.625), + SC(3.000), SC(3.750), SC(4.125), SC(4.500), + SC(4.875), SC(5.250), SC(5.625), SC(6.000), /* OCT 3 */ - SC(0.000), SC(0.000), SC(0.000), SC(1.875), - SC(3.000), SC(4.125), SC(4.875), SC(5.625), - SC(6.000), SC(6.750), SC(7.125), SC(7.500), - SC(7.875), SC(8.250), SC(8.625), SC(9.000), + SC(0.000), SC(0.000), SC(0.000), SC(1.875), + SC(3.000), SC(4.125), SC(4.875), SC(5.625), + SC(6.000), SC(6.750), SC(7.125), SC(7.500), + SC(7.875), SC(8.250), SC(8.625), SC(9.000), /* OCT 4 */ - SC(0.000), SC(0.000), SC(3.000), SC(4.875), - SC(6.000), SC(7.125), SC(7.875), SC(8.625), - SC(9.000), SC(9.750),SC(10.125),SC(10.500), + SC(0.000), SC(0.000), SC(3.000), SC(4.875), + SC(6.000), SC(7.125), SC(7.875), SC(8.625), + SC(9.000), SC(9.750),SC(10.125),SC(10.500), SC(10.875),SC(11.250),SC(11.625),SC(12.000), /* OCT 5 */ - SC(0.000), SC(3.000), SC(6.000), SC(7.875), - SC(9.000),SC(10.125),SC(10.875),SC(11.625), + SC(0.000), SC(3.000), SC(6.000), SC(7.875), + SC(9.000),SC(10.125),SC(10.875),SC(11.625), SC(12.000),SC(12.750),SC(13.125),SC(13.500), SC(13.875),SC(14.250),SC(14.625),SC(15.000), /* OCT 6 */ - SC(0.000), SC(6.000), SC(9.000),SC(10.875), + SC(0.000), SC(6.000), SC(9.000),SC(10.875), SC(12.000),SC(13.125),SC(13.875),SC(14.625), SC(15.000),SC(15.750),SC(16.125),SC(16.500), SC(16.875),SC(17.250),SC(17.625),SC(18.000), /* OCT 7 */ - SC(0.000), SC(9.000),SC(12.000),SC(13.875), + SC(0.000), SC(9.000),SC(12.000),SC(13.875), SC(15.000),SC(16.125),SC(16.875),SC(17.625), SC(18.000),SC(18.750),SC(19.125),SC(19.500), SC(19.875),SC(20.250),SC(20.625),SC(21.000) }; #undef SC +/* key scale level lookup */ +static const INT32 ksl_level[4]= +{ + 31,1,2,0 +}; + /* sustain level table (3dB per step) */ /* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/ #define SC(db) (UINT32) ( db * (2.0/ENV_STEP) ) @@ -1494,9 +1500,7 @@ INLINE void set_ksl_tl(OPL3 *chip,int slot,int v) OPL3_CH *CH = &chip->P_CH[slot/2]; OPL3_SLOT *SLOT = &CH->SLOT[slot&1]; - int ksl = v>>6; /* 0 / 1.5 / 3.0 / 6.0 dB/OCT */ - - SLOT->ksl = ksl ? 3-ksl : 31; + SLOT->ksl = ksl_level[(v>>6)&3]; /* 0 / 3.0 / 1.5 / 6.0 dB/OCT */ SLOT->TL = (v&0x3f)<<(ENV_BITS-1-7); /* 7 bits TL (bit 6 = always 0) */ if (chip->OPL3_mode & 1)