Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 5
0
        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);
            }
        }
Exemplo n.º 6
0
 private void OnNotesDisplayFinished(MarkablePlaybackEvent playbackEvent) =>
 this.NotesDisplayFinished?.Invoke(this, new MarkablePlaybackEventArgs(playbackEvent));
Exemplo n.º 7
0
 /// <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;
 }