代码之家  ›  专栏  ›  技术社区  ›  Justin L.

我该如何通过编程与VST(i)插件交互来合成音频?

  •  9
  • Justin L.  · 技术社区  · 14 年前

    以VSTi为例 Triforce 在TweakBench。当加载到市场上的任何VST主机时,它允许主机向VSTI发送一个(大概是MIDI)信号。然后,VSTI将处理该信号并输出由 软件仪表 在VSTI中。

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

    让我说我有 三力 我正在尝试用我选择的语言编写一个程序,它可以通过发送一个要合成的A4注释来与VSTI交互,并自动将其保存到系统上的一个文件中?

    最后,我希望能够解析一个完整的单轨MIDI文件(使用已经为此目的提供的稳定库),并将其发送到VSTI以“呈现”/将其合成为音频文件。

    我该怎么办呢? 什么语言 我应该寻找构建核心框架吗?

    最终,它将被用于基于Ruby的项目中,所以任何指向特定Ruby资源的指针都是不错的。

    然而,我只是试图理解基本上 VSTI的API如何工作 . (我已经意识到这个问题与首先构建一个VST主机的问题非常相关,尽管这个问题只能将VST输出保存到文件中,而不能回放它们,而且范围要小得多)

    提前感谢任何帮助=)

    1 回复  |  直到 14 年前
        1
  •  8
  •   Nik Reiman    14 年前

    既然你问过,像这样的项目的理想语言是C++。尽管对于VST SDK有更高级语言如Java&N.NET的包装,但我找不到露比的一个(虽然我确实找到了这个让你很酷的项目)。 program VST plugins in Ruby )因此,你将被困在某种程度上的C/C++集成在你自己的。

    也就是说,这里基本上有两种选择:

    1. 在C++中编写一个VST主机,并将它作为一个独立的进程从Ruby中启动。
    2. 将您的Ruby代码直接集成到VSTSDK中,并直接从代码中加载插件dll/bundles。这可能是实现目标的更清洁但更困难的方法。

    我写了一篇文章 VST host programming tutorial 在我的博客上呆一段时间,你可能会发现在这两种情况下都有用。它详细说明了如何在Mac OSX和Windows上打开和与VST插件通信。一旦你让你的主机加载插件,你需要能够直接发送MIDI事件到插件,要么从文件中读取它们,要么你的Ruby代码和VST主机之间的某种类型的通信(例如,命名管道、套接字、文件等)。如果您不熟悉MIDI协议,请查看以下链接:

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

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

    总之,要达到你想要的最终目标,这是一项相当大的工作,但无论如何,这并非不可能。祝你好运!