2012-12-06 47 views
5

के अंत के बाद दिखाई दे रहा है मैं MIDI फ़ाइल में पढ़ने के लिए कुछ फ़ंक्शन लिखने की कोशिश कर रहा हूं। मैं कई साइटों का जिक्र कर रहा हूं जो विनिर्देश देते हैं, लेकिन अधिकांशतः यह एक: http://www.sonicspot.com/guide/midifiles.htmlपढ़ना MIDI फ़ाइल (सी): 0x00 एक var-length मान

मैं इसे डाउनलोड करने वाले सुपर मारियो ब्रॉस थीम के लिए 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 से पहले सब कुछ सही है, तो यह वहाँ क्या कर रहा है? वीएलएन मान से पहले 01110001 का बाइनरी मान है और इसलिए वीएलएन मान का एक और हिस्सा अपेक्षित नहीं है, और इसलिए, AFAIK, एक ईवेंट प्रकार होना चाहिए। हालांकि 0x0 से जुड़े कोई ईवेंट प्रकार नहीं है। क्या कोई देख सकता है कि मैं कहां गलत हो रहा हूं?

उत्तर

5

मुझे समस्या मिली: मेटा-इवेंट कोड (मेरे मामले में 0x51) सामान्य घटनाओं की तरह एक खंड आकार द्वारा आगे बढ़े जाते हैं। कारण मैंने सोचा कि अन्यथा इसलिए है क्योंकि सेट टेम्पो मेटा-इवेंट के लिए, टेम्पो डेटा आकार हमेशा 3 होता है। इसलिए 51 03 05 7B 71 वास्तव में सेट टेम्पो इवेंट कोड (51) है, टेम्पो डेटा का आकार (03) तो वास्तविक टेम्पो (05 7B 71), और उसके बाद 00 सिर्फ एक और चर-लंबाई मान है जो मुझे बता रहा है कि अगली घटना समय पर है 0.

मुझे आशा है कि इससे किसी की मदद मिलेगी। मुझे एमआईडीआई प्रारूप के लिए दस्तावेज़ीकरण का एक बेहतर टुकड़ा भी मिला, जिसने यह स्पष्ट किया: http://www.omega-art.com/midi/mfiles.html