2013-10-29 2 views
1

난 튜토리얼 this에 따라 16 진수 형식의 MIDI를 통해 읽고 필요한 데이터를 추정하는 C++ 프로그램을 작성하려고합니다. 트랙 청크 정보에서 첫 번째 정보는 트랙 "MTrk"를보고 있다는 사실입니다. 두 번째 4 바이트는 청크 크기를 나타냅니다.트랙 덩어리 크기가 잘못된 MIDI를 파싱 하시겠습니까?

내가 알기로, 청크 크기는 다음 트랙 청크가 시작되기 전의 바이트 수를 가리키며, 그렇지 않으면 파일의 끝을 나타냅니다. 그러나, 내가 함께 일해 왔던 midi 파일에서 청크 크기가 너무 작습니다. 말하자면, 청크 크기가 40 바이트라고 가정 해 봅시다 : 다음 "MTrk"는 현재 바이트 이후 70 바이트가 될 때까지 발생하지 않습니다 ("MTrk"및 청크 크기 자체는 아닙니다. 청크 크기의 일부). 그러면이 추가 30 바이트는 무엇입니까? 청크 크기 이후에 발생하는 바이트는 잘라야합니까? 또는 청크 크기를 무시하고 다음 트랙 (또는 트랙의 끝을 나타내는 FF2F00)이 나타날 때까지 계속 읽어야합니까?

4D546864 
00000006 
0001 
0003 
0060 

(HEADER OF END)

: I가 의미있는 부분을 분리 한 아래

4D546864000000060001000300604D54726B0000000B00FFFFFFFF510306FFFFFF8A1B00FFFFFFFF2F004D54726B 

: MIDI 파일 판독 후에

는, I는 출력으로서 다음 기록

4D54726B 
0000000B 

(청크 사이즈 = 11 바이트)

,451,515,
00FFFFFFFF510306FFFFFF8A1B00FFFFFFFF2F00 

4D54726B 

Here 내가 사용하는 MIDI 파일입니다 (하지만 여기에서 우리는 20 바이트 참조).

+0

"FF2F00"또는 다음 "MTrk"트랙의 끝까지 건너 뛰는 것이 합리적인 것처럼 보입니다. MIDI 튜토리얼을 따르지 않는 파일이있는 것 같습니다. 다른 출처의 MIDI 파일을 확인 했습니까? – ChuckCottrill

+0

3 개의 소스를 시도했는데 3 번 발생했습니다. 나는 다른 튜토리얼에서 청크 크기가 부정확하게 ~ 50 %로보고되었다는 사실을 언급했지만, 그 경우에해야 할 일에 대한 자세한 내용은 부끄러웠다. – mike

+0

자습서를 확인하는 MIDI 사양은 다음과 같습니다 (https://docs.isy.liu.se/twiki/pub/VanHeden/DataSheets/The_MIDI_Specification.pdf). – ChuckCottrill

답변

0

제공된 링크에서 파일을 다운로드했는데 나에게 정상적인 것처럼 보입니다. 정의 된 덩어리를 분해합시다. 다음 청크 (MTrk가) (11)의 길이가 3 개 트랙 미디 입력 한 파일이 있다고 00 01 00 03 60, 우리에게, 96

의 시간 분할 :

첫 번째 덩어리는 6 바이트의 크기를 가지고 바이트 : 00 ff 51 03 06 8a 1b 00 ff 2f 00. 이 경우에는 템포에 대한 단일 MIDI 메타 이벤트와 트랙 메시지의 끝만 포함합니다.

두 번째 트랙은 길이가 02 92 바이트 (기수 10에서 658)입니다. 트랙 이름과 악기를 정의하는 몇 가지 MIDI 메타 이벤트가오고 일반 MIDI 데이터가옵니다. 마지막으로 마지막 트랙이옵니다. ...

정확한 카운트가 어디에서 떨어졌는지 확실하지 않습니다. 4 바이트 헤더 (예 : MTrk)를 총 바이트 수와 비교하여 계산하지 않았습니까? 큰 덩어리? 청크 길이는 이 아니며은 이름 또는 길이에 필요한 8 바이트를 포함합니다.

나중에 참조 할 수 있도록 hexdump 유틸리티는 특히 -C과 같은 파일을 보는 데 매우 유용합니다. 이 파일의 경우 다음과 같은 데이터가 표시됩니다.

$> hexdump -C ArminvanBuurenFerryCorsten_-_Bruteversion4__iCarroller_20130206094335.mid 
00000000 4d 54 68 64 00 00 00 06 00 01 00 03 00 60 4d 54 |MThd.........`MT| 
00000010 72 6b 00 00 00 0b 00 ff 51 03 06 8a 1b 00 ff 2f |rk......Q....../| 
00000020 00 4d 54 72 6b 00 00 02 92 00 ff 03 0c 53 61 77 |.MTrk........Saw| 
... etc. 
+0

파일을 잘못 읽었을 수 있습니다. 가지고있는 파일을보고 약간의 불일치가있는 파일을 보았지만, 그 파일이 정확하지 않은 것 같습니다. 내가 읽고있는 방식을 수정 해 보겠습니다. – mike

+0

네, 이제 보았습니다.보고있는 20 바이트는 16 진수로 쓴다면 분명히 11 바이트입니다. 디스크에서 파일을 잘못 읽은 것 같지만 파싱 알고리즘이 실제로 정확합니다. –

관련 문제