我正在使用这个MIDI.js库:https://github.com/mudcube/MIDI.js
为了加载插件并播放midi文件,我这样做:
window.onload = function () {
MIDI.loadPlugin({
soundfontUrl: "./soundfont/",
instruments: [ "acoustic_grand_piano" ],
callback: function() {
MIDI.programChange(0, 0);
_player = MIDI.Player;
}
});};
function playSong(){
_player.timeWarp = 1; // speed the song is played back
_player.loadFile(song[songid], _player.start);
_player.addListener(function(data) {
var now = data.now; // where we are now
var end = data.end; // time when song ends
var channel = data.channel; // channel note is playing on
var message = data.message; // 128 is noteOff, 144 is noteOn
var note = data.note; // the note
var velocity = data.velocity; // the velocity of the note
});
}
var songid = 0;
var song = ['data:audio/mid;base64,TVRoZAAAAA...我的问题是,有没有办法在播放之前转置这个midi文件?基本上,我想解析一个midi文件(无论是.mid文件,还是base64格式),将所有音符更改为+1,然后将其发送到播放器。有没有办法在javascript中做到这一点?
发布于 2014-04-22 05:39:31
这不是一个完整的答案,但如果你仍然被卡住了,它可能会为你指明正确的方向。它基于花几分钟查看MIDI.js的源代码和它所构建的几个包。我假设您希望在读入文件时应用转置,并且对保存转置后的文件不是特别感兴趣。
,
希望这能有所帮助。
编辑:我认为你想要的文件是https://github.com/gasman/jasmid/blob/master/midifile.js。您可以将换位应用于处理从第155行开始的note-on事件的情况
case 0x09:
event.noteNumber = param1;
event.velocity = stream.readInt8();
if (event.velocity == 0) {
event.subtype = 'noteOff';
} else {
event.subtype = 'noteOn';
}
return event;或者,当恰好在返回的事件被推到从行227开始的轨道阵列上之前
while (!trackStream.eof()) {
var event = readEvent(trackStream);
tracks[i].push(event);发布于 2022-02-20 11:28:12
您可以使用以下命令向播放器添加监听器
addListener(
data => {
data.note += 1;
}
);我相信它是在通知本身之前被调用的。
如果你使用我的mudcube的https://github.com/mscuthbert/midicube的ES6分支,叫做midicube MIDI.js,它都在ES6模块中,所以你可以更容易地子类化Player并在玩之前操作数据。
https://stackoverflow.com/questions/22051038
复制相似问题