Unity中的MIDI输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity中的MIDI输出相关的知识,希望对你有一定的参考价值。

我正在尝试构建简单的软件以连接到Unity中的Windows上的MIDI输出设备并发送MIDI数据。

为了避免重新发明轮子,我开始在CodeProject上使用C# Midi Toolkit,它支持.NET 2.0。

我遇到的问题是它在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构建的替代品,但我有兴趣了解为什么这样的东西首先不起作用。

答案

我不知道是不是这种问题,但是这个旧的codeproject代码使用的midiOutOpen函数的x86定义(OutputDevice.cs)是

[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);

也许这是一个平台问题。

另一答案

您可以查看它在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());
}

以上是关于Unity中的MIDI输出的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d 中集成的 android MIDI 驱动程序没有声音

如何在 Java 中播放(MIDI)序列中的音频剪辑?

Java 中用于播放的硬件 MIDI 输出?

在 Java 中播放时将 midi 文件输出到控制台

.NET 中的精确计时

将多个输出中的hls属性设置为单独的片段代码