%第1版第15刷 P.264-274
1章 PSGと音声出力
MSXには次に示すような3系統の音声出力機能が存在します。ただし、?はMSXに標準的に付属するものではないため、本書では扱いません。ここではそれ以外の?と?の機能について説明します。
?PSGによる音声出力(3チャンネル, 8オクターブ)
?1ビットI/Oポートによる音声出力
?MSX-AUDIOによる音声出力 (FM音源)…………本書では説明しない。
1.1 PSGの機能
MSXの音楽演奏機能およびBEEP音の発生には、AY-3-8910相当のLSIが使われています。このLSIはPSG(Programmable Sound Generator)とも呼ばれ、その名が示すとおり、プログラムにより複雑な音楽やさまざまな効果音を発生することができます。その特徴をまとめると次のようになります。
・3チャンネルのトーン発生器を持ち、各チャンネルには独立に、4096種の音階(8オクターブに相当)と16段階の音量を指定することができる。
・エンベロープパターンによって、ピアノやオルガンのような音色も出すことができる。ただし、エンベロープ発生器がひとつしか存在しないため、音色を変えられるのは基本的に1チャンネルだけである。
・内蔵するノイズ発生器によって、風の音や波の音のような効果音も容易に得られる。ただし、ノイズ発生器がひとつしか存在しないため、ノイズで出力できるのは基本的に1チャンネルだけである。
・入力クロックfcを分周することで、トーンやエンベロープをはじめとする必要なすべての周波数を得ている(なおMSXでは、fc=1.7897725MHzと定められている)。このため音程やリズムのふらつきがまったくない。
図5.1 PSGのブロックダイアグラム
上のブロックダイアグラムでは省略しましたが、PSGは音声発生の機能とはまったく別に2つの入出力ポートを持っています。MSXではこれを汎用入出力ポートとして、ジョイスティック、タッチパッド、パドル、マウスなどの入出力装置との接続にも利用しています。なお、これらの汎用入出力ポートについては、5章で説明することにします。
● PSGのレジスタ
PSGが音声出力の作業をすべて実行してくれるので、CPUの仕事は単に音が変化する時点でPSGにそれを教えることだけとなりました。これは図5.2に示したようなPSG内部の16個の8ビットレジスタに値を書き込むことによって行います。
以下に、これらのレジスタの役割とその使用法を説明します。
● トーン周波数の設定(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 [MHz]
12ビットの分周データTPは、各チャンネルごとに上位4ビットの粗調整値CTと下位8ビットの微調整値FTによって、図5.3のように指定されます。また、音階を作るためのレジスタの設定を表5.1に示します。
図5.2 PSGのレジスタ構成
図5.3 音程の設定
表5.1 トーン周波数の設定(音階データ)
● ノイズ周波数の設定(R6)
爆発音や波の音などの合成にかかせないのがノイズ音です。PSGは、ノイズジェネレータによって発生させたノイズをA〜Cの各チャンネルに出力できます。ノイズジェネレータは1つしか存在しないため、各チャンネル共通に同一のノイズが出力されます。ノイズは平均周波数を変えることによって様々な効果を出すことが可能であり、R6レジスタがその設定を行います。このレジスタの下位5ビットのデータ(NP)で基準周波数(fc/16)を分周し、ノイズの平均周波数(fn)を決定します。
NPとfnの間には次のような関係があります。
fn=fc/(16*NP)
=0.11186078125/NP [MHz]
=111860.78125/NP [MHz]
NPは1〜31の値をとりますから、ノイズの平均周波数は3.6kHz〜111.9kHzの範囲で設定できます。
● 音のミキシング(R7)
R7は各チャンネルごとに、トーンジェネレータとノイズジェネレータの出力を選択するためのレジスタで、ノイズとトーンの両者を混合することもできます。図5.5に示したように、R7の下位3ビット(B0〜B2)はトーン出力、次の3ビット(B3〜B5)はノイズ出力の制御を行います。どちらも対応するビットが0の時に出力ON、1の時にOFFとなります。
図5.5 各チャンネルの出力選択
R7の上位2ビットは音声出力とは関係ありません。これはPSGが持つ2本のI/Oポートのデータ方向を決定するもので、対応するビットが0の時に入力モード、1の時に出力モードが設定されます。MSXではポートAを入力、ポートBを出力として使用していますから、つねにビット6=“0”、ビット7=“1”と設定しておく必要があります。
● 音声の設定(R8〜R10)
R8〜R10は各チャンネルの音量を指定するレジスタです。4ビットのデータ(0〜15)で音量を固定的に指定する方法とエンベロープを用いてビブラートや減衰音などの効果音を発生させる方法の2通りが選べますが、その選択もこのレジスタで行います。
図5.6 音量の設定
なお、これらのレジスタのビット4が“0”の場合、エンベロープは使用されず、レジスタの下位4ビットの値L(0〜15)によって音量が指定されます。また、ビット4が“1”の場合はエンベロープ信号によって音量が変化し、Lの値は無視されます。
● エンベロープ周期の設定(R11, R12)
R11, R12はエンベロープの周期を16ビットデータによって指定します。データの上位8ビットをR12で、下位8ビットをR11で設定します。
図5.7 エンベロープ周波数の設定
なお、エンベロープの周期Tと16ビットデータEPの間には、次のような関係があります。
T=(256*EP)/fc
=(256*EP)/1.7897725 [MHz]
=143.03493*EP [μs]
● エンベロープパターンの設定(R13)
R13は、下位4ビットのデータによって図5.8のようにエンベロープパターンを設定します。同図に示したTの間隔がR11とR12で指定されたエンベロープ周期に相当します。
図5.8 エンベロープの波形の設定
● I/Oポート (R14, R15)
R14とR15は8ビットのデータをパラレルで入出力するポートです。MSXではここを汎用入出力機インターフェイスとして使用しています。詳しくは5章を参照してください。
1.2 PSGのアクセス
マシン語プログラム中からPSGをアクセスするために、以下に述べるようないくつかのBIOSルーチンが用意されています。
● GICINI (0090H/MAIN)……………PSGの初期化
入力:---
出力:---
機能:PSGのレジスタを初期化し、さらにBASICのPLAY文を実行するための作業領域の初期設定を行う。この時PSGの各レジスタは図5.9のような値に設定される。
図5.9 PSGレジスタの初期値
● WRTPSG (0093H/MAIN)……………PSGレジスタへのデータの書き込み
入力:A←PSGのレジスタ番号
E←書き込むデータ
出力:---
機能:Aレジスタで指定した番号のPSGレジスタに、Eレジスタの内容を書き込む。
● RDPSG (0096H/MAIN)……………PSGのレジスタのデータの読み出し
入力:A←PSGのレジスタ番号
出力:A←指定したレジスタの内容
機能:Aレジスタで指定した番号のPSGレジスタの内容を読み出し、その値をAレジスタに格納する。
● STRTMS (0099H/MAIN)……………音楽演奏の開始
入力:(QUEUE)←中間言語に変換されたMML
出力:---
機能:バックグラウンドタスクとして、音楽が流れているかどうかを判定し、もし流れていなければキューに設定された音楽を演奏する。
リスト5.1 単音の発生
;=========================================================== ; ; List 5.1 440 Hz tone ; ;=========================================================== ; WRTPSG EQU 0093H ORG 0B000H ;-------- program start -------- LD A,7 ;Select Channel LD E,00111110B ;Channel A tone := On CALL WRTPSG LD A,8 ;Set Volume LD E,10 CALL WRTPSG LD A,0 ;Set Fine Tune Channel A LD E,0FEH ;Data 0FEH CALL WRTPSG LD A,1 ;Set Coarse Tune Channel A LD E,0 CALL WRTPSG RET END
1.3 1ビットサウンドポートによる音声発生機能
MSXには、PSGのほかにもうひとつ音源が存在しています。これは1ビットのI/Oポートの出力をソフトで繰り返しON/OFFして音を出すという単純なものです。
図5.10 1ビットサウンドポート
1.4 1ビットサウンドポートのアクセス
この1ビットサウンドポートをアクセスするために、次に示すBIOSルーチンが用意されています。
● CHGSND (0135H/MAIN)
入力:
A←ON/OFF指定(0=OFF, 0以外=ON)
出力:
---
機能:
Aレジスタに0を入れてこのルーチンをコールするとサウンドポートのビットをOFFにし、0以外の値を入れてコールするとサウンドポートのビットをONにする。
リスト5.2 カセットテープの再生
;=================================================== ; ; List 5.2 Read from cassette tape ; ; Set music tape into tape-recorder ; and run this program. ; Then your MSX will replay it. ; ;=================================================== ; CHGSNG EQU 0135H STMOTR EQU 00F3H RDPSG EQU 0096H BREAKX EQU 00B7H ORG 0B000H ;----- program start ----- 1ビットサウンドポートを利用してテープの音声を再生する START: LD A,1 ;motor on CALL STMOTR LBL01: LD A,14 ;register 14 CALL RDPSG ;read PSG AND 80H ;check CSAR CALL CHGSNG ;change SOUND PORT CALL BREAKX ;check Ctrl-STOP JR NC,LBL01 XOR A ;stop cassette motor CALL STMOTR RET END