void LoadMidi(string MidFile, string Track)
        {
            TempoWorker tempo    = new TempoWorker(120, TempoWorker.NoteType.Crotchet);
            MidiRResult MidiRecv = MidiWorker.ReadMidi(MidFile, Track);
            NoteOnEvent FN       = MidiRecv.Notes[0];
            long        off      = FN.AbsoluteTime;

            for (int i = 0; i < MidiRecv.Notes.Count; i++)
            {
                NoteOnEvent NoteEvent = MidiRecv.Notes[i];
                PianoNote   PNote     = new PianoNote(
                    NoteEvent.AbsoluteTime - off,
                    NoteEvent.NoteLength,
                    new BalthasarLib.PianoRollWindow.PitchValuePair((uint)NoteEvent.NoteNumber, 0)
                    );
                PNote.OctaveType = PitchValuePair.OctaveTypeEnum.Piano;
                PNote.Lyric      = PNote.PitchValue.NoteChar + PNote.PitchValue.Octave.ToString();
                NoteList.Add(PNote);
            }
            int j = 0;
            int k = 0;

            PitchList.Add(k, new List <PitchNode>());
            for (int i = 0; i < MidiRecv.Pitchs.Count; i++)
            {
                if (j >= MidiRecv.Notes.Count)
                {
                    break;
                }
                if (MidiRecv.Pitchs[i].PitchWheelChangeEvent.AbsoluteTime - off < NoteList[j].Tick)
                {
                    continue;                                                                                //在音符前,抛弃
                }
                if (MidiRecv.Pitchs[i].PitchWheelChangeEvent.AbsoluteTime - off > NoteList[j].Tick + NoteList[j].Length)
                {
                    //在音符后
                    j++;
                    k++;
                    i--;//重来一遍
                    PitchList.Add(k, new List <PitchNode>());
                    continue;
                }
                PitchValuePair pvp  = new PitchValuePair((uint)MidiRecv.Notes[j].NoteNumber, MidiRecv.Pitchs[i].PIT, (uint)MidiRecv.Pitchs[i].PBS);
                PitchNode      PitN = new PitchNode(MidiRecv.Pitchs[i].PitchWheelChangeEvent.AbsoluteTime - off, pvp.PitchValue);
                PitchList[k].Add(PitN);
            }
        }
Exemplo n.º 2
0
        public void DrawPitchLine(List <PitchNode> SortedPitchPointSilk, Color LineColor, float LineWidth, System.Drawing.Drawing2D.DashStyle LineStyle)
        {
            //计算X相位边界
            long MinTick = pprops.PianoStartTick;
            long MaxTick = pprops.PianoStartTick + (long)Math.Round(pprops.dertPixel2dertTick(baseEvent.ClipRectangle.Width), 0) + 1;
            //计算Y相位边界
            double MaxNoteCount = (double)baseEvent.ClipRectangle.Height / rconf.Const_RollNoteHeight;

            if (MaxNoteCount > (int)MaxNoteCount)
            {
                MaxNoteCount = (int)MaxNoteCount + 1;
            }
            uint MaxNote = pprops.PianoTopNote;
            uint MinNote = MaxNote - (uint)MaxNoteCount;

            List <Point> PixelSilkLine = new List <Point>();
            bool         First         = true;

            for (int i = 1; i < SortedPitchPointSilk.Count; i++)
            {
                if (SortedPitchPointSilk[i].Tick > MinTick && SortedPitchPointSilk[i - 1].Tick < MaxTick)
                {
                    PitchNode pn  = SortedPitchPointSilk[i];
                    PitchNode pn2 = SortedPitchPointSilk[i - 1];
                    if (First)
                    {
                        Point StartP = PitchNode2Point(pn2, MinTick, MaxTick, MinNote, MaxNote);
                        PixelSilkLine.Add(StartP);
                        First = false;
                    }
                    Point EndP = PitchNode2Point(pn, MinTick, MaxTick, MinNote, MaxNote);
                    PixelSilkLine.Add(EndP);
                }
            }

            D2DGraphics g = baseEvent.D2DGraphics;

            if (PixelSilkLine.Count > 1)
            {
                g.DrawPathGeometrySink(PixelSilkLine, LineColor, LineWidth, LineStyle, false);
            }
        }
Exemplo n.º 3
0
        private Point PitchNode2Point(PitchNode Node, long MinTick, long MaxTick, uint MinNote, uint MaxNote)
        {
            long ETick      = Node.Tick - MinTick;//获得左边界距离启绘点距离;
            int  NodeXPixel = baseEvent.ClipRectangle.X;

            if (ETick < 0)
            {
                //起绘制点小于0;
                NodeXPixel = baseEvent.ClipRectangle.X - (int)Math.Round(pprops.dertTick2dertPixel(-ETick), 0);
            }
            else
            {
                NodeXPixel = baseEvent.ClipRectangle.X + (int)Math.Round(pprops.dertTick2dertPixel(ETick), 0);
            }

            uint   NoteDistance  = MaxNote - Node.PitchValue.NoteNumber;
            double PitchDistance = (double)Node.PitchValue.PitchValue - Node.PitchValue.NoteNumber - 0.5;
            int    NodeYPixel    = baseEvent.ClipRectangle.Top + (int)(((double)NoteDistance + PitchDistance + 1) * rconf.Const_RollNoteHeight);

            return(new Point(NodeXPixel, NodeYPixel));
        }