我想请求您帮助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]
(其中“事件”指向 VstMidiEvent 结构的指针块,这些指针指向碎片结构)
显然有一种方法是错误的(我估计第一种方法是正确的),但我已经实现了两者并且两者都有相同的行为:如果只存在一个事件,则调用 ProcessEvents 任何问题,但是在跟踪 ProcessReplacing 调用之后,wave缓冲区如果总是为空(没有生成波形)。如果存在更多事件, ProcessEvents 会因内存保护错误而崩溃。
我将把这段代码放在这里进行进一步的讨论,但首先我想知道哪种内存布局是正确的,只关注正确的方法。
提前感谢您的帮助。
答案 0 :(得分:0)
感谢您的回复,上面提到的解决方案[Int32 numEvents][reserved][IntPtr event1ptr][IntPtr event2ptr]...[IntPtr eventNptr]
运行正常: - )
最初,似乎我仍有一些实施问题,因为我的乐器( Universal Sound Module 2 )的输出只是沉默,但经过深入分析后我发现所有其他乐器都能正常工作反之亦然通用声音模块(与 Cubase / Cubasis 捆绑在一起)不适用于其他DAW( LMMS , Cakewalk ,...)。
是否有人有经验 USM2 在 Cubase / Cubasis 中工作?解决方案可能是“供应商特定”回调的实现 - 它的出现是与其他工具(opcode = 35, index = 0, value = 0, ptr = {1301644}, opt = 2)
的主要区别。
虽然我很确定可能没有解决方案,但如果有人已经解决了这个问题,我会很感激 - 没有免费更换高质量的真实乐器(只是很多合成实现方便电脑音乐,但不是摇滚乐,古典音乐,爵士乐......)当我已经购买了通用声音模块时,我不想购买其他商业乐器而我只是“需要”使用它在不同的应用中。