异步播放 midi 文件?
Playing a midi file asynchronously?
有没有办法逐个音符地播放 MIDI 文件?例如,当按下一个键时,它只会播放 midi 文件的第一个音符。
我试过了midi.js但是我只能播放,暂停和恢复文件。
我目前正在研究 midi 事件侦听器,因此制作了一个简单的 midi 解析器。您可以下载项目 here,然后将 MidiParser.js 文件从 /build 复制到您的项目。
你可以这样使用它(完整示例here):
// 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>';
};
});
它的输出将是一组格式化的 noteOn 和 noteOff 事件。
关于您的示例,每次按下该键时,您都可以使用 var event = parsedMidi.shift()
获取下一个事件,或使用升序索引 (var event = parsedMidi[yourIndex]
) 访问它。
如果你想播放声音,你可以使用 midi.js 或 sample-player。 (还没有测试过这个)
编辑:
教程:https://github.com/Otto-AA/MidiPlayer/blob/master/tutorials/MidiParser.md
文档:https://github.com/Otto-AA/MidiPlayer/blob/master/docs/MidiParser.md
有没有办法逐个音符地播放 MIDI 文件?例如,当按下一个键时,它只会播放 midi 文件的第一个音符。
我试过了midi.js但是我只能播放,暂停和恢复文件。
我目前正在研究 midi 事件侦听器,因此制作了一个简单的 midi 解析器。您可以下载项目 here,然后将 MidiParser.js 文件从 /build 复制到您的项目。
你可以这样使用它(完整示例here):
// 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>';
};
});
它的输出将是一组格式化的 noteOn 和 noteOff 事件。
关于您的示例,每次按下该键时,您都可以使用 var event = parsedMidi.shift()
获取下一个事件,或使用升序索引 (var event = parsedMidi[yourIndex]
) 访问它。
如果你想播放声音,你可以使用 midi.js 或 sample-player。 (还没有测试过这个)
编辑:
教程:https://github.com/Otto-AA/MidiPlayer/blob/master/tutorials/MidiParser.md
文档:https://github.com/Otto-AA/MidiPlayer/blob/master/docs/MidiParser.md