Example #1
0
        private void OnDataSeqFrq(long SeqCounter)
        {
            if (mv == null)
            {
                return;
            }
            if (mv.desVGM == null)
            {
                return;
            }

            //if ((Audio.sm.Mode & SendMode.MML) != SendMode.MML)
            //{
            //    if (rtMML != null)
            //        rtMML.OneFrameSeq();
            //}

            //入力時に生じた、各チップ向けの送信データをコンパイラを使用して生成する。
            if (qMML.Count < 1)
            {
                return;
            }

            //生成したデータを取得
            mv.desVGM.dat.Clear();
            //音源への送信データキューへ追加
            Enq enq = SoundManager.GetDriverDataEnqueue();

            while (qMML.Count > 0)
            {
                KBDInfo kbdInfo = qMML.Dequeue();
                switch (kbdInfo.mml.type)
                {
                case enmMMLType.Octave:
                    kbdInfo.chip.CmdOctave(kbdInfo.pw.apg, kbdInfo.mml);
                    break;

                case enmMMLType.Note:
                    kbdInfo.chip.SetKeyOff(kbdInfo.pw.apg, kbdInfo.mml);
                    if ((int)kbdInfo.mml.args[1] >= 0)
                    {
                        kbdInfo.chip.CmdNote(kbdInfo.pw, kbdInfo.pw.apg, kbdInfo.mml);    //TODO:page制御やってない
                        kbdInfo.chip.MultiChannelCommand(kbdInfo.mml);
                    }
                    break;
                }

                List <outDatum> dat = kbdInfo.pw.apg.sendData;
                while (0 < dat.Count)
                {
                    outDatum od = dat[0];
                    if (od == null)
                    {
                        dat.RemoveAt(0);
                        continue;
                    }

                    byte val = od.val;
                    byte adr;
                    byte prm;
                    switch (val)
                    {
                    case 0x52:    //OPN2
                        adr = dat[1].val;
                        prm = dat[2].val;
                        enq(dat[0], SeqCounter, kbdInfo.eChip, EnmDataType.Force, adr, prm, null);
                        dat.RemoveAt(0);
                        dat.RemoveAt(0);
                        dat.RemoveAt(0);
                        break;

                    case 0x56:    //OPNA
                        adr = dat[1].val;
                        prm = dat[2].val;
                        enq(dat[0], 0, kbdInfo.eChip, EnmDataType.Force, adr, prm, null);
                        dat.RemoveAt(0);
                        dat.RemoveAt(0);
                        dat.RemoveAt(0);
                        break;

                    case 0x57:    //OPNA
                        adr = dat[1].val;
                        prm = dat[2].val;
                        enq(dat[0], 0, kbdInfo.eChip, EnmDataType.Force, adr | 0x100, prm, null);
                        dat.RemoveAt(0);
                        dat.RemoveAt(0);
                        dat.RemoveAt(0);
                        break;

                    default:
                        dat.RemoveAt(0);
                        break;
                    }
                }
            }
        }