我将如何以编程方式与 VST(i) 插件交互以合成音频?
Posted
技术标签:
【中文标题】我将如何以编程方式与 VST(i) 插件交互以合成音频?【英文标题】:How would I go about programmatically interacting with VST(i) Plugins to synthesize audio? 【发布时间】:2010-06-26 04:32:35 【问题描述】:以 Tweakbench 的 VSTi Triforce 为例。当加载到市场上的任何 VST 主机中时,它允许主机向 VSTi 发送(可能是 MIDI)信号。然后 VSTi 将处理该信号并输出由 VSTi 内的软件工具创建的合成音频。
例如,向 VSTi 发送一个 A4(我相信是 MIDI 音符)将导致它合成中间 C 之上的 A。它将音频数据发送回 VST 主机,然后它可以在我的扬声器上播放它或将其保存为 .wav 或其他一些音频文件格式。
假设我有 Triforce,并且正在尝试用我选择的语言编写一个程序,该程序可以通过发送要合成的 A4 笔记来与 VSTi 交互,并自动将其保存到系统上的文件?
最终,我希望能够解析整个单轨 MIDI 文件(使用已建立的稳定库)并将其发送到 VSTi 以“渲染”/合成为音频文件.
我将如何做?我应该使用哪种语言来构建核心框架?
最终,它将在基于 Ruby 的项目中使用,因此任何指向特定 Ruby 资源的指针也会很好。
但是,我只是想了解 VSTi 的 API 是如何工作的。 (我已经意识到这个问题与首先构建 VST 主机的问题非常相关,尽管它只能将 VST 输出保存到文件而不能回放,而且范围要小得多)
【问题讨论】:
对于将来发现这个问题的任何人,JUCE C++ 库 (juce.com) 可能是构建这样一个系统的一个很好的起点;它有用于 MIDI、音频、插件托管和插件编写的类,并且经过良好测试和广泛使用。 【参考方案1】:好吧,既然你问了,像这样的项目的理想语言将是 C++。尽管有用于 VST SDK 的高级语言(例如 Java 和 .NET)的包装器,但我找不到用于 Ruby 的包装器(尽管我确实找到了这个相当酷的项目,它可以让您program VST plugins in Ruby)。因此,您将不得不自己进行某种程度的 C/C++ 集成。
也就是说,您基本上有两种选择:
-
用 C++ 编写 VST 主机,并将其作为独立进程从 Ruby 中启动。
将您的 Ruby 代码直接集成到 VST SDK,并直接从您的代码加载插件 DLL/Bundles。这可能是实现目标的更简洁但更难的方法。
不久前我在我的博客上写了一个VST host programming tutorial,您可能会发现它在任何一种情况下都很有用。它详细介绍了如何在 Mac OSX 和 Windows 上打开 VST 插件并与之通信。一旦你让你的主机加载插件,你需要能够直接发送 MIDI 事件到插件,或者通过从文件中读取它们,或者在你的 Ruby 代码和 VST 主机之间进行某种类型的通信(即,一个命名管道、套接字、文件等)。如果您不熟悉 MIDI 协议,请查看以下链接:
The MIDI technical fanatic's brainwashing center(愚蠢的名字,严肃的资源) The Sonic Spot's MIDI file specification(如果您需要读取 MIDI 文件)您可能已经知道,VST 本质上是一个基于块的协议。您从插件请求小块音频数据,并在插件处理相应块之前将任何 MIDI 事件发送到插件。确保不忽略 MIDI delta 字段;这将确保插件直接在所需样本上开始处理 MIDI 事件。否则,插件听起来会有点不合时宜,尤其是在乐器的情况下。
VST SDK 也基于浮点块,因此您返回的任何数据都将包含 -1.0 .. 1.0 范围内的各个样本。根据您所需的输出格式,您可能需要将它们转换为其他格式。幸运的是,似乎有一个Ruby binding for the audiofile library,因此您可以将输出发送到其中以生成正确的 AIFF/WAV 文件。
总而言之,要实现您想要的最终目标需要做大量的工作,但这绝不是不可能的。祝你好运!
【讨论】:
我绝对没想到会有这么有用的答案 =) 非常感谢! 很高兴我能帮上忙。您最终是否为您的项目找到了一个好的解决方案或解决方案组合? 很棒的答案,这对我很有帮助。谢谢!以上是关于我将如何以编程方式与 VST(i) 插件交互以合成音频?的主要内容,如果未能解决你的问题,请参考以下文章