/* ---------- frequency counter for operater update ---------- */ void CALC_FCSLOT(OPL_CH CH,OPL_SLOT SLOT) { int ksr; /* frequency step counter */ SLOT.Incr = CH.fc * SLOT.mul; ksr = CH.kcode >> SLOT.KSR; if (SLOT.ksr != ksr) { SLOT.ksr = (byte)ksr; /* attack , decay rate recalcration */ SLOT.evsa = SLOT.AR(ksr); SLOT.evsd = SLOT.DR(ksr); SLOT.evsr = SLOT.RR(ksr); } SLOT.TLL = (int)(SLOT.TL + (CH.ksl_base >> SLOT.ksl)); }
/* set attack rate & decay rate */ void set_ar_dr(int slot,int v) { OPL_CH CH = P_CH[slot >> 1]; OPL_SLOT SLOT = CH.SLOT[slot & 1]; int ar = v >> 4; int dr = v & 0x0f; SLOT.AR = ar != 0 ? new Func <int,int>(index => AR_TABLE[index + ar << 2]) : RATE_0; SLOT.evsa = SLOT.AR(SLOT.ksr); if (SLOT.evm == ENV_MOD_AR) { SLOT.evs = SLOT.evsa; } SLOT.DR = dr != 0 ? new Func <int,int>(index => DR_TABLE[index + dr << 2]) : RATE_0; SLOT.evsd = SLOT.DR(SLOT.ksr); if (SLOT.evm == ENV_MOD_DR) { SLOT.evs = SLOT.evsd; } }
/* ---------- frequency counter for operater update ---------- */ void CALC_FCSLOT(OPL_CH CH, OPL_SLOT SLOT) { int ksr; /* frequency step counter */ SLOT.Incr = CH.fc * SLOT.mul; ksr = CH.kcode >> SLOT.KSR; if (SLOT.ksr != ksr) { SLOT.ksr = (byte)ksr; /* attack , decay rate recalcration */ SLOT.evsa = SLOT.AR(ksr); SLOT.evsd = SLOT.DR(ksr); SLOT.evsr = SLOT.RR(ksr); } SLOT.TLL = (int)(SLOT.TL + (CH.ksl_base >> SLOT.ksl)); }