public MidiEventCollection UpdatePpq(MidiEventCollection midi, int newPpq) { var newMidi = new MidiEventCollection(midi.MidiFileType, newPpq); var multiplier = (double)newPpq / midi.DeltaTicksPerQuarterNote; for (var track = 0; track < midi.Tracks; track++) { var newTrack = newMidi.AddTrackCopy(midi[track]); var shifted = new HashSet <MidiEvent>(); foreach (var clonedEvent in newTrack) { if (shifted.Add(clonedEvent)) { clonedEvent.AbsoluteTime = (long)(clonedEvent.AbsoluteTime * multiplier); } // Make sure that we shift the off event whether it is in the track or not. var offEvent = (clonedEvent as NoteOnEvent)?.OffEvent; if (offEvent != null && shifted.Add(offEvent)) { offEvent.AbsoluteTime = (long)(offEvent.AbsoluteTime * multiplier); } } } return(newMidi); }
public void TestAddTrackCopyParams() { var manualMidi = new MidiEventCollection(1, 200); var noteEvent = new NoteOnEvent(0, 1, 1, 1, 1); var track = manualMidi.AddTrack(); track.Add(noteEvent); track.Add(noteEvent.OffEvent); var extensionMidi = new MidiEventCollection(1, 200); extensionMidi.AddTrackCopy(noteEvent, noteEvent.OffEvent); MidiAssert.Equal(manualMidi, extensionMidi); // Assert they aren't the same objects var manualTrack = manualMidi[0]; var extensionTrack = extensionMidi[0]; for (var e = 0; e < manualTrack.Count; e++) { Assert.That(extensionTrack[e], Is.Not.SameAs(manualTrack[e])); } // Verify the NoteOnEvent.OffEvent link Assert.AreEqual(extensionMidi[0][1], ((NoteOnEvent)extensionMidi[0][0]).OffEvent); }
public void TestAddTrackCopyDuplicateEvents() { var noteEvent = new NoteOnEvent(0, 1, 1, 1, 1); var extensionMidi = new MidiEventCollection(1, 200); var events = new MidiEvent[] { noteEvent, noteEvent.OffEvent, noteEvent, noteEvent.OffEvent }; Assert.Throws <ArgumentException>(() => extensionMidi.AddTrackCopy(events)); }
public static MidiEventCollection Clone(this MidiEventCollection original) { var newCollection = new MidiEventCollection(original.MidiFileType, original.DeltaTicksPerQuarterNote); for (var i = 0; i < original.Tracks; i++) { newCollection.AddTrackCopy(original[i]); } return(newCollection); }
public static IList <MidiEvent> AddTrackCopy(this MidiEventCollection midiEventCollection, params MidiEvent[] initialEvents) { return(midiEventCollection.AddTrackCopy((IList <MidiEvent>)initialEvents)); }