public static IList <MidiEvent> GetTrackByName(this MidiEventCollection midiEventCollection, string name) { var track = midiEventCollection.FindTrackByName(name); if (track == null) { throw new TrackNotFoundException(name); } return(track); }
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); }