コード例 #1
0
        public static IList <MidiEvent> GetTrackByName(this MidiEventCollection midiEventCollection, string name)
        {
            var track = midiEventCollection.FindTrackByName(name);

            if (track == null)
            {
                throw new TrackNotFoundException(name);
            }

            return(track);
        }
コード例 #2
0
ファイル: MidiFixer.cs プロジェクト: JoshuaWebb/FlRockBand3
        public void ConvertLastBeatToEnd(MidiEventCollection midi)
        {
            var beatTrack = midi.GetTrackByName(TrackName.Beat.ToString());

            var lastBeatOn = beatTrack.OfType <NoteOnEvent>().OrderBy(e => e.AbsoluteTime).LastOrDefault(MidiEvent.IsNoteOn);

            if (lastBeatOn == null)
            {
                throw new InvalidBeatTrackException($"No notes were found on the {TrackName.Beat} track");
            }

            var eventsTrack = midi.FindTrackByName(TrackName.Events.ToString());

            if (eventsTrack != null)
            {
                var existingEvent = eventsTrack.FindFirstTextEvent(EventName.End.ToString());
                if (existingEvent != null)
                {
                    AddInfo($"{EventName.End} event already exists at {GetBarInfo(midi, existingEvent)}, left last beat in place.");
                    return;
                }
            }
            else
            {
                eventsTrack = midi.AddNamedTrack(TrackName.Events.ToString());
            }

            beatTrack.Remove(lastBeatOn);
            beatTrack.Remove(lastBeatOn.OffEvent);

            // Fix beat track end
            var newLastEvent = beatTrack.OfType <NoteEvent>().OrderBy(e => e.AbsoluteTime).Last();

            UpdateTrackEnd(beatTrack, newLastEvent.AbsoluteTime);

            eventsTrack.Add(new TextEvent(EventName.End.ToString(), MetaEventType.TextEvent, lastBeatOn.AbsoluteTime));
            UpdateTrackEnd(eventsTrack, lastBeatOn.AbsoluteTime);
        }