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

Posted

技术标签:

【中文标题】每个 VST SDK 似乎都是针对 C++ 的,那么 C# 呢?【英文标题】:Every VST SDK seems to be for C++, what about C#? 【发布时间】:2014-01-11 15:27:16 【问题描述】:

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

现在我刚刚购买了 C# 书籍,认为它会是一门不错的语言(不仅仅是用于 vst 编程),但每个人都在说 C++ 是要走的路,而 VST.NET 似乎是 C++ ....似乎在我的 C# 道路上一切都对我不利?

我的脑海中有“编程思维”,但自从我编写 Visual Basic、Turbo Pascal 等程序以来,那是几年前的事了。所以我的开始很干净。

您的建议是什么,出售我的新 C# 书籍(或将它们藏在书架中)并瞄准 C++,还是 C# 仍然可以?我一直认为 C++ 比 C# 更复杂,要学习。

顺便说一句,VST.NET SDK for C++,它可以以某种方式用于C#吗?

【问题讨论】:

【参考方案1】:

VST.NET 不适用于 C++。你从哪里得到这个想法的?转到 VST.NET 的代码并查看示例。这会让事情变得更清楚 - 我希望。

希望对您有所帮助。 马克 VST.NET 和 MIDI.NET 的作者

【讨论】:

我不知道我在哪里看到说 VST.NET 不适合的东西。要么我认为我需要使用旧版本的 Visual Studio C#.net,要么我看到有人说 C# 太慢了,我应该学习 C++。 确实,如果你想用低 CPU 使用率的复杂 DPS 算法进行极快的手动优化组装,你应该选择 C++。与 .NET 相比,为您提供更多的控制权和更少的开销 - 因为主机和插件之间的每次调用(反之亦然)都是编组的 - 一个 C++ 代码层,可确保两个世界(托管和非托管)可以相互通信。但对于原型设计或更简单的 (MIDI) 插件,VST.NET 的生产力远高于原生 C++ VST (SDK)。【参考方案2】:

Steinberg 的 VST 插件架构已经有很长一段时间了,1996 年首次发布。.NET 当然还需要 6 年,所以当然很多示例代码都是用 C++ 编写的。 VST v3 使用 COM 可以更轻松地以 C++ 以外的语言开发插件。

有两种 COM,一种基于 IUnknown 接口的“纯”类型。而基于 IDispatch 的“实用”类型,也称为 OLE 自动化或 ActiveX,这些天只是称为自动化,因为“ActiveX”的名称识别不再灌输信心:)

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

仍然可以使用 C# 编写插件,您必须在 C# 语言中重新声明 VST 接口类型或使用 C++/CLI 包装器来弥补差距。把这件事做好是很痛苦的,但以前已经做过了。就像在这个open source project 中一样。或this one。不知道他们有多好,不是认可。第一个链接用于 VST.NET。它是一个托管包装器,不适用于 C++。无论如何编译后,它使用 C++/CLI 来处理本机互操作。第二个包装器不再完全可用,因为它需要 Steinberg SDK。最近才停产。当然是不祥之兆。

【讨论】:

VST 有两种版本 2.x 和 3.x。最新的是基于接口的,这些接口与 COM 兼容。 2.x 版本与 COM 无关,是 VST.NET 支持的版本。许多人认为 3.x 过于臃肿,无缘无故让开发人员的生活变得艰难。并非所有主机都支持 3.x 版本的 VST。【参考方案3】:

我想要第二个 Obiwanjacobi。我已经使用 VST.Net 好几个月了,非常棒。

使用 C++ 肯定是有理由的,因为它确实允许对 CPU 优化进行更细粒度的控制。但是,说 C++ 代码一定比 C# 代码快是一个神话。 C# 为你做了很多艰苦的工作,比如内存管理等等。基本上,当有人说 C++ 比 C# 快时,他们并没有真正将苹果与苹果进行比较。但是,语言是个人选择。

我想我会添加此链接,因为如果您要创建 VST,您将需要控件。这是测试阶段的一组控件。它们是为 VST 设计的。它们可剥皮且重量轻。

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

【讨论】:

【参考方案4】:
    如果使用一个特定的 dll,请使用 p/invoke 创建一个包装器,实现 VST SDK 中详述的功能。 如果对一组 VST 使用通用方法,请创建混合模式 ref 类包装器,将文件名作为参数传递 - 您需要在 C++ 中执行此操作。此类在托管和非托管内存之间封送数据。 由于 VST3 是最新的 VST 标准,并且与 COM 兼容,因此请使用 COM 进行实例化。有关一些想法,请参阅How do I go about instantiating a COM Object in C# by CLSID?

【讨论】:

Annnnd 这不是一个答案,不应该作为评论发布,如果你不能发表评论,那么尽可能用完整和详细的帖子来回答,因为它是正确的知道您没有以任何方式帮助该网站,而是鼓励不良行为并污染该网站。如果您想谈论与社区相关的事情,请前往元数据。答案和评论不在这里。 只是想要一个问题的答案,任何人在问这个特定问题时都会得到对 VST.NET 的建议。广告没有任何技术性。 然而它很好地回答了 OP 的问题,让他选择了一个“广告”作为问题的正确答案,并在评论部分承认它有帮助。您不是在这里决定答案是否对 OP 的问题有用,我也不是,我们在这里标记无用的答案,而不是更多。每个问题都是不同的,以某种方式具体,如果您对这篇文章的答案不满意,请创建您自己的问题,因为您不需要任何代表来执行此操作,并指定您不想使用VST.NET。 VST3 真的兼容 COM 吗?这将使其仅适用于 Windows。 AFAIK,如果您正确阅读文档,就会提到 VST-MA“模仿”COM。 VST3 DLL 不会暴露DllRegisterServer 和 COM 所需的朋友,也不需要注册或具有并行清单【参考方案5】:

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

【讨论】:

你能引用参考文献来支持你的观点吗? 这伤害了我的眼睛。请不要将观点与事实混淆。我认为你想说的是上面的墨尔本开发商和 obionejacobi 所说的 - 所以最好什么都不说。

以上是关于每个 VST SDK 似乎都是针对 C++ 的,那么 C# 呢?的主要内容,如果未能解决你的问题,请参考以下文章

如何在.net框架上使用vst sdk

VST SDK & VST 模块 SDK

Xcode 4 和 VST 模块架构 SDK

如何在 FMOD Ex 中实现 VST 插件?

在 Windows 上设置 VST Steinberg SDK

如何将我的 .vst3 插件提供给其他人?