- start button implementation

master
Simon G 5 years ago
parent aaaf2266e2
commit fc3c8f5bd4
  1. 13
      Lib.Audio/Channel.cs
  2. 19
      Lib.Audio/Controls/Buttons/Button.cs
  3. 9
      Lib.Audio/Controls/Buttons/Factories/ButtonFactory.cs
  4. 2
      Lib.Audio/Controls/Buttons/Factories/IButtonFactory.cs
  5. 8
      Lib.Audio/Controls/Buttons/Interfaces/IButton.cs
  6. 11
      Lib.Audio/Controls/Buttons/Interfaces/ISelectButton.cs
  7. 20
      Lib.Audio/Controls/Buttons/MuteButton.cs
  8. 17
      Lib.Audio/Controls/Buttons/SelectButton.cs
  9. 3
      Lib.Driver/Xml/XmlButton.cs
  10. 7
      Lib.Midi/Messages/NoteMessage.cs
  11. 7
      Lib.Midi/Messages/NoteOnMessage.cs
  12. 1
      Mystify/Installers/AudioInstaller.cs

@ -3,6 +3,7 @@
// Copyright(c) 2021 SimonG. All Rights Reserved.
using System.Collections.Generic;
using System.Linq;
using Lib.Audio.Controls.Buttons.Factories;
using Lib.Audio.Controls.Buttons.Interfaces;
using Lib.Audio.Controls.Factories;
@ -40,7 +41,7 @@ namespace Lib.Audio
{
Buttons = new List<IButton>();
foreach (var button in xmlChannel.Buttons)
Buttons.Add(buttonFactory.Create(button));
Buttons.Add(buttonFactory.Create(button, _channelNumber));
}
}
@ -56,6 +57,11 @@ namespace Lib.Audio
{
if (Fader?.NoteNumber == noteOnMessage.NoteNumber)
Fader.IsTouched = true;
else
{
IButton? button = Buttons?.FirstOrDefault(b => b.NoteNumber == noteOnMessage.NoteNumber);
_acknowledgeMessage = button?.HandleOn(Controllable, noteOnMessage.Velocity);
}
}
else if (message is NoteMessage noteMessage)
{
@ -64,6 +70,11 @@ namespace Lib.Audio
Fader.IsTouched = false;
_acknowledgeMessage = new PitchWheelChangeMessage(0, _channelNumber, Fader.Position);
}
else
{
IButton? button = Buttons?.FirstOrDefault(b => b.NoteNumber == noteMessage.NoteNumber);
_acknowledgeMessage = button?.HandleOff(Controllable, noteMessage.Velocity);
}
}
else if (message is PitchWheelChangeMessage pitchWheelChangeMessage)
{

@ -3,11 +3,28 @@
// Copyright(c) 2021 SimonG. All Rights Reserved.
using Lib.Audio.Controls.Buttons.Interfaces;
using Lib.Audio.Interfaces;
using Lib.Midi.Messages;
using Lib.Midi.Messages.Interfaces;
namespace Lib.Audio.Controls.Buttons
{
public class Button : IButton
public class Button : IButton //TODO: Make abstract?
{
private readonly int _channelNumber;
public Button(int noteNumber, int channelNumber)
{
NoteNumber = noteNumber;
_channelNumber = channelNumber;
}
public int NoteNumber { get; }
public virtual IMidiMessage HandleOn(IControllable? controllable, int velocity) =>
new NoteOnMessage(0, _channelNumber, NoteNumber, velocity, 0);
public virtual IMidiMessage HandleOff(IControllable? controllable, int velocity) =>
new NoteMessage(0, _channelNumber, NoteNumber, velocity);
}
}

@ -9,9 +9,14 @@ namespace Lib.Audio.Controls.Buttons.Factories
{
public class ButtonFactory : IButtonFactory
{
public IButton Create(XmlButton xmlButton)
public IButton Create(XmlButton xmlButton, int channelNumber)
{
return new Button();
if (xmlButton.ButtonType == "Select")
return new SelectButton(xmlButton.NoteNumber, channelNumber);
else if (xmlButton.ButtonType == "Mute")
return new MuteButton(xmlButton.NoteNumber, channelNumber);
return new Button(xmlButton.NoteNumber, channelNumber);
}
}
}

@ -9,6 +9,6 @@ namespace Lib.Audio.Controls.Buttons.Factories
{
public interface IButtonFactory
{
IButton Create(XmlButton xmlButton);
IButton Create(XmlButton xmlButton, int channelNumber);
}
}

@ -2,10 +2,16 @@
// Created: 2021-04-07
// Copyright(c) 2021 SimonG. All Rights Reserved.
using Lib.Audio.Interfaces;
using Lib.Midi.Messages.Interfaces;
namespace Lib.Audio.Controls.Buttons.Interfaces
{
public interface IButton
{
int NoteNumber { get; }
IMidiMessage HandleOn(IControllable? controllable, int velocity);
IMidiMessage HandleOff(IControllable? controllable, int velocity);
}
}

@ -0,0 +1,11 @@
// Author: Simon Gockner
// Created: 2021-04-17
// Copyright(c) 2021 SimonG. All Rights Reserved.
namespace Lib.Audio.Controls.Buttons.Interfaces
{
public interface ISelectButton : IButton
{
}
}

@ -3,11 +3,29 @@
// Copyright(c) 2021 SimonG. All Rights Reserved.
using Lib.Audio.Controls.Buttons.Interfaces;
using Lib.Audio.Interfaces;
using Lib.Midi.Messages.Interfaces;
namespace Lib.Audio.Controls.Buttons
{
public class MuteButton : Button, IMuteButton
{
public MuteButton(int noteNumber, int channelNumber)
: base(noteNumber, channelNumber)
{
}
public override IMidiMessage HandleOn(IControllable? controllable, int velocity)
{
controllable?.Mute();
return base.HandleOn(controllable, velocity);
}
public override IMidiMessage HandleOff(IControllable? controllable, int velocity)
{
controllable?.UnMute();
return base.HandleOff(controllable, velocity);
}
}
}

@ -0,0 +1,17 @@
// Author: Simon Gockner
// Created: 2021-04-17
// Copyright(c) 2021 SimonG. All Rights Reserved.
using Lib.Audio.Controls.Buttons.Interfaces;
namespace Lib.Audio.Controls.Buttons
{
public class SelectButton : Button, ISelectButton
{
public SelectButton(int noteNumber, int channelNumber)
: base(noteNumber, channelNumber)
{
}
}
}

@ -11,5 +11,8 @@ namespace Lib.Driver.Xml
{
[XmlAttribute("Type")]
public string? ButtonType { get; set; }
[XmlAttribute("Note")]
public int NoteNumber { get; set; }
}
}

@ -12,9 +12,16 @@ namespace Lib.Midi.Messages
: base(noteEvent)
{
}
public NoteMessage(long absoluteTime, int channelNumber, int noteNumber, int velocity)
: base(new NoteEvent(absoluteTime, channelNumber, MidiCommandCode.NoteOff, noteNumber, velocity)) //TODO: don't always pass note off?
{
}
private NoteEvent NoteEvent => (NoteEvent) _midiEvent;
public int NoteNumber => NoteEvent.NoteNumber;
public int Velocity => NoteEvent.Velocity;
}
}

@ -14,7 +14,14 @@ namespace Lib.Midi.Messages
}
public NoteOnMessage(long absoluteTime, int channelNumber, int noteNumber, int velocity, int duration)
: base(new NoteOnEvent(absoluteTime, channelNumber, noteNumber, velocity, duration))
{
}
private NoteOnEvent NoteOnEvent => (NoteOnEvent) _midiEvent;
public int NoteNumber => NoteOnEvent.NoteNumber;
public int Velocity => NoteOnEvent.Velocity;
}
}

@ -31,6 +31,7 @@ namespace Mystify.Installers
container.Register<IKnob, Knob>();
container.Register<IButton, Button>();
container.Register<IMuteButton, MuteButton>();
container.Register<ISelectButton, SelectButton>();
//factories
container.RegisterFactory<IDeviceFactory>();

Loading…
Cancel
Save