Interactive Explainer / Time Domain + FM Synthesis

\(\cos(x+\sin x)\) を見る・聴く

ある範囲ではガウス関数のように見える曲線を、グラフ・差分・sideband・音で確認します。 ここで扱うのは「ガウスと音が直接つながる」という話ではなく、同じ式を二つの文脈で読むという見方です。

Start here
まず Modulation Index \(I\)0 → 1 → 4 と動かしてください。 Time Domain の形、Spectrum の sideband、Sound Preview の音色が同じパラメータで変化します。

Controls

まず \(I\) と Ratio を触ると変化が分かりやすいです。

Advanced MIDI In ↓
Formula:
general form = current values
f(x)=f(x)=cos(x+I sin(rx))=cos(x+1.00 sin(1.000x))
Modulation Index \(I\)1.00
位相の揺れの強さ。大きいほど sideband が広がります。
Ratio \(r=f_m/f_c\)1.000
意味のある比率から選び、細部は下のスライダーで自由調整できます。
整数比・単純分数比は倍音的、\(\sqrt{2}\) などは bell-like / metallic。
Volume0.20
初期音量は控えめです。Play 後に調整してください。
More Controls
Carrier \(f_c\)220 Hz
音の基準周波数。\(f_m=r f_c\)。
Gaussian \(a\)1.00
比較曲線 \(2e^{-a x^2}-1\) の幅。
x-range±2.0
広げると周期性の違いが見えます。
Sideband \(N\)8
\(n=-N,\ldots,N\) を表示。
Advanced MIDI In
MIDIキーボードから note on/off を受け取り、Carrier Frequency \(f_c\) を演奏できます。Web MIDI API 対応ブラウザと HTTPS / localhost 環境が必要です。
CC assignment では MIDIコントローラの Control Change を \(I\), \(r\), volume に割り当てられます。デフォルトでは \(I\) と \(r\) は None なので、MIDIを有効化しても音色は自動では変わりません。
* は推奨割り当てです。
MIDI: not enabled Input: - Last note: - Velocity: -
MIDI Input
複数デバイスがある場合は、ここで受信元を絞れます。
MIDI Channel
Omni では全チャンネルを受信します。
\(I\) source
推奨は Mod Wheel CC1。デフォルトでは未割り当てです。
\(r\) source
\(r\) は音色の性格を大きく変えます。デフォルトでは未割り当てです。
Volume source
デフォルトでは画面の Volume スライダーを使います。
Octave Shift
MIDI note の音域だけをオクターブ単位で移動します。
Bend Range
Pitch Bend は \(f_c\) に適用し、\(f_m=r f_c\) は保ちます。
CC64 が 64 以上の間、note off 後も発音を保持します。
Time80 ms
note 間で \(f_c\) を滑らかに移動します。

Interactive View

グラフ見出しをクリックすると、個別に折りたためます。

Time Domain\(f(x)\) vs \(g_a(x)\)
Spectrum / Sidebandsanalytic weights \(|J_n(I)|\)
Difference / Error\(f(x)-g_a(x)\)
Sound PreviewAudioWorklet signal
Stopped fc 220 Hz fm 220 Hz I 1.00

Notes

数式と読み解き。必要に応じて各項目を閉じられます。

Key Equations

表示用の曲線では、元の式を少し一般化して \(I\) と \(r\) を動かします。

\(f(x)=\cos\left(x+I\sin(rx)\right)\)
(1)
\(g_a(x)=2e^{-a x^2}-1\)
(2)
\(d(x)=f(x)-g_a(x)\)
(3)
\(y(t)=\cos\left(2\pi f_c t+I\sin(2\pi f_m t)\right)\)
(4)
\(e^{i(\omega_c t+I\sin(\omega_m t))}=\sum_{n=-\infty}^{\infty}J_n(I)e^{i(\omega_c+n\omega_m)t}\)
(5)
What is being compared?

元の観察は、\(\cos(x+\sin x)\) がある範囲で \(2e^{-x^2}-1\) に似て見える、というものです。 この近さは主に原点付近の局所的な性質です。

\(\cos(x+\sin x)=1-2x^2+x^4-\frac{41}{120}x^6+O(x^8)\)

\(2e^{-x^2}-1=1-2x^2+x^4-\frac{1}{3}x^6+O(x^8)\)

定数項・2次項・4次項が一致し、6次項も近いため、中央付近の形がよく似ます。 ただし片方は周期関数、もう片方は非周期関数なので、全域で似ているわけではありません。

Signal Path

同じ式は FM Synthesis の基本形としても読めます。modulator が carrier の phase を揺らします。

Modulator\(\sin(2\pi f_m t)\)
Gain\(I\)
Carrier Phase\(2\pi f_c t + \cdots\)
cos(phase)phase を波形に変換
OutputSound Preview

\(I\) を大きくすると phase の揺れが深くなり、式(5)の sideband が広がります。 音としては、純音からより明るく複雑な音色へ移ります。

Parameter Guide
Parameter
Meaning
Main effect
\(I\)
Modulation Index
sideband と音色の複雑さ
\(r\)
\(f_m/f_c\)
整数比なら倍音的、非整数比なら金属的
\(a\)
Gaussian Width
比較対象 \(g_a(x)\) の幅
\(f_c\)
Carrier Frequency
音の高さ
Volume
Output level
音量
How to Read

1. Original では \(I=1,r=1,a=1\) です。まず Time Domain で重なりを見ます。

2. \(I\) を動かすと、Spectrum の棒グラフが広がります。これは FFT ではなく、式(5)に基づく analytic sideband weights です。

3. Play を押すと、式(4)を AudioWorklet がサンプルごとに計算して鳴らします。ブラウザの制限により、音はユーザー操作後に開始されます。