PSG音源 (SN76489 - Digital Complex Sound Generator )
PSG音源の概要
矩形波3chとノイズ1chを同時発音するシンプルなPSG音源です。
エンベローブ機能はありません。
矩形波の波形はデューティー比50%のみです。
ファミコンの様にデューティー比を選べたり、
PCエンジンやゲームボーイの様に波形を自由に設定する事は出来ません。
ノイズはホワイトノイズとピンクノイズのどちらかを選択出来ます。
音源 | 音色 | 音階 | 音量 |
Ach | 矩形波 | 1024段階 | 16段階 |
Bch | 矩形波 | 1024段階 | 16段階 |
Cch | 矩形波 | 1024段階 | 16段階 |
Noize | ホワイト又はピンクノイズ | 6段階又は、Cchと連動した1024段階 | 16段階 |
矩形波の音階
矩形波(A〜Cチャンネル)の音程は1023段階で指定します。
これは平均律等の音階では無く、ソース周波数に対する分周値です。
ソース周波数は入力周波数の1/32です。入力周波数はNTSCの場合なら 3579540Hz なので、
分周値を求める式は
分周値 = 3579540 / (32 * 音程周波数)
となります。
例えばCの音(440Hz)の分周値なら、
254.228693 = 3579540 / (32 * 440)
となります。
小数点以下は四捨五入するか切り捨てます。
音階を設定するには、下記2bytesの値をSN76489データポート(アドレス 0xC00011) に書き込みます。
書き込むと即座に出力に反映されます。
bit 7 6 5 4 3 2 1 0 1 C2 C1 0 D3 D2 D1 D0 0 0 D9 D8 D7 D6 D5 D4 Cx 各チャンネルに対する音程設定, 0〜2 = A〜Cチャンネル, 3 = ノイズ Dx 1〜1023 = 音階(0は1と同じ)
矩形波とノイズの音量
音量は16段階です。0で最大音量、15で最小音量です。
但し0〜14までは音量が対数的に変化しますが、15は対数的では無いので注意して下さい。
下記サイトにSN76489の詳細と、
出力値を符号付16bitで表した時の音量テーブルが記載されているので参考になります。
http://www.smspower.org/maxim/docs/SN76489.txt
int psgVolume[16]={ 32767, 26028, 20675, 16422, 13045, 10362, 8231, 6568, 5193, 4125, 3277, 2603, 2067, 1642, 1304, 0 }; /* psgVolume[ 0] = 最大 psgVolume[14] = 最小 psgVolume[15] = OFF */
又最大音量はFM音源の1/2程度の様ですが、FM音源とPSG音源のの音量比は機種毎に
異なる為、綿密なバランスが必要な使い方は出来ません。
音量を設定するには、下記2bytesの値をSN76489データポート(アドレス 0xC00011) に書き込みます。
書き込むと即座に出力に反映されます。
bit 7 6 5 4 3 2 1 0 1 C2 C1 1 D3 D2 D1 D0 Cx 各チャンネルに対する音量設定, 0〜2 = A〜Cチャンネル, 3 = ノイズ Dx 0〜15 = 音量
ノイズの音程
ノイズの音程は動作周波数に対する6段階の分周値を設定するか、
Cチャンネルの周波数をソースにします。
bit 7 6 5 4 3 2 1 0 1 1 1 0 0 FB NF1 NF0 FB 1 = 高周波, 0 = 低周波 NFx 0 = Clock/2, 1 = Clock/4, 2 = Clock/8, 3 = Cチャンネルの周波数
上記2bytesの値をSN76489データポート(アドレス 0xC00011)に書き込むと即座に出力に反映されます。
Cチャンネルの周波数をソースにした場合、音程がCチャンネルと連動します。
この場合、例えばCチャンネルの音程を徐々に下げていくと、
遠ざかっていくジェットエンジンの様な効果音になります。