ノイズ

ファミコン音源のノイズについて。(参考文献: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を繰り返す。
  1. シフトレジスターの0桁目と、1(短周期の場合は6)桁目のビット差(XOR)を、求める乱数とする。
    000,0000,0000,0010
    1
  2. シフトレジスターを1桁右シフトする。
    100,0000,0000,0000

    010,0000,0000,00000
    古い0桁目は消滅して、新しい14桁目には0が入る。
  3. 1で求めた乱数を、シフトレジスターの14桁目にコピーする。
    110,0000,0000,0000

    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) <script><!-- var fc2footerparam = 'charset=' + encodeURIComponent(document.charset ? document.charset : document.characterSet) + '&url=' + encodeURIComponent(document.location) + '&service=0&r=' + Math.floor(Math.random()*99999999999); var fc2footertag = "//vip.chps-api.fc2.com/apis/footer/?" + fc2footerparam; var script = document.createElement('script'); script.src = fc2footertag; script.charset = "UTF-8"; script.async = true; document.getElementsByTagName('head')[0].appendChild(script); //--></script> <!-- FC2, inc.--> <img src="//media.fc2.com/counter_img.php?id=50" style="visibility:hidden" alt="inserted by FC2 system" width="0" height="0"> <!-- FC2, inc.-->