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

6

我想开始制作VSTi插件,更具体地说,是midi插件——不会产生任何声音,而是将midi数据输出到其他vst插件(琶音器、和弦工具等)。

现在,我刚刚购买了C#的书籍,认为这是一个不错的入门语言(不仅仅是用于vst编程),但每个人都说C++才是正确的选择,而且VST.NET似乎是为C++设计的……似乎一切都在反对我选择C#?

我脑海中有“编程思维”,但距离我上次编程已经过去很多年了,当时我使用的是Visual Basic、Turbo Pascal等语言。所以我从零开始。

你的建议是什么?是出售我的新C#书籍(或将它们藏在书架上),并转向C++,还是C#仍然可以?我一直认为C++比C#更加复杂,需要更长时间的学习。

顺便说一下,VST.NET SDK是否可以以某种方式用于C#?

5个回答

7

VST.NET不适用于C++。你是从哪里得到这个想法的?请查看VST.NET代码和示例,这将使事情更清晰 - 我希望能帮到你。

希望对你有所帮助。 Marc VST.NETMIDI.NET 的作者


我不知道在哪里看到有人说VST.NET不适合。可能是我认为需要使用旧版本的Visual Studio C#.net,或者看到有人说C#太慢了,应该学习C++。 - cause4concern
3
如果你想使用复杂的数字信号处理算法,同时在低CPU使用率下进行快速手动优化汇编语言编程,那么选择C ++ 是正确的。它比.NET拥有更多的控制权和更少的开销 - 因为主机和插件之间(以及相反)的每个调用都需要进行编组 - C ++ 代码层会确保两个世界(托管和非托管)可以互相通信。但对于原型设计或较简单的(MIDI)插件,VST.NET的生产力远远超过本地的C ++ VST(SDK)。 - obiwanjacobi

3

我赞同Obiwanjacobi所说的。我已经使用VST.Net几个月了,它非常出色。

确实有理由使用C++,因为它可以更精细地控制CPU优化。但是,说C++代码一定比C#代码快是一个谬论。C#可以为你做很多艰苦的工作,如内存管理等等。基本上,当有人说C++比C#更快时,他们并没有真正进行苹果与苹果的比较。但是,语言选择毕竟是个人的选择。

我想加入这个链接,因为如果您要创建VST,您将需要控件。这是一组处于测试阶段的控件。它们专门为VST设计,外观可定制且轻量级。

https://bitbucket.org/MelbourneDeveloper/vst-controls-.net


3

斯坦伯格的VST插件架构已经存在了很长时间,首次发布于1996年。当然,.NET还需要6年时间,因此许多示例代码都是用C ++编写的。 VST v3使用COM使其更容易用其他语言开发插件,而不仅限于C ++。

有两种COM,一种是基于IUnknown接口的“纯”类型,另一种是基于IDispatch(也称为OLE Automation或ActiveX)的“实用”类型,现在只简称为Automation,因为“ActiveX”的知名度不再让人信服 :)

C#语言非常适合“实用”类型。 它支持类型库,这是一种描述由COM服务器实现的类型的文件格式。 在C#程序中非常容易使用,您只需添加对类型库的引用即可,它就像普通的.NET程序集一样运行。 然而,VST使用“纯”类型,您没有方便的类型库可用于导入接口声明。

仍然可以使用C#编写插件,但必须重新声明C#语言中的VST接口类型或使用C++/CLI包装器来弥补差距。 要正确完成此操作相当痛苦,但以前已经完成过。 就像这个开源项目。 或者这个。 顺便说一句,我不知道它们有多好,并非支持推广这些链接。 第一个链接是VST.NET。 它是一个托管包装器,不用于C ++。 在编译之后,它使用C++/CLI来处理本机互操作性。 第二个包装器现在不能使用,因为它需要斯坦伯格SDK。 最近已经停止使用了。 当然是凶兆。


1
VST有两个版本:2.x和3.x。最新的是基于接口的,这些接口兼容COM。2.x版本与COM无关,这是VST.NET支持的版本。许多人认为3.x膨胀并且没有什么好的理由使开发人员生活艰难。并非所有主机都支持VST的3.x版本。 - obiwanjacobi

0
  1. 如果您正在使用特定的 dll,请使用 p/invoke 创建一个包装器,实现 VST SDK 中详细说明的功能。
  2. 如果要为一组 VST 使用通用方法,请创建混合模式 ref class 包装器,并将文件名作为参数传递 - 您需要在 C++ 中执行此操作。该类在托管和非托管内存之间调度数据。
  3. 由于 VST3 是最新的 VST 标准,并且与 COM 兼容,因此请使用 COM 进行实例化。有些想法,请参见 如何使用 CLSID 在 C# 中实例化 COM 对象?

1
这不是一个答案,不应该作为答案发布,而应该作为评论发布。如果您无法发表评论,请尽可能以完整和详细的帖子回答,因为现在您并没有以任何方式帮助网站,反而鼓励了不良行为并污染了网站。如果您想讨论与社区相关的事情,请前往元社区。答案和评论不是用来讨论这些事情的。 - N.K
只是想得到一个问题的答案,当问及这个特定问题时,VST.NET 的推荐就是所有人得到的。没有任何关于广告的技术性内容。 - user9828709
然而,它对于回答提问者的问题足够好,以至于他选择将“广告”作为解决方案的正确答案,并承认在评论部分有所帮助。你不在这里决定答案是否对提问者的问题有用,我也不是,我们在这里标记被发布为无用的答案。每个问题都是不同的,以某种方式具体化的,如果你对这篇文章中的答案不满意,那么创建自己的问题,因为你不需要任何声望来做到这一点,并指定你不想使用VST.NET。 - N.K
VST3真的兼容COM吗?这将使它只能在Windows上运行。据我所知,如果您正确阅读文档,就会提到VST-MA“模拟”COM。 VST3 DLL不会公开DllRegisterServer和COM所需的其他函数,也不需要注册或具有并排清单。 - demberto

-7
原因很简单。C++ 是最低级别的高级语言之一。C# 和 Java 通常是 Web 应用程序或业务应用程序的最佳工具。对于多媒体应用程序,占用空间的大小与性能成指数和反比例关系,因此 C++ 不适用。 ;)

4
你能否引用参考文献来支持你的观点? - Brent Washburne
3
这让我眼睛难受。请不要混淆观点和事实。我认为你试图表达的是墨尔本开发者和obionejacobi上面所说的 - 所以最好什么都不说。 - increddibelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接