根據蘋果的文檔,它說:如何正確使用MIDIReadProc?
因爲你MIDIReadProc回調是從單獨的線程調用, 使用 回調提供的數據時,要注意的同步問題。
這是否意味着,使用@synchronize做安全線程阻塞?
或者這是否意味着同步計時問題可能會發生?
我正在嘗試讀取midi文件,並使用MIDIReadProc觸發基於MIDI事件的軟件合成器的音符/音符。我需要這是非常可靠和完美的時間。現在,我注意到,當我使用這些midi事件並將音頻寫入緩衝區(全部由MIDIReadProc完成)時,時序非常渺茫,聽起來沒有任何問題。所以我想知道,從MIDIReadProc中消耗midi事件的「正確」方式是什麼?
另外,是MIDIReadProc是從MIDI文件中消耗MIDI事件的唯一選擇嗎?
就設置可以被我的合成器直接消耗的虛擬端點而言,還有其他選擇嗎?如果是這樣,那究竟是如何工作的?
但是您沒有提及如何「將它傳遞給控制器」,以便它可以在特殊的midiReadProc高優先級線程之外處理。顯然,我需要將這些數據包存儲到主線程可以使用並轉換爲音頻的數據結構中。如何正確地做到這一點?理想情況下,我想要一個多維數組,因此我可以執行數據包[midiChannel] [currentChannelPacketIndex] = *數據包...但我不知道如何分配給定通道上的總共多少個數據包,以便我可以正確分配該存儲的內存。 – patrick
@patrick,你的假設「主線程可以消耗某些東西並轉化爲音頻」或者似乎有措辭問題,或者不完全確切。只要在實時渲染線程上完成音頻製作/消費,主線程就只關注GUI更新,這是時間選擇最有效的選擇。關於將MIDI生成的數據傳遞給控制器,如果您只是將其傳遞給控制器,您仍然需要將數據包解碼爲渲染線程將理解的內容。你的問題相當廣泛,我會盡快調整我的答案。 – user3078414
「關於播放MIDI文件,如果您想處理任意複雜的流或文件,您可能會遇到意外。」 - 那是我的問題。我正嘗試傳輸一個185bpm的midi文件,其中最快的音符是第16個,這聽起來像是一場絕對的災難.. – patrick