ノイズ
ファミコン音源のノイズについて。(参考文献:VirtuaNESのソースコードなど)
シフトレジスター
ノイズの波形データの生成に用いる、擬似乱数の生成には、15ビットのシフトレジスターを用いる。
レジスターの各桁には、0か1が入る。
シフトレジスターの初期値は、0x4000(1<<14、100,0000,0000,0000)である。
桁
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
値
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
疑似乱数の生成
疑似乱数を連続して取得する手順は下記の1~3を繰り返す。
シフトレジスターの
0桁目
と、
1
(短周期の場合は6)
桁目
のビット差(XOR)を、
求める乱数
とする。
000,0000,0
0
00,00
1
0
1
シフトレジスターを1桁右シフトする。
100,0000,0000,00
0
0
↓
0
10,0000,0000,000
0
0
古い0桁目
は消滅して、
新しい14桁目
には0が入る。
1で求めた乱数
を、シフトレジスターの14桁目にコピーする。
1
10,0000,0000,000
0
↑
1
周期
疑似乱数は、一定周期で一巡する。
長周期、短周期の周期は下記の通り。
長周期
32767
短周期
93
周波数
ノイズの周波数
は、
ファミコンのCPUのクロック周波数(1789772.5)
を、
除数
で割った値である。
周波数
=
1789772.5
÷
除数
ファミコンのプログラミングでノイズの
周波数
を設定する場合は、レジスターに4ビット(0~15)の
除数インデックス
を指定する。
インデックス
と
除数
の関係は下記の通り。
インデックス
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
除数
4
8
16
32
64
96
128
160
202
254
380
508
762
1016
2034
4068
© GPU (Game Programming Unit)