FC音源とは、ファミリーコンピュータ内蔵の音源・ファミコンカートリッジ内の拡張音源のことである。
ファミコン音源を意識した、あるいは実機の音源を用いた音楽は、チップチューン(chiptune)のジャンルに入る。
→Chiptune
FC音源の一覧
音源の種類と音色・チャンネル数は以下のとおり。 ()内はチップに書かれている文字列。
|
|||||||||||||||||||||
|
|||||||||||||||||||||
|
|||||||||||||||||||||
|
|||||||||||||||||||||
|
|||||||||||||||||||||
|
|||||||||||||||||||||
|
|||||||||||||||||||||
|
RP2A03(ファミコン内蔵音源)の詳細
ファミコンのCPU(RP2A03)に内蔵されている音源は、矩形波(2ch)・三角波(1ch)・ノイズ(1ch)・DPCM(1ch)を出力できる。
2A03からはサウンド出力ピンが2つ出ており、1つは矩形波2ch分、もう1つは三角波・ノイズ・DPCM分が出ている。
レジスタ一覧表
R:読み込み可 W:書き込み可
読み込み可でないものは、どこを読んでも$40が返って来る。
アドレス | 読書き | ビット M7......0 |
説明 |
$4000 | W |
DDLERRRR |
矩形波1 制御レジスタ(音色・音量) R:レート ・エンベロープ有効ならエンベロープ速度の指定 (値が小さいほど変化が速い) ・エンベロープ無効なら音量の指定 (0で消音、15が最大) E:エンベロープフラグ(0:有効 1:無効) L:キーオフカウンタフラグ/エンベロープループフラグ ・0でキーオフカウンタ有効・エンベロープループ無効 ・1でキーオフカウンタ無効・エンベロープループ有効 D:Duty比 ・00:12.5% 01:25% 10:50% 11:75% |
$4001 | W |
FSSSHRRR |
矩形波1 制御レジスタ(スイープ)
R:周波数変更量 ・カウント満了時に、どのくらい周波数を変更するか ・値が小さいほど変化が大きい ・0だと変化無し H:周波数変更方向 ・0:下がっていく 1:上がっていく S:周波数変更タイマカウント数 ・値が小さいほど周波数変更頻度が高い F:スイープ有効フラグ(0:無効 1:有効) |
$4002 | W |
FFFFFFFF |
矩形波1 制御レジスタ(周波数下位)
F:周波数(0-7bit) ・値が小さいほど高音になる |
$4003 | W |
CCCCCFFF |
矩形波1 制御レジスタ(周波数上位・キーオン/オフ)
F:周波数(8-10bit) ・値が小さいほど高音になる C:キーオフカウント値 ・値とキーオフカウント値の関係は、下の変換表を参照 このアドレスに任意の値を書くことでキーオン(音を鳴らす)できる。 |
$4004 | W |
DDLERRRR |
矩形波2 制御レジスタ(音色・音量) R:レート ・エンベロープ有効ならエンベロープ速度の指定 (値が小さいほど変化が速い) ・エンベロープ無効なら音量の指定 (0で消音、15が最大) E:エンベロープフラグ(0:有効 1:無効) L:キーオフカウンタフラグ/エンベロープループフラグ ・0でキーオフカウンタ有効・エンベロープループ無効 ・1でキーオフカウンタ無効・エンベロープループ有効 D:Duty比 ・00:12.5% 01:25% 10:50% 11:75% |
$4005 | W |
FSSSHRRR |
矩形波2 制御レジスタ(スイープ)
R:周波数変更量 ・カウント満了時に、どのくらい周波数を変更するか ・値が小さいほど変化が大きい ・0だと変化無し H:周波数変更方向 ・0:下がっていく 1:上がっていく S:周波数変更タイマカウント数 ・値が小さいほど周波数変更頻度が高い F:スイープ有効フラグ(0:無効 1:有効) |
$4006 | W |
FFFFFFFF |
矩形波2 制御レジスタ(周波数下位)
F:周波数(0-7bit) ・値が小さいほど高音になる |
$4007 | W |
CCCCCFFF |
矩形波2 制御レジスタ(周波数上位・キーオン/オフ)
F:周波数(8-10bit) ・値が小さいほど高音になる C:キーオフカウント値 ・値とキーオフカウント値の関係は、下の変換表を参照 このアドレスに任意の値を書くことでキーオン(音を鳴らす)できる。 |
$4008 | W |
FLLLLLLL |
三角波 制御レジスタ(音長) L:音長 ・値が小さいほど短くなる。0で鳴らない F:音長・キーオフカウンタ有効フラグ ・0で有効。1で鳴りっぱなし |
$4009 | -- |
-------- |
(未使用) |
$400A | W |
FFFFFFFF |
三角波 制御レジスタ(周波数下位)
F:周波数(0-7bit) ・値が小さいほど高音になる |
$400B | W |
CCCCCFFF |
三角波 制御レジスタ(周波数上位・キーオン/オフ)
F:周波数(8-10bit) ・値が小さいほど高音になる C:キーオフカウント値 ・値とキーオフカウント値の関係は、下の変換表を参照 このアドレスに任意の値を書くことでキーオン(音を鳴らす)できる。 |
$400C | W |
XXLERRRR |
ノイズ 制御レジスタ(音量) R:レート ・エンベロープ有効ならエンベロープ速度の指定 (値が小さいほど変化が速い) ・エンベロープ無効なら音量の指定 (0で消音、15が最大) E:エンベロープフラグ(0:有効 1:無効) L:キーオフカウンタフラグ/エンベロープループフラグ ・0でキーオフカウンタ有効・エンベロープループ無効 ・1でキーオフカウンタ無効・エンベロープループ有効 X:未使用 |
$400D | -- |
-------- | (未使用) |
$400E | W |
RXXXFFFF |
ノイズ 制御レジスタ(周波数・長/短周期) R:ノイズ周波数 ・値が小さいほど周波数が高くなる。 ・値と周波数の関係は、下の変換表を参照 X:未使用 R:長周期/短周期 ・0で長周期 |
$400F | W |
CCCCCXXX |
ノイズ 制御レジスタ(キーオン/オフ)
X:未使用 C:キーオフカウント値 ・値とキーオフカウント値の関係は、下の変換表を参照 このアドレスに任意の値を書くことでキーオン(音を鳴らす)できる。 |
$4010 |
W |
IRXXFFFF |
DPCM 制御レジスタ(周波数・ループ・割り込み) F:DPCM再生周波数 ・値が大きいほど速くなる。 ・値と周波数の関係は、下の変換表を参照 X:未使用 R:ループフラグ ・0で、指定した長さ分を1回再生。再生終了後は停止。 ・1で、指定した長さ分を何回も再生。 I:割り込み有効フラグ ・1だと、DPCM再生終了直後に割り込みが入る。 |
$4011 |
W |
XFFFFFFF |
DPCM 制御レジスタ(デルタ初期ボリューム) F:デルタ初期ボリューム ・ここで指定した値を元に加算減算を行って波形生成。 X:未使用 |
$4012 |
W |
AAAAAAAA |
DPCM 制御レジスタ(データ読み込み位置) A:データ読み込み位置 ・値 * 0x40 + 0xC000 のアドレスから再生される。 |
$4013 |
W |
LLLLLLLL |
DPCM 制御レジスタ(データ長) L:読み込むデータ長 ・値 * 0x10 + 1 の分まで読み込む |
$4014 |
W |
AAAAAAAA |
(スプライトDMA) |
$4015 |
RW |
r:IIXDNTSS w:XXXDNTSS |
読み込み時:キーオンフラグレジスタ S:矩形波1 キーオン状態フラグ (キーオン中に立つ) S:矩形波2 キーオン状態フラグ (キーオン中に立つ) T:三角波 キーオン状態フラグ (キーオン中に立つ) N:ノイズ キーオン状態フラグ (キーオン中に立つ) D:DPCM 再生状態フラグ (再生中に立つ) X:未使用 I:(割り込みフラグ) 書き込み時:チャンネル有効レジスタ S:矩形波1 有効フラグ (1で有効 0で鳴らない/停止) S:矩形波2 有効フラグ (1で有効 0で鳴らない/停止) T:三角波 有効フラグ (1で有効 0で鳴らない/停止) N:ノイズ 有効フラグ (1で有効 0で鳴らない/停止) D:DPCM 有効フラグ (1で有効/再生開始 0で停止) X:未使用 |
$4016 | RW | XXXCCCCC |
C:コントローラ状態 X:未使用 |
$4017 |
RW |
UXXCCCCC |
フレームレート切り替えレジスタ C:コントローラ状態 X:未使用 U:エンベロープ・スイープ・音長更新速度 ・0で60,120,240Hz 1で48,96,192Hz ・何度も1を書き込むことで、同期を取ることが出来る。 |
キーオフカウント値 変換表
キーオフされるまでの時間を計算する方法は、「キーオフカウント値/フレームレート (秒)」。
フレームレートは、$4017によって60Hzか48Hzかが決まる。
レジスタ値 | キーオフカウント値 |
0 | $05 |
1 | $7f |
2 | $0a |
3 | $01 |
4 | $14 |
5 | $02 |
6 | $28 |
7 | $03 |
8 | $50 |
9 | $04 |
10 | $1e |
11 | $05 |
12 | $07 |
13 | $06 |
14 | $0d |
15 | $07 |
16 | $06 |
17 | $08 |
18 | $0c |
19 | $09 |
20 | $18 |
21 | $0a |
22 | $30 |
23 | $0b |
24 | $60 |
25 | $0c |
26 | $24 |
27 | $0d |
28 | $08 |
29 | $0e |
30 | $10 |
31 | $0f |
ノイズ周波数 変換表
波形更新サイクルの計算方法は、「CPUクロック(1789772.5)/ノイズ周波数」。
レジスタ値 | ノイズ周波数 |
0 | $002 |
1 | $004 |
2 | $008 |
3 | $010 |
4 | $020 |
5 | $030 |
6 | $040 |
7 | $050 |
8 | $065 |
9 | $07f |
10 | $0be |
11 | $0fe |
12 | $17d |
13 | $1fc |
14 | $3f9 |
15 | $7f2 (2A03無印は$3f9) |
DPCM再生レート周波数 変換表
再生レート周波数の計算方法は、「CPUクロック(1789772.5)/DPCM再生周波数」。
レジスタ値 | DPCM再生周波数 |
0 | 428 |
1 | 380 |
2 | 340 |
3 | 320 |
4 | 286 |
5 | 254 |
6 | 226 |
7 | 214 |
8 | 190 |
9 | 160 |
10 | 142 |
11 | 128 |
12 | 106 |
13 | 85 |
14 | 72 |
15 | 54 |
CH1・CH2:矩形波
このチャンネルで出せる矩形波のDuty比は、12.5% 25% 50% 75%の4種類。波形は以下の表を参照。
Duty比 | 波形 |
12.5% | _| ̄|_______| ̄|_______ |
25% | _| ̄ ̄|______| ̄ ̄|______ |
50% | _| ̄ ̄ ̄ ̄|____| ̄ ̄ ̄ ̄|____ |
75% | _| ̄ ̄ ̄ ̄ ̄ ̄|__| ̄ ̄ ̄ ̄ ̄ ̄|__ |
この矩形波チャンネルにはスイープ機能があり、周波数を変化させることが出来る。
スイープレジスタ($4001 $4005)での指定することにより、周波数を上昇させたり下降させたりする事が出来る。 この機能は、キャラクターのジャンプ音・落下音などによく使われる。
周波数更新時、以下の計算方法で周波数の上昇・下降を行う。
CH1 周波数上昇:
周波数レジスタ値 = 周波数レジスタ値 - ( 周波数レジスタ値 >> 周波数変更量 ) - 1
実は、周波数上昇の際、CH1とCH2で計算方法が若干違う。
CH1は周波数レジスタ値が7以下になるまで上昇し続けるが、CH2では上昇が途中で止まってしまう。
これを実際に確認するには、BPS版テトリスなどで電源投入直後、BPSロゴが出ている途中でカセットにデコピンすれば良い。
BPSロゴが出る音は、$4000から順に「B8 AF FF 03 B8 AF FC 03」を書き込んで出している。
最初はCH1とCH2の周波数の差はあまりないが、時間が経つにつれて差が徐々に広がっていき、最終的にはCH1は音が消え、CH2はラの音で止まる。
そのため、ソフトウェアによる周波数変更で、周波数レジスタの9ビット目以降を変える場合、$4003・$4007に書き込まなければならないため、そこでキーオンしてしまい、プチノイズが出てしまう。
矩形波で低音を出す場合、スイープレジスタ($4001 $4005)に気を付けなければならない。
スイープレジスタの周波数変更方向が「0:下がっていく」の場合、周波数変更量の値によって、周波数レジスタの最大値が決まるからである。
その関係は、以下の表を参照。
レジスタ値 | 周波数最大値 |
0 | $3ff |
1 | $555 |
2 | $666 |
3 | $71c |
4 | $787 |
5 | $7c1 |
6 | $7e0 |
7 | $7f0 |
この制限を解除するには、スイープレジスタの周波数変更方向を「1:上がっていく」にすれば対処できる。 しかし、これに気づかずに苦戦していた開発者はそこそこいた。
ちなみに、周波数レジスタの最小値は8で、7以下では鳴らない。
2つの矩形波チャンネルを大音量で流すと、出力のひずみによって音が若干割れる。なお、出力が分かれている三角波・ノイズ・DPCMを大音量で流しても、矩形波チャンネルに影響はない。
CH3:三角波
ファミコンの特徴とも言える三角波。 きれいな三角波ではなく、16段階のギザギザした三角波になっている。
音量レジスタはなく、三角波単独の音量は変更できないが、DPCMの出力によって最大57%くらいまで、三角波とノイズの音量を同時に下げることは出来る。
そのため、ソフトウェアエンベロープなどで、周波数レジスタの9ビット目以降を変えるために$400Bに書き込んでも、プチノイズは出ない。
三角波がキーオフするとき、周波数が0Hzの状態になり、波形は出力し続ける。そのため、キーオン・キーオフ時にプチノイズが出ないようになっている。
ソフトによっては、周波数レジスタを$000にして擬似的に音を止めているものもあるが、この場合は波形が急激に変化するため、プチノイズが出る。
周波数レジスタの有効範囲は$000~$7FFで、矩形波とは違って全ての値で鳴る。
CH4:ノイズ
ノイズ音の周波数は、線形帰還シフトレジスタによる擬似乱数で出ている。
//レジスタの初期値 (間違ってるかもしれない)
reg = 0x8000;
//以下の3行を回す。
// shortFreqは、短周期フラグ。1にすると有効になる。
// これで得られるoutputの値が、ノイズチャンネルの波形。
reg >>= 1;
reg |= ((reg ^ (reg >> (shortFreq ? 6 : 1))) & 1) << 15;
output = reg & 1;
「ザー」という音の長周期と、「ギー」という音の低周期が出せる。
ノイズのパターンは、長周期ノイズが32767bit。低周期ノイズは93bit。
RP2A03無印(ボタンが四角い初期型ファミコン時代)では、低周期ノイズが出せない。また、一番低いノイズ音を出そうとしても、一つ上の周波数と同じノイズ音が出てしまう。
ノイズは、キーオンしてもレジスタが初期化されない。そのため、鳴らすたびに音が違う。
低周期ノイズは、長周期ノイズを鳴らすと音が変わってしまう。
CH5:DPCM(デルタPCM)
データをLSBから1bitずつ読み、0ならボリュームを1段階下げ、1ならボリュームを1段階上げる。
デルタ初期ボリュームは7bit長だが、再生時は下位1bitを無視した64段階でボリューム変更される。
再生開始アドレスとして指定できるのは、$C000~$FFC0まで。$0000~$BFFFは指定できない。
しかし、再生の際にデータを$FFFFまで読んだ後は、$8000から読み続ける。
DPCM停止中でも、$4011のデルタ初期ボリュームに値を書き込んだ直後、その値がDPCMチャンネルの音量となって出力される。
これを利用して、デルタ初期ボリュームにWAVEを流し込んで音声を出力するゲームもある。
例えば、ゴーストバスターズ(りりの方)の「わーい、勝ったー!」、ゾンビハンターの「ハイスコアぁー」「しっかりしろよ!!」、デッドゾーン・水戸黄門のボイス「キャリー、どぇーす!」「この紋所が目に入らぬか!」など。
カウンタ
カウンタのベースは240Hz。 それぞれのカウンタは、以下の表のタイミングで更新される。
エンベロープカウンタ:E スイープカウンタ:S キーオフカウンタ:K
4017H 7bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ・・・ |
0 | 休 | E | ESK | E | ESK | E | ESK | E | ESK | E | ESK | ・・・ |
1 | E | ESK | E | ESK | 休 | E | ESK | E | ESK | 休 | E | ・・・ |
$4017に書き込むと、カウンタベースタイマがリセットされ、カウントが0番目から始まる。
$4017-7bitを1にした場合、1/60秒(1フレーム分)経つと休むので、その間に$4017に書き込むことで、VBlankとの同期が取れる。 スイープを有効活用した効果音を鳴らす際に非常に有効。
たとえば、任天堂前期ソフトの効果音の一部(ドンキーコングJr・マリオブラザーズのやられ音等)は、ちゃんと同期を取らないと出せない。
キーオフカウンタが満了すると、$4015のキーオンフラグが降りる。
これを利用して、次の音までのタイマとして使っているゲームもある。 しかし、ちゃんと同期を取らないとそれぞれのチャンネル間で音がずれていく。 トーセ(エクセリオン等)・セタ・ソフトプロ(カラテカ)・チュンソフト(ドアドア等)などがこの方法を使っていたが、ちゃんと割り込みで同期を取っていたのは多分チュンソフトだけ。
三角波も、キーオンフラグが降りるのはキーオフカウンタが満了する時だけであり、音長カウンタが満了して音が停止してもフラグは降りない。 しかし、音長カウンタ満了でフラグを降ろしてしまうエミュレータがあったりする。
エンベロープ
FC音源の矩形波・ノイズチャンネルでは、音量をハードウェアで減衰させることが出来る。
ただし、初期ボリュームは最大固定。 また、音量をハードウェアで増幅させることは出来ない。
エンベロープを無効にしてキーオンし、音が鳴っている最中に音量レジスタ($4000,$4004,$400C)で音量を指定する(ソフトウェアエンベロープ)こともできる。
FC音源の音楽作成
FC音源用のサウンドファイルとして「NSF」があるが、これを作成する主な方法は以下の通り。
- MCKを使う
音楽をMMLで記述して作成する(ピコカキコのMMLとは異なる)。ほとんどの拡張音源が使える。環境を作るのがだるい。 - FamiTrackerを使う
音楽をトラッカー形式で作成する。エンベロープ・Duty比の変更などを、グラフィカルに編集できる。拡張音源は、MMC5・VRC6が使える。 - 1から自分で書く
サウンドドライバや曲のデータなどを、バイナリエディタやアセンブラ等を使って自分で作成する方法。普通は出来ない。
NSFで作らなくても、FC音源相当のサウンドは作れる。その主な方法は以下の通り。
- 波形をWAVファイルにして、読み込ませる
矩形波や三角波などの波形をWAVファイル等で作成し、ModPlugTrackerやピストンコラージュなどに読み込ませる。この場合、ノイズ音の「鳴らすたびに音が違う」などの仕様の再現に苦戦する。DPCMはこの方法でも十分通用する。 - VSTiを使う
矩形波・三角波は「Magical 8bit Plug」や「RETORIZER」が良い。今のところ、FCノイズ音の再現性が高いVSTiは無い。 - *+ピコカキコを使う+*
音楽をMMLで記述して作成する。音源モジュールとなっているFlMMLは、矩形波・三角波・ノイズ・DPCMが使えて、いずれも再現性は高い。
FC音源のレジスタをいじる方法
実際のファミコンで音源部分のレジスタを実際にいじり、どんな音が出るのかを楽しみたい場合などは、以下ような方法でレジスタをいじることが出来る。
- レジスタをいじるプログラムを自分で書いて実行させる
マシン語・アセンブリ語などで書く場合は、けっこう大変だが自由度は非常に高く、やり方によっては拡張音源のレジスタもいじれる。 実機で自作のプログラムを動かすには、自分でカセットを作るか、NSF化してTNS-HFC3に放り込む方法などがある。
逆に、ファミリーベーシックのBASIC言語を使うと恐ろしいほど楽に出来る。拡張音源はいじれないけど。たとえば、以下のようなプログラムを作れば、あの音が鳴る。
10 POKE &H4015,320 POKE &H4000,&HB8,&HAF,255,3,&HB8,&HAF,252,3
- ベストプレープロ野球シリーズの裏技を使う
ファミコンとベストプレープロ野球2~スペシャルがあれば、一般人でも簡単にできる方法。 ベストプレープロ野球シリーズには、チェックモードに入る裏技があり、その中の機能にサウンドエディットがある。この機能で、$4000~$400Fのレジスタを自由にいじることができるので、BPSロゴ音の再現くらいなら十分出来る。 なお、初代と新データには、チェックモードはあるがサウンドエディット機能はない。
関連項目
- 98
- 0pt