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