16進数と逝く、MIDIファイルの中身について 第3夜
とりあえずバイナリエディターで開いてみようよ
code:dump.hex
4d 54 68 64 00 00 00 06 00 00 00 01 03 c0 4d 54
72 6b 00 00 00 5b 00 ff 58 04 04 02 18 08 00 ff
51 03 05 8c 74 00 90 18 60 83 60 80 18 00 00 90
1a 60 83 60 80 1a 00 00 90 1c 60 83 60 80 1c 00
00 90 1d 60 83 60 80 1d 00 00 90 1f 60 83 60 80
1f 00 00 90 21 60 83 60 80 21 00 00 90 23 60 83
60 80 23 00 00 90 25 60 83 60 80 25 00 00 ff 2f
00
一応言っておくけど16進数よ、この記事では0xは省略するわよ
あとすべての値はリトルエンディアンとして扱いません
SHIFT-JISとして解釈した場合はこんな感じ(当たり前だけど文字化けするので画像で貼るよん)
https://scrapbox.io/files/65ec901749997b0025020db3.png
最初の4バイト4d 54 68 64これは文字にしてM T h dになります
これはMIDI Track Headerの略で、これが最初になければMIDIファイルではありません
次の4バイトは00 00 00 06これは次に続くMIDIファイルのヘッダーのバイト数を表していますが、いまのところこの値以外のものはありません
次の6バイトは00 00 00 01 03 c0これはMIDIファイルのヘッダーで、2バイトづつに分けて解釈します
00 00 MIDIファイルのフォーマット、0と1と2の3種類があるが、3はめったに使われない
00 01 トラック数
03 c0 10進数にして960、これはMIDI特有の時間単位、「デルタ」が何個で4分音符1つ分になるかどうか、この場合は960デルタ=4分音符
次の8バイトは 4d 54 72 6b 00 00 00 5bこれはトラックのヘッダーで、4バイトづつに分けて解釈します
4d 54 72 6b 文字にしてM T r kになります、これはMIDI Trackの略で、ここからトラックだよ、ということです
00 00 00 5b 10進数にして93、これはこの4バイトの次から数えてトラックが何バイト目まであるかということです
ここからトラックの内容です
トラックは可変長のいくつかのイベントというものに分けられ、それには種類があり、ノーツオンやノーツオフ、プログラムチェンジなどがあります
イベントの構造はこの様になっています
XX... AB YY... または XX... YY... ←実際の値を書いてるわけではないよ
1つづつ説明します(ABがない場合どうなるかはちょっと後に解説してるよ次夜になりました)
XX... これは可変長の一個前のイベントからのデルタ数
可変長は他のところでも使うからここで把握しておこう
最初の2バイトを2進数に変換して、
1ビット目が1ならのこりの7ビットを記録、すでに記録してあるならそれに追加(加算ではない)
1ビットめが0なら
値を記録されている場合は残りの7ビットを追加(加算ではない)、それを結果とする
値を記録されていない場合は残りの7ビットを結果とする
今回は00 00000000のため0、そりゃ最初のイベントだからそうだよね
1ビット目が1の場合は
code:hogehoge
85 10000101 //1ビット目が1なので記録 0000101
AE 10101110 //1ビット目が1なので記録 00001010101110
BA 10101110 //1ビット目が1なので記録 000010101011100101110
7D 01111101 //1ビット目が0なので追加して終わり 0000101010111001011101111101
10進数にして11245437ということになる
AB これはAの値によって少々処理が異なり
AがF:SysEx かメタイベント
それ以外:通常のイベント
まあもちろん通常のイベントから解説するよね
Aがイベントの種類、後述(]次夜になりました)するABがない場合に関連する理由により、1ビット目は必ず1
Bがイベントの対象になるチャンネル番号
YY...がイベントのデータ、データ1とデータ2が存在し、イベントにより長さが異なる勘違いでした、、、。
Aによって色々変わるのでAが何かで分けて解説するね
↓このフォーマットで
(イベント名) データ1のバイト数 データ2のバイト数
データ1について
データ2について
Aが、、、
8の場合
ノーツオフ 1 1
高さ、60がC3
ペシロティ、音の重み、ていねいなMIDI音源だと大事になるらしいけどだいたい0
9の場合
ノーツオン 1 1
高さ、60がC3
ペシロティ、音の重み
Aの場合
キープレッシャー 1 1
Bの場合
プログラムチェンジ 1 0
存在しない、さっきデータ1とデータ2が存在しとかいっちゃったのに
Cの場合
プログラムチェンジ 1 0
楽器番号
これも存在しない
Dの場合
チャンネルプレッシャー 1 0
ちょとまって、これも存在しないやん
Eの場合
ピッチベンド 1 1
やっと存在してくれた、
※存在しないデータがある場合はそこを読みすすないでください
もうこんな時間なのでねます、このペースだとあと2夜かかる気がする、、、。
https://scrapbox.io/files/65ec9d734156900024b4387f.png
次の夜:16進数と逝く、MIDIファイルの中身について 第4夜
#ゆめにっき