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

Ruby 我如何通过编程与VST(I)插件交互来合成音频?,ruby,audio,midi,vst,synthesizer,Ruby,Audio,Midi,Vst,Synthesizer,例如,通过Tweakbench开发的VSTi。当加载到市场上的任何VST主机中时,它允许主机向VSTi发送(可能是MIDI)信号。然后,VSTi将处理该信号并输出由VSTi内的软件仪器创建的合成音频 例如,将A4(我相信是MIDI音符)发送到VSTi将导致它合成中间C以上的A。它将音频数据发送回VST主机,然后它可以在我的扬声器上播放或将其保存为.wav或其他音频文件格式 比如说,我有Triforce,我正试图用我选择的语言编写一个程序,通过发送一张要合成的A4便笺,并自动将其保存到系统上的一个

例如,通过Tweakbench开发的VSTi。当加载到市场上的任何VST主机中时,它允许主机向VSTi发送(可能是MIDI)信号。然后,VSTi将处理该信号并输出由VSTi内的软件仪器创建的合成音频

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

比如说,我有Triforce,我正试图用我选择的语言编写一个程序,通过发送一张要合成的A4便笺,并自动将其保存到系统上的一个文件中,该程序可以与VSTi交互

最后,我希望能够解析一个完整的单轨MIDI文件(使用已建立的、稳定的库),并将其发送到VSTi“渲染”/“合成”为音频文件

我将如何着手,我应该用什么语言来构建核心框架

最终,它将用于一个基于Ruby的项目中,因此任何指向特定Ruby资源的指针都会很好


然而,我只是想从根本上理解VSTi的API是如何工作的。(我意识到,这个问题与建立VST主机的问题非常相关,尽管它只能保存VST输出文件,而不回放它们,而且范围小得多)

< P>,既然你问过,这样的项目的理想语言是C++。尽管有一些高级语言的包装器,比如VSTSDK的Java和.NET,但我找不到Ruby的包装器(尽管我确实找到了这个非常酷的项目,它让您可以使用它)。因此,您将不得不自己进行某种程度的C/C++集成

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

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

    • (愚蠢的名字,严肃的资源)
    • (如果您需要读取MIDI文件)
    正如您可能已经了解到的,VST基本上是一个基于块的协议。您从插件请求小块音频数据,并在插件处理相应块之前将任何MIDI事件发送到插件。确保不要忽略MIDI增量字段;这将确保插件直接在所需样本上开始处理MIDI事件。否则,插件的声音会有点不协调,尤其是在乐器的情况下

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


    总的来说,要达到你想要的最终目标需要付出相当多的努力,但无论如何这都不是不可能的。祝你好运

    我绝对没想到会有这么有用的答案(谢谢你!很高兴我能帮上忙。你最终是否为你的项目找到了一个好的解决方案或解决方案的组合?真棒的答案,这真的帮助了我。谢谢对于将来发现这个问题的人来说,JULSC++库()可能是构建这样一个系统的好起点;它有MIDI类、音频类、插件托管类和插件编写类,并且经过了良好的测试和广泛的使用。