PC-6001シリーズ用FM音源ドライバー

今まで何度も使用&改造させていただいている「よっしゅさん製作のFM音源ドライバー」ですが、 今回は 外付けFM音源カートリッジ(PC-60m55)対応かんたんテープイメージ作成機能 などを追加したカスタムバージョンを作成してみました。

また、「MSXのカートリッジスロットに PC-60m55 を差しても使用可能」ということが確認されたので、MSXにも対応してみました。

参考動画

動作環境

このサウンドドライバーは以下のどの環境でも動作します。

  1. 本体PSG(PC-6001/mkII/6601/MSX) PSG/PSG/PSG
  2. 内蔵FM音源(PC-6001mkIISR/6601SR) FM/FM/FM/PSG/PSG/PSG
  3. 本体PSG(PC-6001/mkII/6601/MSX)+外付FM音源カートリッジ(PC-60m55) FM/FM/FM/PSG/PSG/PSG/PSG/PSG/PSG
  4. 内蔵FM音源(PC-6001mkIISR/6601SR)+外付FM音源カートリッジ(PC-60m55) FM/FM/FM/FM/FM/FM/PSG/PSG/PSG/PSG/PSG/PSG

ダウンロード

演奏データの作成は Windows用のツール上で行います。

ツールの説明

コンパイル

MMLウィンドウに書かれたテキストは、演奏データに変換(コンパイル)する必要があります。

コンパイルボタンについて

出力フォーマット

演奏データは2通りのフォーマットで出力することができます。

テープイメージファイル

演奏データとサウンドドライバーを、エミュレーターなどで使用されるテープイメージファイル(PC-6001は.p6形式、MSXはcas形式)として出力します。

また、実機でロード可能なWAVファイルも同時に作成するので、PCの音声出力端子から直接実機でCLOADすることもできます。

バイナリーファイル・BLOADファイル

演奏データとサウンドドライバーを別々のバイナリーファイルとして出力します。

PC-6001用

純粋なバイナリーファイルなので、実機でロードするにはローダープログラムを書く必要があります。

エミュレーターPC6001VW/PC6001VXでは、デバッガから loadmemコマンドでメモリに直接セットすることができます。

MSX用

DISK-BASIC から BLOAD命令でロードできます。

コンパイルオプションについて

データマッピング

クロック・I/Oポート設定

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,FPC-6001用4.0MHzA0HA1HA3H未使用未使用未使用未使用
PC-6001/mkII/PC-6601 で
PC-60m55(FM・SSG) のみを使う
A,B,C,D,E,FPC-6001用4.0MHz70H71H73H未使用未使用未使用未使用
PC-6001/mkII/PC-6601 で
PC-60m55(FM・SSG) をメイン
内蔵音源(PSG) をサブとして使う
(PC-60m55は必ず優先されます)
A,B,C,D,E,F,d,e,fPC-6001用4.0MHz70H71H73H4.0MHzA0HA1HA3H
PC-6001mkIISR/PC-6601SR で
PC-60m55(FM・SSG) をメイン
内蔵音源(FM・SSG) をサブとして使う
A,B,C,D,E,F,a,b,c,d,e,fPC-6001用4.0MHz70H71H73H4.0MHzA0HA1HA3H
PC-6001mkIISR/PC-6601SR で
内蔵音源(FM・SSG) をメイン
PC-60m55(FM・SSG) をサブとして使う
A,B,C,D,E,F,a,b,c,d,e,fPC-6001用4.0MHzA0HA1HA3H4.0MHz70H71H73H
MSX で
内蔵音源(PSG) のみを使う
D,E,FMSX用3.5MHzA0HA1HA3H未使用未使用未使用未使用ステータスレジスタ無視
MSX で
PC-60m55(FM・SSG) のみを使う
(パターン1)
A,B,C,D,E,FMSX用4.0MHz70H71H73H未使用未使用未使用未使用ステータスレジスタ無視
MSX で
PC-60m55(FM・SSG) のみを使う
(パターン2)
a,b,c,d,e,fMSX用未使用未使用未使用未使用4.0MHz70H71H73Hステータスレジスタ無視
MSX で
PC-60m55(FM・SSG) をメイン
内蔵音源(PSG) をサブとして使う
A,B,C,D,E,F,d,e,fMSX用4.0MHz70H71H73H3.5MHzA0HA1HA3Hステータスレジスタ無視
MSX で
内蔵音源(PSG) をメイン
PC-60m55(FM・SSG) をサブとして使う
D,E,F,a,b,c,d,e,fMSX用3.5MHzA0HA1HA3H4.0MHz70H71H73Hステータスレジスタ無視

実行方法

PC-6001

  1. FM音源カートリッジ(PC-60m55)を使う場合は先にカートリッジスロットにセットしてください。
  2. 初代機からSRまでどの機種でも実行することができますが、SRではモード1~5を選んでください。PAGE や FILESはいくつでも構いませんが、メモリを消費するのでPAGEは少なめ、FILESは0が良いと思います。
  3. 作成されたWAVファイルを再生状態にして(またはエミュレーターにテープイメージファイルをセットして)CLOAD してください。
  4. ロードが終了したらRUNしてください。演奏データとサウンドドライバーを正しいアドレスに転送して演奏を開始します。
  5. 演奏が終了するか、演奏中にSTOPを押すと、サウンドドライバーが停止します。

演奏中は通常の割り込みが停止するので、何か作業を行う前には必ずサウンドドライバーを停止させてください。

MSX(テープ)

MSX(ディスク)

ワンポイント

MML書式マニュアル

オリジナルマニュアルおよび技術情報は 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
出力先
AFM音源A チャンネル1 MML定義-外部本体本体
BFM音源A チャンネル2 MML定義 -外部本体本体
CFM音源A チャンネル3 MML定義 -外部本体本体
DPSG音源A チャンネル1 MML定義 本体外部本体本体
EPSG音源A チャンネル2 MML定義 本体外部本体本体
FPSG音源A チャンネル3 MML定義 本体外部本体本体
aFM音源B チャンネル1 MML定義 ---外部
bFM音源B チャンネル2 MML定義 ---外部
cFM音源B チャンネル3 MML定義 ---外部
dPSG音源B チャンネル1 MML定義 -本体-外部
ePSG音源B チャンネル2 MML定義 -本体-外部
fPSG音源B チャンネル3 MML定義 -本体-外部
VFM音源ボイスデータ定義 -外部本体本体・外部共通
;コメント(行の途中に書いても可)

MMLコマンド一覧

以下に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,2,3,4,6,8,12,16,24,32,48,96 のみ指定可能です。

%nと指定した場合、「96分音符n個分」の音長になります。

+
#

シャープです。半音上げます。

-

フラットです。半音下げます。

.

符点です。音長を1.5倍にします。
(1つ付けると1+0.5=1.5倍、2つ付けると1+0.5+0.25=1.75倍、3つ付けると1+0.5+0.25+0.125=1.875倍になります)

&

タイです。この記号の直後の音はキーオンを行わず、前の音と連続して演奏します。

Rn
R%n

休符です。nの意味については音符と同様です。

Ln
L%n

デフォルト音長を設定します。nの意味については音符と同様です。

On

オクターブを設定します。(1~8)

(n
)n

オクターブを相対的に設定します。(1~8・省略時1)
現在演奏中のオクターブからnオクターブ上下させます。

Vn
V%n

ボリュームの値を指定します。(0~15)
FMチャンネルでは %nと指定することで詳細にコントロールすることもできます。(0~127)

>
<

ボリュームを相対的に設定します。
現在演奏中のボリューム(V%nではなくVnで指定した値)を1段階ずつ上下させます。

Tn1,n2

テンポを設定します。一つのチャンネルで指定すれば、その音源の他のチャンネルも影響を受けます。また、曲の途中で変更はできません。
n1… 96分音符のカウント値(1~255)
n2… 割り込みタイマー設定カウンタ(0~255)※初代機では3に固定されます

通常の指定方法と違うので少しわかりにくいかもしれませんが、(n2+1)/2048秒ごとに割り込みを発生させ、その割り込みがn1回カウントされるごとに96分音符を処理します。
通常のテンポ(楽譜やBASICのPLAY文のTコマンドの値)からの変換式を求めると
【mkII以降】 n1=1 としたとき、n2=5120/(1分間の拍数)-1 となります。例えば1分間に160拍の曲を演奏する場合、n2=5120/160-1=31となり、"T1,31" と記述すれば良いことになります。
【初代機】初代機ではn2=3 固定になってしまうので、n1=1280/(1分間の拍数) となります。例えば1分間に160拍の曲を演奏する場合、n1=1280/160=8となり、"T8,3" と記述すれば良いことになります。

音程制御コマンド意味FMチャンネルPSGチャンネル
U%n
U+n
U-n

デチューンの値を直接設定、または相対設定します。(-127~127)

Mn1,n2,n3,n4

ビブラートを設定します。詳細はこちら
n1… ウェイト(0~255)
n2… スピード(1~255)
n3… 振幅回数(0~127)
n4… 増減値(-127~127)

N

ビブラートの有効/無効を切り替えます。

_n

このチャンネルを転調します。(-12~12)

K

転調の有効/無効を切り替えます。

音長制御コマンド意味FMチャンネルPSGチャンネル
Qn

ゲートタイムを設定します。(0~255)

^

音長の数字を合算します。マイナスも指定できます。
「C2...」「C2^4^8^16」「C1^-16」はすべて同じ長さになります。

音量制御コマンド意味FMチャンネルPSGチャンネル
Sn1,n2,n3,n4

ソフトウェアエンベロープを設定します。詳細はこちら
n1… 音量幅(-15~15)
n2… カウンタ(1~255)
n3… 2nd音量幅-15~15)
n4… 2ndカウンタ(-127~127)

-
S0

ソフトウェアエンベロープを解除します。

-
ノイズ制御コマンド意味FMチャンネルPSGチャンネル
Pn

ノイズモードを設定します。(1~3)
1…トーン
2…ノイズ
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)。曲の演奏に合わせてタイミングを取りたい場合などに使えるかもしれません。
ワークエリアのアドレスは、音源#1のチャンネルではF359H、音源#2のチャンネルではF441Hになります。

Zn1,n2

本体のI/Oポートn1に値n2を出力します。

音色設定コマンド意味FMチャンネルPSGチャンネル
V

音色番号 n のパラメーターを定義します。
フィードバックとアルゴリズムを指定した後、オペレーター1、オペレーター2、オペレーター3、オペレーター4の順に記述してください。

V @n
V FB, AL
V AR, DR, SR, RR, SL, TL, KS, ML, DT, EG
V AR, DR, SR, RR, SL, TL, KS, ML, DT, EG
V AR, DR, SR, RR, SL, TL, KS, ML, DT, EG
V AR, DR, SR, RR, SL, TL, KS, ML, DT, EG

-

技術情報メモ


その他、質問事項はtwitterで @tiny_yarou までお気軽にどうぞ(^_^)

謝辞

Special Thanks to YOSH

http://park10.wakwak.com/~yosh/index2.html


戻る