- 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. 19
      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.Controls.Interfaces;
using Lib.Audio.Interfaces; using Lib.Audio.Interfaces;
using Lib.Driver.Xml; using Lib.Driver.Xml;
using Lib.Midi.Interfaces;
using Lib.Midi.Messages;
using Lib.Midi.Messages.Interfaces;
namespace Lib.Audio namespace Lib.Audio
{ {
@ -16,17 +19,18 @@ namespace Lib.Audio
{ {
private readonly int _channelNumber; private readonly int _channelNumber;
public Channel(int channelNumber, private IMidiMessage? _acknowledgeMessage;
XmlChannel xmlChannel,
public Channel(XmlChannel xmlChannel,
IFaderFactory faderFactory, IFaderFactory faderFactory,
IKnobFactory knobFactory, IKnobFactory knobFactory,
IButtonFactory buttonFactory) IButtonFactory buttonFactory)
{ {
_channelNumber = channelNumber; _channelNumber = xmlChannel.ChannelNumber;
if (xmlChannel.Fader != null) if (xmlChannel.Fader != null)
{ {
Fader = faderFactory.Create(); Fader = faderFactory.Create(xmlChannel.Fader);
Fader.PositionChanged += OnFaderPositionChanged; Fader.PositionChanged += OnFaderPositionChanged;
} }
@ -47,6 +51,37 @@ namespace Lib.Audio
public IControllable? Controllable { get; private set; } public IControllable? Controllable { get; private set; }
public void AllocateControllable(IControllable controllable) => Controllable = controllable; 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); private void OnFaderPositionChanged(object? sender, float position) => Controllable?.SetVolume(position);
public override string ToString() => $"Channel {_channelNumber}"; public override string ToString() => $"Channel {_channelNumber}";

@ -9,7 +9,6 @@ using Lib.Audio.Interfaces;
using Lib.Driver.Interfaces; using Lib.Driver.Interfaces;
using Lib.Midi.Factories; using Lib.Midi.Factories;
using Lib.Midi.Interfaces; using Lib.Midi.Interfaces;
using Lib.Midi.Messages;
using Lib.Midi.Messages.Interfaces; using Lib.Midi.Messages.Interfaces;
namespace Lib.Audio namespace Lib.Audio
@ -35,24 +34,14 @@ namespace Lib.Audio
public string Name => _driver.Name ?? ""; public string Name => _driver.Name ?? "";
public List<IChannel> Channels { get; } public List<IChannel> Channels { get; }
public void StartCommunication() public void StartCommunication(bool useMidiView) => _midiCommunication.Open(useMidiView);
{
_midiCommunication.Open();
// _midiCommunication.Send(new PitchWheelChangeMessage(5000, 1, 600));
_midiCommunication.Send(new ControlChangeMessage(0, 1, 127));
}
private List<IChannel> InitializeChannels() => _driver.Channels == null ? new List<IChannel>() 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) private void OnMidiCommunicationMessageReceived(object? sender, IMidiMessage message)
{ {
int i = 0; Channels[message.ChannelNumber - 1].HandleMessage(message);
if (message is PitchWheelChangeMessage) Channels[message.ChannelNumber - 1].SendAcknowledge(_midiCommunication);
{
i = 1;
_midiCommunication.Send(message);
}
} }
private void OnMidiCommunicationErrorReceived(object? sender, IMidiMessage message) private void OnMidiCommunicationErrorReceived(object? sender, IMidiMessage message)

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

@ -5,6 +5,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using Lib.Audio.Controls.Buttons.Interfaces; using Lib.Audio.Controls.Buttons.Interfaces;
using Lib.Audio.Controls.Interfaces; using Lib.Audio.Controls.Interfaces;
using Lib.Midi.Interfaces;
using Lib.Midi.Messages.Interfaces;
namespace Lib.Audio.Interfaces namespace Lib.Audio.Interfaces
{ {
@ -17,5 +19,7 @@ namespace Lib.Audio.Interfaces
IControllable? Controllable { get; } IControllable? Controllable { get; }
void AllocateControllable(IControllable controllable); void AllocateControllable(IControllable controllable);
void HandleMessage(IMidiMessage message);
void SendAcknowledge(IMidiCommunication midiCommunication);
} }
} }

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