首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何转置midi文件?

如何转置midi文件?
EN

Stack Overflow用户
提问于 2014-02-27 03:16:10
回答 2查看 1.3K关注 0票数 5

我正在使用这个MIDI.js库:https://github.com/mudcube/MIDI.js

为了加载插件并播放midi文件,我这样做:

代码语言:javascript
复制
window.onload = function () {
    MIDI.loadPlugin({
        soundfontUrl: "./soundfont/",
        instruments: [ "acoustic_grand_piano" ],
        callback: function() {
            MIDI.programChange(0, 0);   
                    _player = MIDI.Player;

        }
    });

};

代码语言:javascript
复制
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中做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2014-04-22 05:39:31

这不是一个完整的答案,但如果你仍然被卡住了,它可能会为你指明正确的方向。它基于花几分钟查看MIDI.js的源代码和它所构建的几个包。我假设您希望在读入文件时应用转置,并且对保存转置后的文件不是特别感兴趣。

  1. addListener方法不太可能有用。它看起来像是在音符被发送到合成器后立即发生的回调,也就是说,改变音调已经太晚了。
  2. 你需要找到将传入的文件字符转换为javascript数组元素的函数。

  1. ,如果你真的很幸运,开发者会提供一个钩子,你可以用它在函数将事件属性写入数组之前设置一个回调来改变它们。否则,您将需要相应地修改该函数。如果你能让它工作得很好,试着说服开发人员将它补丁到源代码中--否则你就只能维护自己的库分支了。

希望这能有所帮助。

编辑:我认为你想要的文件是https://github.com/gasman/jasmid/blob/master/midifile.js。您可以将换位应用于处理从第155行开始的note-on事件的情况

代码语言:javascript
复制
case 0x09:
    event.noteNumber = param1;
    event.velocity = stream.readInt8();
    if (event.velocity == 0) {
        event.subtype = 'noteOff';
    } else {
        event.subtype = 'noteOn';
    }
    return event;

或者,当恰好在返回的事件被推到从行227开始的轨道阵列上之前

代码语言:javascript
复制
while (!trackStream.eof()) {
    var event = readEvent(trackStream);
    tracks[i].push(event);
票数 0
EN

Stack Overflow用户

发布于 2022-02-20 11:28:12

您可以使用以下命令向播放器添加监听器

代码语言:javascript
复制
addListener(
  data => {
     data.note += 1;
  }
);

我相信它是在通知本身之前被调用的。

如果你使用我的mudcube的https://github.com/mscuthbert/midicube的ES6分支,叫做midicube MIDI.js,它都在ES6模块中,所以你可以更容易地子类化Player并在玩之前操作数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22051038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档