2012-12-06 1 views
5

MIDI 파일을 읽는 일부 기능을 작성하려고합니다. 나는이 스펙을 제공하는 많은 사이트를 언급 해왔다. 그러나 대부분이 하나이다. http://www.sonicspot.com/guide/midifiles.htmlMIDI 파일 읽기 (C) : var-length 값 끝 부분에 0x00이 표시됩니다.

내가 다운로드 한 Super Mario Bros 테마의 MIDI 파일에서 테스트를 해왔다. 예기치 않은 데이터. 파일의 형식이 잘못 지정된 것일 수 있지만, 내가 잘못한 것 같아요. 다음,

4D 54 72 6B 00 00 00 19 00 FF 51 03 05 7B 71 00 FF 58 
|---------| |---------| || || || |------| || || 
    MTrk Chunk size || || || Tempo || || 
      (25 bytes) || || ||(ms per || || 
         \/ || ||1/4 note) || || 
       VLen value || ||   \/ || 
      (Event at time 0)|| || VLen value || 
          \/ || (event at || 
       Beginning of || time 113) || 
       meta-event ||    || 
           \/    \/ 
       Meta-event type:   ???? 
         set tempo 

당신이 볼 수 있듯이, 0x00 전에 모든 것이 정확한지 : 여기에 문제가있어 (16 진수 편집기)에서 데이터입니다, 나는 생각 내가 그것에 대해 알고 거기서 뭐하고 있니? 이전 VLen 값은 이진 값이 01110001이므로 VLen 값의 다른 부분을 기대하지 않으므로 AFAIK, 이 이벤트 유형이어야합니다. 그러나 0x0과 연결된 이벤트 유형은 없습니다. 아무도 내가 잘못 가고있는 것을 볼 수 있습니까?

답변

5

문제점 : 메타 이벤트 코드 (내 경우는 0x51)는 일반 이벤트처럼 청크 크기로 진행됩니다. 생각하지 못한 이유는 설정된 템포 메타 이벤트에 대해 템포 데이터 크기가 항상 3이기 때문입니다. 따라서 51 03 05 7B 71은 실제로 설정된 템포 이벤트 코드 (51)이고 템포 데이터 크기 (03)는 실제 템포 (05 7B 71)이고, 그 다음에 00은 다음 이벤트가 시간 0에 있음을 알려주는 또 다른 가변 길이 값입니다.

이 정보가 도움이되기를 바랍니다. 필자도 MIDI 형식에 대한 더 나은 문서를 발견하여이를 명확하게했습니다. http://www.omega-art.com/midi/mfiles.html

관련 문제