MFiファイルフォーマット


携帯電話が普及しはじめて着信音が耳につく電子音から、非常に表現力の高い音源を使用した音に変わってきています。
一昔前なら「シンセサイザー」と呼ばれ(今でもそう呼ぶけど^^;)プロのミュージシャンでも限られた人にしか所有できない物が、今では携帯電話のおまけとして内蔵されるまでになってしまいました。

このページでは最近注目を集めてる(?)iメロディ(NTT DoCoMoのiMode端末の着信音用に使用されている音楽フォーマット:正式にはMFi(Melody Format for iMode))の解析、公開をしています。
iMode端末単体では意味の無いものですが、PCでこれらに準拠したファイルを作成し、iMode端末に転送して演奏してやれば、単体で作成したものより遥かに表現力の豊かな着信メロディを奏でることが出来るでしょう。

(MFi2)MFi ver2.0の情報は暫定的なものです。書いてる本人も完全に動作が確認できてるわけではないので気をつけてください^^;

<索引>
基本データフォーマット ファイルヘッダ部 データインフォメーション部 トラック部 イベント情報 ノートメッセージ 拡張ステータス情報 音色編集 ビブラート 機種依存情報
※基本的に名称はデタラメです(爆)


基本データフォーマット
  ファイルヘッダ部 データインフォメーション部 トラック部
バイト(ビット)列 13byte nbyte ×χ mbyte
データ例 melo.........

MLDファイルは基本的に3つの部位から構成されています。ファイルそのものの識別子を含むファイルヘッダ部。MLDファイルのデータについての情報を含むデータインフォメーション部。そして音階の情報等を含むトラック部です。基本的にどの部位が欠けてもデータエラーになるはずです。
各部の詳細は以下の通り。


ファイルヘッダ部
  識別子(melo) ファイル長 -8 トラック部までのサイズ データタイプ(メジャー) データタイプ(マイナー) トラック数
バイト(ビット)列 4byte 4byte 2byte 1byte 1byte 1byte
フォーマット 6D 65 6C 6F 00 00 00 FF 00 EA 01 01 01
※ボルド体は可変です

ファイルの識別文字列(melo)の後に、MLDファイルのファイル長-8(ファイル長の次のバイトからファイルの最後まで)、トラック部までのサイズ(トラック部までのサイズの次のバイトからデータインフォメーション部の最後まで)、データタイプが2つ、トラック数と続きます。
(MFi2) MFi2.0でのトラック数は2、3、4も指定可能です。

データタイプ
メジャータイプ 01h 着信メロディデータ
02h 音楽データ(MFi2)
マイナータイプ 00h (音楽データの場合)
01h 全曲データ
02h 部分データ

データタイプはメジャーとマイナーに分かれています。部分データはゲームの効果音など、データの初期設定だけ最初にやっておいてトラック部だけの小さなデータで音を鳴らすために設けられたタイプなのでしょう。
MFi2になってデータタイプが増えてます。これはデータフォーマット自体が、着信メロディだけじゃなく、より音楽的になったと言えます。実際、一般の音楽フォーマットに近いコマンドが多数増えているのが確認できます。

トラック数 データ
01h 1 4和音データ
02h 2 8和音データ(MFi2)
04h 4 16和音データ(MFi2)

トラック数は発音可能な最大和音数を定義します。1トラックに4音まで発音可能なのでYMU757では、759では2か4の値を取る事になります。3については未確認です^^;

データインフォメーション部
  識別子 データ長 実データ
バイト(ビット)列 4byte 2byte nbyte
データ例 7469746C 0010 3E88AB96828FE9C4DED7B7ADD72042474D31
titl .. 悪魔城ドラキュラ BGM1

識別子
識別子(バイト列) データ長(n) 情報
titl(7469746C) nAbyte MLDデータの曲タイトルを示します。16byteに納めるのが望ましいでしょう。
sorc(736F7263) 0001(1byte) データのプロテクト情報を示します。(下表参照)
vers(76657273) 0004(4byte) MLDフォーマットのバージョン情報を示します。(0100 or 0200)
date(64617465) 0008(8byte) データ作成の日付を示します。YYYYMMDDのフォーマットで記述します。
copy(636F7079) nBbyte 著作権表示。著作権情報を文字列で記述します。
prot(706F7274) nCbyte データ管理文字列。
note(6E6F7465) 0002(2byte?) ノートメッセージ長情報(1ならノート長が4byteになる)(MFi2)
exst(6E6F7465) 0002(2byte?) 拡張ステータス依存データ長情報(MFi2)

データインフォメーション部は、最大6個(MFi Ver2.0では最大8個)のデータ情報を記述することが出来ます。どれも省略可能ですが、タイトルくらいはつけたほうが良いでしょうね。ただし503iシリーズではタイトル、プロテクト情報、バージョンを見に行ってるようなので、この3つは省略しない方が良いかもしれません。
データ長は実データ部のみ(識別子、データ長自身のサイズは含まない)のサイズを記述します。
タイトル部を記述する際、iMode端末の機種によって表示できるサイズが違うので注意してください。F209iでは最大16バイトまで表示できていました。
また、このデータインフォメーション部全体のサイズ+3(ファイルヘッダ部のトラック数、データタイプの分)がファイルヘッダ部のトラック部までのサイズに記述されることになります。

プロテクト情報
sorc bit列 意味
上位7bit 0000000 ネットワークからのダウンロード
0000001 端末の入力機能を使用
0000010 端末外部I/Fを用いての入力
下位1bit 0 著作権なし
1 著作権あり

データのプロテクト情報は2つの意味を持ち、上位7bitでデータの入力経路、下位1bitで著作権情報の有無を表します。通常は00hか01hをしていておけば良いでしょう。

トラック部
  識別子 データ長 実データ
4byte 4byte mbyte
データ例 74726163 000000FF
trac ....

4バイトの識別子の後に4バイトのデータ長、このデータ長はトラック部の実データのみのデータ長を。その後に実データ、と記述していきます。
実データには音符を記述する為のノートメッセージ(イベント情報)の他にテンポや音色、音量を設定する為のシステムメッセージが存在します。
(MFi2) MFi2.0では現トラックの実データ長を示します。使用するトラック分だけ連続して記述していきます。

イベント情報
  Δタイム ステータス情報 ステータス依存データ
バイト(ビット)列 1byte 1byte nbyte
フォーマット 00 00 00〜

イベント情報は3バイト以上から構成され、音楽データの基本、音を出すという作業の他、拡張情報(ステータスがFFh)等の意味を持ちます。
ノートメッセージと拡張情報のスイッチは、ステータス情報の値で決定します。FFhで拡張情報を扱えるようになります。

ノートメッセージ
  Δタイム ステータス情報 ステータス依存データ1 ステータス依存データ2(MFi2)
ボイス
上位2bit
音程(note)
下位6bit
音の長さ 音の強さ
上位6bit
オクターブ
シフト
下位2bit
バイト(ビット)列 1byte 1byte 1byte 1byte
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
フォーマット 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0

Δタイム(三角じゃないよデルタだよ)は前のデータが実行されてからの時間、音の長さは発音する時間の長さを示し、共に全音符を192、4分音符を48とした数値で最大255(FFh)の値を取ります。
Δタイムが255を超えるとき、NOPコマンド(xxFFDE00)をダミーとして記述することで255以上の音長を再現する事が出来ます。また、前の音の音の長さよりΔタイムが短い場合、音色によってはスラーやタイが表現されます。
チャンネルは第2バイトの上位2ビットを使用し、ビット列で00,01,10,11の値を取りそれぞれ1〜4ボイスの発音を可能にします。これにより、1トラック4つ、4トラックで16の音を鳴らす事が出来ます。のこりの6ビットで発音する音程を指定します。
基本的に0(00h)で3オクターブ下のラ、27(1Bh)で真ん中のド、62(3Eh)で2オクターブ上のシを発音させます。63(3Fh)は拡張ステータス情報の為にシステムで予約されているため使えません。また、上位2bitでボイスが指定されることに注意して下さい。休符は音の長さを0に指定することで再現できます。
これらのノートメッセージをずらずら並べて曲を構成していきます。
(MFi2) データインフォメーション部のノートメッセージ長情報がの場合、ステータス依存データ2が使用可能になります。上位6ビットで64段階のエクスプレッション、下位2ビットでオクターブシフトを行います。この場合、データサイズが単純計算で30%増しになる事に注意して下さい。表現力とデータサイズはどうしてもトレードオフになっちゃいますね。

ノート対応表
コード 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
ノート A A+ B C C+ D D+ E F F+ G G+ A A+ B C C+ D D+ E F F+ G G+ A A+ B C C+ D D+ E
コード 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
ノート F F+ G G+ A A+ B C C+ D D+ E F F+ G G+ A A+ B C C+ D D+ E F F+ G G+ A A+ B n/a

音長対応表
全音符 192(C0h) 16分音符 12(0Ch)
2分音符 96(60h) 32分音符 6(06h)
4分音符 48(30h) 64分音符 3(03h)
8分音符 24(18h) 付点は各1.5倍
オクターブシフト
bit1 bit0 シフト
... 0 0 シフトせず
... 0 1 1オクターブ上げる
... 1 0 2オクターブ下げる
... 1 1 1オクターブ下げる

拡張ステータス情報
  Δタイム ステータス情報 拡張ステータス
(ステータス依存データ1)
拡張ステータス依存データ
(ステータス依存データ2)
1byte 1byte 1byte 1byte
フォーマット 00 FF 00 00

拡張ステータス一覧
メッセージ 拡張ステータス 拡張ステータス依存データ
チャンネルに依存しない音源制御情報
バイト(ビット)列 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
マスターボリューム B0h (0〜127?)
B1h
ドラムスケール変更 BAh 0 チャンネル 0 0 1でドラム
テンポメッセージ
テンポ Cxh ※後述(20〜255)
演奏管理情報
バイト(ビット)列 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
演奏位置情報 D0h 開始(00h) or 終了(01h)
ループポイント DDh ループID ループ回数
1111で無限
開始:00 終了:01
NOP DEh 00h
EndOfTrack DFh 00h
音源制御情報
バイト(ビット)列 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
音色 E0h パート GM音色の下位6bit
E1h パート 0 0 0 0 1 GM音色のBit6
音量 E2h パート 音量(0-63)
ステレオバランス E3h パート 左(0、1)← 中央(32)→右(63)(MFi2)
チャンネル割り当て E5h パート 0〜15(MFi2)PCM機のみ
ボリュームの相対変化 E6h パート -32〜0〜31(MFi2)
拡張情報
音色編集 F0h (MFi1)
  詳細は別ページにて
ビブラート F1h 00 03 01h 〜 (MFi1)
  詳細は別ページにて
機種依存 FFh (MFi2)
  詳細は別ページにて

システムメッセージは基本的に4バイトから構成され、テンポ、音色、音量等の設定を行います。
Δタイムの後にシステムメッセージのFFh(これで音階と区別しています)、その後に命令の種別を示すメッセージコードを記述し、最後にその命令への値を記述します。
Ver1.0での特殊な例として音色編集ビブラートがありますが、これは他のページで説明します。
また、Ver1.0の場合、テンポ、音色、音量は一番最初に指定したもののみ有効となり、後のものは無視されます。さらに曲の始まり(FFD000h)は省略可能ですが、曲の終わり(FFDF00h)は省略できないようです(F209iの場合)。
ですので、上の表でビブラートと曲の終わり以外はトラック部の頭にまとめて記述した方が、データ的に美しいかもしれないですね。
(MFi2) Ver2.0の場合は曲中のテンポ、音色、音量の変更が可能なようです。拡張情報である音色変更とビブラートは機種依存の一つとして分類されたため、使用不可になります。また、ループのネストの最大は4です。さらに機種依存情報によりPCM機、FM機でデータの差がある模様です。とりあえずN503iのみ調査中。

テンポ
拡張ステータス 拡張ステータス 拡張ステータス依存データ
(テンポ)
上位4bit 下位4bit タイムベース 上位4bit 下位4bit タイムベース
C
(1100)
0000 C
(1100)
1000 15 20〜125〜255
0001 12 1001 30
0010 24 1010 60
0011 48 1011 120
0100 96 1100 240
0101 192 1101 480
0110 384 1110 960
0111 N/A 1111 N/A

テンポは他の命令と違って、拡張ステータスの下位4bitも可変で意味を持ちます。このタイムベースとテンポの値によって、1Δタイムの絶対時間が導き出されます。
1Δタイム = (60/テンポ)/タイムベース (単位:秒)



戻る