2011-09-06 249 views
1

我創建了一個MIDI播放器,但問題也出現在視頻/聲音播放器中。我在發送MIDI事件之間使用usleep/Sleep功能。當CPU不是很忙時這很好,但當CPU忙時音樂會變慢。視頻/聲音/ MIDI播放器時間

我想我需要得到一個「全球時間」,並作出更正。什麼是便攜式(Windows/Linux)方式(庫?)來做到這一點?

標準庫日期/時間函數的精度爲1s。我需要1ms的至少(1美元將是首選,但我想這是不可能在Windows上)...提升是大的我的小球員;)

感謝 斯坦

+0

你正在寫一個播放器來發送MIDI事件到一個現有的合成器,或者你在寫合成器接受事件嗎? – AShelly

回答

1

睡眠的確是一個糟糕的主意,因爲你根本不知道你真的睡了多久,而且你可能會用你的主線程的其他部分。

你想要做的是確保你的MIDI事件在正確的時間發送。提前發送消息並使用時間戳會讓MIDI系統在正確的時間發送這些事件。也就是說,如果你有一個有時間戳的MIDI API。

Mac/iOS上的MIDI API:CoreMIDI運行良好,發送時可以爲您的MIDI事件添加時間戳。

MIDI API的Windows:傳統MME API沒有時間戳。 DirectMusic確實添加了時間戳,因此它取決於您試圖發送MIDI的位置,以確定您可以使用哪個API。

Linux上的MIDI API:我相信有些ALSA項目允許在發送MIDI事件時使用時間戳。雖然看起來原始的ALSA MIDI沒有時間戳。 1]如果沒有時間戳系統(例如MME,ALSA raw),您需要設置一個定時器,儘可能頻繁地調用您,並使用系統時間來確定哪些MIDI事件需要立即發送。這將工作正常,除非系統非常繁忙,並且定時器變慢。

2]使用時間戳系統(例如CoreMIDI,DirectMusic),您基本上對Timer執行相同的操作,但是您可以將所有將要發生的消息發送到MIDI API並提供時間戳讓MIDI API準確知道事件應該發送的時間。