/// <summary> /// Initializes a new instance of the <see cref="Playback"/> with the specified /// collection of timed objects and tempo map. /// </summary> /// <param name="timedObjects">Collection of timed objects to play.</param> /// <param name="tempoMap">Tempo map used to calculate events times.</param> /// <param name="clockSettings">Settings of the internal playback's clock.</param> /// <exception cref="ArgumentNullException"><paramref name="timedObjects"/> is null. -or- /// <paramref name="tempoMap"/> is null.</exception> public Playback(IEnumerable <ITimedObject> timedObjects, TempoMap tempoMap, MidiClockSettings clockSettings = null) { ThrowIfArgument.IsNull(nameof(timedObjects), timedObjects); ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap); var playbackEvents = GetPlaybackEvents(timedObjects, tempoMap); _eventsEnumerator = playbackEvents.GetEnumerator(); _eventsEnumerator.MoveNext(); var lastPlaybackEvent = playbackEvents.LastOrDefault(); _duration = lastPlaybackEvent?.Time ?? TimeSpan.Zero; _durationInTicks = lastPlaybackEvent?.RawTime ?? 0; _notesMetadata = playbackEvents.Select(e => e.Metadata.Note).Where(m => m != null).ToList(); _notesMetadata.Sort((m1, m2) => m1.StartTime.CompareTo(m2.StartTime)); TempoMap = tempoMap; clockSettings = clockSettings ?? new MidiClockSettings(); _clock = new MidiClock(false, clockSettings.CreateTickGeneratorCallback(ClockInterval)); _clock.Ticked += OnClockTicked; Snapping = new PlaybackSnapping(playbackEvents, tempoMap); }
/// <summary> /// Initializes a new instance of the <see cref="Playback"/> with the specified /// collection of MIDI events collections, tempo map and output MIDI device to play events through. /// </summary> /// <param name="events">Collection of MIDI events collections to play.</param> /// <param name="tempoMap">Tempo map used to calculate events times.</param> /// <param name="outputDevice">Output MIDI device to play <paramref name="events"/> through.</param> /// <exception cref="ArgumentNullException"><paramref name="events"/> is null. -or- /// <paramref name="tempoMap"/> is null. -or- <paramref name="outputDevice"/> is null.</exception> public Playback(IEnumerable <IEnumerable <MidiEvent> > events, TempoMap tempoMap, OutputDevice outputDevice) { ThrowIfArgument.IsNull(nameof(events), events); ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap); ThrowIfArgument.IsNull(nameof(outputDevice), outputDevice); var playbackEvents = GetPlaybackEvents(events, tempoMap); _eventsEnumerator = playbackEvents.GetEnumerator(); _eventsEnumerator.MoveNext(); var lastPlaybackEvent = playbackEvents.LastOrDefault(); _duration = lastPlaybackEvent?.Time ?? TimeSpan.Zero; _durationInTicks = lastPlaybackEvent?.RawTime ?? 0; _notesMetadata = playbackEvents.Select(e => e.Metadata.Note).Where(m => m != null).ToList(); _notesMetadata.Sort((m1, m2) => Math.Sign(m1.StartTime.Ticks - m2.StartTime.Ticks)); TempoMap = tempoMap; OutputDevice = outputDevice; _clock = new MidiClock(ClockInterval); _clock.Tick += OnClockTick; }
public Playback(IEnumerable <IEnumerable <MidiEvent> > events, TempoMap tempoMap, OutputDevice outputDevice) { ThrowIfArgument.IsNull(nameof(events), events); ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap); ThrowIfArgument.IsNull(nameof(outputDevice), outputDevice); _eventsEnumerator = GetPlaybackEvents(events, tempoMap).GetEnumerator(); _eventsEnumerator.MoveNext(); _tempoMap = tempoMap; _outputDevice = outputDevice; _clock = new MidiClock(ClockInterval); _clock.Tick += OnClockTick; }
/// <summary> /// Initializes a new instance of the <see cref="Playback"/> with the specified /// collection of MIDI events collections, tempo map and output MIDI device to play events through. /// </summary> /// <param name="events">Collection of MIDI events collections to play.</param> /// <param name="tempoMap">Tempo map used to calculate events times.</param> /// <param name="outputDevice">Output MIDI device to play <paramref name="events"/> through.</param> /// <exception cref="ArgumentNullException"><paramref name="events"/> is null. -or- /// <paramref name="tempoMap"/> is null. -or- <paramref name="outputDevice"/> is null.</exception> public Playback(IEnumerable <IEnumerable <MidiEvent> > events, TempoMap tempoMap, OutputDevice outputDevice) { ThrowIfArgument.IsNull(nameof(events), events); ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap); ThrowIfArgument.IsNull(nameof(outputDevice), outputDevice); var playbackEvents = GetPlaybackEvents(events, tempoMap); _duration = playbackEvents.LastOrDefault()?.Time ?? TimeSpan.Zero; _durationInTicks = playbackEvents.LastOrDefault()?.RawTime ?? 0; _eventsEnumerator = playbackEvents.GetEnumerator(); _eventsEnumerator.MoveNext(); TempoMap = tempoMap; OutputDevice = outputDevice; _clock = new MidiClock(ClockInterval); _clock.Tick += OnClockTick; }
private void CreateClock(TimeSpan pollingInterval) { _clock = new MidiClock(true, _clockSettings.CreateTickGeneratorCallback(), pollingInterval); _clock.Ticked += OnTick; }