2010-06-26 41 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

相關問題