波を足すと、角が立つ
正弦波を足し合わせると別の波形が組み上がる。基本の sin(t) に、その2倍の速さで揺れる sin(2t) を半分の振幅で重ねると、山のひとつが傾いて左右対称ではなくなる。
足す本数を増やすときは、整数倍(倍音)の sin を振幅 1/n で重ねていく。高い倍音ほど 1/n で効きが弱まる。
// 倍音 n=1..harmonics を 1/n の重みで足す
const saw = (t, harmonics) => {
let y = 0
for (let n = 1; n <= harmonics; n++) y += Math.sin(n * t) / n
return y
}下は倍音 2 本ぶん(sin(t) と sin(2t)/2)だけを重ねたもの。基本波と2倍音を薄く重ねておくと、太い線がその和になっているのが見える。位相に時間を足すと、三本の波が一緒に横へ流れる。
2本でもう片側だけ尖り始める。同じ 1/n の重みで本数を増やすと、鋸歯(のこぎり)波に近づく。下は倍音の数を 1 本ずつ増やして縦に並べた。いちばん上が sin ひとつ、いちばん下が 8 本ぶんの和。
下に行くほど倍音が積まれて、鋸歯の斜面と垂直の落ち込みが出てくる。波形を作るのに別の式が要るわけではなく、sin を足す本数と重みを変えているだけ。
任意の周期波は sin と cos の重ね合わせに分解できる(フーリエ級数)。鋸歯波なら倍音の振幅は 1/n、矩形波なら奇数倍音だけを 1/n で足す。どの倍音をどれだけ含むかが音色(ティンバー)の正体で、WebAudio の PeriodicWave はこの倍音テーブルをそのまま渡して波形を定義する。逆に波形を倍音に分解するのが DFT で、加算合成とちょうど往復の関係になっている。