目次
MIDIファイルを解析してみた
まずはゲームの入力となるMIDIファイルをバイナリ解析してみました。
dominoでテキトーにMIDIファイルを作って、解析結果をテキストで出力していきます。
ヘッダチャンクの解析
ファイルの先頭にはヘッダチャンクがあります。
ヘッダチャンクには、MIDIフォーマットバージョンとトラック数、デルタタイム(4分音符の分解能)の情報があります。
テキスト出力するとこんな感じ↓
========== MIDI HEADER ==========
Magic : MThd
Size : 0x00000006
Format : 1
TrackNum : 18
DeltaTime : 0x01E0(480)
トラックチャンクの解析
ヘッダチャンクに続いて、トラックチャンクが1つ以上あります。
トラックチャンクの数はヘッダチャンク(TrackNum)で表示している分だけあります。
トラックチャンクには大きく分けて3つのイベントがあります。
- メタイベント
- SysExイベント
- MIDIイベント
メタイベントには、楽器名や歌詞などのテキストデータや、テンポや拍子、調の設定など演奏に関わるデータもあります。
ゲーム開発では、どの音をゲームオブジェクトとして使用するかを決める際にテキストデータを使うかも。テンポの設定もゲームオプションとして必要そう。他のデータは必要無いかな。
dominoでMIDI出力すると最初のトラックチャンクにテキストデータが入っていました。こんな感じ↓
========== MIDI TRACK(1) ==========
Magic : MTrk
Size : 0x00000063
--------------------------------
delta time = 0 : MetaEvent : Sequence :
delta time = 0 : MetaEvent : Copyright : Copyright (C) 2019
delta time = 0 : MetaEvent : Text : 【サイト名】 URL
delta time = 0 : MetaEvent : Tempo : 0x0F4240(1000000)
delta time = 0 : MetaEvent : Maker : Setup
delta time = 0 : MetaEvent : Beat : 0x01031808(1/8, メトロノーム1拍あたりのMIDIクロック数=24, MIDI4分音符(24MIDIクロック)の中に入る32分音符の数=8)
delta time = 14337 : MetaEvent : Tempo : 0x07A120(500000)
delta time = 0 : MetaEvent : Maker : Start
delta time = 0 : MetaEvent : Beat : 0x04021808(4/4, メトロノーム1拍あたりのMIDIクロック数=24, MIDI4分音符(24MIDIクロック)の中に入る32分音符の数=8)
delta time = 0 : MetaEvent : End
SysExイベントは何かよくわかんない?
けど、ゲームには必要なさそうだから理解しなくていいや(笑)
MIDIイベントには、音のON/OFF、音の強弱、音色の設定などの演奏データがあります。こんな感じ↓
========== MIDI TRACK(3) ==========
Magic : MTrk
Size : 0x000001A8
--------------------------------
delta time = 0 : MetaEvent : Sequence :
delta time = 0 : MetaEvent : Port : 0
delta time = 0 : MetaEvent : Text : ---- System Setup --------------------------------------------------
delta time = 7681 : MetaEvent : Text : ---- CH Setup --------------------------------------------------
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 121, Value = 0
delta time = 1 : MidiEvent : Control Change : Channel = 0, Controler No. = 0, Value = 0
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 32, Value = 0
delta time = 0 : MidiEvent : Program Change : Channel = 0, Program = 0
delta time = 3 : MidiEvent : Control Change : Channel = 0, Controler No. = 10, Value = 64
delta time = 1 : MidiEvent : Control Change : Channel = 0, Controler No. = 7, Value = 100
delta time = 1 : MidiEvent : Control Change : Channel = 0, Controler No. = 91, Value = 0
delta time = 1 : MidiEvent : Control Change : Channel = 0, Controler No. = 11, Value = 127
delta time = 1 : MidiEvent : Control Change : Channel = 0, Controler No. = 1, Value = 0
delta time = 1 : MidiEvent : Control Change : Channel = 0, Controler No. = 101, Value = 0
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 100, Value = 1
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 6, Value = 64
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 38, Value = 0
delta time = 4 : MidiEvent : Control Change : Channel = 0, Controler No. = 101, Value = 0
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 100, Value = 2
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 6, Value = 64
delta time = 3 : MidiEvent : Control Change : Channel = 0, Controler No. = 101, Value = 0
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 100, Value = 0
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 6, Value = 12
delta time = 3 : MidiEvent : Pitch Bend : Channel = 0, PitchBend = 0x4000
delta time = 1 : MidiEvent : Control Change : Channel = 0, Controler No. = 101, Value = 127
delta time = 0 : MidiEvent : Control Change : Channel = 0, Controler No. = 100, Value = 127
delta time = 2 : MetaEvent : Text : ---- End of CH Setup --------------------------------------------------
delta time = 30 : MidiEvent : Note On : Channel = 0, Note No. = 60, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 60, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 61, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 61, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 62, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 62, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 63, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 63, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 64, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 64, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 65, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 65, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 66, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 66, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 67, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 67, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 68, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 68, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 69, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 69, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 70, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 70, Velocity = 0
delta time = 0 : MidiEvent : Note On : Channel = 0, Note No. = 71, Velocity = 100
delta time = 12291 : MidiEvent : Note Off : Channel = 0, Note No. = 71, Velocity = 0
delta time = 0 : MetaEvent : End
次は、MIDIファイルをプログラムで再生したり、イベント送信して単音を出力したりしてみる予定。
コメント