コード例 #1
0
ファイル: MidiFixer.cs プロジェクト: JoshuaWebb/FlRockBand3
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 public static IList <MidiEvent> AddTrackCopy(this MidiEventCollection midiEventCollection, params MidiEvent[] initialEvents)
 {
     return(midiEventCollection.AddTrackCopy((IList <MidiEvent>)initialEvents));
 }