初版 | 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 | オクターブセットに関する記述を修正 |
MMMD | |||
|_________ | CNTI | ||
|____ | MTR | ||
|_________ | Mtsu | ||
|____ | MspI | ||
|____ | Mtsq |
シグネチャ | データサイズ | データ | |
---|---|---|---|
16進 | 4D 4D 4D 44 | 00 00 00 00 | ・・・・ |
ASCII | 'M' 'M' 'M' 'D' |
シグネチャ | データサイズ | 不明の5バイト | 曲の説明 | |
---|---|---|---|---|
16進 | 43 4E 54 49 | 00 00 00 00 | 00 00 00 01 00 | ・・・・ |
ASCII | 'C' 'N' 'T' 'I' |
シグネチャ | データサイズ | 不明 | @ | A | 不明 | サブチャンク | |
---|---|---|---|---|---|---|---|
16進 | 4D 54 52 00 | 00 00 00 00 | 00 00 | 02 | 02 | 00 00 | ・・・・ |
ASCII | 'M' 'T' 'R' '・' |
シグネチャ | データサイズ | データ | |
---|---|---|---|
16進 | 4D 74 73 75 | 00 00 00 00 | ・・・・ |
ASCII | 'M' 't' 's' 'u' |
エクスクルーシブ | 可変データ長 | データヘッダ | データ | フッタ |
FF F0 | 00 ・・・ | 43 02 ** | ・・・・ | F7 |
エクスクルーシブ | 内容 |
---|---|
1デルタタイムあたりのmsecらしい。が変えるとテンポが変になる、使い方がいまいち不明。 | |
音色設定その1 | |
音色設定その2 | |
音色設定その3 | |
音色設定その4 |
シグネチャ | データサイズ | データ | |
---|---|---|---|
16進 | 4D 73 70 49 | 00 00 00 00 | ・・・・ |
ASCII | 'M' 's' 'p' 'I' |
シグネチャ | データサイズ | データ | |
---|---|---|---|
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 の場合
*の音長は0.5デルタタイム分足りていないのでどっかで補正しなければならない MTRチャンクの@の値を 01 にするとテンポが 02 の倍になる同様に 00 にすると 01 の倍になる。03 にするとなぜか 02 の 約0.8倍になる。 |
#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; }