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

本文关键字:转换 波形 主机 MIDI VST | 更新日期: 2023-09-27 18:34:41

我想请您帮助实现 VST 主机。

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

在阅读了 VST 规范和各种示例后,似乎 wave 和 MIDI 插件之间的唯一区别只是在 ProcessReplace 之前调用 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]

(其中"事件"指向指向VstMidiEvent结构的指针块,这些指针指向碎片结构(

显然一种方法是

错误的(我估计正确的是第一种方法(,但是我已经实现了这两种方法,并且两者都具有相同的行为:如果仅存在一个事件,则调用ProcessEvents没有任何问题,但是在遵循ProcessPlace调用后,如果波缓冲区始终为空(不生成波(。如果存在更多事件,进程事件将崩溃并出现内存保护错误。

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

提前感谢您的帮助。

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

感谢您

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

最初,我似乎仍然有一些实现问题,因为我的乐器(通用声音模块

2(的输出只是静音,但经过更深入的分析,我发现所有其他乐器都可以正常工作,反之亦然通用声音模块(与 Cubase/Cubasis 捆绑在一起(不适用于其他 DAW (LMMSCakewalk 等(。

有人有经验让USM2古巴/库基斯工作吗?解决方案可能是实现"供应商特定"回调 - 它的发生是与其他工具的主要区别 (opcode = 35, index = 0, value = 0, ptr = {1301644}, opt = 2) .

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