2014-02-26 115 views
3

我使用这个MIDI.js库:https://github.com/mudcube/MIDI.js如何转置MIDI文件?

要加载的插件和播放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中做到这一点?

回答

0

这不是一个完整的答案,但如果您仍然卡住,它可能会指向正确的方向。它基于花费几分钟时间查看MIDI.js的源代码以及它构建的几个软件包。我假设你想要在读取文件时应用转置,并且对保存转置文件不感兴趣。

  1. addListener方法不太可能有用。它看起来像是在音符发送到合成器后立即发生的回调,即改变音高太迟。
  2. 您将需要找到将传入文件字符转换为javascript数组元素的函数。这可能在jasmid库中。
  3. 如果你真的很幸运,开发人员将提供一个钩子,你可以使用它来设置回调,以便在函数将它们写入数组之前修改事件属性。否则,您需要相应地修改该功能。如果你能使它运行良好,试着说服开发人员将其修补到源代码中 - 否则你会被困在维护自己的图书馆分支。

希望这有助于。

编辑:我想你想要的文件是https://github.com/gasman/jasmid/blob/master/midifile.js。你可以运用换位在处理音符开事件起始于线的情况下155

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);