private void DrawPitchBend(UNote note, DrawingContext cxt) { var _pitchExp = note.PitchBend as PitchBendExpression; var _pts = _pitchExp.Data as List <PitchPoint>; if (_pts.Count < 2) { return; } double pt0Tick = note.PosTick + MusicMath.MillisecondToTick(_pts[0].X, DocManager.Inst.Project.BPM, DocManager.Inst.Project.BeatUnit, DocManager.Inst.Project.Resolution); double pt0X = midiVM.QuarterWidth * pt0Tick / DocManager.Inst.Project.Resolution; double pt0Pit = note.NoteNum + _pts[0].Y / 10.0; double pt0Y = TrackHeight * ((double)UIConstants.MaxNoteNum - 1.0 - pt0Pit) + TrackHeight / 2; if (note.PitchBend.SnapFirst) { cxt.DrawEllipse(ThemeManager.WhiteKeyNameBrushNormal, penPit, new Point(pt0X, pt0Y), 2.5, 2.5); } else { cxt.DrawEllipse(null, penPit, new Point(pt0X, pt0Y), 2.5, 2.5); } for (int i = 1; i < _pts.Count; i++) { double pt1Tick = note.PosTick + MusicMath.MillisecondToTick(_pts[i].X, DocManager.Inst.Project.BPM, DocManager.Inst.Project.BeatUnit, DocManager.Inst.Project.Resolution); double pt1X = midiVM.QuarterWidth * pt1Tick / DocManager.Inst.Project.Resolution; double pt1Pit = note.NoteNum + _pts[i].Y / 10.0; double pt1Y = TrackHeight * ((double)UIConstants.MaxNoteNum - 1.0 - pt1Pit) + TrackHeight / 2; // Draw arc double _x = pt0X; double _x2 = pt0X; double _y = pt0Y; double _y2 = pt0Y; if (pt1X - pt0X < 5) { cxt.DrawLine(penPit, new Point(pt0X, pt0Y), new Point(pt1X, pt1Y)); } else { while (_x2 < pt1X) { _x = Math.Min(_x + 4, pt1X); _y = MusicMath.InterpolateShape(pt0X, pt1X, pt0Y, pt1Y, _x, _pts[i - 1].Shape); cxt.DrawLine(penPit, new Point(_x, _y), new Point(_x2, _y2)); _x2 = _x; _y2 = _y; } } pt0Tick = pt1Tick; pt0X = pt1X; pt0Pit = pt1Pit; pt0Y = pt1Y; cxt.DrawEllipse(null, penPit, new Point(pt0X, pt0Y), 2.5, 2.5); } }
private void DrawPitchBend(UNote note, DrawingContext cxt) { var _pitchExp = note.pitch; var _pts = _pitchExp.data; if (_pts.Count < 2) { return; } double pt0Tick = note.position + MusicMath.MillisecondToTick(_pts[0].X, DocManager.Inst.Project.bpm, DocManager.Inst.Project.beatUnit, DocManager.Inst.Project.resolution); double pt0X = midiVM.QuarterWidth * pt0Tick / DocManager.Inst.Project.resolution; double pt0Pit = note.tone + _pts[0].Y / 10.0; double pt0Y = TrackHeight * (UIConstants.MaxNoteNum - 1.0 - pt0Pit) + TrackHeight / 2; cxt.DrawEllipse(note.pitch.snapFirst ? penPit.Brush : null, penPit, new Point(pt0X, pt0Y), 2.5, 2.5); for (int i = 1; i < _pts.Count; i++) { double pt1Tick = note.position + MusicMath.MillisecondToTick(_pts[i].X, DocManager.Inst.Project.bpm, DocManager.Inst.Project.beatUnit, DocManager.Inst.Project.resolution); double pt1X = midiVM.QuarterWidth * pt1Tick / DocManager.Inst.Project.resolution; double pt1Pit = note.tone + _pts[i].Y / 10.0; double pt1Y = TrackHeight * (UIConstants.MaxNoteNum - 1.0 - pt1Pit) + TrackHeight / 2; // Draw arc double _x = pt0X; double _x2 = pt0X; double _y = pt0Y; double _y2 = pt0Y; if (pt1X - pt0X < 5) { cxt.DrawLine(penPit, new Point(pt0X, pt0Y), new Point(pt1X, pt1Y)); } else { while (_x2 < pt1X) { _x = Math.Min(_x + 4, pt1X); _y = MusicMath.InterpolateShape(pt0X, pt1X, pt0Y, pt1Y, _x, _pts[i - 1].shape); cxt.DrawLine(penPit, new Point(_x, _y), new Point(_x2, _y2)); _x2 = _x; _y2 = _y; } } pt0Tick = pt1Tick; pt0X = pt1X; pt0Pit = pt1Pit; pt0Y = pt1Y; cxt.DrawEllipse(null, penPit, new Point(pt0X, pt0Y), 2.5, 2.5); } }
public int MillisecondToTick(double ms) { return(MusicMath.MillisecondToTick(ms, BPM, BeatUnit, Resolution)); }
/// <summary> /// Utility method to convert milliseconds to ticks. /// </summary> protected int MsToTick(double ms) { return(MusicMath.MillisecondToTick(ms, bpm, beatUnit, resolution)); }