MuSICA ドライバー部 音楽データ 仕様書

MSXマガジン標準ミュージックドライバー[MuSICA]
(C) Ascii corporation / 1990

MSXディスク通信創刊号(1990年10月)付属のMuSICA仕様書に、
幾つか補足修正を加えた非公式版です。

 MSXマガジン標準ミュージックドライバー「MuSICA」は、FM音源9音、PSG音源3音、SCC音源5音の全17音を同時に発声できるミュージックドライバーです。

 「MuSICA」のドライバー部で使用する音楽データ形式について説明します。

ミュージックデータ データ構造

 ミュージックデータは、ヘッダーデータ、シーケンスデータ、ブロックデータ、音色データの4つのデータから構成されます。

 ブロックデータは実際に演奏を行う音階、音調データなどで構成されており、シーケンスデータは、そのブロックデータをどのような順番で演奏するかを設定するためのデータです。

 さらに、そのシーケンスデータをどのチャンネルに振り分けるかを指定するのがヘッダーデータです。

(1) ヘッダーデータ データ構造

オフセット 内容
+0 モード指定
+1 1 CH シーケンスデータ先頭番地
+3 2 CH シーケンスデータ先頭番地
- ・・・・・・・・・・・・・・
+33 17CH シーケンスデータ先頭番地

モード指定

 FM音源部をメロディー6音+リズム、メロディー9音のどちらのモードを使用するかを指定します。
0の時メロディー6音+リズム、1の時メロディー9音が選択されます。

シーケンスデータ先頭番地

 各チャンネルのシーケンスデータの先頭番地を絶対番地で指定します。
使用しないチャンネルは0000Hを設定します。

各チャンネルのふりわけ方

 チャンネル1~9がFM音源に、チャンネル10~13がPSG音源に、チャンネル13~17がSCC音源に対応しています。

 FM音源部がメロディー6音+リズムのとき、チャンネル1~6がメロディーに、チャンネル7がリズムとなり、チャンネル8、9は0000Hを指定し、使用してはいけません。

(2) シーケンスデータ データ構造

 ブロックデータの演奏順番と演奏回数をチャンネル毎に設定します。
最初の2バイトがブロックデータの先頭番地(絶対番地)、次の1バイトが演奏回数です。

 シーケンスデータを終了させたい場合はブロックデータのアドレスに0000Hを指定します。

 ミュージックドライバーはある任意のチャンネルの演奏が終了しても、他のチャンネルが演奏中であるときは、他のすべてのチャンネルの演奏が終了するまで何もせずに待ちます。

(例)

DW BLOCK1 ;1番目に演奏するブロックデータのアドレス  
DB 2      ;演奏回数  
DW BLOCK2 ;2番目に演奏するブロックデータのアドレス  
DB 2      ;演奏回数  
DW 0000H  ;終了  

 BLOCK1を2回、BLOCK2を1回演奏し、他のすべてのチャンネルの演奏が終了するまで待ちます。

(3) ブロックデータ データ構造

メロディー部とリズム部でコマンドが異なります。

1. メロディー部

00H~5FH

音程指定となります。続く1バイトが音長データです。

音階データは00Hは休符、01HがO1Cとなり、以後半音毎に+1されます。
このため8オクターブ目のシ(O8B)の音程は使用できません。

音長データは1から255で指定します。
0を指定した場合の動作の保証はありません。

0FFHを指定した場合は、さらに次の1バイトも音長データとして加算されます。
この音長データの読み出しは、0FFH以外になるまで繰り返されます。

後記のウェイト指定、リズム音長データもこの形式と同様です。

60H~6FH

音量指定です。この値から60Hを引いた値が実際にレジスタに設定されます。
デフォルトは60Hです。

FM音源の場合60Hが、PSG音源、SCC音源の場合6FHが最大です。

70H~7FH

音色指定です。この値から70Hを引いた値が実際にレジスタに設定されます。
デフォルトは7AHです。

この命令はFM音源のみの命令で、PSG音源、SCC音源で使用した場合は何も起こりません。

80H

サスティンOFF指定OFFです。
デフォルトはサスティンOFFです。

PSG音源、SCC音源で使用した場合は何も起こりません。

81H

サスティンON指定です。

PSG音源、SCC音源で使用した場合は何も起こりません。

82H

ミュージックドライバーではサポートしていません。
このデータを使用しても何も起こりません。

83H

ユーザー音色指定です。続く2バイトでユーザー音色データのある番地を絶対番地で指定します。

FM音源の場合、ここで設定したユーザー音色を発声させるには音色指定で70Hを指定しなければなりません。

音源によってデータ形式が異なるため、FMチャンネルにPSGデータを設定した場合などの動作の保証はありません。

84H

レガートOFF指定です。
デフォルトはレガートOFFです。

この指定をした場合、音を音符毎に切って演奏します。

85H

レガートON指定です。

この指定をした場合、音を音符毎に切らずに演奏します。

86H

Q指定です。続く1バイトのデータ(1~8または0)で指定します。
デフォルトは8です。

Q指定が0の時だけは特別な意味を持ち、この値が指定された場合、必ず最後の1カウントは音を切って演奏します。

データが1~8または0出ない場合の動作の保証はありません。
また、レガートONの時はQ指定は実行されません。

87H

デチューン指定です。続く1バイトのデータ(0~255)がデチューン量です。
デフォルトは0です。

0を設定した場合デチューンは行われません。

88H

ポルタメントを指定します。続く1バイトのデータ(0~255)で音程の変化量を指定します。
デフォルトは0です。

0を設定した場合ポルタメントは行われません。
時間変化はLFOの速度に左右されます。

89H

ビブラート指定です。続く1バイトのデータ(0~255)でビブラートの深さを設定します。
デフォルトは0です。

0を設定した場合ビブラートは行われません。

8AH

ミュージックドライバーではサポートしていません。
このデータを使用しても何も起こりません。

8BH

LFOの速度を指定します。続く1バイトのデータ(1~255)で設定します。
デフォルトは1です。

ポルタメント、ビブラート、トレモロなどはこの設定値で動作します。

8CH

レジスタ直接書き込み指定です。続く1バイトでレジスタ番号を、さらに続く1バイトで書き込むデータを指定します。

FM音源、PSG音源、SCC音源のどれにでも使用できますが、レジスタ番号、データともに、それぞれの音源の有効範囲外の指定をした場合の動作の保証はありません。

8DH

ウェイト指定です。続く1バイトで待ち時間を指定します。

この待ち時間は音長データと同様の形式で読みだされますが、Q指定、レガート指定などの影響をまったく受けず、本当にただ待つだけです。主に、前記のレジスタ直接書き込み指定とともに使用します。

8EH~FEH

未使用となります。

このデータを実行した場合の動作の保証はありません。

FFH

そのブロックデータ枚の終了コードです。

このコードがはいると、シーケンスデータに設定されている次のブロックデータの演奏を開始します。

--- 注意 ---

ポルタメント、ビブラートは同時に使用することはできません。
同時に使用した場合は、後で設定されたほうが有効になります。

2. リズム部

リズム音操作
ビット 7 6 5 4 3 2 1 0
意味 V 0 1 B S M C H
ビット 意味
V このビットが1なら次の1バイトで音量指定
0なら指定されたリズム楽器を発音
B バスドラムを指定
S スネアドラムを指定
M タムタムを指定
C シンバルを指定
H ハイハットを指定
(bit7) V=0 (001?????b)

リズム発声指定です。続く1バイトのデータが音長データです。
この音長データの読み出しはメロディー部の場合と同様です。

(bit7) V=1 (101?????b)

音量指定です。続く1バイトのデータ(0~15)が音量データとなります。
このデータは下位4ビットが有効です。

0C0H (11000000b)

レジスタ直接書き込み指定です。使用方法はメロディー部と同様です。

0FFH (11111111b)

そのブロックデータの演奏を終了します。

(4) 音色データ データ構造

FM音源の場合

1つの音色データは8バイトで構成されます。

OPLL(YM2413)のレジスタ00H~07Hの順に設定されます。

ofs. C/M bit76543210
+0 (M) AMVIBEGKSRMULtiple
+1 (C) AMVIBEGKSRMULtiple
+2 (M) KSLTotal Level
+3 (C) KSL0DCDMFeedBack(M)
+4 (M) Attack RateDecay Rate
+5 (C) Attack RateDecay Rate
+6 (M) Sustain LevelRelease Rate
+7 (C) Sustain LevelRelease Rate
  • (M): Modulator

  • (C): Carrier

  • Multiple値と周波数倍率の関係について、
    特殊なものは、0(半分)、10と11(10倍)、12と13(12倍)、14と15(15倍)。
    それ以外は指定値通りの倍率。

  • [BUG] MuSICAの音色エディタではDCとDMが入れ替わっているバグあり

ofs size bit name long name 補足
+0 1 7 AM (M) Amplitude Modulation (M) 音量ビブラート
1 6 VB (M) Vibrato (M) 音程ビブラート
1 5 EG (M) EG Type (M) 1なら減衰音
1 4 KSR(M) Key Scale Rate (M) 音程が高いほど変化が速い
4 3-0 MUL(M) Multiple (M) 周波数倍率
+1 1 7 AM (C) Amplitude Modulation (C) 音量ビブラート
1 6 VB (C) Vibrato (C) 音程ビブラート
1 5 EG (C) EG Type (C) 1なら減衰音
1 4 KSR(C) Key Scale Rate (C) 音程が高いほど変化が速い
3 3-0 MUL(C) Multiple (C) 周波数倍率
+2 2 7-6 KSL(M) Key Scale Level (M) 音程が高いほど出力が減衰
6 5-0 TL (M) Total Level (M) 出力を減衰
+3 2 7-6 KSL(C) Key Scale Level (C) 音程が高いほど出力が減衰
1 5 0 --- (-) 常に0
1 4 DC (C) Distortion (C) (C) 半波整流
1 3 DM (M) Distortion (M) (M) 半波整流
3 2-0 FB (M) FeedBack (M) フィードバック
+4 4 7-4 AR (M) Attack Rate (M) アタックレート
4 3-0 DR (M) Decay Rate (M) ディケィレート
+5 4 7-4 AR (C) Attack Rate (C) アタックレート
4 3-0 DR (C) Decay Rate (C) ディケィレート
+6 4 7-4 SL (M) Sustain Level (M) サスティンレベル
4 3-0 RR (M) Release Rate (M) リリースレート
+7 4 7-4 SL (C) Sustain Leve (C) サスティンレベル
4 3-0 RR (C) Release Rate (C) リリースレート

PSG音源の場合

1つの音色データは6バイトで構成されます。

VCDファイルでは切りの良いように8バイト単位で配置されます。
(2バイトは余白になります)

オフセット 内容
+0 ソフトウェアエンベロープのアタックタイム
+1 ソフトウェアエンベロープのディケイタイム
+2 ソフトウェアエンベロープのサスティンレベル
+3 ソフトウェアエンベロープのリリースタイム
+4 ノイズの周波数
+5 トーン及び、ノイズのオン・オフ制御
(0x01 = Tone off
+6 空き
+7 空き
  • アタック、ディケイ、リリースは上位4ビットでカウンター、下位4ビットで音量の変化量を指定します。
    それぞれ値のとる範囲は1~15です。

    たとえば、カウンターの値が1で変化量が2の場合、
    1カウント(60分の1秒)で音量が2ずつ変化していく。

  • サスティンレベルは0~15で指定します。

  • ノイズの周波数は0~31で指定します。

  • トーンおよび、ノイズのオン・オフ制御は、

    ビット0でトーンを指定。
    ビット3でノイズを指定。

    ビットが0のときオン。
    ビットが1のときオフ。

  • その他のビットは0を指定しなければなりません。

SCC音源の場合

1つの音色データは36バイトで構成されます。

オフセット 内容
+0 ソフトウェアエンベロープのアタックタイム
+1 ソフトウェアエンベロープのディケイタイム
+2 ソフトウェアエンベロープのサスティンレベル
+3 ソフトウェアエンベロープのリリースタイム
+4~+35 波形データ
  • ソフトウェアエンベロープはPSG音源と同様です。

  • 波形データは、符号付8ビットの振幅データが32個で1周期を構成します。

  • チャンネル4、5はハードウェアの都合上同じデータを使用するため、後で設定された波形データが有効になります。

波形データテーブル例

+4:  0x80 = -127  
     0x81 = -126  
     ...  
     0xFE =   -2  
     0xFF =   -1  
     0x00 =    0  
     0x01 =   +1  
     0x02 =   +2  
     ...  
     0x7E = +126  
+35: 0x7F = +127