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

14
例如,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++库(http://www.juce.com/)可能是构建此类系统的良好起点;它具有用于MIDI、音频、插件托管和插件编写的类,并且经过了充分测试并广泛使用。 - btown
1个回答

12

好的,既然您问了,对于这样的项目来说,理想的语言将是C++。虽然有一些高级语言的包装器,比如Java和.NET适用于VST SDK,但我没有找到Ruby的包装器(尽管我发现了这个相当酷的项目,它让你可以使用Ruby编写VST插件)。因此,您需要自己进行一定程度的C/C++集成。

话虽如此,在这里您基本上有两个选择:

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

我曾经在我的博客上写过一篇关于VST主机程序设计的教程,您可能会发现它在任何情况下都很有用。它详细介绍了如何在Mac OSX和Windows上打开和与VST插件通信。一旦您让主机加载插件,您就需要能够直接向插件发送MIDI事件,可以通过从文件读取它们或者通过您的Ruby代码和VST主机之间的某种通信(例如命名管道、套接字、文件等)来实现。如果您不熟悉MIDI协议,请查看以下链接:

你可能已经了解到,VST基本上是一个块(block)协议。你从插件请求小块的音频数据,并在它处理相应的块之前将任何MIDI事件发送到插件中。一定要不忽略MIDI delta字段;这将确保插件直接在所需的采样上开始处理MIDI事件。否则,在乐器的情况下,插件会听起来有点跑调。

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

总的来说,达到您想要的最终目标需要一定的工作量,但这绝非不可能。祝好运!


我绝对没有想到会得到这么有帮助的答案 =) 非常感谢! - Justin L.
很高兴能够帮忙。你最终找到了解决方案或混合解决方案来完成你的项目吗? - Nik Reiman
我认为教程的链接已经改变了。这是新地址:http://teragonaudio.com/article/How-to-make-your-own-VST-host.html - Zsolti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接