Example #1
0
        public void SendEvent_MidiEvent()
        {
            var midiEvent = new NoteOnEvent((SevenBitNumber)45, (SevenBitNumber)89)
            {
                Channel = (FourBitNumber)6
            };

            using (var outputDevice = OutputDevice.GetByName(MidiDevicesNames.DeviceA))
            {
                MidiEvent eventSent = null;
                outputDevice.EventSent += (_, e) => eventSent = e.Event;

                using (var inputDevice = InputDevice.GetByName(MidiDevicesNames.DeviceA))
                {
                    MidiEvent eventReceived = null;
                    inputDevice.EventReceived += (_, e) => eventReceived = e.Event;

                    inputDevice.StartEventsListening();

                    outputDevice.PrepareForEventsSending();
                    outputDevice.SendEvent(new NoteOnEvent((SevenBitNumber)45, (SevenBitNumber)89)
                    {
                        Channel = (FourBitNumber)6
                    });

                    var timeout             = TimeSpan.FromMilliseconds(15);
                    var isEventSentReceived = SpinWait.SpinUntil(() => eventSent != null && eventReceived != null, timeout);
                    Assert.IsTrue(isEventSentReceived, "Event either not sent ot not received.");

                    MidiAsserts.AreEventsEqual(midiEvent, eventSent, false, "Sent event is invalid.");
                    MidiAsserts.AreEventsEqual(eventSent, eventReceived, false, "Received event is invalid.");
                }
            }
        }
Example #2
0
        public void Write_Compression_DeleteDefaultKeySignature_Obsolete()
        {
            var nonDefaultKeySignatureEvent = new KeySignatureEvent(-5, 1);

            var midiFile = new MidiFile(
                new TrackChunk(
                    new NoteOnEvent((SevenBitNumber)100, (SevenBitNumber)50),
                    new NoteOffEvent((SevenBitNumber)100, (SevenBitNumber)50),
                    new UnknownMetaEvent(254),
                    new KeySignatureEvent(),
                    nonDefaultKeySignatureEvent));

            Write_Compression_Obsolete(
                midiFile,
                CompressionPolicy.DeleteDefaultKeySignature,
                (fileInfo1, fileInfo2) =>
            {
                var originalMidiFile = MidiFile.Read(fileInfo1.FullName);
                Assert.AreEqual(
                    2,
                    originalMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <KeySignatureEvent>().Count(),
                    "Invalid count of Key Signature events in original file.");

                var newMidiFile        = MidiFile.Read(fileInfo2.FullName);
                var keySignatureEvents = newMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <KeySignatureEvent>().ToArray();
                Assert.AreEqual(
                    1,
                    keySignatureEvents.Length,
                    "Invalid count of Key Signature events in new file.");

                MidiAsserts.AreEventsEqual(keySignatureEvents[0], nonDefaultKeySignatureEvent, false, "Invalid Key Signature event.");
            });
        }
Example #3
0
        public void CloneEvent()
        {
            var random = new Random();

            foreach (var type in TypesProvider.GetAllEventTypes())
            {
                var midiEvent = type == typeof(UnknownMetaEvent)
                    ? new UnknownMetaEvent(1)
                    : (MidiEvent)Activator.CreateInstance(type);

                if (midiEvent is ChannelEvent channelEvent)
                {
                    channelEvent.Channel = (FourBitNumber)(random.Next(5) + 5);
                }

                if (midiEvent is BaseTextEvent baseTextEvent)
                {
                    baseTextEvent.Text = random.Next(1000).ToString();
                }

                midiEvent.DeltaTime = random.Next(1000) + 1;

                var midiEventClone = midiEvent.Clone();
                MidiAsserts.AreEventsEqual(midiEvent, midiEventClone, true, $"Clone of {type} is invalid.");
            }
        }
Example #4
0
        public void Write_DeleteDefaultTimeSignature()
        {
            var nonDefaultTimeSignatureEvent = new TimeSignatureEvent(2, 16);

            var midiFile = new MidiFile(
                new TrackChunk(
                    new NoteOnEvent((SevenBitNumber)100, (SevenBitNumber)50),
                    new NoteOffEvent((SevenBitNumber)100, (SevenBitNumber)50),
                    new UnknownMetaEvent(254),
                    new TimeSignatureEvent(),
                    nonDefaultTimeSignatureEvent));

            Write(
                midiFile,
                settings => settings.DeleteDefaultTimeSignature = true,
                (fileInfo1, fileInfo2) =>
            {
                var originalMidiFile = MidiFile.Read(fileInfo1.FullName);
                Assert.AreEqual(
                    2,
                    originalMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <TimeSignatureEvent>().Count(),
                    "Invalid count of Time Signature events in original file.");

                var newMidiFile         = MidiFile.Read(fileInfo2.FullName);
                var timeSignatureEvents = newMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <TimeSignatureEvent>().ToArray();
                Assert.AreEqual(
                    1,
                    timeSignatureEvents.Length,
                    "Invalid count of Time Signature events in new file.");

                MidiAsserts.AreEventsEqual(timeSignatureEvents[0], nonDefaultTimeSignatureEvent, false, "Invalid Time Signature event.");
            });
        }
Example #5
0
        public void AllEventTypesAreReadCorrectly(Func <Type, MidiEvent> createMidiEvent)
        {
            var events = TypesProvider.GetAllEventTypes()
                         .Where(t => !typeof(SystemCommonEvent).IsAssignableFrom(t) &&
                                !typeof(SystemRealTimeEvent).IsAssignableFrom(t) &&
                                t != typeof(EndOfTrackEvent) &&
                                t != typeof(UnknownMetaEvent))
                         .Select(createMidiEvent)
                         .ToArray();

            var midiFile = MidiFileTestUtilities.Read(
                new MidiFile(new TrackChunk(events)),
                null,
                new ReadingSettings {
                SilentNoteOnPolicy = SilentNoteOnPolicy.NoteOn
            },
                MidiFileFormat.SingleTrack);

            var readEvents = midiFile.GetEvents().ToArray();

            for (var i = 0; i < events.Length; i++)
            {
                var expectedEvent = events[i];
                var actualEvent   = readEvents[i];

                MidiAsserts.AreEventsEqual(expectedEvent, actualEvent, true, $"Event {i} is invalid.");
            }
        }
 private static void CompareEvents(MidiEvent expectedMidiEvent, MidiEvent actualMidiEvent)
 {
     MidiAsserts.AreEventsEqual(
         expectedMidiEvent,
         actualMidiEvent,
         false,
         "MIDI event read incorrectly.");
 }
Example #7
0
        public void Write_DeleteDefaultKeySignature_DeleteDefaultSetTempo()
        {
            var nonDefaultKeySignatureEvent = new KeySignatureEvent(-5, 1);
            var nonDefaultSetTempoEvent     = new SetTempoEvent(100000);

            var midiFile = new MidiFile(
                new TrackChunk(
                    new NoteOnEvent((SevenBitNumber)100, (SevenBitNumber)50),
                    new NoteOffEvent((SevenBitNumber)100, (SevenBitNumber)50),
                    new UnknownMetaEvent(254),
                    new KeySignatureEvent(),
                    nonDefaultKeySignatureEvent,
                    new SetTempoEvent(),
                    nonDefaultSetTempoEvent));

            Write(
                midiFile,
                settings =>
            {
                settings.DeleteDefaultKeySignature = true;
                settings.DeleteDefaultSetTempo     = true;
            },
                (fileInfo1, fileInfo2) =>
            {
                var originalMidiFile = MidiFile.Read(fileInfo1.FullName);
                var newMidiFile      = MidiFile.Read(fileInfo2.FullName);

                //

                Assert.AreEqual(
                    2,
                    originalMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <KeySignatureEvent>().Count(),
                    "Invalid count of Key Signature events in original file.");

                var keySignatureEvents = newMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <KeySignatureEvent>().ToArray();
                Assert.AreEqual(
                    1,
                    keySignatureEvents.Length,
                    "Invalid count of Key Signature events in new file.");

                MidiAsserts.AreEventsEqual(keySignatureEvents[0], nonDefaultKeySignatureEvent, false, "Invalid Key Signature event.");

                //

                Assert.AreEqual(
                    2,
                    originalMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <SetTempoEvent>().Count(),
                    "Invalid count of Set Tempo events in original file.");

                var setTempoEvents = newMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <SetTempoEvent>().ToArray();
                Assert.AreEqual(
                    1,
                    setTempoEvents.Length,
                    "Invalid count of Set Tempo events in new file.");

                MidiAsserts.AreEventsEqual(setTempoEvents[0], nonDefaultSetTempoEvent, false, "Invalid Set Tempo event.");
            });
        }
Example #8
0
        public void AllEventTypesAreReadCorrectly()
        {
            var events = TypesProvider.GetAllEventTypes()
                         .Where(t => !typeof(SystemCommonEvent).IsAssignableFrom(t) &&
                                !typeof(SystemRealTimeEvent).IsAssignableFrom(t) &&
                                t != typeof(EndOfTrackEvent) &&
                                t != typeof(UnknownMetaEvent))
                         .Select(t =>
            {
                var instance = (MidiEvent)Activator.CreateInstance(t);

                if (instance is SysExEvent sysExEvent)
                {
                    sysExEvent.Data = new byte[] { 1, 2, 3 }
                }
                ;

                if (instance is SequencerSpecificEvent sequencerSpecificEvent)
                {
                    sequencerSpecificEvent.Data = new byte[] { 1, 2, 3 }
                }
                ;

                if (instance is NoteOnEvent noteOnEvent)
                {
                    noteOnEvent.Velocity = (SevenBitNumber)100;
                }

                if (instance is BaseTextEvent baseTextEvent)
                {
                    baseTextEvent.Text = Guid.NewGuid().ToString();
                }

                return(instance);
            })
                         .ToArray();

            var midiFile   = MidiFileTestUtilities.Read(new MidiFile(new TrackChunk(events)), null, null, MidiFileFormat.SingleTrack);
            var readEvents = midiFile.GetEvents().ToArray();

            for (var i = 0; i < events.Length; i++)
            {
                var expectedEvent = events[i];
                var actualEvent   = readEvents[i];

                MidiAsserts.AreEventsEqual(expectedEvent, actualEvent, true, $"Event {i} is invalid.");
            }
        }
Example #9
0
        public void SendEvent(MidiEvent midiEvent)
        {
            using (var outputDevice = OutputDevice.GetByName(MidiDevicesNames.DeviceA))
            {
                MidiEvent eventSent = null;
                outputDevice.EventSent += (_, e) => eventSent = e.Event;

                string errorOnSend = null;
                outputDevice.ErrorOccurred += (_, e) => errorOnSend = e.Exception.Message;

                using (var inputDevice = InputDevice.GetByName(MidiDevicesNames.DeviceA))
                {
                    MidiEvent eventReceived = null;
                    inputDevice.EventReceived += (_, e) => eventReceived = e.Event;

                    string errorOnReceive = null;
                    inputDevice.ErrorOccurred += (_, e) => errorOnReceive = e.Exception.Message;

                    inputDevice.StartEventsListening();

                    outputDevice.PrepareForEventsSending();
                    outputDevice.SendEvent(midiEvent);

                    var timeout             = TimeSpan.FromMilliseconds(15);
                    var isEventSentReceived = SpinWait.SpinUntil(() => eventSent != null && eventReceived != null, timeout);

                    if (!isEventSentReceived)
                    {
                        if (errorOnSend != null)
                        {
                            Assert.Fail($"Failed to send event: {errorOnSend}");
                        }
                        else if (errorOnReceive != null)
                        {
                            Assert.Fail($"Failed to receive event: {errorOnReceive}");
                        }
                        else
                        {
                            Assert.Fail("Event either not sent ot not received.");
                        }
                    }

                    MidiAsserts.AreEventsEqual(midiEvent, eventSent, false, "Sent event is invalid.");
                    MidiAsserts.AreEventsEqual(eventSent, eventReceived, false, "Received event is invalid.");
                }
            }
        }
        private void CompareSentReceivedEvents(
            IReadOnlyList <SentEvent> sentEvents,
            IReadOnlyList <ReceivedEvent> receivedEvents,
            IReadOnlyList <TimeSpan> expectedTimes)
        {
            for (var i = 0; i < sentEvents.Count; i++)
            {
                var sentEvent     = sentEvents[i];
                var receivedEvent = receivedEvents[i];
                var expectedTime  = expectedTimes[i];

                MidiAsserts.AreEventsEqual(sentEvent.Event, receivedEvent.Event, false, $"Received event {receivedEvent.Event} doesn't match sent one {sentEvent.Event}.");

                var offsetFromExpectedTime = (sentEvent.Time - expectedTime).Duration();
                Assert.LessOrEqual(
                    offsetFromExpectedTime,
                    SendReceiveUtilities.MaximumEventSendReceiveDelay,
                    $"Event was sent at wrong time (at {sentEvent.Time} instead of {expectedTime}).");
            }
        }
        private void CompareReceivedEvents(
            IReadOnlyList <ReceivedEvent> receivedEvents,
            IReadOnlyList <ReceivedEvent> expectedReceivedEvents)
        {
            Assert.AreEqual(expectedReceivedEvents.Count, receivedEvents.Count, "Received events count is invalid.");

            for (var i = 0; i < receivedEvents.Count; i++)
            {
                var receivedEvent         = receivedEvents[i];
                var expectedReceivedEvent = expectedReceivedEvents[i];

                MidiAsserts.AreEventsEqual(expectedReceivedEvent.Event, receivedEvent.Event, false, $"Received event {receivedEvent.Event} doesn't match expected one {expectedReceivedEvent.Event}.");

                var expectedTime           = expectedReceivedEvent.Time;
                var offsetFromExpectedTime = (receivedEvent.Time - expectedTime).Duration();
                Assert.LessOrEqual(
                    offsetFromExpectedTime,
                    SendReceiveUtilities.MaximumEventSendReceiveDelay,
                    $"Event was received at wrong time (at {receivedEvent.Time} instead of {expectedTime}).");
            }
        }
        public static void CompareSentReceivedEvents(
            IReadOnlyList <EventToSend> eventsToSend,
            IReadOnlyList <SentEvent> sentEvents,
            IReadOnlyList <ReceivedEvent> receivedEvents,
            TimeSpan maximumEventSendReceiveDelay)
        {
            for (var i = 0; i < sentEvents.Count; i++)
            {
                var eventToSend   = eventsToSend[i];
                var sentEvent     = sentEvents[i];
                var receivedEvent = receivedEvents[i];

                MidiAsserts.AreEventsEqual(sentEvent.Event, eventToSend.Event, false, $"Sent event ({sentEvent.Event}) doesn't match the one that should be sent ({eventToSend.Event}).");
                MidiAsserts.AreEventsEqual(sentEvent.Event, receivedEvent.Event, false, $"Received event ({receivedEvent.Event}) doesn't match the sent one ({sentEvent.Event}).");

                var delay = (receivedEvent.Time - sentEvent.Time).Duration();
                Assert.LessOrEqual(
                    delay,
                    maximumEventSendReceiveDelay,
                    $"Event was received too late (at {receivedEvent.Time} instead of {sentEvent.Time}). Delay is too big.");
            }
        }