예제 #1
0
        /* ---------- 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));
        }
예제 #2
0
        /* 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;
            }
        }
예제 #3
0
파일: FmOPL.cs 프로젝트: scemino/nscumm
        /* ---------- 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));
        }