17

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

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

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

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

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

4

5 回答 5

10

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

于 2013-01-13T08:26:54.653 回答
5

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

于 2014-01-14T14:06:39.580 回答
2

不同的乐器表现不同。钢琴有一个“内在”的音符,但管风琴没有。

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

于 2014-05-28T19:28:05.500 回答
1

谷歌网页 MIDI API。它尚未在所有浏览器中实现,但 GitHub 上的 Chris Wilson 提供了一个 polyfill。

于 2013-02-13T21:47:28.323 回答
1

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

参见无尽声音的教堂管风琴示例

这个例子使用WebAudioFont来演奏超过 1500 种乐器和鼓。这个库支持 ADSR、混响和循环点。

于 2018-08-01T06:35:15.093 回答