以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输出保存到文件而不能播放它们,并且范围要小得多)
提前感谢您的任何帮助=)
答案 0 :(得分:8)
好吧,既然你问过,像这样的项目的理想语言将是C ++。虽然有更高级语言的包装器,如Java&用于VST SDK的.NET,我找不到Ruby的版本(尽管我确实找到了这个相当酷的项目,它允许你program VST plugins in Ruby)。因此,您将无法自己进行某种程度的C / C ++集成。
那就是说,你基本上有两个选择:
我在我的博客上写了一段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文件。
总而言之,达到理想的最终目标将是一项相当大的工作,但这绝不是不可能的。祝你好运!