Unity中的MIDI输出

6
我正在尝试构建一款简单的软件,以在Unity中连接到Windows上的MIDI输出设备并发送MIDI数据。
为了避免重复造轮子,我开始使用支持.NET 2.0的C# Midi Toolkit CodeProject。
我的问题是,在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中专门构建其他替代品,但我对为什么这类事情一开始就不能正常工作感兴趣。


为什么你使用 deviceID = 1,看起来示例都是使用 0。 - Iłya Bursov
0 是 Microsoft GS Wavetable Synth,我正在尝试连接到一个设备 ID 为 1 的独立回环 MIDI 接口。使用您在顶部看到的日志记录代码,在独立模式和编辑器中已确认这种情况。 - Naxin
哪个语句失败了? - CL.
OutputDevice的构造函数是库所在的位置,它也尝试连接提供的设备ID。 - Naxin
1
你尝试过使用NAudio吗? - Shimmy Weitzhandler
不可能!我已经在这个项目中使用NAudio,但没有意识到它具有MIDI输出功能。这个问题更多是关于学习为什么这种方法没有起作用,但感谢你给了我一个解决更大问题的简单方法 :) - Naxin
2个回答

1

我不知道这种问题是否存在,但是这个旧的codeproject代码使用的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);

也许这是一个平台问题。

非常有趣,所以您是在暗示旧的 Code Project 示例可能是为不同的带有 winmm.dll 的旧版 Windows 构建的?我是在 Windows 10 上进行测试的。 - Naxin
这是带有IntPtr的新x64 / x86实现。 - anefeletos

0

你可以看一下DryWetMIDI中的实现方式,例如:输出设备

用法:

using Melanchall.DryWetMidi.Devices;
using Melanchall.DryWetMidi.Core;

// ...

using (var outputDevice = OutputDevice.GetByName("Output device")) // or GetById(1)
{
    outputDevice.SendEvent(new NoteOnEvent());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接