如何用javascript播放任意MIDI音符?

时间:2013-01-13 08:16:07

标签: javascript midi

澄清:我不想生成MIDI文件,也不想播放MIDI文件,我希望能够即时播放MIDI音符。

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

我可以通过拨打MIDI.noteOn(0,midiNumber,100);来播放音符。然而,即使我从不打电话MIDI.noteOff,这会播放几秒钟的音符然后逐渐消失。

我不相信这是MIDI的工作方式。我希望能够在调用noteOff之前调用noteOn并进行音符播放和延音。

预期的浏览器:现代的firefox / chrome。

5 个答案:

答案 0 :(得分: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元素设置为自动循环,则可以自行解决此问题。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

不同的仪器表现不同。钢琴有一种内在的"请注意,但是器官并没有。

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

答案 3 :(得分:1)

Google for Web MIDI API。 它尚未在所有浏览器中实现,但GitHub上有Chris Wilson的polyfill。

答案 4 :(得分:0)

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

看到church organ example的无尽声音。

此人使用WebAudioFont演奏1500多种乐器和鼓。该库支持ADSR,混响和循环点。