我正在與另一個論壇上的一些開發人員就準確生成MIDI事件(注意消息等)進行辯論。人耳對微小的時序誤差非常敏感,我認爲他們的主要問題來自於他們使用分辨率相對較低的定時器,這些定時器將其事件量化爲15毫秒左右(其大小足以導致可察覺的不準確性)。大約10年前,我寫了一個示例應用程序(Windows 95上的Visual Basic 5),它是一個軟件合成器和MIDI播放器的組合。基本前提是一個跨越緩衝區回放系統,每個緩衝區的持續時間爲十六分音符(例如:每分鐘120個四分音符,每個四分音符爲500毫秒,因此每個十六分音符爲125毫秒,所以每個緩衝區是5513個樣本)。每個緩衝區都通過waveOutWrite方法播放,並使用此方法的回調函數排隊下一個緩衝區併發送MIDI消息。這保持了基於WAV的音頻和MIDI音頻的同步。waveOutWrite API方法的回調的延遲(或延遲)時間是多少?
在我耳邊,這種方法非常奏效 - MIDI音符聽起來甚至略微失調(如果您使用普通定時器精確到15毫秒來播放MIDI音符,它們會聽起來明顯失調)。
理論上,這種方法可以產生精確到樣本的MIDI定時,或0.0227毫秒(因爲每毫秒有44.1個樣本)。我懷疑這是這種方法的真正延遲,因爲大概在緩衝區結束和waveOutWrite回調被通知時間之間有一些小的延遲。有誰知道這個延遲實際上有多大?
來看着你在寫播放同步沒有延遲,延遲在WaveOut中是聲波變化和其實際播放之間的最小延遲。我的經驗是,WaveOut適用於延遲> 64ms(更好的更短的緩衝區最好在我的情況下是8x8ms的緩衝區)。還測試了DirectSound,但它的shit延遲> 400ms(對我的目的不可用),還有bufer查詢回調由於API中的錯誤而無法工作(我有DS最後在XP上測試過,並且沒有使用過)。 – Spektre 2013-09-20 13:53:08