2010-08-02 80 views
12

我做了一些研究,似乎JavaScript和MIDI近來不太合拍。谷歌說至少如此。從Javascript生成現場MIDI

正如本主題中所述: generating MIDI in javascript,可以在Javascript或服務器端創建一個文件,並像播放普通文件一樣播放它。

但是,我真的希望能夠發送各種midi活動,「活」,因爲這將是一個不斷的用戶交互。 我想我的計劃B將創建一個Java applet來做到這一點,但是我的應用程序不再是純HTML5了。

我也聽說過HTML5的音頻支持現在不是很出名,所以我也想知道,如果現在沒有解決方案,那麼未來可能會有哪些結果?

謝謝。

回答

3

查看this blog post by John Resig的音樂嵌入部分。 (出於某種原因,Resig鏈接的Mario遊戲在Firefox中播放聲音,但不是Chrome或Safari;這是值得研究的原因)。

想法是,您使用data URI在HTML文件本身內嵌入base64編碼版本的數據。所以你可以寫Javascript來連續生成MIDI format,然後encode it in base64,然後將其注入到HTML5 <audio>元素

+0

這就是我已經在做的整個序列,我會認爲我必須堅持它來播放單個音符。問題在於延遲有點明顯,即使它並不那麼大。但我猜想沒有使用Java applet,這是目前最好的解決方案。 – Manux 2010-08-07 17:10:48

+0

你能發佈一個到你的代碼的鏈接嗎?通過在背景中持續生成色調並創建多個音頻元素來填充它們,可以減少延遲。 – 2010-08-07 18:49:17

0

如果html5是一個選項,您可以嘗試使用websockets生成osc事件並使用服務器代理將它們轉換爲midi信號。

我不知道的是,如果JavaScript中的計時器足夠穩定以產生準確的計時。

+0

等待,所以我將不得不將音樂流到客戶端?以那個速度,我不明白我爲什麼會使用OSC。或者,一旦我在客戶端的機器上獲得了MIDI信號,我應該在哪裏發送它們:^? – Manux 2010-08-02 18:45:47

+0

osc事件不是流式傳輸到用途的現場音樂,而是通過udp或tcp傳輸的控制信號。在桌面上,您可以運行一個小型代理,將osc事件轉換爲midi信號,並將其發送到您想要控制的midi設備 – 2010-08-02 19:01:24

+0

因此,我必須在客戶機上安裝該代理服務器?我想我不能用Javascript做到這一點。 – Manux 2010-08-02 19:11:15

1

我相信您目前的最佳選擇是通過xhr或websockets從您的HTML應用程序與您的服務器上運行的後端系統進行通信,該系統可以實際轉換爲midi事件。你可能會發現許多已經可用的彗星服務器中的一個可以讓你的生活變得更輕鬆,然而許多midi應用程序需要相對較低的延遲,並且你會很難讓彗星技術的下降遠低於100ms。

+0

這並沒有真正的幫助,我仍然需要找到一種方法將MIDI事件發送到客戶端的操作系統。 – Manux 2010-08-06 17:48:29