【发布时间】:2014-12-19 02:54:22
【问题描述】:
我需要从 Windows 应用商店应用播放 MIDI 文件。 (即应用程序本身应该在软件中生成声音——我不想将 MIDI 输出到硬件设备。)
我希望有一些简单的 API/库,我可以在其中传递文件的位置和可能的声音字体,并调用“播放”函数,但我一直找不到这样的东西。例如FluidSynth 看起来像 it will do just this,但它没有适用于 Windows 应用商店应用的版本。
Microsoft recently introduced 一个新的Windows Runtime API for MIDI,但这不包括任何处理 MIDI 文件的代码。
开源库NAudio确实显然包含用于读取 MIDI 文件的代码,所以我认为我需要实现的是使用 NAudio 打开文件,读入/解析 MIDI 事件,然后通过Microsoft GS Wavetable Synth 软件设备通过新的 MIDI 预览 API 播放它们(实现我自己的调度,以便在正确的时间发送消息)。
更新:Microsoft 用于枚举 MIDI 端口的 sample code 列出了连接 USB MIDI 设备,但没有连接 USB 设备时报告“没有 MIDI 端口” .
注意示例代码通过将MidiOutPort::GetDeviceSelector 的返回值传递给DeviceInformation::FindAllAsync 方法来枚举端口。据我所知,这应该列出所有可用的 MIDI 设备。
但是,在同一台计算机上,可以在桌面应用程序中找到 Microsoft 合成器 ,例如通过 DirectMusic 的EnumPort 方法。
这是否意味着没有可用于 Windows 应用商店应用的默认软件合成器?我还需要实现自己的合成器吗?
更新 2:我现在从 Microsoft 工作人员那里找到 some comments,确认 WindowsPreview MIDI API 不支持默认的软件合成器。
这行得通吗?这是正确的方法吗?有没有我错过的更简单的方法/API/第三方库?
更新 3: 看起来 NAudio 的 WinRT 版本不包含 MIDI 功能,所以我似乎将同时构建 MIDI 音序器和从头开始合成。 (也许在合成器实现中使用 NAudio。)
【问题讨论】:
-
显然,确实没有音序器。
-
你见过this sample吗?
-
@Alovchin 我没有看过那个样本,这肯定很有帮助。谢谢!
-
@Rich 最重要的是在相当高的分辨率下稳定的计时器事件。如果你有这个,制作音序器就不是那么难了。该代码旨在作为参考,您可以解决它的方法之一。
标签: windows-runtime windows-store-apps midi naudio