129 lines
3.3 KiB
C#
129 lines
3.3 KiB
C#
using Midi.Devices;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Threading;
|
|
|
|
|
|
namespace VirtualDJ_MidiDeviceBridge
|
|
{
|
|
internal static class MidiManager
|
|
{
|
|
public static void SetupDevice()
|
|
{
|
|
Globals.MidiInDevice.NoteOn += MidiDevice_NoteOn;
|
|
Globals.MidiInDevice.NoteOff += MidiDevice_NoteOff;
|
|
Globals.MidiInDevice.ControlChange += MidiDevice_ControlChange;
|
|
}
|
|
|
|
private static void MidiDevice_NoteOn(Midi.Messages.NoteOnMessage msg)
|
|
{
|
|
string key = $"NOTEON_{(int)(msg.Pitch)}";
|
|
|
|
if ((int)msg.Pitch == Globals.Config.ShiftNoteId)
|
|
{
|
|
if (Globals.Config.ToggleShift && Globals.ShiftKeyHeld)
|
|
Globals.ShiftKeyHeld = false;
|
|
else
|
|
Globals.ShiftKeyHeld = true;
|
|
}
|
|
|
|
string cmd = null;
|
|
Globals.Config.GetActiveMidiInCommands(Globals.ShiftKeyHeld).TryGetValue(key, out cmd);
|
|
|
|
if (cmd == null)
|
|
{
|
|
Console.WriteLine($"Unbound midi event: {key} (shift: {Globals.ShiftKeyHeld})");
|
|
return;
|
|
}
|
|
|
|
Globals.SendCommand($"0:(command){cmd}");
|
|
}
|
|
|
|
private static void MidiDevice_NoteOff(Midi.Messages.NoteOffMessage msg)
|
|
{
|
|
string key = $"NOTEOFF_{(int)(msg.Pitch)}";
|
|
|
|
if ((int)msg.Pitch == Globals.Config.ShiftNoteId)
|
|
{
|
|
if (!Globals.Config.ToggleShift)
|
|
Globals.ShiftKeyHeld = false;
|
|
|
|
Globals.MidiOutDevice.SilenceAllNotes();
|
|
}
|
|
|
|
string cmd = null;
|
|
Globals.Config.GetActiveMidiInCommands(Globals.ShiftKeyHeld).TryGetValue(key, out cmd);
|
|
|
|
if (cmd == null)
|
|
{
|
|
Console.WriteLine($"Unbound midi event: {key} (shift: {Globals.ShiftKeyHeld})");
|
|
return;
|
|
}
|
|
|
|
Globals.SendCommand($"0:(command){cmd}");
|
|
}
|
|
|
|
private static void MidiDevice_ControlChange(Midi.Messages.ControlChangeMessage msg)
|
|
{
|
|
string key = $"CONTROL_{(int)(msg.Control)}";
|
|
string cmd = null;
|
|
|
|
float normalizedValue = msg.Value / 128.0f * 100f;
|
|
|
|
Globals.Config.GetActiveMidiInCommands(Globals.ShiftKeyHeld).TryGetValue(key, out cmd);
|
|
|
|
if (cmd == null)
|
|
{
|
|
Console.WriteLine($"Unbound midi event: {key} (value: {normalizedValue.ToString(CultureInfo.InvariantCulture)}) (shift: {Globals.ShiftKeyHeld})");
|
|
return;
|
|
}
|
|
|
|
cmd = cmd.Replace("%val%", normalizedValue.ToString(CultureInfo.InvariantCulture) + "%");
|
|
Globals.SendCommand($"0:(command){cmd}");
|
|
}
|
|
|
|
public static void Work()
|
|
{
|
|
Globals.MidiInDevice.StartReceiving(null);
|
|
|
|
while (true)
|
|
{
|
|
Thread.Sleep(100);
|
|
|
|
foreach(var cmd in Globals.Config.GetActiveMidiOutShiftCommandsSysEx(Globals.ShiftKeyHeld))
|
|
{
|
|
try
|
|
{
|
|
string result = Globals.SendCommand($"1:(string){cmd}");
|
|
result = result.Substring(2); //skip 0:
|
|
//result = result.Substring(1, result.Length - 3); //skip [ ... ]
|
|
|
|
string[] values = result.Split(',');
|
|
byte[] sysExBytes = new byte[values.Length];
|
|
|
|
for (int i = 0; i < values.Length; i++)
|
|
{
|
|
if (values[i].StartsWith("0x"))
|
|
sysExBytes[i] = byte.Parse(values[i].Substring(2), NumberStyles.HexNumber);
|
|
else
|
|
sysExBytes[i] = byte.Parse(values[i], NumberStyles.Integer);
|
|
}
|
|
|
|
Globals.MidiOutDevice.SendSysEx(sysExBytes);
|
|
}
|
|
catch (DeviceException ex)
|
|
{
|
|
Console.WriteLine("Device lost, you're on your own now!");
|
|
return;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"Failed to read sysex midi out command!\nCommand: {cmd}");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|