Javascript 异步播放midi文件?

Javascript 异步播放midi文件?,javascript,midi,Javascript,Midi,有没有办法一个音符一个音符地播放MIDI文件?例如,当按下一个键时,它只播放midi文件的第一个音符 我尝试了midi.js,但我只能播放、暂停和恢复文件。我目前正在开发一个midi事件侦听器,因此制作了一个简单的midi解析器。您可以下载该项目,然后将MidiParser.js文件从/build复制到您的项目中 您可以这样使用它(完整示例): //创建midi解析器 var parser=new MidiParser(); //加载文件并解析midi var fileReader=newfil

有没有办法一个音符一个音符地播放MIDI文件?例如,当按下一个键时,它只播放midi文件的第一个音符


我尝试了midi.js,但我只能播放、暂停和恢复文件。

我目前正在开发一个midi事件侦听器,因此制作了一个简单的midi解析器。您可以下载该项目,然后将MidiParser.js文件从/build复制到您的项目中

您可以这样使用它(完整示例):

//创建midi解析器
var parser=new MidiParser();
//加载文件并解析midi
var fileReader=newfilereader();
var midiFileInput=document.getElementById('midiFileInput');
midiFileInput.addEventListener('change',函数(inputEvent){
如果(!inputEvent.target.files.length)
返回false;
fileReader.readAsArrayBuffer(inputEvent.target.files[0]);
fileReader.onload=函数(文件){
var uint8Midi=新的Uint8Array(file.target.result);
var parsedMidi=parser.parseUint8(uint8Midi);
//使用解析的midi
document.body.innerHTML+=''+JSON.stringify(parsedMidi,null,2)+'';
};
});
它的输出将是一个格式化的noteOn和noteOff事件数组

关于您的示例,每次按下该键时,您都可以使用
var event=parsedMidi.shift()
获取下一个事件,或者使用升序索引访问它(
var event=parsedMidi[yourIndex]

如果您想播放声音,可以使用midi.js或。(还没有测试过这个)

编辑:

教程:


文档:

是的,有办法,谢谢!这真的很有帮助。我在播放解析的midi时遇到了一点问题。如何准确地将事件传递给midi js播放器。当检测到任何按键输入时,我试图一个音符一个音符地浏览整个midi。感谢您的进一步帮助,伙计。类似于
MIDI.noteOn(频道、音符、速度、延迟)
请参见或先生!const parsedMidi是在匿名函数中创建的,如何在全局范围内访问它。所以我可以用它。我尝试返回parsedMidi,但没有成功。然后,当您加载midi时,您可以执行
parsedMidi=parser.parseUint8(uint8Midi)
。然而,您的其他代码只能在异步加载之后使用parsedMidi。您可能希望添加某种onmidload函数,将代码放入其中,使用parsedMidi并在加载时调用它。正如站点所指出的,在大多数情况下,全局变量被认为是不好的:)我设法使它工作。谢谢但我在弹奏和弦时遇到了一些问题。我注意到您的解析器在应该播放和弦时会播放一个音符?有没有办法解析和弹奏和弦?
// Create midi parser
var parser = new MidiParser();

// Load file and parse midi
var fileReader = new FileReader();
var midiFileInput = document.getElementById('midiFileInput');
midiFileInput.addEventListener('change', function(inputEvent) {
    if (!inputEvent.target.files.length)
        return false;

    fileReader.readAsArrayBuffer(inputEvent.target.files[0]);
    fileReader.onload = function(file) {
        var uint8Midi = new Uint8Array(file.target.result);
        var parsedMidi = parser.parseUint8(uint8Midi);
        // Use parsed midi
        document.body.innerHTML += '<pre>' + JSON.stringify(parsedMidi, null, 2) + '</pre>';
    };
});