5

MIDIファイルに読み込む関数を書き込もうとしています。私は仕様を提供する多くのサイトを参照してきましたが、ほとんどはこれです:http: //www.sonicspot.com/guide/midifiles.html

ダウンロードしたスーパーマリオブラザーズのテーマのMIDIファイルでテストしていて、予期しないデータが表示されます。ファイルのフォーマットが間違っている可能性がありますが、私が何か間違ったことをしている可能性が高いと思います。これが私が問題を抱えている(16進エディタからの)データと私がそれについて知っていると思うことです:

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が正しい場合、そこで何をしているのでしょうか。以前のVLen値はのバイナリ値を持っている01110001ため、VLen値の別の部分を予期していないため、AFAIKはイベントタイプである必要があります。ただし、に関連付けられたイベントタイプはありません0x0。誰かが私がどこで間違っているのか見ることができますか?

4

1 に答える 1

5

問題が見つかりました: メタイベント コード (私の場合0x51) は、通常のイベントと同じようにチャンク サイズで処理されます。違うと思ったのは、セットテンポのメタイベントの場合、テンポデータのサイズは常に 3 なので、51 03 05 7B 71実際にはセットテンポのイベントコード( 51)、テンポデータのサイズ( 03)、そして実際のテンポ( 05 7B 71)、は、00次のイベントが時間 0 であることを示す別の可変長値です。

これが誰かに役立つことを願っています。また、これをより明確にするMIDI形式のより良いドキュメントを見つけました:http://www.omega-art.com/midi/mfiles.html

于 2012-12-06T13:40:12.083 に答える