- fix led toggle

master
Simon G 5 years ago
parent b4aa1d6ed6
commit 2c7403ade3
  1. 44
      Lib.Audio/Channel.cs
  2. 9
      Lib.Audio/Controls/Buttons/Button.cs
  3. 3
      Lib.Audio/Controls/Buttons/Interfaces/IButton.cs
  4. 4
      Lib.Audio/Controls/Buttons/Interfaces/IRecordButton.cs
  5. 4
      Lib.Audio/Controls/Buttons/Interfaces/ISelectButton.cs
  6. 12
      Lib.Audio/Controls/Buttons/LedState.cs
  7. 3
      Lib.Audio/Controls/Buttons/RecordButton.cs
  8. 3
      Lib.Audio/Controls/Buttons/SelectButton.cs

@ -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) if (!Controllable.IsValid)
InitializeFader(); return;
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);
} }
} }
} }

@ -22,7 +22,7 @@ namespace Lib.Audio.Controls.Buttons
public int NoteNumber { get; } public int NoteNumber { get; }
protected bool IsActive { get; private set; } protected bool IsActive { get; private set; }
public virtual IMidiMessage? Handle(IControllable? controllable, Velocity velocity) public virtual IMidiMessage? HandlePressed(IControllable? controllable, Velocity velocity)
{ {
if (velocity != Velocity.On) if (velocity != Velocity.On)
return null; return null;
@ -30,13 +30,16 @@ namespace Lib.Audio.Controls.Buttons
IsActive = !IsActive; IsActive = !IsActive;
Handle(controllable); Handle(controllable);
return IsActive ? new NoteOnMessage(0, _channelNumber, NoteNumber, (int) Velocity.On, 0) return IsActive ? LedOn() : LedOff();
: new NoteMessage(0, _channelNumber, NoteNumber, (int) Velocity.Off);
} }
public IMidiMessage ToggleLed(LedState ledState) => ledState == LedState.Off ? LedOff() : LedOn();
protected virtual void Handle(IControllable? controllable) protected virtual void Handle(IControllable? controllable)
{ {
} }
private IMidiMessage LedOn() => new NoteOnMessage(0, _channelNumber, NoteNumber, (int) Velocity.On, 0);
private IMidiMessage LedOff() => new NoteMessage(0, _channelNumber, NoteNumber, (int) Velocity.Off);
} }
} }

@ -11,6 +11,7 @@ namespace Lib.Audio.Controls.Buttons.Interfaces
{ {
int NoteNumber { get; } int NoteNumber { get; }
IMidiMessage? Handle(IControllable? controllable, Velocity velocity); IMidiMessage? HandlePressed(IControllable? controllable, Velocity velocity);
IMidiMessage ToggleLed(LedState ledState);
} }
} }

@ -2,12 +2,10 @@
// Created: 2021-04-26 // Created: 2021-04-26
// Copyright(c) 2021 SimonG. All Rights Reserved. // Copyright(c) 2021 SimonG. All Rights Reserved.
using Lib.Midi.Messages.Interfaces;
namespace Lib.Audio.Controls.Buttons.Interfaces namespace Lib.Audio.Controls.Buttons.Interfaces
{ {
public interface IRecordButton : IButton public interface IRecordButton : IButton
{ {
IMidiMessage? Record();
} }
} }

@ -2,12 +2,10 @@
// Created: 2021-04-17 // Created: 2021-04-17
// Copyright(c) 2021 SimonG. All Rights Reserved. // Copyright(c) 2021 SimonG. All Rights Reserved.
using Lib.Midi.Messages.Interfaces;
namespace Lib.Audio.Controls.Buttons.Interfaces namespace Lib.Audio.Controls.Buttons.Interfaces
{ {
public interface ISelectButton : IButton public interface ISelectButton : IButton
{ {
IMidiMessage? Select();
} }
} }

@ -0,0 +1,12 @@
// Author: Gockner, Simon
// Created: 2021-04-26
// Copyright(c) 2021 SimonG. All Rights Reserved.
namespace Lib.Audio.Controls.Buttons
{
public enum LedState
{
Off,
On
}
}

@ -16,7 +16,6 @@ namespace Lib.Audio.Controls.Buttons
} }
public override IMidiMessage? Handle(IControllable? controllable, Velocity velocity) => null; //for now don't do anything when pressed public override IMidiMessage? HandlePressed(IControllable? controllable, Velocity velocity) => null; //for now don't do anything when pressed
public IMidiMessage? Record() => base.Handle(null, Velocity.On);
} }
} }

@ -16,7 +16,6 @@ namespace Lib.Audio.Controls.Buttons
} }
public override IMidiMessage? Handle(IControllable? controllable, Velocity velocity) => null; //for now don't do anything when pressed public override IMidiMessage? HandlePressed(IControllable? controllable, Velocity velocity) => null; //for now don't do anything when pressed
public IMidiMessage? Select() => base.Handle(null, Velocity.On);
} }
} }
Loading…
Cancel
Save