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

时间:2010-06-26 04:32:36

标签: ruby audio midi vst synthesizer

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

提前感谢您的任何帮助=)

1 个答案:

答案 0 :(得分:8)

好吧,既然你问过,像这样的项目的理想语言将是C ++。虽然有更高级语言的包装器,如Java&用于VST SDK的.NET,我找不到Ruby的版本(尽管我确实找到了这个相当酷的项目,它允许你program VST plugins in Ruby)。因此,您将无法自己进行某种程度的C / C ++集成。

那就是说,你基本上有两个选择:

  1. 用C ++编写VST主机,并将其作为一个独立的进程从Ruby中启动。
  2. 将您的Ruby代码直接集成到VST SDK,并直接从您的代码加载插件DLL / Bundles。这可能是实现目标的更简洁,更难的方式。
  3. 我在我的博客上写了一段VST host programming tutorial,你可能会发现这两种情况都很有用。它详细介绍了如何在Mac OSX和Windows上打开VST插件并与之通信。一旦你让你的主机加载插件,你需要能够直接将MIDI事件发送到插件,方法是从文件中读取它们或者在Ruby代码和VST主机之间进行某种类型的通信(即,命名管道,套接字,文件等)。如果您不熟悉MIDI协议,请查看以下链接:

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

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

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