我如何使用javascript播放任意MIDI音符

How do I play arbitrary MIDI notes with javascript?

本文关键字:任意 MIDI 音符 播放 javascript 何使用      更新时间:2023-09-26

澄清一下:我不想生成MIDI文件,也不想播放MIDI文件,我希望在飞行中播放MIDI音符。

我试着使用https://github.com/mudcube/MIDI.js作为MIDI库,它有点工作。

我可以通过调用MIDI.noteOn(0,midiNumber,100);来演奏音符。然而,这播放一个音符几秒钟,然后逐渐减少,即使我从来没有调用MIDI.noteOff

我不相信这是MIDI的工作方式。我希望能够调用noteOn,并有一个音符播放和维持,直到noteOff被调用。

适用浏览器:现代firefox/chrome。

这是你的MIDI.js版本的bug:

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将加载一个给定的音符并播放它。因为没有自动循环属性,所以它不会重复,所以没有必要调用noteOff。如果您将audio元素设置为auto-loop,则可以自己解决此问题。

或者,http://mohayonao.github.io/timbre.js/提供了各种声音生成器,可以调用noteOn和noteOff。

不同的工具表现不同。钢琴有一个"内在"音,但管风琴没有。

同样,noteOnnoteOff取决于实现。HTML5实现中的modcu.be为每个音符播放一个OGG文件,它根本不关心noteOff。当OGG结束时,声音停止。在这种情况下,autoloop对钢琴没有帮助。

这是正确的行为。你需要一个更好的样本库来播放长声音。

参见教堂风琴的无尽的声音的例子。

这个例子使用WebAudioFont播放超过1500种乐器和鼓。这个库支持ADSR,混响和循环点。

Google for Web MIDI API。它还没有在所有浏览器中实现,但是Chris Wilson在GitHub上有一个polyfill。