トップへ戻る
初版 2000/10/12
改訂 2000/10/13 MTRのところを修正、チェックサムとか休符とか追加
2000/10/14 MTR,MspIのところを修正、Mtsqのところをちょこっと追加
2000/10/17 音長とテンポの関係を追加
2000/10/27 とりあえずHTML化してみました。それに伴いちょこちょこっと細かいところを修正。
2000/11/01 C302Hにおけるオクターブ制限についてを追加
2001/01/22 オクターブセットに関する記述を修正
MMFフォーマット(au/TU-KA用4和音)

※ここに書かれている内容は私が勝手に解析したもので正しいかどうかもわかりません。
よって、これを使用して起こった不具合等について責任は取れません。あくまで個人責任で使用してください。


・基本構成
4バイトのシグネチャ、4バイトのデータサイズ、データによって構成されるカスケードチャンク構造になっている。
1つのチャンクは内部にサブチャンクを持つ。


・現在のとことわかっているチャンクと構成
MMMD  
 |_________ CNTI
|____ MTR
 |_________ Mtsu
|____ MspI
|____ Mtsq

1.MMMDチャンク
 シグネチャデータサイズデータ
16進 4D 4D 4D 44 00 00 00 00 ・・・・
ASCII 'M' 'M' 'M' 'D'   

 メインのチャンク
 (データサイズはモトローラ形式、ビッグエンディアンだっけか?ようは前から順番に読めばいい)

2.CNTIチャンク
 シグネチャデータサイズ不明の5バイト曲の説明
16進 43 4E 54 49 00 00 00 00 00 00 00 01 00 ・・・・
ASCII 'C' 'N' 'T' 'I'    

 曲の著作情報等が入っている。(不明の5バイト以降は無くてもOK?)

2.MTRチャンク
 シグネチャデータサイズ不明@A不明サブチャンク
16進 4D 54 52 00 00 00 00 00 00 00020200 00 ・・・・
ASCII 'M' 'T' 'R' '・'      

 不明のところはとりあえず 00 をいれとけばOK。
 @は 00〜03 までの値をとる、00にすると曲が速く03で遅くなるのでおそらくデルタタイムの倍率。通常は02を設定する。
 Aは 00〜03 までの値をとる、00にすると音長が短く03で長くなるのでおそらくリリースタイムの倍率。通常は02を設定する。
 サブチャンクを持つ。

3.Mtsuチャンク
 シグネチャデータサイズデータ
16進 4D 74 73 75 00 00 00 00 ・・・・
ASCII 'M' 't' 's' 'u'   

 おそらく曲データ全般に関するデータが格納されている。

 データ部は下記のエクスクルーシブを複数含む構成になっている
エクスクルーシブ可変データ長データヘッダデータフッタ
FF F0 00 ・・・ 43 02 ** ・・・・F7

 ・現在わかっているもの
エクスクルーシブ内容
FF F0 05 43 02 80 ** F71デルタタイムあたりのmsecらしい。が変えるとテンポが変になる、使い方がいまいち不明。
FF F0 13 43 02 00 ・・・ F7音色設定その1
FF F0 13 43 02 01 ・・・ F7音色設定その2
FF F0 13 43 02 02 ・・・ F7音色設定その3
FF F0 13 43 02 03 ・・・ F7音色設定その4

 ・音色設定について
 とりあえずわかっているのは上記の・・・の部分の1バイト目はが 00 2バイト目が音色番号。細かいところは現在不明。
 (サンプル)
 FF F0 13 43 02 00 00 3E F1 3A 17 14 68 2A D3 04 00 00 11 22 44 F7
 FF F0 13 43 02 01 00 50 72 9B 3F C1 98 4B 3F C0 00 10 21 42 00 F7
 など

4.MspIチャンク
 シグネチャデータサイズデータ
16進 4D 73 70 49 00 00 00 00 ・・・・
ASCII 'M' 's' 'p' 'I'   

 なんに使われているか全然不明。無くても音が鳴るから何かのアプリ用の情報か?
 一応データには見つけた限りでは "st:****,sp:****," と "PS:********,PK:********," というのがあるようだ(*のところは数値っぽい)。

4.Mtsqチャンク
 シグネチャデータサイズデータ
16進 4D 74 73 71 00 00 00 00 ・・・・
ASCII 'M' 't' 's' 'q'   

 曲のデータ部。

 ・データコマンド
 データ構造は [デルタタイム] + [メッセージ] という形で構成されている。

  [デルタタイム]は前メッセージ終了からの時間を示している。

  [メッセージ]は、音符、音色設定、ボリューム設定、エクスクルーシブ等の種類がある。

 現在わかっているメッセージ
メッセージ説明
音符:デルタタイム(可変長)+パート(2bit)+オクターブ(2bit)+音階(4bit)+リリースタイム(可変長)
 例)00 10 35 3A 12 35 3A 14 35 (パート0でドレミ)
 ※音階は ド〜△ド を 0〜C であらわしている。
音色設定:デルタタイム(普通は00)+00+[30,70,B0,F0](それぞれ先頭2bitがパートを示す)+音色番号
 例)00 00 30 01 00 00 70 02 00 00 B0 03 00 00 F0 04 (パート0を音色0x01、パート1を音色0x02、パート2を音色0x03、パート3を音色0x04に設定)
 ※音色番号はMIDIのGM規格の音色マップに対応してると思われる。
ミュート:デルタタイム(可変長)+FF+00 (音全部がとまる、各パートごとではない、デルタタイムを 00 にすると何にもおこんない)
音量設定:デルタタイム(普通は00)+00+[37,77,B7,F7](それぞれ先頭2bitがパートを示す)+音量(70で普通くらい?)
 例)00 00 37 7F 00 00 77 5F 00 00 B7 5A 00 00 F7 5F (パート0を音量0x7F、パート1を音量0x5F、パート2を音量0x5A、パート3を音量0x5Fに設定)
不明:デルタタイム(普通は00)+00+[31,71,B1,F1](それぞれ先頭2bitがパートを示す)+データ
エクスクルーシブ:デルタタイム(普通は00)+FF+F0+バイト数+データ+F7
 現在わかっているのは
  00 FF F0 06 43 01 80 31 ** F7 : 1デルタタイムあたりのmsec。Mtsuで設定したもの。
オクターブセット: デルタタイム(普通は00)+00+[32,72,B2,F2](それぞれ先頭2bitがパートを示す)+[00, 01, 02](00はデフォルト値、01で1オクターブ、02で2オクターブ高くなる。但しこれが使用できる音色は限定されています)
終了コード?: 00 00 00 00 (たぶん(^^;;

※可変長値について
  バイトの先頭ビットが0の場合は終端バイト、1の場合は継続バイトであることを示している。(継続バイトの計算方法 : ((Vn & 0x7F) + 1) << (7*n) )
例)3A → 0x3A (58)
80 52 → 0xD2 (210)
82 33 → 0x1B3 (435)
80 81 12 → 0x4112(16658)

※オクターブセットに関しては音符データの間に入れることも可能。それ以外のデータは音符データの前にセットしておかないといけない。

※C302Hでは、ひとつのパート内での音程の変動を3オクターブ内に収めないといけない。
具体的には(例はパート0の場合)
  0x01 〜 0x2C(▽▽ド#〜△ド)
  0x11 〜 0x3C(▽ド#〜△△ド)
  (00 00 32 01 を指定した場合)
  0x11 〜 0x3C(ド#〜△△△ド)
  (00 00 32 02 を指定した場合)
  0x11 〜 0x3B(△ド#〜△△△シ)
の4パターンの範囲内に音程の変動を収めないとダウンロードに成功しても音が鳴らない。

※音長とテンポについて
今のところテンポを直接指定するコマンドが見つかっていないので、デルタタイムでテンポを調整するための対応表を作ってみた
・MTRチャンクの@の値が 02 の場合
音長1601401201009080
320C0D10131518
32.1213*181C*1F*24
16181A20262A30
16.242730393F48
83034404C5460
8.484E60727E80 10
4606880 0080 1880 2880 40
4.80 1080 1C80 4080 6480 7C81 20
280 4080 5081 0081 3081 5082 00
2.81 2081 3882 0082 4882 7483 70
182 0082 2083 0083 6084 2085 00

*の音長は0.5デルタタイム分足りていないのでどっかで補正しなければならない
MTRチャンクの@の値を 01 にするとテンポが 02 の倍になる同様に 00 にすると 01 の倍になる。03 にするとなぜか 02 の 約0.8倍になる。


5.au/TU-KA 4和音専用付加データ

 au/TU-KAの4和音はデータの最後に CRCコード(2バイト) + 1D + 0F が付加される

 CRCコードの計算は 初期値 0xFFFF CRC 多項式は CCITT 勧告の x^{16} + x^{12} + x^5 + 1 を使用して求めます。計算対象は上記の4バイトを除いた部分。

  サンプルコード:

#define CRCPOLY  0x1021U 
//---------------------------------------------------------------------------- 
// Function: 
//		CRCコードを計算する 
// Input: 
//      void *vbuf : データの格納されているバッファ 
//      int byte   : データ数 
//      UINT crc   : CRCコード(初期値として0xFFFFを入れる) 
// Output: 
//		なし。 
// Return:      
//      CRCコード
// Description: // 
//---------------------------------------------------------------------------- 
WORD GetCrc( void *vbuf , int byte , WORD crc )
{
	int i, j; 
	BYTE *buf = (BYTE*)vbuf;  
	for (i = 0; i < byte; i++)
	{
		crc ^= (buf[i] << 8); 	
		for (j = 0; j < 8; j++)
 			if (crc & 0x8000U)
				 crc = (crc << 1) ^ CRCPOLY;
 			else
				crc <<= 1;
	}
 	return ~crc;
}

とりあえずいまのところはこんなけ。


トップへ戻る