Cross Platform Application to allow control with a MIDI controller
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
2.3 KiB

// Author: Gockner, Simon
// Created: 2021-04-07
// Copyright(c) 2021 SimonG. All Rights Reserved.
using System.Collections.Generic;
using System.Linq;
using Lib.Audio.Factories;
using Lib.Audio.Interfaces;
using Lib.Driver.Interfaces;
using Lib.Logging;
using Lib.Midi.Factories;
using Lib.Midi.Interfaces;
using Lib.Midi.Messages.Interfaces;
namespace Lib.Audio
{
public class Device : IDevice
{
private readonly IDriver _driver;
private readonly IMidiCommunication _midiCommunication;
private readonly IChannelFactory _channelFactory;
public Device(IDriver driver, IControllableCollector controllableCollector, IMidiCommunicationFactory midiCommunicationFactory, IChannelFactory channelFactory)
{
_driver = driver;
_midiCommunication = midiCommunicationFactory.Create(driver);
_channelFactory = channelFactory;
Channels = InitializeChannels(controllableCollector);
_midiCommunication.MessageReceived += OnMidiCommunicationMessageReceived;
_midiCommunication.ErrorReceived += OnMidiCommunicationErrorReceived;
}
public string Name => _driver.Name ?? "";
public List<IChannel> Channels { get; }
public void StartCommunication(bool useMidiView) => _midiCommunication.Open(useMidiView);
public void StopCommunication() => _midiCommunication.Close();
private List<IChannel> InitializeChannels(IControllableCollector controllableCollector) => _driver.Channels == null ? new List<IChannel>()
: _driver.Channels.Select(c => _channelFactory.Create(c, controllableCollector, _midiCommunication)).ToList();
private void OnMidiCommunicationMessageReceived(object? sender, IMidiMessage message)
{
IChannel channel = Channels.First(c => c.ChannelNumber == message.ChannelNumber);
channel.HandleMessage(message);
channel.SendAcknowledge();
}
private void OnMidiCommunicationErrorReceived(object? sender, IMidiMessage message) =>
Log.Write<Device>($"Midi Error: Message type: {message.GetType()}, Channel: {message.ChannelNumber}, RawMessage: {message.RawMessage}");
public void Dispose()
{
Channels.ForEach(c => c.Dispose());
_midiCommunication.Close();
}
}
}