Exemplo n.º 1
0
        private void NoteOnMONO(int n, int velocity)
        {
            if (n < 0 || n > 127)
            {
                return;
            }

            NoteOffMONO(latestNoteNumberMONO);
            latestNoteNumberMONO = n;


            GetChipCh(out ClsChip chip, out int ch);
            if (chip == null || ch < 0)
            {
                return;
            }

            KBDInfo kbdInfo = new KBDInfo();

            kbdInfo.chip = chip;// mv.desVGM.ym2608[0];
            if (kbdInfo.chip == null)
            {
                return;
            }
            kbdInfo.chip.use = true;
            kbdInfo.pw       = kbdInfo.chip.lstPartWork[ch];
            if (kbdInfo.pw == null)
            {
                return;
            }
            kbdInfo.mml   = MakeMML_Octave(n);
            kbdInfo.eChip = Audio.GetChip(EnmChip.YM2608);
            if (kbdInfo.eChip == null)
            {
                return;
            }
            qMML.Enqueue(kbdInfo);

            kbdInfo          = new KBDInfo();
            kbdInfo.chip     = chip;// mv.desVGM.ym2608[0];
            kbdInfo.chip.use = true;
            kbdInfo.pw       = kbdInfo.chip.lstPartWork[ch];
            kbdInfo.mml      = MakeMML_NoteOn(n);
            kbdInfo.eChip    = Audio.GetChip(EnmChip.YM2608);
            qMML.Enqueue(kbdInfo);
        }
Exemplo n.º 2
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;
                    }
                }
            }
        }