|
|
|
@ -5,6 +5,7 @@ |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Linq; |
|
|
|
using Lib.Audio.Controls; |
|
|
|
using Lib.Audio.Controls; |
|
|
|
|
|
|
|
using Lib.Audio.Controls.Buttons; |
|
|
|
using Lib.Audio.Controls.Buttons.Factories; |
|
|
|
using Lib.Audio.Controls.Buttons.Factories; |
|
|
|
using Lib.Audio.Controls.Buttons.Interfaces; |
|
|
|
using Lib.Audio.Controls.Buttons.Interfaces; |
|
|
|
using Lib.Audio.Controls.Factories; |
|
|
|
using Lib.Audio.Controls.Factories; |
|
|
|
@ -50,9 +51,9 @@ namespace Lib.Audio |
|
|
|
if (xmlChannel.Knob != null) |
|
|
|
if (xmlChannel.Knob != null) |
|
|
|
Knob = knobFactory.Create(); |
|
|
|
Knob = knobFactory.Create(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Buttons = new List<IButton>(); |
|
|
|
if (xmlChannel.Buttons != null) |
|
|
|
if (xmlChannel.Buttons != null) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Buttons = new List<IButton>(); |
|
|
|
|
|
|
|
foreach (var button in xmlChannel.Buttons) |
|
|
|
foreach (var button in xmlChannel.Buttons) |
|
|
|
Buttons.Add(buttonFactory.Create(button, _channelNumber)); |
|
|
|
Buttons.Add(buttonFactory.Create(button, _channelNumber)); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -63,16 +64,19 @@ namespace Lib.Audio |
|
|
|
|
|
|
|
|
|
|
|
public IFader? Fader { get; } |
|
|
|
public IFader? Fader { get; } |
|
|
|
public IKnob? Knob { get; } |
|
|
|
public IKnob? Knob { get; } |
|
|
|
public List<IButton>? Buttons { get; } |
|
|
|
public List<IButton> Buttons { get; } |
|
|
|
public IControllable? Controllable { get; private set; } |
|
|
|
public IControllable? Controllable { get; private set; } |
|
|
|
|
|
|
|
|
|
|
|
public void MapControllable(IControllable controllable) |
|
|
|
public void MapControllable(IControllable controllable) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Controllable = controllable; |
|
|
|
Controllable = controllable; |
|
|
|
ToggleSelectButtonLed(); |
|
|
|
ToggleButtonLed<ISelectButton>(LedState.On); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!Controllable.IsValid) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
if (Controllable.IsValid) |
|
|
|
InitializeFader(); |
|
|
|
InitializeFader(); |
|
|
|
ToggleButtonLed<IRecordButton>(LedState.On); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void UnMapControllable() |
|
|
|
private void UnMapControllable() |
|
|
|
@ -80,7 +84,8 @@ namespace Lib.Audio |
|
|
|
if (Controllable == null) |
|
|
|
if (Controllable == null) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
ToggleSelectButtonLed(); |
|
|
|
ToggleButtonLed<ISelectButton>(LedState.Off); |
|
|
|
|
|
|
|
ToggleButtonLed<IRecordButton>(LedState.Off); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void HandleMessage(IMidiMessage message) |
|
|
|
public void HandleMessage(IMidiMessage message) |
|
|
|
@ -91,8 +96,8 @@ namespace Lib.Audio |
|
|
|
Fader.IsTouched = true; |
|
|
|
Fader.IsTouched = true; |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
IButton? button = Buttons?.FirstOrDefault(b => b.NoteNumber == noteOnMessage.NoteNumber); |
|
|
|
IButton? button = Buttons.FirstOrDefault(b => b.NoteNumber == noteOnMessage.NoteNumber); |
|
|
|
_acknowledgeMessage = button?.Handle(Controllable, (Velocity) noteOnMessage.Velocity); |
|
|
|
_acknowledgeMessage = button?.HandlePressed(Controllable, (Velocity) noteOnMessage.Velocity); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else if (message is NoteMessage noteMessage) |
|
|
|
else if (message is NoteMessage noteMessage) |
|
|
|
@ -104,8 +109,8 @@ namespace Lib.Audio |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
IButton? button = Buttons?.FirstOrDefault(b => b.NoteNumber == noteMessage.NoteNumber); |
|
|
|
IButton? button = Buttons.FirstOrDefault(b => b.NoteNumber == noteMessage.NoteNumber); |
|
|
|
_acknowledgeMessage = button?.Handle(Controllable, (Velocity) noteMessage.Velocity); |
|
|
|
_acknowledgeMessage = button?.HandlePressed(Controllable, (Velocity) noteMessage.Velocity); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else if (message is PitchWheelChangeMessage pitchWheelChangeMessage) |
|
|
|
else if (message is PitchWheelChangeMessage pitchWheelChangeMessage) |
|
|
|
@ -135,10 +140,10 @@ namespace Lib.Audio |
|
|
|
_midiCommunication.Send(new PitchWheelChangeMessage(0, _channelNumber, Fader.Position)); |
|
|
|
_midiCommunication.Send(new PitchWheelChangeMessage(0, _channelNumber, Fader.Position)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void ToggleSelectButtonLed() |
|
|
|
private void ToggleButtonLed<TButton>(LedState ledState) where TButton : IButton |
|
|
|
{ |
|
|
|
{ |
|
|
|
ISelectButton? selectButton = Buttons?.OfType<ISelectButton>().FirstOrDefault(); |
|
|
|
TButton? button = Buttons.OfType<TButton>().FirstOrDefault(); |
|
|
|
IMidiMessage? selectMessage = selectButton?.Select(); |
|
|
|
IMidiMessage? selectMessage = button?.ToggleLed(ledState); |
|
|
|
|
|
|
|
|
|
|
|
if (selectMessage != null) |
|
|
|
if (selectMessage != null) |
|
|
|
_midiCommunication.Send(selectMessage); |
|
|
|
_midiCommunication.Send(selectMessage); |
|
|
|
@ -161,8 +166,11 @@ namespace Lib.Audio |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
Controllable = _controllableCollector.GetControllableForExecutable(Controllable.ExecutablePath); |
|
|
|
Controllable = _controllableCollector.GetControllableForExecutable(Controllable.ExecutablePath); |
|
|
|
if (Controllable != null) |
|
|
|
if (Controllable == null) |
|
|
|
InitializeFader(); |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InitializeFader(); |
|
|
|
|
|
|
|
ToggleButtonLed<IRecordButton>(LedState.On); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void OnProcessManagerProcessExited(object? sender, IObservedProcess process) |
|
|
|
private void OnProcessManagerProcessExited(object? sender, IObservedProcess process) |
|
|
|
@ -173,7 +181,8 @@ namespace Lib.Audio |
|
|
|
if (!Controllable.ExecutablePath.Equals(process.FileName)) |
|
|
|
if (!Controllable.ExecutablePath.Equals(process.FileName)) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
Controllable.IsValid = false; //TODO: Toggle Record button led |
|
|
|
Controllable.IsValid = false; |
|
|
|
|
|
|
|
ToggleButtonLed<IRecordButton>(LedState.Off); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public override string ToString() => $"Channel {_channelNumber}"; |
|
|
|
public override string ToString() => $"Channel {_channelNumber}"; |
|
|
|
@ -185,6 +194,9 @@ namespace Lib.Audio |
|
|
|
|
|
|
|
|
|
|
|
UnMapControllable(); |
|
|
|
UnMapControllable(); |
|
|
|
_midiCommunication.Send(new PitchWheelChangeMessage(0, _channelNumber, 0)); |
|
|
|
_midiCommunication.Send(new PitchWheelChangeMessage(0, _channelNumber, 0)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (IMidiMessage ledOffMessage in Buttons.Select(b => b.ToggleLed(LedState.Off))) |
|
|
|
|
|
|
|
_midiCommunication.Send(ledOffMessage); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |