無限に上がり続ける音~無限音階
はてしなく上がってゆく音
次の音を再生してみて下さい。
音の高さが、どんどん、どんどん、はてしなく上がってゆくように聞こえませんでしょうか?
シェパード・トーンと無限音階
この不思議な錯覚を引き起こす音は、ベル研究所のシェパードさんが 1964 年の論文 Roger N. Shepard "Circularity in judgments of relative pitch" で示された「1 オクターブ上がっても元と同じに聞こえる音」というアイデアを拡張し、何オクターブ上がっても元と同じに聞こえるようにした「無限音階」と呼ばれるものです。
シェパード・トーンの作り方
シェパードさんの論文を C/C++ 向けに解りやすく書き直すと次のようになります。
第 \(c\) 正弦波の時刻 \(t\) における周波数 \(f\) と振幅 \(a\) を次のように設定します。 \begin{eqnarray} \left\{ \begin{array}{lll} f(t,c) &=& f_{min}\cdot 2^{c+\frac{t}{t_{max}}} \\ a(t,c) &=& 10^\frac{L(t,c)}{20} \end{array} \right. \end{eqnarray}
ここで \(f_{min}\) は可聴域下限 20Hz より低い周波数を指定します。
\(L(t,c)\) は振幅をデシベルで表した関数で、 最小レベル \(L_{min}\) と最大レベル \(L_{max}\) により \begin{eqnarray} L(t,c) &=& L_{min} + (L_{max}-L_{min})\cdot\frac{1-\cos \theta(t,c)}{2} \end{eqnarray} と表され、\(\theta(t,c)\) は時間と周波数に依存して正弦波の振幅を制御する関数です。 \begin{eqnarray} \theta(t,c) &=& \frac{2\pi}{c_{max}}\left( c + \frac{t}{t_{max}} \right)\\ \end{eqnarray}
このように周波数がスイープし、振幅が可聴域の両端で絞られた正弦波を \(c=0,1,2,\cdots\) と生成して足し合わせると、 終わり \(t=t_{max}\) 部分は音の出始め \(t=0\) 部分より 1 オクターブ高いにもかかわらず、同じ音(大きさ,高さ,音色)に聞こえます。
なぜなら可聴域内の各正弦波の振幅と周波数が同じになるからです (位相は同じになりませんが、人間は正弦波の位相には鈍感ですので…)。
無限音階の作り方
シェパードさんの式は \(t=t_{max}\) で 1 オクターブ上がって、そこで終わりですが、これを何オクターブも上がってゆくように拡張し、 可聴域外に出てしまった正弦波は削除し、代わりに最低音のオクターブ下に正弦波を追加することで、いつまでも上がり続けるように聞こえる「無限音階」を作れます。
下図は、先ほどお聴きいただいた「上がり続ける音」のスペクトログラムです。
この例では可聴域外の低い音が 20 秒ごとに新たに加わっているのですが、気づかれないように、聞こえないくらい小さな振幅でゆっくり入ってくるようにしてあります。
実験
先ほどお聴きいただいたのは「はてしなく上がってゆく音」でしたが、ついでに下がってゆく音も作って、リバーブ(残響効果)を掛けてみました。
上がり続ける音に「危うさ」を、下がり続ける音に「疲れ」を感じるのは、気のせいでしょうか…。