スタンダードMIDIファイルの読込

はじめに

ここではスタンダードMIDIファイル(.smf)のフォーマットの説明と簡単な読込サンプルについて解説しています。
スタンダードMIDIファイルについては、「smfフォーマット」などで検索するとすでに他のサイトでも解説されていますので、簡単に説明します。

このサイトでは「わいやぎのwebページ」に記載されている内容をもとに作成しています。

スタンダードMIDIファイルのフォーマット

スタンダードMIDIファイルはRIFFファイル形式に似た形式をとっています。

RIFFファイル形式は、そのファイルに必要なデータをチャンクと呼ばれるブロックに分けて保存し、チャンクにFourCCと呼ばれる4Byteの識別子(ID)を付けて管理するファイル形式です。
RIFFファイルについては下記に簡単に記載しております。スタンダードMIDIファイルは上記のRIFFファイル形式に似た形式のファイルのため、必要に応じてご参照ください。

今回作成するスタンダードMIDIファイルの読み込み関数のサンプルはこちらからダウンロードできます。 → riffsample_20231210
※スタンダードMIDIファイル以外にもwavファイルやSoundfontファイル読込サンプルなども同梱されています。

スタンダードMIDIファイルのチャンク

スタンダードMIDIファイルのチャンクと階層構造は下記となっています。各チャンクの詳細は後述します。
2つの必須チャンクがあります。

なお、スタンダードMIDIファイルはRIFFチャンクから始まっていないため、厳密にはRIFF形式のファイルではありません。

チャンク名 タイプ 必須
/任意
チャンク識別子
(ファイル/LIST識別子)
概要
MThdチャンク 一般 必須 MThd スタンダードMIDIファイルのヘッダ情報(トラックフォーマット形式や分解能など)が保存されたチャンク
MTrkチャンク 一般 必須 MTrk 各トラックごとのMIDIデータが保存されたチャンク。複数トラックがある場合、同じチャンクID(MTrk)が複数存在することになる。

スタンダードMIDIファイルの各チャンクの説明

スタンダードMIDIファイルの各チャンクについて説明いたします。

MThdチャンク

概要 スタンダードMIDIファイルのヘッダ情報(トラックフォーマット形式や分解能など)が保存されたチャンクになります
必須・任意 必須 チャンクサイズ 6Byte固定
データ部 データ部には下記 構造体が入ります。

(WORD型はunsigned short、DWORD型はunsinged longの再定義となります。)

型 変数名 意味
WORD format スタンダードMIDIファイルのフォーマットです。
0の場合…1つのトラックにすべてのMIDIデータが保存されます。
1の場合…チャンネルやフレーズごとにトラックを分けてMIDIデータが保存されます。

WORD tracknum トラックの数になります。MTrkチャンクの数と等しくなります。
WORD timedev 分解能などを示す値です。
最上位ビットが0のとき、4分音符の分解能を表します。
最上位ビットが1のとき、絶対時間ベースとなります。絶対時間ベースの詳細は割愛します。

MTrkチャンク

概要 各トラックごとのMIDIデータが保存されたチャンクになります。
(複数トラックがある場合、同じチャンクID(MTrk)が複数存在するので注意。)
必須・任意 必須 チャンクサイズ トラック内にあるMIDIデータの内容により変わります。
データ部 デルタタイム・MIDIイベント・MIDIイベントデータの3つを1つとしたMIDIデータが複数保存されます。
デルタタイムは可変長のデータで、また、MIDIイベントデータはMIDIイベントによって変わるため後述します。

MTrkチャンクのデータ形式

デルタタイム

(作成中)

MIDIイベントとMIDIデータ

(作成中)

スタンダードMIDファイル読み込みサンプル

スタンダードMIDファイルの読み込みの流れは

  1. MThdチャンクを読み込む
  2. MTrkチャンクを読み込み、トラック内にあるMIDIメッセージを保存する。
    ※トラック数に応じてMTrkの読み込みを繰り返す。

となります。

スタンダードMIDIファイルを読み込む関数のサンプルコードを記載します。
説明についてはコード内に記載しているので割愛します。

なお、スタンダードMIDIファイルの読み込みには下記のRIFFの読込を行うクラスを使用していますので、下記もご参照ください。

スタンダードMIDIファイルの読み込み関数のサンプルはこちらからもダウンロードできます。 →  riffsample_20231210
※スタンダードMIDIファイル以外にもwavファイルやSoundfontファイル読込サンプルなども同梱されています。

【cmidiloader.h】

上記の関数ででスタンダードMIDIファイルを読み込むことができます。
下記のように利用することができます。

最後に

スタンダードMIDIのファイルフォーマットとそれぞれのチャンクについての説明は以上になります。

今回作成したスタンダードMIDIファイルの読み込みクラスのサンプルはこちらからダウンロードできます。 → riffsample_20231210
※スタンダードMIDIファイル以外にもwavファイルやSoundfontファイル読込サンプルなども同梱されています。

他のファイルの読み込みなどはリンクはこちらにまとめております → メディアファイルの取り扱い

質問はコメント欄や掲示板、Twitterでいただけばとおもいます。
また、「この部分を詳しく」などの要望も掲示板やTwitterでいただければと思います。

■掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp

コメントを残す