private void CheckPlaySound(TimeSpan currentTime, MarkablePlaybackEvent playbackEvent) { if (playbackEvent.Time < this.lastTick.Subtract(new TimeSpan(0, 0, 0, 5)) || playbackEvent.Time > currentTime.Subtract(new TimeSpan(0, 0, 0, 5))) { return; } this.SendPlaySoundEvents(playbackEvent, playbackEvent.Event); }
private void CheckDisplay(TimeSpan currentTime, MarkablePlaybackEvent playbackEvent) { if (playbackEvent.Time < this.lastTick) { return; } if (playbackEvent.Time > currentTime) { this.lastTick = currentTime; return; } this.SendDisplayEvents(playbackEvent, playbackEvent.Event); }
private static MarkablePlaybackEvent GetPlaybackEventWithNoteTag( Note note, TimedEvent timedEvent, TempoMap tempoMap) { var playbackEvent = new MarkablePlaybackEvent( timedEvent.Event, timedEvent.TimeAs <MetricTimeSpan>(tempoMap), timedEvent.Time); TimeSpan noteStartTime = note.TimeAs <MetricTimeSpan>(tempoMap); TimeSpan noteEndTime = TimeConverter.ConvertTo <MetricTimeSpan>(note.Time + note.Length, tempoMap); playbackEvent.Metadata = new NotePlaybackEventMetadata(note, noteStartTime, noteEndTime); return(playbackEvent); }
private void SendDisplayEvents(MarkablePlaybackEvent playbackEvent, MidiEvent midiEvent) { if (midiEvent.EventType != MidiEventType.NoteOn && midiEvent.EventType != MidiEventType.NoteOff) { return; } MarkablePlaybackEvent markablePlaybackEvent = null; foreach (var selectedNote in this.selectedNotes) { if (selectedNote == playbackEvent) { markablePlaybackEvent = selectedNote; } } if (markablePlaybackEvent == null) { return; } switch (midiEvent.EventType) { // to display case MidiEventType.NoteOn when((NoteOnEvent)midiEvent).Channel == this.SelectedChannel: this.OnNotesDisplayStarted(markablePlaybackEvent); break; case MidiEventType.NoteOff when((NoteOffEvent)midiEvent).Channel == this.SelectedChannel: this.OnNotesDisplayFinished(markablePlaybackEvent); break; } }
private void SendPlaySoundEvents(MarkablePlaybackEvent playbackEvent, MidiEvent midiEvent) { // deal with notes our user is supposed to play MarkablePlaybackEvent currentNote = null; var inSelectedNotes = false; foreach (var selectedNote in this.selectedNotes) { // This playback event describes a note our user is supposed to play. if (selectedNote == playbackEvent) { inSelectedNotes = true; } // This playback event describes a note our user was supposed to play but didn't. if (selectedNote == playbackEvent && ((selectedNote.IsMarked && selectedNote.Event.EventType == MidiEventType.NoteOn) || (!selectedNote.IsMarked && selectedNote.Event.EventType != MidiEventType.NoteOn) || selectedNote.Event.EventType == MidiEventType.NoteOff)) { currentNote = selectedNote; } } if (inSelectedNotes) { // user was supposed to play this if (currentNote != null) { // The user actually played this. this.SendEvent(midiEvent); this.SelectedTrackNotification?.Invoke( this, new TrackNotificationEventArgs(true, midiEvent.ToString())); } else { // The user did not mark the note. this.SelectedTrackNotification?.Invoke( this, new TrackNotificationEventArgs(false, midiEvent.ToString())); } } else if ((UserData.GameMode != UserData.Mode.Solo && UserData.IsMultiplayerConductor) || UserData.GameMode == UserData.Mode.Solo || UserData.GameMode == UserData.Mode.Offline) { // play notes for instruments that are not played by current user this.SendEvent(midiEvent); } // Following logic deals with pausing when a noteOn event has been sent but the note off event has not yet // been sent, so that we can restart those notes when we unpause. var noteMetadata = playbackEvent.Metadata; if (noteMetadata == null) { return; } if (midiEvent.EventType == MidiEventType.NoteOn) { this.activeNotes[noteMetadata.RawNote.GetNoteId()] = noteMetadata.RawNote; this.OnNotesPlaybackStarted(noteMetadata.RawNote); } else { _ = this.activeNotes.Remove(noteMetadata.RawNote.GetNoteId()); this.OnNotesPlaybackFinished(noteMetadata.RawNote); } }
private void OnNotesDisplayFinished(MarkablePlaybackEvent playbackEvent) => this.NotesDisplayFinished?.Invoke(this, new MarkablePlaybackEventArgs(playbackEvent));
/// <summary> /// Initializes a new instance of the <see cref="MarkablePlaybackEventArgs"/> class. /// </summary> /// <param name="playbackEvent">The playback event.</param> public MarkablePlaybackEventArgs(MarkablePlaybackEvent playbackEvent) => this.PlaybackEvent = playbackEvent;
/// <summary> /// Initializes a new instance of the <see cref="RenderedMarkablePlaybackEvent"/> class. /// </summary> /// <param name="markablePlaybackEvent">The markable playback event.</param> /// <param name="noteControl">The note control.</param> public RenderedMarkablePlaybackEvent(MarkablePlaybackEvent markablePlaybackEvent, NoteControl noteControl) { this.MarkablePlaybackEvent = markablePlaybackEvent; this.NoteControl = noteControl; }