static void CALC_FCSLOT(FM_SLOT SLOT, int fc, int kc) { int ksr; return;//xxx /* frequency step counter */ /* SLOT.Incr= (fc+SLOT.DT[kc])*SLOT.mul; */ SLOT.Incr = (uint)(fc * SLOT.mul + SLOT.DT[kc]); ksr = kc >> 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.evss = SLOT.SR[ksr]; SLOT.evsr = SLOT.RR[ksr]; } SLOT.TLL = SLOT.TL /* + KSL[kc]*/; }
/* set sustain rate */ static void set_sr(FM_SLOT SLOT, int v, IntSubArray dr_table) { SLOT.SR = (v &= 0x1f) != 0 ? new IntSubArray(dr_table, v << 1) : new IntSubArray(RATE_0); SLOT.evss = SLOT.SR[SLOT.ksr]; if (SLOT.eg_next == FM_EG_SR) SLOT.evs = SLOT.evss; }
/* set release rate */ static void set_sl_rr(FM_SLOT SLOT, int v, IntSubArray dr_table) { SLOT.SL = SL_TABLE[(v >> 4)]; SLOT.RR = new IntSubArray(dr_table, ((v & 0x0f) << 2) | 2); SLOT.evsr = SLOT.RR[SLOT.ksr]; if (SLOT.eg_next == FM_EG_Release) SLOT.evs = SLOT.evsr; }
/* set total level */ static void set_tl(FM_CH CH, FM_SLOT SLOT, int v, int csmflag) { v &= 0x7f; v = (v << 7) | v; /* 7bit . 14bit */ SLOT.TL = (v * EG_ENT) >> 14; if (csmflag == 0) { /* not CSM latch total level */ SLOT.TLL = SLOT.TL /* + KSL[CH.kcode] */; } }
/* set attack rate & key scale */ static void set_ar_ksr(FM_CH CH, FM_SLOT SLOT, int v, IntSubArray ar_table) { SLOT.KSR = (byte)(3 - (v >> 6)); SLOT.AR = (v &= 0x1f) != 0 ? new IntSubArray(ar_table, v << 1) : new IntSubArray(RATE_0); SLOT.evsa = SLOT.AR[SLOT.ksr]; if (SLOT.eg_next == FM_EG_AR) SLOT.evs = SLOT.evsa; CH.SLOT[SLOT1].Incr = unchecked((uint)-1); }
static bool FM_KEY_IS(FM_SLOT SLOT) { return (SLOT.eg_next != FM_EG_Release); }
/* set detune & multiple */ static void set_det_mul(FM_ST ST, FM_CH CH, FM_SLOT SLOT, int v) { SLOT.mul = (uint)MUL_TABLE[v & 0x0f]; SLOT.DT = ST.DT_TABLE[(v >> 4) & 7]; CH.SLOT[SLOT1].Incr = unchecked((uint)-1); }
static void FM_EG_AR(FM_SLOT SLOT) { /* next DR */ SLOT.eg_next = FM_EG_DR; SLOT.evc = EG_DST; SLOT.eve = SLOT.SL; SLOT.evs = SLOT.evsd; }
static void FM_EG_Release(FM_SLOT SLOT) { SLOT.evc = EG_OFF; SLOT.eve = EG_OFF + 1; SLOT.evs = 0; }
static void FM_EG_DR(FM_SLOT SLOT) { SLOT.eg_next = FM_EG_SR; SLOT.evc = SLOT.SL; SLOT.eve = EG_DED; SLOT.evs = SLOT.evss; }
static void FM_EG_SR(FM_SLOT SLOT) { SLOT.evc = EG_OFF; SLOT.eve = EG_OFF + 1; SLOT.evs = 0; }
public FM_CH() { for (int i = 0; i < 4; i++) SLOT[i] = new FM_SLOT(); }
static void FM_CALC_EG(ref int OUT, FM_SLOT SLOT) { }
static void FM_CALC_EG(ref uint OUT, FM_SLOT SLOT) { if ((SLOT.evc += SLOT.evs) >= SLOT.eve) SLOT.eg_next((SLOT)); OUT = (uint)(SLOT.TLL + ENV_CURVE[SLOT.evc >> ENV_BITS]); if (SLOT.ams != 0) OUT += (SLOT.ams * lfo_amd / LFO_RATE); }