2011-05-12 144 views
6

我已經構建了一個獨立的應用程序版本的項目,直到現在只是一個VST/audiounit。我通過rtaudio提供音頻支持。實時midi輸入和音頻同步

我想添加MIDI支持使用rtmidi但我不清楚如何同步音頻和MIDI部分。

在VST/audiounit land中,我習慣於MIDI事件,它有一個時間戳,指示它們從音頻塊開始的樣本中的偏移量。

rtmidi提供自上一個事件以來的增量時間,但我不確定應該如何獲取這些事件,以及如何根據音頻線程中的當前樣本計算出他們的時間。

插件主機如何做到這一點?

我可以理解事件如何在播放時獲得準確的樣本,但尚不清楚在使用實時輸入時他們如何能夠獲得準確的樣本。

rtaudio給我一個回調函數。我將以低塊大小運行(32個樣本)。我想我會傳遞一個指向rtmidi實例的指針作爲回調的userdata部分,然後調用midiin-> getMessage(& message);裏面的音頻回調,但我不知道這是否線程合理。

非常感謝您能給我的任何提示

+0

MIDI永遠不會是精確的樣本,也不需要。 MIDI數據相對較慢。 – Brad 2011-05-12 14:14:35

回答

5

就您而言,您無需擔心。一旦它們到達,您的程序應該將MIDI事件發送給插件,時間戳記爲零。我認爲你可能誤解了「取樣準確」的含義。

由於@布拉德在他對你的問題的評論中指出,MIDI確實非常慢。但這只是問題的一部分......當您在基於塊的環境中工作時,傳入的MIDI事件無法由插件處理,直到塊開始。當計算機速度較慢並且塊大小爲512(或上帝禁止,> 1024)的情況很常見時,這就引入了一個不平凡的延遲時間,導致排列聽起來不那麼「緊密」。因此,順序器想出了一個巧妙的方法來解決這個問題。由於MIDI事件是事先已知的,所以這些事件可以提前一格發送到儀器,並在樣本幀中有一個偏移量。該插件然後在塊的開始處接收這些事件,並且知道不會開始實際處理它們,直到N樣本已經過去。這就是「精確採樣」意味着音序器。

但是,如果您正在處理來自鍵盤或某種其他MIDI設備的實時輸入,則無法「安排」這些事件。事實上,當你收到它們時,時鐘已經在滴答滴答了!因此,這些事件應該只在下一個塊的開始時發送到插件,並且偏移量爲0.僅允許插件同時接收預先排序和現場事件的Ableton Live等排序器只需發送任何實時事件與0幀的偏移量。

由於您使用的是一個非常小的塊大小,最壞的情況是延遲爲.7ms,這根本不算太糟糕。在rtmidi的情況下,時間戳不代表您需要計劃的偏移量,而是表示事件被捕獲的時間。但是既然你只打算接收現場直播活動(你不是寫一個音序器,是嗎?),你可以簡單地傳入任何傳入的MIDI到插件馬上。

+0

感謝尼克,這使得它更清晰。我得到了它的工作 – olilarkin 2011-05-16 17:51:05