12

以 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 输出保存到文件而不能回放,而且范围要小得多)

4

1 回答 1

10

好吧,既然你问了,像这样的项目的理想语言将是 C++。尽管有用于 VST SDK 的高级语言(例如 Java 和 .NET)的包装器,但我找不到用于 Ruby 的包装器(尽管我确实找到了这个相当酷的项目,它可以让您在 Ruby 中编写 VST 插件)。因此,您将不得不自己进行某种程度的 C/C++ 集成。

也就是说,您在这里基本上有两个选择:

  1. 用 C++ 编写一个 VST 主机,并将其作为一个单独的进程从 Ruby 中启动。
  2. 将您的 Ruby 代码直接集成到 VST SDK,并直接从您的代码中加载插件 DLL/Bundles。这可能是实现目标的更清洁但更难的方法。

不久前,我在我的博客上写了一个VST 主机编程教程,您可能会发现它在任何一种情况下都很有用。它详细介绍了如何在 Mac OSX 和 Windows 上打开 VST 插件并与之通信。一旦你让你的主机加载插件,你需要能够直接发送 MIDI 事件到插件,或者通过从文件中读取它们,或者在你的 Ruby 代码和 VST 主机之间进行某种类型的通信(即,一个命名管道、套接字、文件等)。如果您不熟悉 MIDI 协议,请查看以下链接:

您可能已经知道,VST 本质上是一个基于块的协议。您从插件请求小块音频数据,并在插件处理相应块之前将任何 MIDI 事件发送到插件。确保不要忽略 MIDI delta 字段;这将确保插件直接在所需样本上开始处理 MIDI 事件。否则,插件听起来会有点不合时宜,尤其是在乐器的情况下。

VST SDK 也基于浮点块,因此您返回的任何数据都将包含 { -1.0 .. 1.0 } 范围内的单个样本。根据您所需的输出格式,您可能需要将它们转换为其他格式。幸运的是,audiofile library 似乎有一个Ruby 绑定,因此您可以将输出发送到其中以生成正确的 AIFF/WAV 文件。

总而言之,要达到你想要的最终目标将是相当多的工作,但这绝不是不可能的。祝你好运!

于 2010-06-26T13:59:45.380 回答