- add handle and acknowledge message methods

- channel number is initialized from driver now
- add possibility to use midi view
master
Simon G 5 years ago
parent 629be75e44
commit 1c94786581
  1. 43
      Lib.Audio/Channel.cs
  2. 21
      Lib.Audio/Device.cs
  3. 2
      Lib.Audio/Factories/IChannelFactory.cs
  4. 4
      Lib.Audio/Interfaces/IChannel.cs
  5. 2
      Lib.Audio/Interfaces/IDevice.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}";

@ -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<IChannel> 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<IChannel> InitializeChannels() => _driver.Channels == null ? new List<IChannel>()
: _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;

@ -9,6 +9,6 @@ namespace Lib.Audio.Factories
{
public interface IChannelFactory
{
IChannel Create(int channelNumber, XmlChannel xmlChannel);
IChannel Create(XmlChannel xmlChannel);
}
}

@ -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);
}
}

@ -11,6 +11,6 @@ namespace Lib.Audio.Interfaces
string Name { get; }
List<IChannel> Channels { get; }
void StartCommunication();
void StartCommunication(bool useMidiView);
}
}
Loading…
Cancel
Save