Web Audio APIでファミコンノイズを鳴らしてみる

おっさんには懐かしいファミコンのノイズ音をWeb Audio APIを使ってウェブブラウザで再現してみます。今聴くとかなり表現力に乏しい感じのノイズですが、当時はこれで宇宙船の推進音や敵機の爆発音、レーザー光線やスネアドラムなど無限にイメージが膨らんだものです。
 
このファミコンの音源プロセッサRP2A03のノイズは、単純な乱数によるホワイトノイズなどでは再現できません。ノイズ生成のロジックをそのまま実装する必要があります。
 
RP2A03の詳細やノイズ生成ロジックはニコニコ大百科のFC音源の項に異常に詳しく書いてあります。内容も読み応えがありずっと読んでいられます。僕は何か嫌なことがあったりして気持ちを落ち着けたいときにはこのページをよく読むようにしています。嘘です。
これによるとノイズ生成は以下のC言語プログラムでできるとのこと。ノイズには音程感のほとんどない長周期ノイズと比較的音程感のある短周期ノイズがあり、またそれぞれ再生ピッチによって音に変化がつけられます。

    //レジスタの初期値 (間違ってるかもしれない)
    reg = 0x8000;

    //以下の3行を回す。
    // shortFreqは、短周期フラグ。1にすると有効になる。
    // これで得られるoutputの値が、ノイズチャンネルの波形。
    reg >>= 1;
    reg |= ((reg ^ (reg >> (shortFreq ? 6 : 1))) & 1) << 15;
    output = reg & 1;

 
JavaScriptで書くとこんな感じ。一緒ですね。

    this.reg >>= 1;
    this.reg |= ((this.reg ^ (this.reg >> (this.short_flag ? 6 : 1))) & 1) << 15;
    ret = this.reg & 1;

GUIをつけてできあがり。ね?簡単でしょ。
iPhoneでも動くので、これで爆発させたいやつらをところかまわず爆発させてください。
 
http://aikelab.net/faminoise/

f:id:aike:20121225012505j:image