Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VST主机-MIDI到波形转换(C#)_C#_Plugins_Midi_Wave_Vst - Fatal编程技术网

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

VST主机-MIDI到波形转换(C#),c#,plugins,midi,wave,vst,C#,Plugins,Midi,Wave,Vst,我想向您寻求VST主机实现方面的帮助 虽然wave处理很容易实现,但我在尝试MIDI处理时失败了(特别是我需要使用我最喜欢的插件将MIDI事件转换为wave输出) 在阅读了VST规范和各种示例之后,wave和MIDI插件之间的唯一区别似乎就是在processreplacement之前调用ProcessEvents(使用正确的时间) 不幸的是,ProcessEvents在我的实现中由于内存访问异常而失败,并且因为我已经多次验证了结构,所以我决定在这里讨论:-) 在我把一些代码放在这里之前,我将从一

我想向您寻求VST主机实现方面的帮助

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

在阅读了VST规范和各种示例之后,wave和MIDI插件之间的唯一区别似乎就是在processreplacement之前调用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没有任何问题,但是在调用ProcessReplacement之后,如果始终为空(没有生成波形),则调用wave缓冲区。如果存在更多事件,ProcessEvents会因内存保护故障而崩溃

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


提前感谢您的帮助。

感谢您的回复,上述解决方案
[Int32 numEvents][reserved][IntPtr event1ptr][IntPtr event2ptr]…[IntPtr eventNptr]
运行良好:-)

起初,我似乎还存在一些实现问题,因为我的乐器(通用声音模块2)的输出只是静音,但经过深入分析,我发现所有其他乐器都工作正常,反之亦然通用声音模块(与Cubase/Cubasis捆绑)不适用于其他DAW(LMMCakewalk,…)

是否有人有使用Cubase/Cubasis获得USM2的经验?解决方案可能是实现“特定于供应商的”回调-它的出现是与其他工具的主要区别
(操作码=35,索引=0,值=0,ptr={1301644},opt=2)


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

不同的事件类型有不同的大小,因此
VstEvents
结构包含一个指向事件的指针数组。请注意
events
本身不是指针。感谢您的建议。因此,上述两种内存布局都不正确,如果我理解得很好的话,它是正确的应该是:
[Int32 numEvents][reserved][IntPtr event1ptr][IntPtr event2ptr]…[IntPtr eventNptr]
。我不知道C的内存布局规范实际上是如何工作的,但这看起来是正确的。请查看VST.NET以获得“灵感”。)