public void SaveRecordingToFile() { var tempoMap = TempoMap.Default; var eventsToSend = new[] { new EventToSend(new NoteOnEvent(), TimeSpan.Zero), new EventToSend(new NoteOffEvent(), TimeSpan.FromMilliseconds(500)), new EventToSend(new ProgramChangeEvent((SevenBitNumber)40), TimeSpan.FromSeconds(5)), new EventToSend(new ActiveSensingEvent(), TimeSpan.FromMilliseconds(100)), new EventToSend(new ProgramChangeEvent((SevenBitNumber)50), TimeSpan.FromMilliseconds(500)), }; using (var outputDevice = OutputDevice.GetByName(SendReceiveUtilities.DeviceToTestOnName)) { SendReceiveUtilities.WarmUpDevice(outputDevice); using (var inputDevice = InputDevice.GetByName(SendReceiveUtilities.DeviceToTestOnName)) { var receivedEventsNumber = 0; inputDevice.StartEventsListening(); inputDevice.EventReceived += (_, __) => receivedEventsNumber++; using (var recording = new Recording(tempoMap, inputDevice)) { var sendingThread = new Thread(() => { SendReceiveUtilities.SendEvents(eventsToSend, outputDevice); }); recording.Start(); sendingThread.Start(); SpinWait.SpinUntil(() => !sendingThread.IsAlive && receivedEventsNumber == eventsToSend.Length); recording.Stop(); var midiFile = recording.ToFile(); var timedEvents = midiFile.GetTimedEvents(); var expectedEvents = new[] { new TimedEvent(new NoteOnEvent(), TimeConverter.ConvertFrom((MetricTimeSpan)TimeSpan.Zero, tempoMap)), new TimedEvent(new NoteOffEvent(), TimeConverter.ConvertFrom((MetricTimeSpan)TimeSpan.FromMilliseconds(500), tempoMap)), new TimedEvent(new ProgramChangeEvent((SevenBitNumber)40), TimeConverter.ConvertFrom((MetricTimeSpan)TimeSpan.FromSeconds(5.5), tempoMap)), new TimedEvent(new ProgramChangeEvent((SevenBitNumber)50), TimeConverter.ConvertFrom((MetricTimeSpan)TimeSpan.FromSeconds(6.1), tempoMap)) }; Assert.IsTrue( TimedEventEquality.AreEqual(expectedEvents, timedEvents, false, 10), "Timed events saved incorrectly."); } } } }
private static void CheckEventsReceiving(IReadOnlyList <EventToSend> eventsToSend) { var receivedEventsB = new List <ReceivedEvent>(); var receivedEventsC = new List <ReceivedEvent>(); var sentEvents = new List <SentEvent>(); var stopwatch = new Stopwatch(); using (var outputA = OutputDevice.GetByName(MidiDevicesNames.DeviceA)) { SendReceiveUtilities.WarmUpDevice(outputA); outputA.EventSent += (_, e) => sentEvents.Add(new SentEvent(e.Event, stopwatch.Elapsed)); using (var inputB = InputDevice.GetByName(MidiDevicesNames.DeviceB)) using (var inputC = InputDevice.GetByName(MidiDevicesNames.DeviceC)) { inputB.EventReceived += (_, e) => receivedEventsB.Add(new ReceivedEvent(e.Event, stopwatch.Elapsed)); inputB.StartEventsListening(); inputC.EventReceived += (_, e) => receivedEventsC.Add(new ReceivedEvent(e.Event, stopwatch.Elapsed)); inputC.StartEventsListening(); using (var inputA = InputDevice.GetByName(MidiDevicesNames.DeviceA)) { inputA.StartEventsListening(); using (var outputB = OutputDevice.GetByName(MidiDevicesNames.DeviceB)) using (var outputC = OutputDevice.GetByName(MidiDevicesNames.DeviceC)) { var devicesConnector = inputA.Connect(outputB, outputC); Assert.IsTrue(devicesConnector.AreDevicesConnected, "Devices aren't connected."); stopwatch.Start(); SendReceiveUtilities.SendEvents(eventsToSend, outputA); stopwatch.Stop(); var timeout = TimeSpan.FromTicks(eventsToSend.Sum(e => e.Delay.Ticks)) + SendReceiveUtilities.MaximumEventSendReceiveDelay; var areEventsReceived = SpinWait.SpinUntil( () => receivedEventsB.Count == eventsToSend.Count && receivedEventsC.Count == eventsToSend.Count, timeout); Assert.IsTrue(areEventsReceived, $"Events are not received for timeout {timeout}."); devicesConnector.Disconnect(); Assert.IsFalse(devicesConnector.AreDevicesConnected, "Devices aren't disconnected."); } } } } SendReceiveUtilities.CompareSentReceivedEvents(eventsToSend, sentEvents, receivedEventsB, MaximumEventSendReceiveDelay); SendReceiveUtilities.CompareSentReceivedEvents(eventsToSend, sentEvents, receivedEventsC, MaximumEventSendReceiveDelay); }
public void CheckMidiTimeCodeEventReceiving() { MidiTimeCode midiTimeCodeReceived = null; var eventsToSend = new[] { new EventToSend(new ProgramChangeEvent((SevenBitNumber)100), TimeSpan.FromMilliseconds(500)), new EventToSend(new MidiTimeCodeEvent(MidiTimeCodeComponent.FramesLsb, (FourBitNumber)1), TimeSpan.FromSeconds(1)), new EventToSend(new ProgramChangeEvent((SevenBitNumber)70), TimeSpan.FromMilliseconds(500)), new EventToSend(new MidiTimeCodeEvent(MidiTimeCodeComponent.FramesMsb, (FourBitNumber)1), TimeSpan.FromSeconds(2)), new EventToSend(new MidiTimeCodeEvent(MidiTimeCodeComponent.HoursLsb, (FourBitNumber)7), TimeSpan.FromSeconds(1)), new EventToSend(new MidiTimeCodeEvent(MidiTimeCodeComponent.HoursMsbAndTimeCodeType, (FourBitNumber)7), TimeSpan.FromSeconds(2)), new EventToSend(new ProgramChangeEvent((SevenBitNumber)80), TimeSpan.FromMilliseconds(500)), new EventToSend(new MidiTimeCodeEvent(MidiTimeCodeComponent.MinutesLsb, (FourBitNumber)10), TimeSpan.FromSeconds(1)), new EventToSend(new ProgramChangeEvent((SevenBitNumber)10), TimeSpan.FromMilliseconds(500)), new EventToSend(new ProgramChangeEvent((SevenBitNumber)15), TimeSpan.FromMilliseconds(500)), new EventToSend(new MidiTimeCodeEvent(MidiTimeCodeComponent.MinutesMsb, (FourBitNumber)2), TimeSpan.FromSeconds(2)), new EventToSend(new MidiTimeCodeEvent(MidiTimeCodeComponent.SecondsLsb, (FourBitNumber)10), TimeSpan.FromSeconds(1)), new EventToSend(new ProgramChangeEvent((SevenBitNumber)40), TimeSpan.FromMilliseconds(500)), new EventToSend(new MidiTimeCodeEvent(MidiTimeCodeComponent.SecondsMsb, (FourBitNumber)1), TimeSpan.FromSeconds(2)) }; using (var outputDevice = OutputDevice.GetByName(MidiDevicesNames.DeviceA)) using (var inputDevice = InputDevice.GetByName(MidiDevicesNames.DeviceA)) { inputDevice.MidiTimeCodeReceived += (_, e) => midiTimeCodeReceived = new MidiTimeCode(e.Format, e.Hours, e.Minutes, e.Seconds, e.Frames); inputDevice.StartEventsListening(); SendReceiveUtilities.SendEvents(eventsToSend, outputDevice); var timeout = TimeSpan.FromTicks(eventsToSend.Sum(e => e.Delay.Ticks)) + SendReceiveUtilities.MaximumEventSendReceiveDelay; var isMidiTimeCodeReceived = SpinWait.SpinUntil(() => midiTimeCodeReceived != null, timeout); Assert.IsTrue(isMidiTimeCodeReceived, $"MIDI time code received for timeout {timeout}."); inputDevice.StopEventsListening(); } Assert.AreEqual(MidiTimeCodeType.Thirty, midiTimeCodeReceived.Format, "Format is invalid."); Assert.AreEqual(23, midiTimeCodeReceived.Hours, "Hours number is invalid."); Assert.AreEqual(42, midiTimeCodeReceived.Minutes, "Minutes number is invalid."); Assert.AreEqual(26, midiTimeCodeReceived.Seconds, "Seconds number is invalid."); Assert.AreEqual(17, midiTimeCodeReceived.Frames, "Frames number is invalid."); }
public void GetDuration(TimeSpan start, TimeSpan delayFromStart) { var eventsToSend = new[] { new EventToSend(new NoteOnEvent(), start), new EventToSend(new NoteOffEvent(), delayFromStart) }; var receivedEvents = new List <ReceivedEvent>(); var stopwatch = new Stopwatch(); using (var outputDevice = OutputDevice.GetByName(SendReceiveUtilities.DeviceToTestOnName)) { SendReceiveUtilities.WarmUpDevice(outputDevice); using (var inputDevice = InputDevice.GetByName(SendReceiveUtilities.DeviceToTestOnName)) { inputDevice.StartEventsListening(); inputDevice.EventReceived += (_, e) => receivedEvents.Add(new ReceivedEvent(e.Event, stopwatch.Elapsed)); using (var recording = new Recording(TempoMap.Default, inputDevice)) { recording.Start(); stopwatch.Start(); SendReceiveUtilities.SendEvents(eventsToSend, outputDevice); var timeout = start + delayFromStart + SendReceiveUtilities.MaximumEventSendReceiveDelay; var areEventsReceived = SpinWait.SpinUntil(() => receivedEvents.Count == eventsToSend.Length, timeout); Assert.IsTrue(areEventsReceived, $"Events are not received for timeout {timeout}."); recording.Stop(); Assert.IsFalse(recording.IsRunning, "Recording is running after stop."); TimeSpan duration = recording.GetDuration <MetricTimeSpan>(); Assert.IsTrue( AreTimeSpansEqual(duration, start + delayFromStart), $"Duration is invalid. Actual is {duration}. Expected is {start + delayFromStart}."); } } } }
public void PlayRecordedData() { var tempoMap = TempoMap.Default; var eventsToSend = new[] { new EventToSend(new NoteOnEvent(), TimeSpan.Zero), new EventToSend(new NoteOffEvent(), TimeSpan.FromMilliseconds(500)), new EventToSend(new ProgramChangeEvent((SevenBitNumber)40), TimeSpan.FromSeconds(5)) }; MidiFile recordedFile = null; using (var outputDevice = OutputDevice.GetByName(SendReceiveUtilities.DeviceToTestOnName)) { SendReceiveUtilities.WarmUpDevice(outputDevice); using (var inputDevice = InputDevice.GetByName(SendReceiveUtilities.DeviceToTestOnName)) { var receivedEventsNumber = 0; inputDevice.StartEventsListening(); inputDevice.EventReceived += (_, __) => receivedEventsNumber++; using (var recording = new Recording(tempoMap, inputDevice)) { var sendingThread = new Thread(() => { SendReceiveUtilities.SendEvents(eventsToSend, outputDevice); }); recording.Start(); sendingThread.Start(); SpinWait.SpinUntil(() => !sendingThread.IsAlive && receivedEventsNumber == eventsToSend.Length); recording.Stop(); recordedFile = recording.ToFile(); } } } CheckPlayback( eventsToSend, 1.0, beforePlaybackStarted: NoPlaybackAction, startPlayback: (context, playback) => playback.Start(), afterPlaybackStarted: NoPlaybackAction, waiting: (context, playback) => { var timeout = context.ExpectedTimes.Last() + SendReceiveUtilities.MaximumEventSendReceiveDelay; var areEventsReceived = SpinWait.SpinUntil(() => context.ReceivedEvents.Count == eventsToSend.Length, timeout); Assert.IsTrue(areEventsReceived, $"Events are not received for timeout {timeout}."); }, finalChecks: (context, playback) => { var playbackStopped = SpinWait.SpinUntil(() => !playback.IsRunning, SendReceiveUtilities.MaximumEventSendReceiveDelay); Assert.IsTrue(playbackStopped, "Playback is running after completed."); }, createPlayback: (outputDevice, clockSettings) => recordedFile.GetPlayback(outputDevice, clockSettings)); }
public void CheckRecording() { var tempoMap = TempoMap.Default; var stopAfter = TimeSpan.FromSeconds(1); var stopPeriod = TimeSpan.FromSeconds(2); var eventsToSend = new[] { new EventToSend(new NoteOnEvent(), TimeSpan.Zero), new EventToSend(new NoteOffEvent(), TimeSpan.FromMilliseconds(500)), new EventToSend(new TimingClockEvent(), TimeSpan.FromSeconds(5)) }; var sentEvents = new List <SentEvent>(); var receivedEvents = new List <ReceivedEvent>(); var stopwatch = new Stopwatch(); var expectedTimes = new List <TimeSpan>(); var expectedRecordedTimes = new List <TimeSpan>(); var currentTime = TimeSpan.Zero; foreach (var eventToSend in eventsToSend) { currentTime += eventToSend.Delay; expectedTimes.Add(currentTime); expectedRecordedTimes.Add(currentTime > stopAfter ? currentTime - stopPeriod : currentTime); } using (var outputDevice = OutputDevice.GetByName(SendReceiveUtilities.DeviceToTestOnName)) { SendReceiveUtilities.WarmUpDevice(outputDevice); outputDevice.EventSent += (_, e) => sentEvents.Add(new SentEvent(e.Event, stopwatch.Elapsed)); using (var inputDevice = InputDevice.GetByName(SendReceiveUtilities.DeviceToTestOnName)) { inputDevice.StartEventsListening(); inputDevice.EventReceived += (_, e) => receivedEvents.Add(new ReceivedEvent(e.Event, stopwatch.Elapsed)); using (var recording = new Recording(tempoMap, inputDevice)) { var sendingThread = new Thread(() => { SendReceiveUtilities.SendEvents(eventsToSend, outputDevice); }); stopwatch.Start(); recording.Start(); sendingThread.Start(); Thread.Sleep(stopAfter); recording.Stop(); Thread.Sleep(stopPeriod); recording.Start(); var timeout = expectedTimes.Last() + SendReceiveUtilities.MaximumEventSendReceiveDelay; var areEventsReceived = SpinWait.SpinUntil(() => receivedEvents.Count == expectedTimes.Count, timeout); Assert.IsTrue(areEventsReceived, $"Events are not received for timeout {timeout}."); CompareSentReceivedEvents(sentEvents, receivedEvents, expectedTimes); var recordedEvents = recording.GetEvents(); CheckRecordedEvents(recordedEvents, expectedRecordedTimes, tempoMap); } } } }