Karplus-Strong — ノイズを弦に変える
弦を弾いた瞬間はあらゆる高さの振動が混ざった雑音で、雑音が減衰して一つの高さに落ち着くと音程のある音になる。短い配列にノイズを詰め、隣り合う二つの値を平均しながら配列を巡回させると、この落ち着く過程がそのまま波形に出る。
Karplus-Strong は 1983 年に Kevin Karplus と Alex Strong が発表した物理モデリング合成の最小形。リングバッファ(ディレイライン)に雑音を詰め、隣接平均(ローパスフィルタ)を掛けながら巡回(フィードバック)させる、この三つだけで撥弦の振動を模す。バッファ長 N がディレイ時間を決め、ディレイ時間が基本周波数になる。最初に詰めるノイズが弦を弾いた瞬間の励起、巡回ごとの平均が高音から先に失われるエネルギー散逸に対応する。波形を足す加算合成や位相を揺らす FM とは別系統の、物理現象を数値で真似るアプローチ。
長さ N の配列を -1〜1 の乱数で埋める。弦を弾いた瞬間の励起で、隣の値と無関係なギザギザの雑音。値を横に並べて折れ線で結ぶと、上下に荒れた波になる。配列の中身は動かさず、雑音そのものを線で見せる。
各サンプルが独立した乱数なので、隣どうしの段差が大きく折れ線が尖る。N の幅いっぱいに荒れた波が広がっている。この配列を巡回させながら、隣り合う二つの値を平均で置き換える。buf[i] = (buf[i] + buf[i+1]) / 2 を i を一つずつ進めながら繰り返すと、急な段差が均されて雑音がほどける。
巡回が一周するごとに段差が一段ずつ取れ、尖った雑音がうねる波へ寄っていく。平均は高い周波数ほど強く削るローパスフィルタとして働くので、細かいギザギザから先に消えて、配列の長さに合った緩い波だけが残る。ここでは値がほぼ平らに均れたところで配列を弾き直し、雑音から滑らかな波への変化を繰り返している。
平均に減衰率 decay を掛けると、波が均れていくだけでなく振幅そのものが少しずつ落ちる。(buf[i] + buf[j]) * 0.5 * decay の decay を 1 よりわずかに小さくすると、弾いた音が時間とともにしぼむ。残った波の山の数は配列長 N で決まり、N が短いほど一周が速く、波が密で高い音になる。
弾くたびに N が変わり、短いと波の山が増えて密に、長いとまばらになる。decay が振幅を毎周削るので、ノイズがほどけて滑らかな波になった頃には全体がしぼんで中心線へ近づく。励起(最初のノイズ)と共鳴(巡回と平均)が分かれていて、ギターやハープのような撥弦の鳴りを、ディレイとフィードバックだけで出している。decay を 1 に近づけると音が長く伸び、平均の重み 0.5 をずらすと倍音の削れ方が変わる。