ノイズを種にして鳴らす — Karplus-Strong
弦をはじいた瞬間はガサッとしたノイズに近く、すぐに澄んだ音程へ落ち着く。短いリングバッファをノイズで満たし、隣どうしを平均しながら一周ずつ回すと、この移り変わりが出る。
長さ N のバッファに Math.random() * 2 - 1 を詰めて -1〜1 のノイズで満たし、波形として横一線に引く。各サンプルが隣と無関係なので、線は毎点てっぺんと底を行き来してとげとげに潰れる。N を変えると、後で残る音の高さが変わる。
timer が 90 フレームごとにバッファを撒き直すので、定期的にとげとげのノイズが戻る。h * 0.42 がノイズの振れ幅で、軸はバッファの真ん中の高さに引いている。
このノイズの隣どうしを平均する。(buf[i] + buf[i+1]) / 2 で書き換えると、各点が隣と混ざって尖りが削れる。毎フレーム全点を一度ずつ均すと、波形がだんだんなめらかになる。
撒き直した直後の鋸歯がフレームごとに角を取られ、波がなだらかに丸まっていく。平均を取るたびに細かい上下が消えて、振れ幅も少しずつ縮む。120 フレームごとに撒き直すと、また尖った状態から丸まり直す。
隣どうしの平均 (buf[i] + buf[i+1]) / 2 は二点移動平均のローパスフィルタで、画像のぼかし(隣を混ぜて高い周波数を削る)と同じ操作。高い周波数ほど強く減衰し、バッファ一周ぶんの波長を持つ低い成分だけが定在波として残る。残る基本周波数はサンプリングレートをバッファ長 N で割った値で、N が長いほど低い音になる。Kevin Karplus と Alexander Strong が 1983 年に発表した、撥弦・打楽器の物理モデル合成の出発点。
弦の振動として鳴らすには、平均をバッファの一点ずつ進める。読み出し位置 phase を一周させながら、その点を隣との平均で書き換える。一フレームに数サンプルだけ進め、減衰 decay を掛けて音を細らせる。energy で全体の振れ幅を時間とともに落とし、一定間隔で撒き直す。
撒き直した直後はバッファ全体がノイズで暴れ、一周また一周と平均が進むにつれて尖りが消え、バッファ長に対応した一本のうねりへ収束する。energy が振れ幅を落として音が細り、period フレームごとにまた弾かれる。背景を半透明の paper で薄く塗っているので、前のフレームの波が残像として尾を引く。N を小さくすると周期が短い高い音、大きくすると低い音になる。decay を下げると収束が速く、波がすぐ平らに沈む。blend を 0.5 から動かすとバッファを一周するたびにエネルギーが増減して、音が伸びたり詰まったりする。