階段を上がっているのに、いつまでも同じ階に戻ってきてしまう。エッシャーのだまし絵に出てくるあの無限階段を、音で作ったらどうなるでしょうか。実は本当に作れます。ドレミファソラシド、と半音ずつ確かに上がり続けているのに、1分聴いても10分聴いても、いっこうに「一番上」に着かない音階。シェパードトーンと呼ばれる音の錯覚で、1964年に心理学者ロジャー・シェパードが計算機で合成して見せたものです。

この連載ではこれまでに差音ミッシング・ファンダメンタル 、2つの「鳴らしていない低音が聞こえる」錯覚を扱ってきました。今回はその棚の3本目です。前の2本が耳の作る幻の低音だったのに対し、こちらは耳が音の高さをどう測っているかの隙を突く錯覚で、種明かしを知ると、プログラムでの作り方まで一直線につながります。

上がり続けるには、どこかで戻るしかないはず

まず、なぜこれが不思議なのかをはっきりさせておきます。音の高さを切れ目なく滑らかに変えることをグリッサンドといいますが、サイレンのように1本の音をグリッサンドで上げ続けると、いつかは必ず限界が来ます。楽器の音域の上限か、耳に聞こえる周波数の上限か、いずれにせよ天井はある。上がり続けたければ、どこかで下へ戻るしかありません。そして戻った瞬間の「ヒュッと落ちる」は、誰の耳にもはっきり聞こえてしまいます。

1本の音で上がると上限に届いた瞬間の落下が必ず聞こえるが、オクターブ違いの成分を重ねたシェパードトーンでは入れ替わりが両端の無音で起きるため上がり続けだけが聞こえることを比べた図

シェパードトーンの答えは、右の図のほうです。音を1本ではなく、1オクターブずつ離した何本もの成分の束にする。そして「戻る」瞬間を、音量がゼロになる端っこに隠してしまう。落ちる音が聞こえないのは、落ちるときにはもう聞こえない小ささになっているからです。

この仕掛けが成立するには、耳の側にも条件がひとつ要ります。それが次の話です。

耳は「どのオクターブか」を音量の重心で聞いている

平均律の回 でやったとおり、1オクターブ上の音とは周波数がちょうど2倍の音のことです。そして人間の耳にとって、オクターブ違いの音はただの「別の高さ」ではありません。ピアノにドは8つほどありますが、どれを弾いても私たちは同じ「ド」だと感じます。音の高さには、ドかレかソかという音名の顔と、それが低いドか高いドかというオクターブの顔、2つの顔があるわけです。

ここで、同じ音名のドを、低いドから高いドまで全オクターブぶん一度に鳴らしたらどうなるか。音名のほうは文句なしに「ド」です。ところがオクターブのほうは、材料が全部の高さに散らばっているので、決め手がありません。このとき耳は、成分の音量がどのあたりに集まっているか、いわば音量の重心で「だいたいこの高さのド」と聞き取ります。逆に言えば、重心さえ動かなければ、中身の成分がこっそり入れ替わっても、耳には同じ高さ帯の音に聞こえ続けるということです。シェパードトーンは、この性質を正面から突きます。

山は動かさず、成分だけが山を滑っていく

作り方はこうです。1オクターブおきに並べた成分たちに、周波数に応じた音量の山を掛けます。山は釣鐘型で、真ん中の高さ帯がいちばん大きく、低すぎる端と高すぎる端ではちょうどゼロ。つまり両端は無音です。この山は最後まで固定しておいて、成分たちだけを全員一斉に、同じ速さで上へ滑らせます。

釣鐘型の音量の山を固定したまま全成分が右へ滑り、上端の成分が消えながら退場し下端から新しい成分が無音で入場して、1オクターブ上がりきると出発時と完全に同じ配置に戻ることを3コマで示した図

図の赤い1本を追ってみてください。出発時に上のほうにいた成分は、上がるにつれて山を降り、どんどん小さくなりながら右端へ抜けて消えます。同時に左端では、新しい成分が無音のまま生まれて、山を登りはじめる。そして全員がちょうど1オクターブ上がりきった瞬間、成分の配置は出発時と寸分たがわず同じになります。1本1本は確かに1オクターブ上がったのに、スペクトル全体としては振り出しに戻っている。音量の重心は、最初から最後までぴくりとも動いていません。

あとはこれを繰り返すだけです。どの瞬間を切り取っても、すべての成分は本当に上昇しているので、耳は「上がっている」と正しく感じ続けます。一方で、1オクターブ上がるごとに全体は元どおりになるので、いつまで経っても高くはならない。配役の入れ替えは毎回、音量ゼロの端で行われるため、耳には検出のしようがありません。床が下り続けるらせん階段を、延々と登らされているようなものです。

触ってみる

この入れ替わりは、目で見ると一段と腑に落ちます。釣鐘の山の上を8本の成分が滑り続け、右端で消えた成分が左端から生まれ直すデモを用意しました。なめらかに滑る連続版と、半音ずつ階段で上がる版を切り替えられます。

うまく表示されないときは、デモを別タブで開く

おすすめは、鳴らしっぱなしにして「スタートからの上昇量」の数字を眺めることです。ピアノの全音域は7オクターブと少ししかないのに、この音階は10オクターブでも20オクターブでも平気で上がり続けます。もちろん音はずっと同じ高さ帯のまま。それから、向きを下降に切り替えると、今度は永遠に落ち続ける音になります。エレベーターの下りが終わらない感覚も、なかなかのものです。

この音、聴き覚えのある方も多いはずです。映画『ダンケルク』では、ハンス・ジマーがこの原理を音楽全体に織り込み、終わらない上昇で緊張がひたすら高まり続ける感覚を作りました。ゲームでは『スーパーマリオ64』の無限階段が有名で、登っても登っても続く階段の演出に、上がり続ける音階がぴったり重ねられています。錯覚と分かっていても、心拍のほうは正直に釣られてしまうのが面白いところです。実際にどんなふうに使われているかは、下から聴いて確かめてみてください。

映画『ダンケルク』 / ハンス・ジマー

Supermarine

スコア全体がシェパードトーンで組まれた作品ですが、単曲なら「Supermarine」が代表例です。上がり続ける音でひたすら緊張が高まっていく感覚が、はっきり味わえます。

ゲーム / スーパーマリオ64

無限階段のBGM

登っても登っても終わらない階段の演出に、上がり続ける音階が重ねられた有名な例です。

ところで、この錯覚の土台にあった「音の高さには音名とオクターブの2つの顔がある」という性質は、音感を鍛えるときにもそのまま顔を出します。ドの音名は当てられるのにオクターブを取り違える、というのはよくあることです。私事ですが、筆者は音を聴いて当てる練習ができる音感トレーニングアプリ Harmonize を個人開発しています。耳がどうやって高さを聞いているのかを知ってから練習すると、また違った面白さがあります。

どう実現するか

デモの中身は、倍音の回 と同じくサイン波を並べる加算合成で、違いは周波数と音量を動かし続けることだけです。成分を $N$ 本(デモでは8本)用意し、いちばん下の周波数を $f_{\min}$ とすると、位置 $u$(0〜$N$ オクターブ)にいる成分の周波数と音量は

$$f = f_{\min} \cdot 2^{u}, \qquad a(u) = \tfrac{1}{2}\left(1 - \cos\tfrac{2\pi u}{N}\right)$$

で決まります。$a(u)$ が例の釣鐘で、$u=0$ と $u=N$ の両端でちょうどゼロになります。あとは全成分の $u$ を同じ速さで増やし続け、$N$ を超えたら 0 に巻き戻すだけです。

const N = 8, fmin = 27.5;
const bell = u => 0.5 * (1 - Math.cos(2 * Math.PI * u / N));

// pos は「これまで上がったオクターブ数」。毎フレーム少しずつ増やす
for (let i = 0; i < N; i++) {
  const u = (i + pos) % N;                     // 端まで行ったら反対側へ回る
  osc[i].frequency.value = fmin * Math.pow(2, u);
  gain[i].gain.value = bell(u) * (2 / N);      // 合計が常に1になる正規化
}

ひとつだけ実装上の勘どころがあります。この釣鐘には、どの瞬間に切り取っても全成分の音量の合計が $N/2$ で一定になる、という便利な性質があります(コサインを1周ぶん等間隔にサンプリングすると打ち消し合ってゼロになるためです)。おかげで、成分がどこにいても全体の音量が揺れません。何時間鳴らし続けても大きくなったり細ったりしない無限音階が、この数行で手に入ります。

参考文献

  • R. N. Shepard, “Circularity in Judgments of Relative Pitch,” The Journal of the Acoustical Society of America, vol. 36, no. 12 (1964), pp. 2346–2353. DOI: 10.1121/1.1919362 。この錯覚を計算機合成で示した原論文。
  • 連続グリッサンド版と、その周辺の音の錯覚は Wikipedia: Shepard tone がまとまっています。連続版はジャン=クロード・リセによる拡張です。
  • 青木直史『サウンドプログラミング入門――音響合成の基本とC言語による実装 』技術評論社(2013)。サイン波の重ね合わせをはじめ、音作りの基礎をC言語の実装つきで学べる定番書。
  • デモの実装には Web Audio API を使用。8本の OscillatorNode の周波数と GainNode の音量を毎フレーム動かしています。

登っても登っても着かない階段を、ぜひデモで一度体験してみてください。数字の上では20オクターブ登ったのに、音はそこにいるままです。


連載「サウンドプログラミング」
← 前回 消えたはずの低音が聞こえる