- add possibility to use midi view

master
Simon G 5 years ago
parent bce47735c5
commit 64eda82e79
  1. 2
      Lib.Midi/Interfaces/IMidiCommunication.cs
  2. 39
      Lib.Midi/MidiCommunication.cs
  3. 12
      Lib.Midi/MidiView.cs

@ -9,7 +9,7 @@ namespace Lib.Midi.Interfaces
{ {
public interface IMidiCommunication public interface IMidiCommunication
{ {
void Open(); void Open(bool useMidiView);
void Close(); void Close();
void Send(IMidiMessage message); void Send(IMidiMessage message);

@ -15,19 +15,16 @@ namespace Lib.Midi
{ {
public class MidiCommunication : IMidiCommunication public class MidiCommunication : IMidiCommunication
{ {
private readonly IDriver _driver;
private readonly IMidiMessageFactory _midiMessageFactory; private readonly IMidiMessageFactory _midiMessageFactory;
private readonly MidiIn _midiIn;
private readonly MidiOut _midiOut; private MidiIn? _midiIn;
private MidiOut? _midiOut;
public MidiCommunication(IDriver driver, IMidiMessageFactory midiMessageFactory) public MidiCommunication(IDriver driver, IMidiMessageFactory midiMessageFactory)
{ {
_driver = driver;
_midiMessageFactory = midiMessageFactory; _midiMessageFactory = midiMessageFactory;
var midiInput = MidiInputs.FirstOrDefault(i => i.midiInCapabilities.ProductId == driver.ProductId);
var midiOutput = MidiOutputs.FirstOrDefault(o => o.midiOutCapabilities.ProductId == driver.ProductId);
_midiIn = new MidiIn(midiInput.index);
_midiOut = new MidiOut(midiOutput.index);
} }
private IEnumerable<(MidiInCapabilities midiInCapabilities, int index)> MidiInputs private IEnumerable<(MidiInCapabilities midiInCapabilities, int index)> MidiInputs
@ -48,8 +45,17 @@ namespace Lib.Midi
} }
} }
public void Open() public void Open(bool useMidiView)
{ {
int inputProductId = useMidiView ? MidiView.INPUT_PRODUCT_ID : _driver.InputProductId;
int outputProductId = useMidiView ? MidiView.OUTPUT_PRODUCT_ID : _driver.OutputProductId;
var midiInput = MidiInputs.FirstOrDefault(i => i.midiInCapabilities.ProductId == inputProductId);
var midiOutput = MidiOutputs.FirstOrDefault(o => o.midiOutCapabilities.ProductId == outputProductId);
_midiIn = new MidiIn(midiInput.index);
_midiOut = new MidiOut(midiOutput.index);
_midiIn.MessageReceived += OnMidiInMessageReceived; _midiIn.MessageReceived += OnMidiInMessageReceived;
_midiIn.ErrorReceived += OnMidiInErrorReceived; _midiIn.ErrorReceived += OnMidiInErrorReceived;
_midiIn.Start(); _midiIn.Start();
@ -57,15 +63,18 @@ namespace Lib.Midi
public void Close() public void Close()
{ {
_midiIn.Stop(); if (_midiIn != null)
_midiIn.MessageReceived -= OnMidiInMessageReceived; {
_midiIn.ErrorReceived -= OnMidiInErrorReceived; _midiIn.Stop();
_midiIn.MessageReceived -= OnMidiInMessageReceived;
_midiIn.ErrorReceived -= OnMidiInErrorReceived;
_midiIn.Close();
}
_midiIn.Close(); _midiOut?.Close();
_midiOut.Close();
} }
public void Send(IMidiMessage message) => _midiOut.Send(message.RawMessage); public void Send(IMidiMessage message) => _midiOut?.Send(message.RawMessage);
private void OnMidiInMessageReceived(object? sender, MidiInMessageEventArgs args) => MessageReceived?.Invoke(this, _midiMessageFactory.Create(args)); 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)); private void OnMidiInErrorReceived(object? sender, MidiInMessageEventArgs args) => ErrorReceived?.Invoke(this, _midiMessageFactory.Create(args));

@ -0,0 +1,12 @@
// Author: Simon Gockner
// Created: 2021-04-10
// Copyright(c) 2021 SimonG. All Rights Reserved.
namespace Lib.Midi
{
public class MidiView
{
public const int INPUT_PRODUCT_ID = 103;
public const int OUTPUT_PRODUCT_ID = 102;
}
}
Loading…
Cancel
Save