2012-10-16 2 views
4

C++에서 midi 파일을 읽으려고하는데 표준 midi 사양 (이 사이트를 포함하여 여러 사이트에서 검색 한 내용 : http://www.sonicspot.com/guide/midifiles.html)에 정의되지 않은 이벤트 인 것 같습니다.미디 파일을 읽을 수 없습니까? [확장 사양?]

나는 16 진수 편집기에서 midi를 열고 오류를 찾아 냈습니다. 첫 번째 "메모 온"이벤트 전에 발생합니다. 이 파일은 Sibelius 6 소프트웨어를 사용하여 생성되었으며 여기에 파일 섹션을 게시하면 누군가가이 문제를 해결하는 데 도움이 될지 궁금합니다. 어느

4D 54 72 6B (MTrk magic number) 
00 00 1F F5 (track size in bytes - 8181) 
00 FF 03 04 (4 bytes follows) (track sequence name) 
00 FF 04 0B (11 bytes follows) (instrument name) 
00 C0 34 (program change event) 
00 B0 79 00 (controller event) 
00 5B <- (what the heck is that?!) 

첫번째 값이 00이기 때문에 델타 틱 수 없다 (단, MSB는 1로 설정)가 인식 할 수있는 이벤트가 아니다 :

은 제 3 트랙의 시작이다. 10 바이트 나중에 내가 이벤트 "에 참고"는 인식이 간다 :

00 5B 30 00 40 00 00 07 64 00 0A 10 00 90 3E 47 < - 내가 아무 생각이 없다

에 유의 무엇을 "note on"이전의 12 바이트는 나타 내기 때문에 파일을 읽을 수 없습니다. 나는 첫 번째 음이 길다는 것을 알고 있습니다. 아마도 그 이유가 있습니다. 나는 또한 "바"일시 정지를 나타내는 이벤트를 찾을 수 없다는 것을 알았다. 아마 바 + 길이의 코드일까요? 나는 그것들을 진드기로 읽어야합니까?

감사합니다. 도움을 주시면 감사하겠습니다.

답변

6

MIDI 파일의 복잡성 중 하나는 Running Status입니다. 동일한 유형 및 채널 (예 : 모든 컨트롤러 또는 모든 음)의 메시지 순서가있는 경우 MIDI는 상태 바이트를 생략하여 여러 바이트를 저장할 수 있습니다. 이 상태를 실행 사용하지 않은 경우에 당신은 볼 것이다 바이트는 모든 컨트롤러 메시지가 인접 및 동일 채널에있는

00 B0 79 00 - controller 121: controller reset 
00 B0 5B 00 - controller 91: reverb 
00 B0 40 00 - controller 64: sustain 
00 B0 07 64 - controller 7: volume 
00 B0 0A 10 - controller 10: pan 
00 90 3E 47 - note message 

때문에, 상태 바이트는 생략 할 수 있습니다. 메시지 유형이 변경되는 즉시 상태 바이트를 다시 추가해야합니다.

MIDI 파일을 이해하려는 경우 이해할 수없는 MIDI 이벤트가있을 때마다 Python-MIDI 또는 GNMidi과 같은 별도의 도구를 사용하는 것이 좋습니다. 이것들은 그것을 텍스트로 보여줄 수 있기 때문에 당신이하는 일을 모방 할 수 있습니다.

EDIT : 길이 또는 지속 시간 매개 변수 (예 : MIDI 파일의 이벤트 간 PPQN 시간 또는 sysex 메시지 또는 메타 이벤트 길이)를 사용하는 모든 MIDI 메시지는 변수를 사용합니다 길이이므로 모든 길이 필드가 항상 고정 길이라고 가정하지 마십시오.

면책 조항 : Sibelius 6에서 MIDI 내보내기 코드를 작성했습니다 ...

+0

와우! 진심으로! 나는 하나의 언급 된 실행 상태가 아닌 midi 파일 형식을 설명하는 웹 사이트의 보트로드를 거쳤습니다. 방금 날 구 했어요! 내가 알 수없는 또 하나의 문제는 Sibelius에서 일시 중지 된 "막대"가 midi로 내보내지는 방법입니다. 또한이 미디 로더는 상업용 게임의 일부이며 크레딧에 특별한 감사를 드리고자합니다. 어떤 이름을 넣을 수 있습니까? –

+0

싸구려는 아니지만 정확한 세부 정보를 얻으려면 [실제 MIDI 사양] (http://www.midi.org/techspecs/midispec.php) 사본이 필요합니다. 주위를 사냥하다 보면 세부 정보를 처리하고 시간을 절약 할 수있는 MIDI 가져 오기 라이브러리를 찾을 수 있습니다. Sibelius의 일시 중지 (fermata)에 관해서는, 내가 기억 하듯이 우리는 추가 시간을 삽입하여 막대를 길게 만듭니다. 이전 버전에서는 음을 길게 만들기 위해 템포가 변경되었지만, 이것은 fermata의 끝과 다음 막대의 시작 사이의 간격을 허용하지 않았습니다.오, 그리고 당신은 단지 'The Mandrill'을 신용 할 수 있습니다 :-) –

관련 문제