我将如何以编程方式与VST交互(i)插件来合成音频?

Tweakbench的VSTi Triforce为例。 当加载到市场上的任何VST主机中时,它允许主机向VSTi发送(可能是MIDI)信号。 然后,VSTi将处理该信号并输出​​由VSTi内的软件仪器创建的合成音频。

例如,向VSTi发送A4(我相信的MIDI音符)将使其合成中间C上方的A。它将音频数据发送回VST主机,然后VST主机可以在我的扬声器上播放或保存它.wav或其他一些音频文件格式。

假设我有Triforce ,并且我试图用我选择的语言编写一个程序,它可以通过发送要合成的A4音符与VSTi进行交互,并自动将其保存到系统上的文件中?

最后,我希望能够解析整个单轨MIDI文件(使用已经可用于此目的的已建立的稳定库)并将其发送到VSTi以“渲染”/合成为音频文件。

我将如何解决这个问题,以及我应该用什么语言来构建核心框架?

最终,它将用于基于Ruby的项目,因此任何指向特定Ruby资源的指针都会很好。

但是,我只是想了解一下VSTi的API是如何工作的 。 (我已经意识到这个问题与构建VST主机的问题非常相关,尽管只能将VST输出保存到文件中而不能播放它们,而且范围要小得多)

在此先感谢任何帮助=)

好吧,既然你问过,像这样的项目的理想语言将是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协议,请查看以下链接:

  • MIDI技术狂热者的洗脑中心 (愚蠢的名字,严肃的资源)
  • Sonic Spot的MIDI文件规范 (如果您需要读取MIDI文件)

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

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

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