public static List <TimingPoint> TimingMarkListToTimingPointList(ObservableCollection <TimingMark> mark, out int preview, out List <Bookmark> bookmarks) { var result = new List <TimingPoint>(); bookmarks = new List <Bookmark>(); preview = -1; TimingMark prevMark = null; foreach (var cur in mark) { if (cur.Preview) { preview = cur.Offset; } if (cur.BookMarkChange) { bookmarks.Add(new Bookmark(cur.Offset, cur.Bookmark)); } if (cur.MeasureChange || cur.SpeedChange || cur.HitSoundChange) { if (prevMark == null || Math.Abs(cur.Bpm - prevMark.Bpm) > 0.01) { result.Add(new TimingPoint { Offset = cur.Offset, MsPerBeat = BpmConverter.BpmToMilliseconds(cur.Bpm, 1), Meter = cur.Measure, SampleSet = (int)cur.HitSound + 1, SampleIndex = 0, Volume = cur.Volume, Inherited = true, Kiai = cur.Kiai }); } if (cur.SpeedRate != 100 || !cur.SpeedChange) { result.Add(new TimingPoint { Offset = cur.Offset, MsPerBeat = (double)-10000 / cur.SpeedRate, Meter = cur.Measure, SampleSet = (int)cur.HitSound + 1, SampleIndex = 0, Volume = cur.Volume, Inherited = false, Kiai = cur.Kiai }); } } prevMark = cur; } return(result); }
public void HandleEvent(CurrentTimingChangedEvent e) { var marks = ((MainWindowViewModel)DataContext).TimingMarks; LineCanvas.Children.Clear(); foreach (var item in marks) { AddLine(item.Offset); } if (marks.Count == 0) { NewBaseCheckBox.IsHitTestVisible = true; } if (marks.Count == 1) { NewBaseCheckBox.IsChecked = true; NewBaseCheckBox.IsHitTestVisible = false; } else { // Find previous TimingMark TimingMark prevMark = null; foreach (var timing in marks) { if (e.Offset > timing.Offset) { prevMark = timing; } } if (prevMark == null) { prevMark = marks.First(); } if (Math.Abs(prevMark.Bpm - e.Bpm) < 0.001) { NewBaseCheckBox.IsHitTestVisible = true; } else { NewBaseCheckBox.IsChecked = true; NewBaseCheckBox.IsHitTestVisible = false; } } }
public void HandleEvent(CurPositionEvent e) { HeaderTimeline.CurrentValue = e.CurPosition; var dataContext = (MainWindowViewModel)DataContext; TimingMark prevMark = null; foreach (var mark in dataContext.TimingMarks) { if (mark.Offset > e.CurPosition) { dataContext.CurrentTiming = prevMark ?? dataContext.TimingMarks[0]; break; } prevMark = mark; } }