2010-06-26 56 views
9

以Tweakbench的VSTi Triforce为例。当加载到市场上的任何VST主机时,它允许主机向VSTi发送(推测为MIDI)信号。然后VSTi将处理该信号并输出​​由VSTi内的软件仪器创建的合成音频。我将如何通过编程方式与VST(i)插件合成音频?

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

比方说,我有三角力量,和我想在我的选择,可以通过在A4笔记发送带有的VSTi互动的语言来编写一个程序来进行合成,并自动将其保存到文件系统上?最终,我希望能够解析一个完整的单轨MIDI文件(使用已建立的稳定库可用于此目的),并将其发送给VSTi以“渲染”/将其合成为音频文件。

我该怎么做,并在什么语言我应该看看建立核心框架?最终,它将用在基于Ruby的项目中,所以任何指向特定Ruby资源的指针都会很好。

但是,我只是想基本上了解VSTi的API如何工作。 (我已经意识到,这个问题与首先构建VST主机的问题非常相关,尽管只能将VST输出保存并不播放,并且范围要小得多)

在此先感谢您的帮助=)

+0

对于任何未来会发现这个问题的人来说,JUCE C++库(http://www.juce.com/)可能是构建这样一个系统的一个很好的起点;它具有用于MIDI,音频,插件托管和插件写作的类,并且经过了充分测试和广泛使用。 – btown 2013-12-14 00:06:56

回答

8

好吧,既然您问过,像这样的项目的理想语言将是C++。虽然有高级语言的包装器,例如用于VST SDK的Java & .NET,但是我找不到一个适用于Ruby的包(虽然我确实发现这个非常酷的项目可以让你program VST plugins in Ruby)。所以你会被卡在某种程度上自己完成C/C++集成。

这就是说,你已经基本上两个选项:

  1. 写C++中的VST主机,并启动它从内红宝石一个单独的进程。
  2. 将您的Ruby代码直接集成到VST SDK,并直接从代码加载插件DLL/Bundles。这可能是实现您的目标的更干净但更难的方法。

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

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

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

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

+0

我绝对没有想到这个答案有帮助=)非常感谢你! – 2010-06-26 15:33:43

+0

很高兴我能帮上忙。你最终是否为你的项目找到了一个好的解决方案或混合解决方案? – 2010-07-07 07:18:26

+0

真棒回答,这真的帮了我。谢谢! – Leif 2013-06-01 13:36:57