ファミコンのサウンドはAPU(Audio Processing Unit)により統括されていて、ファミコンの場合はAPUはCPU(6502)にワンチップ化されています。
FM音源4チャンネルとPCM音源1チャンネルの計5チャンネルから成り立っています。また、それぞれのチャンネルには完全な役割分担がなされており、矩形波が2チャンネル、三角波1チャンネル、ノイズ1チャンネル、DPCM1チャンネルとなっています。
矩形波を出力するチャンネルで、主に音楽のメロディ部分や効果音に使われます。矩形波は2チャンネル用意されていて、チャンネル1はI/O【0x4000-0x4003】を、チャンネル2はI/O【0x4004-0x4007】で設定を行います。チャンネル2に関しては、チャンネル1と同じレジスタ構成になっているのでこれからの記述は全てチャンネル1を想定します。
矩形波はI/O【0x4002-0x4003】に再生したい音の周波数を11bit値で設定することで、任意の高さの音を再生することが出来ます。
例えば、「ラ」の音を出したい場合は440Hzの音を再生することになるのですが、周波数レジスタにそのまま440と入力するわけではありません。ここに設定する値は「システムクロック周波数(1.79MHz)からの分周値」となっているのです。
と言うことは「1790000 / x = 440」と言うことで「x = 4068.18...」としたいところですが、実際に設定される分周値は、周波数設定レジスタに指定した値を内部的に5bit左シフトをした値となっています。それらを総合すると、周波数レジスタに設定する値と実際に再生される音の間には次の式が成り立ちます。
ここで最後の「-1」に関しては、あくまで予想ですが多分内部的に0除算が起きるのを防止しているものと思われます。
また、実際に上の式に当てはめて音階を作ってみると高音になればなるほど設定する値が小さくなって行きます。さらに小数部は四捨五入するので高音になればなるほど周波数に誤差が生まれていくことになります。つまりファミコンのゲームの高音がちょっと音痴に聞こえるのはこのためです。
主に音楽のベース部分に使われるチャンネルです。I/O【0x4008-0x400B】で制御し、次のような特徴があります。
と言うことで非常に設定項目が少いので、矩形波よりも簡単に制御出来ると思います。
基本的には矩形波と同じように、I/O【0x400A-0x400B】に再生周波数を設定するのですが、注意しなくてはならないのは周波数レジスタから生成される分周値が矩形波と異なり6bitシフトした値となりますので、矩形波と同じ周波数を設定すると1オクターブ低い音が出力されることになります。
主に効果音や音楽のリズムに使われるチャンネルです。I/O【0x400C-0x400F】で制御します。
私自身適当にしか使ってないので細かい部分は分かりません。よって細かい説明は省略…。
ファミコン唯一のPCM音源のチャンネルで、任意の波形を出力する事が出来ます。その気になればボイスデータ等の複雑な波形も再生する事ができますが、基本的にメモリ空間の少ないファミコンで音声データはあまりにもサイズが大きく、実際には音楽のドラム音ぐらいにしか使われていない事が多いです。
ちなみに、このチャンネルはI/O【0x4010-0x4013】を使って制御しますが、細かい設定方法はI/Oポートを参照してください。