2012-12-06 35 views
5

Próbuję zapisać niektóre funkcje do odczytu w pliku MIDI. Mam na myśli wiele witryn, które podają specyfikację, ale głównie ten: http://www.sonicspot.com/guide/midifiles.htmlOdczytywanie pliku MIDI (C): 0x00 pojawiające się po końcu wartości zmiennej var

Testowałem to na pliku MIDI dla motywu Super Mario Bros, który pobrałem, i dostaję trochę nieoczekiwane dane. Być może plik jest źle sformatowany, ale wydaje mi się, że jest bardziej prawdopodobne, że robię coś nie tak. Oto dane (z edytora HEX), że mam problemy z, i co myślę Wiem o tym:

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 

Jak widać, czy wszystko przed 0x00 jest poprawna, a następnie co on tam robi? Wartość VLen wcześniej ma wartość binarną wynoszącą 01110001 i dlatego nie oczekuje innej części wartości VLen, a zatem AFAIK, powinien być typem zdarzenia o numerze. Jednak nie ma typu zdarzenia związanego z 0x0. Czy ktoś może zobaczyć, gdzie idę źle?

Odpowiedz

5

Znalazłem problem: kody meta-zdarzeń (w moim przypadku 0x51) są kontynuowane przez rozmiar porcji, tak jak normalne zdarzenia. Powodem, dla którego myślałem, że jest inaczej, jest to, że dla meta-zdarzenia o ustalonym tempie, rozmiar danych tempa jest zawsze 3. Dlatego 51 03 05 7B 71 jest w rzeczywistości ustawionym kodem zdarzenia temp (51), rozmiarem danych o tempie (03), a następnie rzeczywistym tempem (05 7B 71), a następnie 00 to kolejna wartość o zmiennej długości, informująca mnie, że następne zdarzenie jest o czasie 0.

Mam nadzieję, że to pomoże komuś. Znalazłem również lepszą dokumentację formatu MIDI, która uczyniła to jaśniejszym: http://www.omega-art.com/midi/mfiles.html