// Author: Gockner, Simon // Created: 2021-04-09 // Copyright(c) 2021 SimonG. All Rights Reserved. using System; using Lib.Midi.Interfaces; using Lib.Midi.Messages.Factories; using Lib.Midi.Messages.Interfaces; using NAudio.Midi; namespace Lib.Midi { public class MidiCommunication : IMidiCommunication { private readonly IMidiMessageFactory _midiMessageFactory; private readonly MidiIn _midiIn; private readonly MidiOut _midiOut; public MidiCommunication(IMidiMessageFactory midiMessageFactory) { _midiMessageFactory = midiMessageFactory; _midiIn = new MidiIn(0); //TODO: don't always use device 0? _midiOut = new MidiOut(0); } public void Open() { _midiIn.MessageReceived += OnMidiInMessageReceived; _midiIn.ErrorReceived += OnMidiInErrorReceived; _midiIn.Start(); } public void Close() { _midiIn.Stop(); _midiIn.MessageReceived -= OnMidiInMessageReceived; _midiIn.ErrorReceived -= OnMidiInErrorReceived; _midiIn.Close(); _midiOut.Close(); } public void Send(IMidiMessage message) => _midiOut.Send(message.RawMessage); private void OnMidiInMessageReceived(object? sender, MidiInMessageEventArgs args) => MessageReceived?.Invoke(this, _midiMessageFactory.Create(args)); private void OnMidiInErrorReceived(object? sender, MidiInMessageEventArgs args) => ErrorReceived?.Invoke(this, _midiMessageFactory.Create(args)); public event EventHandler? MessageReceived; public event EventHandler? ErrorReceived; } }