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); }
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; } } } }