今まで何度も使用&改造させていただいている「よっしゅさん製作のFM音源ドライバー」ですが、 今回は 外付けFM音源カートリッジ(PC-60m55)対応 や かんたんテープイメージ作成機能 などを追加したカスタムバージョンを作成してみました。
また、「MSXのカートリッジスロットに PC-60m55 を差しても使用可能」ということが確認されたので、MSXにも対応してみました。
このサウンドドライバーは以下のどの環境でも動作します。
演奏データの作成は Windows用のツール上で行います。
・(MSX用ドライバーのみ)OPNもクロック3.5MHzに対応しました。(v 1.0.0.6)
・ポート番号を直接入力できるようにしました。(v 1.0.0.5)
・MSX用のサウンドドライバーを出力できるようにしました。(v 1.0.0.4)
・ポート番号を細かく指定できるようにしました。(v 1.0.0.4)
・チップごとにクロックを指定できるようにしました。(v 1.0.0.4)
・mml_sample3.txt を追加しました。(v 1.0.0.4)
・テープイメージの最後に冗長なデータを追加して読み込みに失敗しにくいようにしました。(v 1.0.0.3)
・ポート番号を変更できるようにしました。(v 1.0.0.2)
・ボリュームの相対指定が逆になっていたのを修正しました。(v 1.0.0.1)
・mml_sample2.txt を追加しました。(v 1.0.0.1)
MMLウィンドウに書かれたテキストは、演奏データに変換(コンパイル)する必要があります。
演奏データは2通りのフォーマットで出力することができます。
演奏データとサウンドドライバーを、エミュレーターなどで使用されるテープイメージファイル(PC-6001は.p6形式、MSXはcas形式)として出力します。
また、実機でロード可能なWAVファイルも同時に作成するので、PCの音声出力端子から直接実機でCLOADすることもできます。
演奏データとサウンドドライバーを別々のバイナリーファイルとして出力します。
純粋なバイナリーファイルなので、実機でロードするにはローダープログラムを書く必要があります。
エミュレーターPC6001VW/PC6001VXでは、デバッガから loadmemコマンドでメモリに直接セットすることができます。
DISK-BASIC から BLOAD命令でロードできます。
2つの音源チップのパラメーターを別々に指定できます。
MMLを書く際には、チップA は A~F、チップB は a~f の識別文字でコントロールします。
パラメーターを変更した場合はかならずサウンドドライバーを再出力してください。
環境 | 使用可能 トラック識別子 | ドライバー | チップA クロック | チップA アドレスWR | チップA データWR | チップA ステータスRD | チップB クロック | チップB アドレスWR | チップB データWR | チップB ステータスRD | その他設定 |
---|---|---|---|---|---|---|---|---|---|---|---|
PC-6001/mkII/PC-6601 で 内蔵音源(PSG) のみを使う (PC-60m55は外してください) | D,E,F | PC-6001用 | 4.0MHz | A0H | A1H | A3H | 未使用 | 未使用 | 未使用 | 未使用 | |
PC-6001/mkII/PC-6601 で PC-60m55(FM・SSG) のみを使う | A,B,C,D,E,F | PC-6001用 | 4.0MHz | 70H | 71H | 73H | 未使用 | 未使用 | 未使用 | 未使用 | |
PC-6001/mkII/PC-6601 で PC-60m55(FM・SSG) をメイン 内蔵音源(PSG) をサブとして使う (PC-60m55は必ず優先されます) | A,B,C,D,E,F,d,e,f | PC-6001用 | 4.0MHz | 70H | 71H | 73H | 4.0MHz | A0H | A1H | A3H | |
PC-6001mkIISR/PC-6601SR で PC-60m55(FM・SSG) をメイン 内蔵音源(FM・SSG) をサブとして使う | A,B,C,D,E,F,a,b,c,d,e,f | PC-6001用 | 4.0MHz | 70H | 71H | 73H | 4.0MHz | A0H | A1H | A3H | |
PC-6001mkIISR/PC-6601SR で 内蔵音源(FM・SSG) をメイン PC-60m55(FM・SSG) をサブとして使う | A,B,C,D,E,F,a,b,c,d,e,f | PC-6001用 | 4.0MHz | A0H | A1H | A3H | 4.0MHz | 70H | 71H | 73H | |
MSX で 内蔵音源(PSG) のみを使う | D,E,F | MSX用 | 3.5MHz | A0H | A1H | A3H | 未使用 | 未使用 | 未使用 | 未使用 | ステータスレジスタ無視 |
MSX で PC-60m55(FM・SSG) のみを使う (パターン1) | A,B,C,D,E,F | MSX用 | 4.0MHz | 70H | 71H | 73H | 未使用 | 未使用 | 未使用 | 未使用 | ステータスレジスタ無視 |
MSX で PC-60m55(FM・SSG) のみを使う (パターン2) | a,b,c,d,e,f | MSX用 | 未使用 | 未使用 | 未使用 | 未使用 | 4.0MHz | 70H | 71H | 73H | ステータスレジスタ無視 |
MSX で PC-60m55(FM・SSG) をメイン 内蔵音源(PSG) をサブとして使う | A,B,C,D,E,F,d,e,f | MSX用 | 4.0MHz | 70H | 71H | 73H | 3.5MHz | A0H | A1H | A3H | ステータスレジスタ無視 |
MSX で 内蔵音源(PSG) をメイン PC-60m55(FM・SSG) をサブとして使う | D,E,F,a,b,c,d,e,f | MSX用 | 3.5MHz | A0H | A1H | A3H | 4.0MHz | 70H | 71H | 73H | ステータスレジスタ無視 |
演奏中は通常の割り込みが停止するので、何か作業を行う前には必ずサウンドドライバーを停止させてください。
オリジナルマニュアルおよび技術情報は YOSHさんのページをご覧ください(ただし一部の仕様については変更または削除されているのでご了承ください)。
MMLは行単位で解析され、行頭の識別文字とその後に続くMMLとして解析されます。
識別文字によってその行が何のデータを表すか判断するので、必ず行頭には指定の識別文字を書いてください。
; MML記述例 A v15o4l8cdefg B v15o4l8efgab C v15o4l8gab>cd
赤い部分が識別文字、青い部分がMMLです。
以下に識別文字の一覧を掲載します。
識別文字に関してはアルファベットの大文字と小文字で意味が異なるので注意してください。
識別文字 | 意味 | PC-6001/mkII/6601 出力先 | PC-6001/mkII/6601 +PC-60m55 出力先 | PC-6001mkIISR/6601SR 出力先 | PC-6001mkIISR/6601SR +PC-60m55 出力先 |
---|---|---|---|---|---|
A | FM音源A チャンネル1 MML定義 | - | 外部 | 本体 | 本体 |
B | FM音源A チャンネル2 MML定義 | - | 外部 | 本体 | 本体 |
C | FM音源A チャンネル3 MML定義 | - | 外部 | 本体 | 本体 |
D | PSG音源A チャンネル1 MML定義 | 本体 | 外部 | 本体 | 本体 |
E | PSG音源A チャンネル2 MML定義 | 本体 | 外部 | 本体 | 本体 |
F | PSG音源A チャンネル3 MML定義 | 本体 | 外部 | 本体 | 本体 |
a | FM音源B チャンネル1 MML定義 | - | - | - | 外部 |
b | FM音源B チャンネル2 MML定義 | - | - | - | 外部 |
c | FM音源B チャンネル3 MML定義 | - | - | - | 外部 |
d | PSG音源B チャンネル1 MML定義 | - | 本体 | - | 外部 |
e | PSG音源B チャンネル2 MML定義 | - | 本体 | - | 外部 |
f | PSG音源B チャンネル3 MML定義 | - | 本体 | - | 外部 |
V | FM音源ボイスデータ定義 | - | 外部 | 本体 | 本体・外部共通 |
; | コメント(行の途中に書いても可) |
以下にMMLコマンドの一覧を掲載します。
基本コマンド | 意味 | FMチャンネル | PSGチャンネル |
---|---|---|---|
Cn Dn En Fn Gn An Bn C%n D%n E%n F%n G%n A%n B%n | n分音符を演奏します。 | ○ | ○ |
+ # | シャープです。半音上げます。 | ○ | ○ |
- | フラットです。半音下げます。 | ○ | ○ |
. | 符点です。音長を1.5倍にします。 | ○ | ○ |
& | タイです。この記号の直後の音はキーオンを行わず、前の音と連続して演奏します。 | ○ | ○ |
Rn R%n | 休符です。nの意味については音符と同様です。 | ○ | ○ |
Ln L%n | デフォルト音長を設定します。nの意味については音符と同様です。 | ○ | ○ |
On | オクターブを設定します。(1~8) | ○ | ○ |
>n <n | オクターブを相対的に設定します。(1~8・省略時1) | ○ | ○ |
Vn V%n | ボリュームの値を指定します。(0~15) | ○ | ○ |
( ) | ボリュームを相対的に設定します。 | ○ | ○ |
Tn1,n2 | テンポを設定します。一つのチャンネルで指定すれば、その音源の他のチャンネルも影響を受けます。また、曲の途中で変更はできません。 通常の指定方法と違うので少しわかりにくいかもしれませんが、(n2+1)/2048秒ごとに割り込みを発生させ、その割り込みがn1回カウントされるごとに96分音符を処理します。 | ○ | ○ |
音程制御コマンド | 意味 | FMチャンネル | PSGチャンネル |
U%n U+n U-n | デチューンの値を直接設定、または相対設定します。(-127~127) | ○ | ○ |
Mn1,n2,n3,n4 | ビブラートを設定します。詳細はこちら | ○ | ○ |
N | ビブラートの有効/無効を切り替えます。 | ○ | ○ |
_n | このチャンネルを転調します。(-12~12) | ○ | ○ |
K | 転調の有効/無効を切り替えます。 | ○ | ○ |
音長制御コマンド | 意味 | FMチャンネル | PSGチャンネル |
Qn | ゲートタイムを設定します。(0~255) | ○ | ○ |
^ | 音長の数字を合算します。マイナスも指定できます。 | ○ | ○ |
音量制御コマンド | 意味 | FMチャンネル | PSGチャンネル |
Sn1,n2,n3,n4 | ソフトウェアエンベロープを設定します。詳細はこちら | - | ○ |
S0 | ソフトウェアエンベロープを解除します。 | - | ○ |
ノイズ制御コマンド | 意味 | FMチャンネル | PSGチャンネル |
Pn | ノイズモードを設定します。(1~3) | - | ○ |
Wn W+n W-n | ノイズ周波数を指定します。(0~31) | - | ○ |
演奏制御コマンド | 意味 | FMチャンネル | PSGチャンネル |
[ | ネスト(繰り返し)開始位置を指定します。4重まで重ねられます。 | ○ | ○ |
]n | ネスト終了位置と回数を指定します。(2~255) | ○ | ○ |
: | ネストを抜ける位置を指定します。最終ループ時にはこの記号以降を演奏しません。 | ○ | ○ |
J | 演奏データの最後に到達するとこの地点まで戻ります。 | ○ | ○ |
システム制御コマンド | 意味 | FMチャンネル | PSGチャンネル |
Yn1,n2 | YM2203のレジスタn1に値n2を設定します。 | ○ | ○ |
In | nをワークエリアに書き込みます(0~255)。曲の演奏に合わせてタイミングを取りたい場合などに使えるかもしれません。 | ○ | ○ |
Zn1,n2 | 本体のI/Oポートn1に値n2を出力します。 | ○ | ○ |
音色設定コマンド | 意味 | FMチャンネル | PSGチャンネル |
V | 音色番号 n のパラメーターを定義します。 | ○ | - |
その他、質問事項はtwitterで @tiny_yarou までお気軽にどうぞ(^_^)
Special Thanks to YOSH
http://park10.wakwak.com/~yosh/index2.html