Cross Platform Application to allow control with a MIDI controller
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 lines
1.5 KiB

// Author: Gockner, Simon
// Created: 2021-04-07
// 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 //TODO: Make abstract?
{
private readonly int _channelNumber;
public Button(int noteNumber, byte controller, int channelNumber)
{
NoteNumber = noteNumber;
Controller = controller;
_channelNumber = channelNumber;
}
public int NoteNumber { get; }
public byte Controller { get; }
protected bool IsActive { get; private set; }
public virtual IMidiMessage? HandlePressed(IControllable? controllable, Velocity velocity)
{
if (velocity != Velocity.On)
return null;
IsActive = !IsActive;
Handle(controllable);
return IsActive ? LedOn() : LedOff();
}
public IMidiMessage ToggleLed(LedState ledState) => ledState == LedState.Off ? LedOff() : LedOn();
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);
}
}