--- np2/sound/opngenc.c 2003/10/16 17:58:04 1.1.1.1 +++ np2/sound/opngenc.c 2003/11/28 08:01:33 1.7 @@ -1,7 +1,9 @@ #include "compiler.h" #include +#include "pccore.h" +#include "iocore.h" #include "sound.h" -#include "opngen.h" +#include "fmboard.h" #include "keydisp.h" @@ -15,29 +17,11 @@ #define FREQBASE4096 ((double)OPNA_CLOCK / calcrate / 64) - SINT32 env_curve[EVC_ENT*2 + 1]; - SINT32 envtable[EVC_ENT]; - SINT32 sintable[SIN_ENT]; -#ifdef SOUND_FM_ASM + OPNCFG opncfg; +#ifdef OPNGENX86 char envshift[EVC_ENT]; char sinshift[SIN_ENT]; #endif - BYTE baseratebit; - - OPNCH opnch[OPNCH_MAX]; - BYTE fm_keyreg[OPNCH_MAX]; - - UINT playchannels; - SINT32 feedback2; - SINT32 feedback3; - SINT32 feedback4; - SINT32 outdl; - SINT32 outdc; - SINT32 outdr; - SINT32 calc1024; - SINT32 calcremain; - SINT32 fmvolforasm; - SINT32 fmvolforc; static SINT32 detunetable[8][32]; @@ -76,66 +60,66 @@ void opngen_initialize(UINT rate) { calcrate = rate * 55466 / 44100; - calc1024 = FMDIV_ENT * 44100 / 55466; + opncfg.calc1024 = FMDIV_ENT * 44100 / 55466; for (i=0; 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= 16が条件 if (rate == 44100) { - baseratebit = 0 + (FREQ_BITS - 16); + opncfg.ratebit = 0 + (FREQ_BITS - 16); } else if (rate == 22050) { - baseratebit = 1 + (FREQ_BITS - 16); + opncfg.ratebit = 1 + (FREQ_BITS - 16); } else { - baseratebit = 2 + (FREQ_BITS - 16); + opncfg.ratebit = 2 + (FREQ_BITS - 16); } for (i=0; i<4; i++) { @@ -163,8 +147,19 @@ void opngen_initialize(UINT rate) { freq *= 1.0 + (i & 3) * 0.25; } freq *= (double)(1 << ((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; @@ -176,8 +171,22 @@ void opngen_initialize(UINT rate) { void opngen_setvol(UINT vol) { - fmvolforc = vol * 5 / 4; - fmvolforasm = fmvolforc << FMASMSHIFT; + opncfg.fmvol = vol * 5 / 4; +#if defined(OPNGENX86) + opncfg.fmvol <<= FMASMSHIFT; +#endif +} + +void opngen_setVR(BYTE channel, BYTE value) { + + if ((channel & 3) && (value)) { + opncfg.vr_en = TRUE; + opncfg.vr_l = (channel & 1)?value:0; + opncfg.vr_r = (channel & 2)?value:0; + } + else { + opncfg.vr_en = FALSE; + } } @@ -186,60 +195,68 @@ void opngen_setvol(UINT vol) { static void set_algorithm(OPNCH *ch) { SINT32 *outd; + BYTE outslot; - outd = &outdc; + outd = &opngen.outdc; if (ch->stereo) { switch(ch->pan & 0xc0) { case 0x80: - outd = &outdl; + outd = &opngen.outdl; break; case 0x40: - outd = &outdr; + outd = &opngen.outdr; break; } } switch(ch->algorithm) { case 0: - ch->connect1 = &feedback2; - ch->connect2 = &feedback3; - ch->connect3 = &feedback4; + ch->connect1 = &opngen.feedback2; + ch->connect2 = &opngen.feedback3; + ch->connect3 = &opngen.feedback4; + outslot = 0x08; break; case 1: - ch->connect1 = &feedback3; - ch->connect2 = &feedback3; - ch->connect3 = &feedback4; + ch->connect1 = &opngen.feedback3; + ch->connect2 = &opngen.feedback3; + ch->connect3 = &opngen.feedback4; + outslot = 0x08; break; case 2: - ch->connect1 = &feedback4; - ch->connect2 = &feedback3; - ch->connect3 = &feedback4; + ch->connect1 = &opngen.feedback4; + ch->connect2 = &opngen.feedback3; + ch->connect3 = &opngen.feedback4; + outslot = 0x08; break; case 3: - ch->connect1 = &feedback2; - ch->connect2 = &feedback4; - ch->connect3 = &feedback4; + ch->connect1 = &opngen.feedback2; + ch->connect2 = &opngen.feedback4; + ch->connect3 = &opngen.feedback4; + outslot = 0x08; break; case 4: - ch->connect1 = &feedback2; + ch->connect1 = &opngen.feedback2; ch->connect2 = outd; - ch->connect3 = &feedback4; + 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 = &feedback2; + ch->connect1 = &opngen.feedback2; ch->connect2 = outd; ch->connect3 = outd; + outslot = 0x0e; break; case 7: @@ -247,8 +264,10 @@ 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) { @@ -259,7 +278,11 @@ static void set_dt1_mul(OPNSLOT *slot, B static void set_tl(OPNSLOT *slot, BYTE 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) { @@ -308,7 +331,7 @@ static void set_d1l_rr(OPNSLOT *slot, BY 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; } } @@ -380,9 +403,9 @@ void opngen_reset(void) { OPNSLOT *slot; UINT j; + ZeroMemory(&opngen, sizeof(opngen)); ZeroMemory(opnch, sizeof(opnch)); - ZeroMemory(fm_keyreg, sizeof(fm_keyreg)); - playchannels = 3; + opngen.playchannels = 3; ch = opnch; for (i=0; ikeyfunc[0] & 7) << 8) + value; ch->kcode[0] = (blk << 2) | kftable[fn >> 7]; // ch->keynote[0] = fn * opmbaserate / (1L << (22-blk)); - ch->keynote[0] = (fn << (baseratebit + blk)) >> 6; + ch->keynote[0] = (fn << (opncfg.ratebit + blk)) >> 6; channleupdate(ch); break; @@ -516,7 +539,7 @@ void opngen_setreg(BYTE chbase, BYTE reg fn = ((ch->keyfunc[chpos+1] & 7) << 8) + value; ch->kcode[chpos+1] = (blk << 2) | kftable[fn >> 7]; // ch->keynote[chpos+1] = fn * opmbaserate / (1L << (22-blk)); - ch->keynote[chpos+1] = (fn << (baseratebit + blk)) >> 6; + ch->keynote[chpos+1] = (fn << (opncfg.ratebit + blk)) >> 6; channleupdate(ch); break; @@ -553,8 +576,10 @@ void opngen_keyon(UINT chnum, BYTE value UINT i; sound_sync(); - fm_keyreg[chnum] = value; + opngen.keyreg[chnum] = value; + opngen.playing++; ch = opnch + chnum; + ch->playing |= value >> 4; slot = ch->slot; bit = 0x10; for (i=0; i<4; i++) { @@ -574,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;