diff --git a/Lib.Audio/Channel.cs b/Lib.Audio/Channel.cs index 303c7cc..325089c 100644 --- a/Lib.Audio/Channel.cs +++ b/Lib.Audio/Channel.cs @@ -9,6 +9,9 @@ using Lib.Audio.Controls.Factories; using Lib.Audio.Controls.Interfaces; using Lib.Audio.Interfaces; using Lib.Driver.Xml; +using Lib.Midi.Interfaces; +using Lib.Midi.Messages; +using Lib.Midi.Messages.Interfaces; namespace Lib.Audio { @@ -16,17 +19,18 @@ namespace Lib.Audio { private readonly int _channelNumber; - public Channel(int channelNumber, - XmlChannel xmlChannel, + private IMidiMessage? _acknowledgeMessage; + + public Channel(XmlChannel xmlChannel, IFaderFactory faderFactory, IKnobFactory knobFactory, IButtonFactory buttonFactory) { - _channelNumber = channelNumber; + _channelNumber = xmlChannel.ChannelNumber; if (xmlChannel.Fader != null) { - Fader = faderFactory.Create(); + Fader = faderFactory.Create(xmlChannel.Fader); Fader.PositionChanged += OnFaderPositionChanged; } @@ -47,6 +51,37 @@ namespace Lib.Audio public IControllable? Controllable { get; private set; } public void AllocateControllable(IControllable controllable) => Controllable = controllable; + public void HandleMessage(IMidiMessage message) + { + if (message is NoteOnMessage noteOnMessage) + { + if (Fader?.NoteNumber == noteOnMessage.NoteNumber) + Fader.IsTouched = true; + } + else if (message is NoteMessage noteMessage) + { + if (Fader?.NoteNumber == noteMessage.NoteNumber) + { + Fader.IsTouched = false; + _acknowledgeMessage = new PitchWheelChangeMessage(0, _channelNumber, Fader.Position); + } + } + else if (message is PitchWheelChangeMessage pitchWheelChangeMessage) + { + if (Fader != null) + Fader.Position = pitchWheelChangeMessage.Pitch; + } + } + + public void SendAcknowledge(IMidiCommunication midiCommunication) + { + if (_acknowledgeMessage == null) + return; + + midiCommunication.Send(_acknowledgeMessage); + _acknowledgeMessage = null; + } + private void OnFaderPositionChanged(object? sender, float position) => Controllable?.SetVolume(position); public override string ToString() => $"Channel {_channelNumber}"; diff --git a/Lib.Audio/Device.cs b/Lib.Audio/Device.cs index d4d9fed..c165eea 100644 --- a/Lib.Audio/Device.cs +++ b/Lib.Audio/Device.cs @@ -9,7 +9,6 @@ using Lib.Audio.Interfaces; using Lib.Driver.Interfaces; using Lib.Midi.Factories; using Lib.Midi.Interfaces; -using Lib.Midi.Messages; using Lib.Midi.Messages.Interfaces; namespace Lib.Audio @@ -35,26 +34,16 @@ namespace Lib.Audio public string Name => _driver.Name ?? ""; public List Channels { get; } - public void StartCommunication() - { - _midiCommunication.Open(); - // _midiCommunication.Send(new PitchWheelChangeMessage(5000, 1, 600)); - _midiCommunication.Send(new ControlChangeMessage(0, 1, 127)); - } - + public void StartCommunication(bool useMidiView) => _midiCommunication.Open(useMidiView); private List InitializeChannels() => _driver.Channels == null ? new List() - : _driver.Channels.Select(c => _channelFactory.Create(_driver.Channels.IndexOf(c), c)).ToList(); + : _driver.Channels.Select(c => _channelFactory.Create(c)).ToList(); private void OnMidiCommunicationMessageReceived(object? sender, IMidiMessage message) { - int i = 0; - if (message is PitchWheelChangeMessage) - { - i = 1; - _midiCommunication.Send(message); - } + Channels[message.ChannelNumber - 1].HandleMessage(message); + Channels[message.ChannelNumber - 1].SendAcknowledge(_midiCommunication); } - + private void OnMidiCommunicationErrorReceived(object? sender, IMidiMessage message) { int i = 0; diff --git a/Lib.Audio/Factories/IChannelFactory.cs b/Lib.Audio/Factories/IChannelFactory.cs index 7b00b53..817f3a3 100644 --- a/Lib.Audio/Factories/IChannelFactory.cs +++ b/Lib.Audio/Factories/IChannelFactory.cs @@ -9,6 +9,6 @@ namespace Lib.Audio.Factories { public interface IChannelFactory { - IChannel Create(int channelNumber, XmlChannel xmlChannel); + IChannel Create(XmlChannel xmlChannel); } } \ No newline at end of file diff --git a/Lib.Audio/Interfaces/IChannel.cs b/Lib.Audio/Interfaces/IChannel.cs index c3e465c..a7dff6f 100644 --- a/Lib.Audio/Interfaces/IChannel.cs +++ b/Lib.Audio/Interfaces/IChannel.cs @@ -5,6 +5,8 @@ using System.Collections.Generic; using Lib.Audio.Controls.Buttons.Interfaces; using Lib.Audio.Controls.Interfaces; +using Lib.Midi.Interfaces; +using Lib.Midi.Messages.Interfaces; namespace Lib.Audio.Interfaces { @@ -17,5 +19,7 @@ namespace Lib.Audio.Interfaces IControllable? Controllable { get; } void AllocateControllable(IControllable controllable); + void HandleMessage(IMidiMessage message); + void SendAcknowledge(IMidiCommunication midiCommunication); } } \ No newline at end of file diff --git a/Lib.Audio/Interfaces/IDevice.cs b/Lib.Audio/Interfaces/IDevice.cs index 19e1d8d..eefb24c 100644 --- a/Lib.Audio/Interfaces/IDevice.cs +++ b/Lib.Audio/Interfaces/IDevice.cs @@ -11,6 +11,6 @@ namespace Lib.Audio.Interfaces string Name { get; } List Channels { get; } - void StartCommunication(); + void StartCommunication(bool useMidiView); } } \ No newline at end of file