2014-02-26 1 views
3

나는이 MIDI.js 라이브러리를 사용하고 있습니다 : https://github.com/mudcube/MIDI.js어떻게 미디 파일을 트랜스 포즈합니까?

이 플러그인을로드하고 미디 파일을 재생하기를, 나는이 일을 해요 :

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 파일 (.mid 파일 또는 base64 형식)을 구문 분석하고 +1로 모든 노트를 변경 한 다음 플레이어에게 보냅니다. 어떤 방법으로 자바 스크립트 에서이 일을?

답변

0

이 답변은 완전한 답변은 아니지만 문제가 계속되는 경우 올바른 방향으로 안내 할 수 있습니다. 그것은 MIDI.js에 대한 소스와 그것이 빌드 된 패키지의 몇 가지를 보는 데 몇 분을 소비하는 것을 기반으로합니다. 파일을 읽을 때 조바꿈을 적용하고 중첩 된 파일을 저장하는 데 특히 관심이없는 것으로 가정합니다.

  1. addListener 메서드는 유용하지 않을 수 있습니다. 노트가 신스에 전송 된 직후에 발생하는 콜백, 즉 피치를 변경하기에는 너무 늦은 것으로 보입니다.
  2. 들어오는 파일 문자를 자바 스크립트 배열 요소로 변환하는 함수를 찾고 싶을 것입니다. 아마도 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);