-
Notifications
You must be signed in to change notification settings - Fork 13
/
MidiInNode.cs
108 lines (91 loc) · 2.91 KB
/
MidiInNode.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
* Created by SharpDevelop.
* User: TF
* Date: 21.12.2014
* Time: 20:49
*
*/
using System;
using VVVV.PluginInterfaces.V2;
using Sanford.Multimedia.Midi;
using System.ComponentModel.Composition;
using VVVV.Audio.MIDI;
namespace VVVV.Nodes
{
[PluginInfo(Name = "MidiIn", Category = "VAudio", Version = "Source", Help = "Opens a Midi driver and outputs its events", Tags = "", Author = "tonfilm")]
public class MidiInNode : IPluginEvaluate, IDisposable
{
[Input("Driver", EnumName = "VAudioMidiDevice", IsSingle = true)]
IDiffSpread<EnumEntry> FDriverIn;
[Input("Rescan", IsBang = true, IsSingle = true)]
ISpread<bool> FRescanIn;
[Output("Events", IsSingle = true)]
ISpread<MidiEvents> FEventsOut;
[ImportingConstructor]
public MidiInNode()
{
RefreshDrivers();
}
void RefreshDrivers()
{
var drivers = GetDriverNames();
if (drivers.Length > 0)
{
EnumManager.UpdateEnum("VAudioMidiDevice", drivers[0], drivers);
}
else
{
drivers = new string[]{"No Midi Devices Found"};
EnumManager.UpdateEnum("VAudioMidiDevice", drivers[0], drivers);
}
}
private string[] GetDriverNames()
{
var drivers = new string[InputDevice.DeviceCount];
if (InputDevice.DeviceCount > 0)
{
for (int i = 0; i < InputDevice.DeviceCount; i++)
{
drivers[i] = InputDevice.GetDeviceCapabilities(i).name;
}
}
return drivers;
}
public void Evaluate(int SpreadMax)
{
if(FRescanIn[0])
{
RefreshDrivers();
}
if(FDriverIn.IsChanged)
{
FEventsOut.SliceCount = SpreadMax;
for (int i = 0; i < SpreadMax; i++)
{
var oldDevice = FEventsOut[i];
var newDeviceID = FDriverIn[i].Index;
if(oldDevice == null)
{
FEventsOut[i] = InputDeviceMidiEvents.FromDeviceID(newDeviceID);
}
else
{
if(oldDevice.DeviceID != newDeviceID)
{
FEventsOut[i] = InputDeviceMidiEvents.FromDeviceID(newDeviceID);
oldDevice.Dispose();
}
}
}
}
}
public void Dispose()
{
foreach (var element in FEventsOut)
{
if(element != null)
element.Dispose();
}
}
}
}