VST 主机 - MIDI 到波形转换 (C#)

Posted

技术标签:

【中文标题】VST 主机 - MIDI 到波形转换 (C#)【英文标题】:VST host - MIDI to wave conversion (C#) 【发布时间】:2016-02-16 05:15:10 【问题描述】:

我想就 VST 主机实现向您寻求帮助。

虽然波形处理很容易实现,但我尝试 MIDI 处理失败了(特别是我需要使用我最喜欢的插件将 MIDI 事件转换为波形输出)。

在阅读了 VST 规范和各种示例之后,wave 和 MIDI 插件之间的唯一区别似乎只是在 ProcessReplacing 之前调用 ProcessEvents(使用正确的时间)。

不幸的是,ProcessEvents 在我的实现中因内存访问异常而失败,因为我已经多次验证了结构,所以我决定在这里讨论它:-)

在我在这里放一段代码之前,我先从一个基本问题开始讨论:ProcessEvents 的预期结构是什么。 这个答案很重要,因为我在从另一个应用程序下载的示例中看到了两种方法:

大多数源代码使用以下内存布局:

[Int32 numEvents]
[reserved]
[IntPtr events] => [VstMidiEvent event1][VstMidiEvent event2]...[VstMidiEvent eventN]

(其中“事件”直接指向一个连续的 VstMidiEvent 结构块)

但我也看到了实现:

[Int32 numEvents]
[reserved]
[IntPtr events] =>
   [pointer to VstMidiEvent event1][pointer to VstMidiEvent event2]...[pointer to VstMidiEvent eventN]

(其中“events”指向指向VstMidiEvent结构的指针块,这些指针指向碎片结构)

显然一种方法是错误的(我估计第一种方法是正确的),但我已经实现了这两种方法并且两者都有相同的行为:如果只存在一个事件,则调用 ProcessEvents任何问题,但如果在 ProcessReplacing 调用后始终为空(不生成波),波形缓冲区。如果存在更多事件,ProcessEvents 会因内存保护错误而崩溃。

我将在这里放一段代码以供进一步讨论,但首先我想知道哪种内存布局是正确的,以便专注于正确的方法。

提前感谢您的帮助。

【问题讨论】:

不同的事件类型有不同的大小,所以VstEvents 结构包含一个指向事件的指针数组。请注意events 本身不是指针。 感谢您的建议。所以上面提到的内存布局都不是正确的,如果我理解得很好,它应该是:[Int32 numEvents][reserved][IntPtr event1ptr][IntPtr event2ptr]...[IntPtr eventNptr]. 我不知道 C# 的内存布局规范实际上是如何工作的,但这看起来是正确的。 看看 VST.NET 的“灵感”。 vstnet.codeplex.com ;-) 【参考方案1】:

感谢您的回复,上述解决方案[Int32 numEvents][reserved][IntPtr event1ptr][IntPtr event2ptr]...[IntPtr eventNptr] 工作正常:-)

最初,我似乎还有一些实现问题,因为我的乐器(Universal Sound Module 2)的输出只是静音,但经过深入分析,我发现所有其他乐器都可以正常工作反之亦然 Universal Sound Module(与 Cubase/Cubasis 捆绑)不适用于其他 DAW(LMMS strong>、Cakewalk、...)。

有人有经验让 USM2Cubase/Cubasis 工作吗?该解决方案可能是“供应商特定”回调的实现 - 它的出现是与其他工具 (opcode = 35, index = 0, value = 0, ptr = 1301644, opt = 2) 的主要区别。

虽然我很确定可能没有解决方案,但如果有人已经解决了,我将不胜感激 - 没有免费更换高质量的真实乐器(只有许多便于计算机音乐的合成实现,但不适用于摇滚、古典音乐、爵士乐……)我不想购买其他商业乐器,因为我已经购买了通用声音模块,我“只是”需要使用它在不同的应用程序中。

【讨论】:

以上是关于VST 主机 - MIDI 到波形转换 (C#)的主要内容,如果未能解决你的问题,请参考以下文章

每个 VST SDK 似乎都是针对 C++ 的,那么 C# 呢?

在 C#/C++ 中托管 VST/DX 仪器? [关闭]

我将如何以编程方式与 VST(i) 插件交互以合成音频?

Delphi ASIO VST 和 MiniHost 的 Midi 时序问题

实时 MIDI 输入和音频同步

是否可以为生成 MIDI 的 Logic 创建插件?