MSX Datapack wiki化計画

1章 PSGと音声出力

 MSXには次に示すような3系統の音声出力機能があります。ただし、3.はMSXに標準的に付属するものではないため、第7部で扱います。ここではそれ以外の1.と2.の機能について説明します。

  1. PSGによる音声出力(3チャンネル、8オクターブ)
  2. 1ビットI/Oポートによる音声出力
  3. MSX-AUDIOやMSX-MUSICによる音声出力(FM音源)

 1.1 PSGの機能

 MSXの音楽演奏機能およびBEEP音の発生には、AY-3-8910相当のLSIが使われています。このLSIはPSG(Programmable Sound Generator)とも呼ばれ、その名が示すとおり、プログラムにより複雑な音楽やさまざまな効果音を発生することがきます。その特徴をまとめると次のようになります。

  1. 3チャンネルのトーン発生器を持ち、各チャンネルには独立に、4096種の音階(8オクターブに相当)と16段階の音量を指定することができる。
  2. エンベロープパターンによって、ピアノやオルガンのような音色を出すことができる。ただし、エンベロープ発生器がひとつしか存在しないため、同時に使用できる音色は1種類だけである。
  3. 内蔵するノイズ発生器によって、風の音や波の音のような効果音も容易に得られる。ただし、ノイズ発生器がひとつしか存在しないため、同時に使用できるノイズは1種類だけである。
  4. 入力クロックfcを分周することで、トーンやエンベロープをはじめとする必要なすべての周波数を得ている(なおMSXでは、fc=1.7897725MHzと定められている)。このため音程やリズムのふらつきがまったくない。


図6.1 PSGのブロックダイアグラム

 上のブロックダイアグラムでは省略しましたが、PSGは音声発生の機能とは全く別に2つの入出力ポートを持っています。MSXではこれを汎用入出力ポートとして、ジョイスティック、タッチパッド、パドル、マウスなどの入出力装置との接続にも利用しています。なお、これらの汎用入出力ポートについては、5章で説明します。

1.1.1 PSGのレジスタ

 PSGが音声出力の作業をすべて実行してくれるので、CPUの仕事は単に音が変化する時点でPSGにそれを教えることだけです。これは、図6.2に示したようなPSG内部の16個の8ビットレジスタに値を書き込むことによって行います。
 以下に、これらのレジスタの役割とその使用法を説明します。

1.トーン周波数の設定(R0〜R5)
 A、B、C各チャンネルのトーン周波数はR0〜R5によって設定します。まずPSG内で入力クロック(fc=1.7897725MHz)を16分周し、それを基準周波数とします。また各チャンネルは、この基準周波数をそれぞれに割り当てられた12ビットのデータで分周して最終的な音程を得ます。12ビットの分周データ(TP)と発生する音の周波数(ft)には次のような関係があります。

ft=fc/(16*TP)
 =0.11186078125/TP[MHz]
 =111860.78125/TP[Hz]

 12ビットの分周データTPは、各チャンネルごとに上位4ビットの粗調整値CTと下位8ビットの微調整値FTによって、図6.3のように指定されます。また、音階を作るためのレジスタの設定を表6.1に示します。

図6.2 PSGレジスタ構成


図6.3 音程の設定

表6.1 トーン周波数の設定(音階データ)

音程 オクターブ
12345678
C D5D6AF3571ACD66B351B
C#C9C64E327194CA653219
D BE75F42FA17DBE5F3018
D#B3C59E2CF168B45A2D16
E A9B54E2A7153AA552A15
F A02501281140A0502814
F#9734BA25D12E974C2613
G 8EB47623B11D8F472412
G#86B43621B10D87432211
A 7F23F91FDFE 7F402010
A#7803C01E0F0 783C1EF
B 71438A1C5E3 71391CE

2.ノイズ周波数の設定(R6)
 爆発音や波の音などの合成にかかせないのがノイズ音です。PSGはノイズジェネレータによって発生させたノイズをA〜Cの各チャンネルに出力できます。ノイズジェネレータは1つしかないため、各チャンネル共通に同一のノイズが出力されます。ノイズは平均周波数を変えることによって様々な効果を出すことができ、R6レジスタがその設定を行います。このレジスタの下位5ビットのデータ(NP)で基準周波数(fc/16)を分周し、ノイズの平均周波数(fn)を決定します。

図6.4 ノイズ周波数の設定

 NPとfnの間には次のような関係があります。

fn=fc/(16*NP)
 =0.11186078125/NP [MHz]
 =111860.78125/NP [Hz]

 NPは1〜31の値をとりますから、ノイズの平均周波数は3.6kHz〜111.9kHzの範囲で設定できます。

3.音のミキシング(R7)
 R7は各チャンネルごとに、トーンジェネレータとノイズジェネレータの出力を選択するためのレジスタで、ノイズとトーンの両者を混合することもできます。図6.5に示したように、R7の下位3ビット(B0〜B2)はトーン出力、次の3ビット(B3〜B5)はノイズ出力の制御を行います。どちらも対応するビットが0のときに出力ON、1のときにOFFとなります。

図6.5 各チャンネルの出力選択

 R7の上位2ビットは音声出力とは関係ありません。これはPSGが持つ2本のI/Oポートのデータ方向を決定するもので、対応するビットが「0」のときに入力モード、「1」の時に出力モードが設定されます。MSXではポートAを入力、ポートBを出力として使用していますから、つねにビット6=「0」、ビット7=「1」と設定しておく必要があります。

4.音量の設定(R8〜R10)
 R8〜R10は各チャンネルの音量を指定するレジスタです。4ビットのデータ(0〜15)で音量を固定的に指定する方法とエンベロープを用いてビブラートや減衰音などの効果音を発生させる方法の2通りが選べます。その選択もこのレジスタで行います。

図6.6 音量の設定

 なお、これらのレジスタのビット4が「0」の場合、エンベロープは使用されず、レジスタの下位4ビットの値L(0〜15)によって音量が指定されます。また、ビット4が「1」の場合はエンベロープ信号によって音量が変化し、Lの値は無視されます。

5.エンベロープ周期の設定(R11、R12)
 R11、R12はエンベロープの周期を16ビットデータによって指定します。データの上位8ビットをR12で、下位8ビットをR11で設定します。

図6.7 エンベロープ周波数の設定

 なお、エンベロープの周期Tと16ビットデータEPの間には、次のような関係があります。

T =(256*EP)/fc
 =(256*EP)/1.7897725 [MHz]
 =143.03493*EP [μs]

6.エンベロープパターンの設定(R13)
 R13は、下位4ビットのデータによって図6.8のようにエンベロープパターンを設定します。同図に示したTの間隔がR11とR12で指定されたエンベロープ周期に相当します。

図6.8 エンベロープの波形の設定

7.I/Oポート(R14、R15)
 R14とR15は8ビットのデータをパラレルで入出力するポートです。MSXではここを汎用入出力インターフェイスとして使用しています。詳しくは5章を参照してください。

 1.2 PSGのアクセス

 マシン語プログラム中からPSGをアクセスするために、以下のようなBIOSルーチンが用意されています。

GICINI (0090H/MAIN)
機能

PSGを初期化します。

コール手順
なし
戻り値
なし
解説
PSGのレジスタを初期化し、さらにBASICのPLAY文を実行するための作業領域の初期設定を行います。このとき、PSGの各レジスタは表6.2のような値に設定されます。

表6.2 PSGレジスタの初期値

レジスタ ビット
76543210
R0 チャンネルA 01010101
R1 周波数 00000000
R2 チャンネルB 00000000
R3 周波数 00000000
R4 チャンネルC 00000000
R5 周波数 00000000
R6 ノイズ周波数 00000000
R7 チャンネル設定 10111000
R8 チャンネルA音量 00000000
R9 チャンネルB音量 00000000
R10チャンネルC音量 00000000
R11エンベロープ周期00001011
R1200000000
R13エンベロープパターン 00000000
R14I/OポートA
R15I/OポートB

WRTPSG (0093H/MAIN)
機能

PSGレジスタへデータを書き込みます。

コール手順

APSGのレジスタ番号
E書き込むデータ
戻り値

なし

変更レジスタ
なし
解説
Aレジスタで指定した番号のPSGレジスタに、Eレジスタの内容を書き込みます。サンプルプログラム「TONE.MAC」を参照して下さい。

RDPSG (0096H/MAIN)
機能

PSGレジスタのデータを読み出します。

コール手順
APSGのレジスタ番号
戻り値
A指定したレジスタの内容
変更レジスタ

なし

解説
Aレジスタで指定した番号のPSGレジスタの内容を読み出し、その値をAレジスタに格納します。

STRTMS (0099H/MAIN)
機能

音楽の演奏を開始します。

コール手順

(QUEUE) 中間言語に変換されたMML

戻り値

なし

変更レジスタ
すべて
解説
バックグラウンドタスクとして、音楽が流れているかどうかを判定し、もし流れていなければキューに設定された音楽を演奏する。
実際のアクセスについては、「第2部 6.1 PLAY文BIOS」を参照して下さい。

 1.3 1ビットサウンドポートによる音声発生機能

 MSXには、PSGのほかにもうひとつ音源が存在しています。これは1ビットのI/Oポートの出力をソフトで繰り返しON/OFFして音を出すというものです。

図6.9 1ビットサウンドポート

 1.4 1ビットサウンドポートのアクセス

 この1ビットサウンドポートをアクセスするために、以下のようなBIOSルーチンが用意されています。

CHGSND (0135H/MAIN)
機能

1ビットサウンドポートをアクセスします。

コール手順

AON/OFF指定
0OFF
1ON
戻り値

なし

変更レジスタ
AF
解説
Aレジスタに0を入れてこのルーチンをコールするとサウンドポートのビットをOFFにし、0以外の値を入れてコールするとサウンドポートのビットをONにします。サンプルプログラム「CHGSND.MAC」を参照して下さい。