我正在尝试构建简单的软件以连接到Unity中的Windows上的MIDI输出设备并发送MIDI数据。
为了避免重新发明轮子,我开始在使用支持.NET 2.0构建的CodeProject上使用C# Midi Toolkit。
我遇到的问题是,它在Unity编辑器中运行良好,但随后 在独立的Windows版本中失败。
这是基本的连接/播放声音代码:
// Log devices
int deviceCount = OutputDevice.DeviceCount;
for (int i = 0; i < deviceCount; i++)
{
Debug.Log(string.Format("Detected MIDI Device with ID {0}:{1}", i, OutputDevice.GetDeviceCapabilities(i).name));
}
deviceID = 1;
Debug.Log(string.Format("Connected to {0}", deviceID));
// Connect to device
device = new OutputDevice(deviceID);
// Play Middle C
device.Send(new ChannelMessage(ChannelCommand.NoteOn, 0, note, 127));
在独立版本中,我得到以下异常:
OutputDeviceException:指定的设备句柄无效。
我查看了源代码并注意到该库正在使用 Win32处理 winmm.dll ,我认为这可能与它有关,但不知道从哪里开始。
任何人都可以提供有关如何处理此问题的任何见解吗?我可能会考虑专门为Unity构建的替代品,但我有兴趣了解为什么这样的东西一开始就不起作用。
答案 0 :(得分:1)
我不知道是否存在这种问题,但是此旧代码项目代码(OutputDevice.cs)使用的midiOutOpen函数的x86定义是
[DllImport("winmm.dll")]
50 private static extern int midiOutOpen(ref int handle, int deviceID,
51 MidiOutProc proc, int instance, int flags);
在Pinvoke上,我可以找到以下定义:
[DllImport("winmm.dll")]
static extern uint midiOutOpen(out IntPtr lphMidiOut, uint uDeviceID, IntPtr dwCallback, IntPtr dwInstance, uint dwFlags);
也许是平台问题。
答案 1 :(得分:0)
您可以查看它在DryWetMIDI中的实现方式,例如:Output device。
用法:
using Melanchall.DryWetMidi.Devices;
using Melanchall.DryWetMidi.Smf;
// ...
using (var outputDevice = OutputDevice.GetByName("Output device")) // or GetById(1)
{
outputDevice.SendEvent(new NoteOnEvent());
}