ゲーム開発に挑戦してみる。#2「MIDIファイル解析してみた」

スポンサーリンク

MIDIファイルを解析してみた

まずはゲームの入力となるMIDIファイルをバイナリ解析してみました。

dominoでテキトーにMIDIファイルを作って、解析結果をテキストで出力していきます。

ヘッダチャンクの解析

ファイルの先頭にはヘッダチャンクがあります。

ヘッダチャンクには、MIDIフォーマットバージョンとトラック数、デルタタイム(4分音符の分解能)の情報があります。

テキスト出力するとこんな感じ↓

========== MIDI HEADER ==========
Magic     : MThd
Size      : 0x00000006
Format    : 1
TrackNum  : 18
DeltaTime : 0x01E0(480)

トラックチャンクの解析

ヘッダチャンクに続いて、トラックチャンクが1つ以上あります。

トラックチャンクの数はヘッダチャンク(TrackNum)で表示している分だけあります。

トラックチャンクには大きく分けて3つのイベントがあります。

  1. メタイベント
  2. SysExイベント
  3. 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ファイルをプログラムで再生したり、イベント送信して単音を出力したりしてみる予定。

コメント