protected override void OnRender(DrawingContext drawingContext) { Rect fullRect = new Rect(new Point(), new Size(ActualWidth, ActualHeight)); drawingContext.PushClip(new RectangleGeometry(fullRect)); drawingContext.DrawRectangle(Background, null, fullRect); drawingContext.DrawLine(new Pen(Brushes.Red, 11), new Point(Midpoint * ActualWidth, 0), new Point(Midpoint * ActualWidth, ActualHeight)); if (Beats != null) { double timeFrom = Progress.TotalSeconds - Midpoint * TotalDisplayedDuration; double timeTo = Progress.TotalSeconds + (1 - Midpoint) * TotalDisplayedDuration; List <TimeSpan> absoluteBeatPositions = Beats.GetBeats(TimeSpan.FromSeconds(timeFrom), TimeSpan.FromSeconds(timeTo)).ToList(); IEnumerable <double> relativeBeatPositions = absoluteBeatPositions.Select(b => (b.TotalSeconds - timeFrom) / (timeTo - timeFrom)); const double safeSpace = 30; double y = ActualHeight / 2.0; DrawLine(drawingContext, Colors.Red, new Point(-safeSpace, y), new Point(ActualWidth + safeSpace, y)); foreach (double pos in relativeBeatPositions) { DrawLine(drawingContext, LineColor, new Point(pos * ActualWidth, -5), new Point(pos * ActualWidth, ActualHeight + 5), LineWidth); } } drawingContext.Pop(); }
private void mnuShiftSelected_Click(object sender, RoutedEventArgs e) { TimeSpan tBegin = _marker1 < _marker2 ? _marker1 : _marker2; TimeSpan tEnd = _marker1 < _marker2 ? _marker2 : _marker1; double shiftBy = GetDouble(0.0); if (Double.IsNaN(shiftBy)) { return; } TimeSpan shift = TimeSpan.FromMilliseconds((int)shiftBy); List <TimeSpan> beatsToEvenOut = Beats.GetBeats(tBegin, tEnd).Select(b => b + shift).ToList(); List <TimeSpan> otherBeats = Beats.Where(t => t <tBegin || t> tEnd).ToList(); SetAllBeats(otherBeats.Concat(beatsToEvenOut)); _marker1 += shift; _marker2 += shift; BeatBar.Marker1 = _marker1; BeatBar.Marker2 = _marker2; }
private void btnDetect_Click(object sender, RoutedEventArgs e) { BeatPatternEditor editor = new BeatPatternEditor(new bool[] { true, false, false, false, false, false, false, false, }); if (editor.ShowDialog() != true) { return; } bool[] pattern = editor.Result; var beats = Beats.GetBeats(_begin, _end).ToList(); BeatSegment segment = GetSegment(beats, pattern); if (segment == null) { return; } Segments.Add(segment); }
private void Normalize(int additionalBeats, bool trimToBeats = true) { TimeSpan tBegin = _marker1 < _marker2 ? _marker1 : _marker2; TimeSpan tEnd = _marker1 < _marker2 ? _marker2 : _marker1; List <TimeSpan> beatsToEvenOut = Beats.GetBeats(tBegin, tEnd).ToList(); List <TimeSpan> otherBeats = Beats.Where(t => t <tBegin || t> tEnd).ToList(); if (beatsToEvenOut.Count < 2 && trimToBeats) { return; } TimeSpan first = trimToBeats ? beatsToEvenOut.Min() : tBegin; TimeSpan last = trimToBeats ? beatsToEvenOut.Max() : tEnd; int numberOfBeats = (int)(beatsToEvenOut.Count + additionalBeats); if (numberOfBeats < 2) { numberOfBeats = 2; } TimeSpan tStart = first; TimeSpan intervall = (last - first).Divide(numberOfBeats - 1); for (int i = 0; i < numberOfBeats; i++) { otherBeats.Add(tStart + intervall.Multiply(i)); } Fadeout.SetText(intervall.TotalMilliseconds.ToString("f0") + "ms", TimeSpan.FromSeconds(4)); SetAllBeats(otherBeats); }
protected override void OnRender(DrawingContext drawingContext) { #region Background Rect fullRect = new Rect(new Point(), new Size(ActualWidth, ActualHeight)); drawingContext.PushClip(new RectangleGeometry(fullRect)); drawingContext.DrawRectangle(Background, null, fullRect); #endregion #region Selection TimeSpan timeFrom = Progress - TotalDisplayedDuration.Multiply(Midpoint); TimeSpan timeTo = Progress + TotalDisplayedDuration.Multiply(1 - Midpoint); if (Marker1 != TimeSpan.MinValue && Marker2 != TimeSpan.MinValue) { TimeSpan earlier = Marker1 < Marker2 ? Marker1 : Marker2; TimeSpan later = Marker1 > Marker2 ? Marker1 : Marker2; if (later >= timeFrom && earlier <= timeTo) { double xFrom = XFromTime(earlier); double xTo = XFromTime(later); SolidColorBrush brush = new SolidColorBrush(Colors.Cyan) { Opacity = 0.4 }; drawingContext.DrawRectangle(brush, null, new Rect(new Point(xFrom, 0), new Point(xTo, ActualHeight))); } } if (Marker1 != TimeSpan.MinValue && IsTimeVisible(Marker1)) { double x = XFromTime(Marker1); drawingContext.DrawLine(new Pen(Brushes.Cyan, 1), new Point(x, 0), new Point(x, ActualHeight)); } if (Marker2 != TimeSpan.MinValue && IsTimeVisible(Marker2)) { double x = XFromTime(Marker2); drawingContext.DrawLine(new Pen(Brushes.Cyan, 1), new Point(x, 0), new Point(x, ActualHeight)); } #endregion #region MidPoint drawingContext.DrawLine(new Pen(Brushes.Red, 11), new Point(Midpoint * ActualWidth, 0), new Point(Midpoint * ActualWidth, ActualHeight)); #endregion #region Beats if (Beats != null) { List <TimeSpan> absoluteBeatPositions = Beats.GetBeats(timeFrom, timeTo).ToList(); IEnumerable <double> relativeBeatPositions = absoluteBeatPositions.Select(b => (b - timeFrom).Divide(timeTo - timeFrom)); //const double safeSpace = 30; //double y = ActualHeight / 2.0; //DrawLine(drawingContext, Colors.Red, new Point(-safeSpace, y), // new Point(ActualWidth + safeSpace, y)); foreach (double pos in relativeBeatPositions) { DrawLine(drawingContext, LineColor, new Point(pos * ActualWidth, -5), new Point(pos * ActualWidth, ActualHeight + 5), LineWidth); } } #endregion drawingContext.Pop(); }