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调用后,如果波缓冲区始终为空(不生成波(。如果存在更多事件,进程事件将崩溃并出现内存保护错误。
我将在这里放置一段代码以供进一步讨论,但首先我想知道哪种内存布局是正确的,以便只关注正确的方法。
提前感谢您的帮助。
的回复,上述解决方案[Int32 numEvents][reserved][IntPtr event1ptr][IntPtr event2ptr]...[IntPtr eventNptr]
工作正常:-(
2(的输出只是静音,但经过更深入的分析,我发现所有其他乐器都可以正常工作,反之亦然通用声音模块(与 Cubase/Cubasis 捆绑在一起(不适用于其他 DAW (LMMS、Cakewalk 等(。
有人有经验让USM2在古巴/库基斯工作吗?解决方案可能是实现"供应商特定"回调 - 它的发生是与其他工具的主要区别 (opcode = 35, index = 0, value = 0, ptr = {1301644}, opt = 2)
.
虽然我很确定可能没有解决方案,但如果有人已经解决了它,我将不胜感激 - 没有免费更换高质量的真实乐器(只是许多合成实现,方便计算机音乐,但不适用于摇滚,古典音乐,爵士乐,...(并且我不想购买其他商业乐器,当我已经购买通用声音模块并且我"只是"需要在不同的应用程序中使用它时。