2013-01-13 54 views
11

澄清:我不想生成MIDI文件,也不想播放MIDI文件,我希望隨時播放MIDI音符。如何使用JavaScript播放任意MIDI音符?

我嘗試使用https://github.com/mudcube/MIDI.js作爲MIDI庫,它有點作用。

我可以通過撥打MIDI.noteOn(0,midiNumber,100);來播放音符。但是,這會在幾秒鐘內播放一個音符,然後即使我從不撥打MIDI.noteOff也會減少音量。

我不相信這是MIDI如何工作。我希望能夠打電話給noteOn並進行音符演奏並保持到noteOff被調用。

目標瀏覽器:現代的Firefox/Chrome。

回答

9

這是一個錯誤的MIDI.js的版本:

var playChannel = function (id) { 
    var note = notes[id]; 
    if (!note) return; 
    var nid = (channel_nid + 1) % channels.length; 
    var time = (new Date()).getTime(); 
    var audio = channels[nid]; 
    channel_map[note.id] = audio; 
    audio.src = MIDI.Soundfont[note.id]; 
    audio.volume = volume; 
    audio.play(); 
    channel_nid = nid; 
}; 

正如你可以看到playChannel會加載一個給定的說明和發揮它。由於沒有autoloop屬性,所以不會重複,因此noteOff的調用不是必需的。如果將audio元素設置爲自動循環,則可以自己修復此問題。

+2

哇。很高興發現了一個錯誤。 +1,但是你不想提出拉取請求嗎? – 2013-01-13 08:36:59

+0

@ H2CO3:我目前不在我的電腦,我仍然不習慣github界面(我更喜歡bitbucket)。但是,我相信有些應用程序使用這個bug,並會停止工作,因爲他們沒有使用'noteOff'(畢竟可能是可能的)。也許在〜11h(21:00 UTC + 1)。 – Zeta

+0

啊,我在閱讀代碼時發現了這個錯誤,但不太清楚修復是什麼。看到一些實現在noteOff()中甚至沒有任何代碼,這個bug實際上可能是一個預期的設計缺陷。我同意你爲了遺留目的而修改代碼的問題。你應該改爲創建一個fork請求。現在我只是猴子補丁,看看它是否工作。 –

1

Google for Web MIDI API。 尚未在所有瀏覽器中實現,但在GitHub上有Chris Wilson的polyfill。

2

不同的樂器表現不同。鋼琴有一個「內在」的音符,但一個器官沒有。

此外,noteOnnoteOff取決於實施。 modcu.be在HTML5實現中爲每個音符播放一個OGG文件,它完全不關心noteOff。當OGG結束時,聲音停止。在這種情況下,autoloop對於鋼琴無濟於事。