--- np2/sound/opngenc.c 2003/10/18 09:02:38 1.3 +++ np2/sound/opngenc.c 2003/12/08 00:55:33 1.8 @@ -18,9 +18,6 @@ OPNCFG opncfg; - SINT32 env_curve[EVC_ENT*2 + 1]; - SINT32 envtable[EVC_ENT]; - SINT32 sintable[SIN_ENT]; #ifdef OPNGENX86 char envshift[EVC_ENT]; char sinshift[SIN_ENT]; @@ -34,13 +31,13 @@ static SINT32 decaytable[94]; static const SINT32 decayleveltable[16] = { SC( 0),SC( 1),SC( 2),SC( 3),SC( 4),SC( 5),SC( 6),SC( 7), SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)}; -static const BYTE multipletable[] = { +static const UINT8 multipletable[] = { 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; static const SINT32 nulltable[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; -static const BYTE kftable[16] = {0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3}; -static const BYTE dttable[] = { +static const UINT8 kftable[16] = {0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3}; +static const UINT8 dttable[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, @@ -71,16 +68,16 @@ void opngen_initialize(UINT rate) { sft = ENVTBL_BIT; while(sft < (ENVTBL_BIT + 8)) { pom = (double)(1 << sft) / pow(10.0, EG_STEP*(EVC_ENT-i)/20.0); - envtable[i] = (long)pom; + opncfg.envtable[i] = (long)pom; envshift[i] = sft - TL_BITS; - if (envtable[i] >= (1 << (ENVTBL_BIT - 1))) { + if (opncfg.envtable[i] >= (1 << (ENVTBL_BIT - 1))) { break; } sft++; } #else pom = (double)(1 << ENVTBL_BIT) / pow(10.0, EG_STEP*(EVC_ENT-i)/20.0); - envtable[i] = (long)pom; + opncfg.envtable[i] = (long)pom; #endif } for (i=0; i= (1 << (SINTBL_BIT - 1))) { + if (opncfg.sintable[i] >= (1 << (SINTBL_BIT - 1))) { break; } - if (sintable[i] <= -1 * (1 << (SINTBL_BIT - 1))) { + if (opncfg.sintable[i] <= -1 * (1 << (SINTBL_BIT - 1))) { break; } sft++; } #else pom = (double)((1 << SINTBL_BIT) - 1) * sin(2*PI*i/SIN_ENT); - sintable[i] = (long)pom; // ver0.27 + opncfg.sintable[i] = (long)pom; #endif } for (i=0; i> 2) - 1)); +#if 0 + attacktable[i] = (long)((freq + OPM_ARRATE - 1) / OPM_ARRATE); + decaytable[i] = (long)((freq + OPM_DRRATE - 1) / OPM_DRRATE); +#else attacktable[i] = (long)(freq / OPM_ARRATE); decaytable[i] = (long)(freq / OPM_DRRATE); +#endif + if (attacktable[i] >= EC_DECAY) { + TRACEOUT(("attacktable %d %d %d", i, attacktable[i], EC_DECAY)); + } + if (decaytable[i] >= EC_DECAY) { + TRACEOUT(("decaytable %d %d %d", i, decaytable[i], EC_DECAY)); + } } attacktable[62] = EC_DECAY - 1; attacktable[63] = EC_DECAY - 1; @@ -169,7 +177,7 @@ void opngen_setvol(UINT vol) { #endif } -void opngen_setVR(BYTE channel, BYTE value) { +void opngen_setVR(REG8 channel, REG8 value) { if ((channel & 3) && (value)) { opncfg.vr_en = TRUE; @@ -187,6 +195,7 @@ void opngen_setVR(BYTE channel, BYTE val static void set_algorithm(OPNCH *ch) { SINT32 *outd; + UINT8 outslot; outd = &opngen.outdc; if (ch->stereo) { @@ -205,42 +214,49 @@ static void set_algorithm(OPNCH *ch) { ch->connect1 = &opngen.feedback2; ch->connect2 = &opngen.feedback3; ch->connect3 = &opngen.feedback4; + outslot = 0x08; break; case 1: ch->connect1 = &opngen.feedback3; ch->connect2 = &opngen.feedback3; ch->connect3 = &opngen.feedback4; + outslot = 0x08; break; case 2: ch->connect1 = &opngen.feedback4; ch->connect2 = &opngen.feedback3; ch->connect3 = &opngen.feedback4; + outslot = 0x08; break; case 3: ch->connect1 = &opngen.feedback2; ch->connect2 = &opngen.feedback4; ch->connect3 = &opngen.feedback4; + outslot = 0x08; break; case 4: ch->connect1 = &opngen.feedback2; ch->connect2 = outd; ch->connect3 = &opngen.feedback4; + outslot = 0x0a; break; case 5: ch->connect1 = 0; ch->connect2 = outd; ch->connect3 = outd; + outslot = 0x0e; break; case 6: ch->connect1 = &opngen.feedback2; ch->connect2 = outd; ch->connect3 = outd; + outslot = 0x0e; break; case 7: @@ -248,43 +264,49 @@ static void set_algorithm(OPNCH *ch) { ch->connect1 = outd; ch->connect2 = outd; ch->connect3 = outd; + outslot = 0x0f; } ch->connect4 = outd; + ch->outslot = outslot; } -static void set_dt1_mul(OPNSLOT *slot, BYTE value) { +static void set_dt1_mul(OPNSLOT *slot, REG8 value) { slot->multiple = (SINT32)multipletable[value & 0x0f]; slot->detune1 = detunetable[(value >> 4) & 7]; } -static void set_tl(OPNSLOT *slot, BYTE value) { +static void set_tl(OPNSLOT *slot, REG8 value) { +#if (EVC_BITS >= 7) slot->totallevel = ((~value) & 0x007f) << (EVC_BITS - 7); +#else + slot->totallevel = ((~value) & 0x007f) >> (7 - EVC_BITS); +#endif } -static void set_ks_ar(OPNSLOT *slot, BYTE value) { +static void set_ks_ar(OPNSLOT *slot, REG8 value) { - slot->keyscale = (BYTE)(((~value)>>6)&3); + slot->keyscale = ((~value) >> 6) & 3; value &= 0x1f; slot->attack = (value)?(attacktable + (value << 1)):nulltable; - slot->env_inc_attack = slot->attack[slot->envraito]; + slot->env_inc_attack = slot->attack[slot->envratio]; if (slot->env_mode == EM_ATTACK) { slot->env_inc = slot->env_inc_attack; } } -static void set_d1r(OPNSLOT *slot, BYTE value) { +static void set_d1r(OPNSLOT *slot, REG8 value) { value &= 0x1f; slot->decay1 = (value)?(decaytable + (value << 1)):nulltable; - slot->env_inc_decay1 = slot->decay1[slot->envraito]; + slot->env_inc_decay1 = slot->decay1[slot->envratio]; if (slot->env_mode == EM_DECAY1) { slot->env_inc = slot->env_inc_decay1; } } -static void set_dt2_d2r(OPNSLOT *slot, BYTE value) { +static void set_dt2_d2r(OPNSLOT *slot, REG8 value) { value &= 0x1f; slot->decay2 = (value)?(decaytable + (value << 1)):nulltable; @@ -292,30 +314,30 @@ static void set_dt2_d2r(OPNSLOT *slot, B slot->env_inc_decay2 = 0; } else { - slot->env_inc_decay2 = slot->decay2[slot->envraito]; + slot->env_inc_decay2 = slot->decay2[slot->envratio]; } if (slot->env_mode == EM_DECAY2) { slot->env_inc = slot->env_inc_decay2; } } -static void set_d1l_rr(OPNSLOT *slot, BYTE value) { +static void set_d1l_rr(OPNSLOT *slot, REG8 value) { slot->decaylevel = decayleveltable[(value >> 4)]; slot->release = decaytable + ((value & 0x0f) << 2) + 2; - slot->env_inc_release = slot->release[slot->envraito]; + slot->env_inc_release = slot->release[slot->envratio]; if (slot->env_mode == EM_RELEASE) { slot->env_inc = slot->env_inc_release; if (value == 0xff) { slot->env_mode = EM_OFF; slot->env_cnt = EC_OFF; - slot->env_end = EC_OFF+1; + slot->env_end = EC_OFF + 1; slot->env_inc = 0; } } } -static void set_ssgeg(OPNSLOT *slot, BYTE value) { +static void set_ssgeg(OPNSLOT *slot, REG8 value) { value &= 0xf; if ((value == 0xb) || (value == 0xd)) { @@ -324,7 +346,7 @@ static void set_ssgeg(OPNSLOT *slot, BYT } else { slot->ssgeg1 = 0; - slot->env_inc_decay2 = slot->decay2[slot->envraito]; + slot->env_inc_decay2 = slot->decay2[slot->envratio]; } if (slot->env_mode == EM_DECAY2) { slot->env_inc = slot->env_inc_decay2; @@ -345,8 +367,8 @@ static void channleupdate(OPNCH *ch) { for (i=0; i<4; i++, slot++) { slot->freq_inc = (fc + slot->detune1[kc]) * slot->multiple; evr = (BYTE)(kc >> slot->keyscale); - if (slot->envraito != evr) { - slot->envraito = evr; + if (slot->envratio != evr) { + slot->envratio = evr; slot->env_inc_attack = slot->attack[evr]; slot->env_inc_decay1 = slot->decay1[evr]; slot->env_inc_decay2 = slot->decay2[evr]; @@ -360,8 +382,8 @@ static void channleupdate(OPNCH *ch) { slot->freq_inc = (ch->keynote[s] + slot->detune1[ch->kcode[s]]) * slot->multiple; evr = (BYTE)(ch->kcode[s] >> slot->keyscale); - if (slot->envraito != evr) { - slot->envraito = evr; + if (slot->envratio != evr) { + slot->envratio = evr; slot->env_inc_attack = slot->attack[evr]; slot->env_inc_decay1 = slot->decay1[evr]; slot->env_inc_decay2 = slot->decay2[evr]; @@ -404,14 +426,14 @@ void opngen_reset(void) { ch++; } for (i=0x30; i<0xc0; i++) { - opngen_setreg((BYTE)i, 0xff, 0); - opngen_setreg((BYTE)i, 0xff, 3); - opngen_setreg((BYTE)i, 0xff, 6); - opngen_setreg((BYTE)i, 0xff, 9); + opngen_setreg(0, (REG8)i, 0xff); + opngen_setreg(3, (REG8)i, 0xff); + opngen_setreg(6, (REG8)i, 0xff); + opngen_setreg(9, (REG8)i, 0xff); } } -void opngen_setcfg(BYTE maxch, UINT flag) { +void opngen_setcfg(REG8 maxch, UINT flag) { OPNCH *ch; UINT i; @@ -438,7 +460,7 @@ void opngen_setcfg(BYTE maxch, UINT flag } } -void opngen_setextch(UINT chnum, BYTE data) { +void opngen_setextch(UINT chnum, REG8 data) { OPNCH *ch; @@ -446,7 +468,7 @@ void opngen_setextch(UINT chnum, BYTE da ch[chnum].extop = data; } -void opngen_setreg(BYTE chbase, BYTE reg, BYTE value) { +void opngen_setreg(REG8 chbase, REG8 reg, REG8 value) { UINT chpos; OPNCH *ch; @@ -546,16 +568,18 @@ void opngen_setreg(BYTE chbase, BYTE reg } } -void opngen_keyon(UINT chnum, BYTE value) { +void opngen_keyon(UINT chnum, REG8 value) { OPNCH *ch; OPNSLOT *slot; - BYTE bit; + REG8 bit; UINT i; sound_sync(); opngen.keyreg[chnum] = value; + opngen.playing++; ch = opnch + chnum; + ch->playing |= value >> 4; slot = ch->slot; bit = 0x10; for (i=0; i<4; i++) { @@ -575,8 +599,8 @@ void opngen_keyon(UINT chnum, BYTE value if (slot->env_mode > EM_RELEASE) { slot->env_mode = EM_RELEASE; if (!(slot->env_cnt & EC_DECAY)) { - slot->env_cnt = (env_curve[slot->env_cnt >> ENV_BITS] - << ENV_BITS) + EC_DECAY; + slot->env_cnt = (opncfg.envcurve[slot->env_cnt + >> ENV_BITS] << ENV_BITS) + EC_DECAY; } slot->env_end = EC_OFF; slot->env_inc = slot->env_inc_release;