异步播放midi文件?

Posted

技术标签:

【中文标题】异步播放midi文件?【英文标题】:Playing a midi file asynchronously? 【发布时间】:2017-11-18 18:36:56 【问题描述】:

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

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

【问题讨论】:

是的,有办法 【参考方案1】:

我目前正在开发一个 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 js 播放器。当检测到任何键输入时,我正在尝试逐个音符地推进整个 MIDI 音符。感谢您的进一步帮助,伙计。 类似MIDI.noteOn(channel, note, velocity, delay) 见github.com/mudcube/MIDI.js#midipluginjs---controls-midi-output 或github.com/mudcube/MIDI.js/blob/master/examples/Basic.html 先生! const parsedMidi 是在匿名函数内部创建的,我如何在全局范围内访问它。所以我可以使用它。我尝试返回 parsedMidi 但没有成功。 您可以创建一个全局var parsedMidi;。然后,当您加载 midi 时,您可以执行 parsedMidi = parser.parseUint8(uint8Midi)。然而,您的其他代码只能在异步加载后使用 parsedMidi。您可能想要添加某种 onMidiLoad 函数,将代码放入其中,使用 parsedMidi 并在加载时调用它。作为站点说明,在大多数情况下,全局变量被认为是坏的:) 我设法让它工作。谢谢!。但是我在弹奏和弦时遇到了一些问题。我注意到您的解析器在应该播放和弦时播放一个音符?有没有办法解析和演奏和弦?

以上是关于异步播放midi文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 chrome 播放 MIDI 文件

MIDI文件无法播放,还与Guitar Pro 5.1有关

在 python 中播放 MIDI 文件?

在 python 中播放 MIDI 文件?

AVAudioEngine MIDI 文件播放(当前进度+MIDI 结束回调)Swift

为啥干净的 Midi 文件播放不同? (与米多)