前回のシェパードトーン は、無限に上がり続けるのにいつまでも高くならない音階でした。あの記事の終わりに、切れ目なく滑る連続版はフランスの作曲家ジャン=クロード・リセによる拡張だと書きましたが、リセはさらに一歩進んだ人で、同じからくりを音の高さではなくリズムに移植してしまいました。どこまでも加速し続けているのに、いつまで経っても速くならないビート。リセ・リズムと呼ばれる錯覚で、この連載の「耳のバグ」の棚では、差音 ・ミッシング・ファンダメンタル ・シェパードトーンに続く4本目になります。
テンポにも「オクターブ」がある
シェパードトーンの仕掛けを思い出すと、鍵は1オクターブ、つまり周波数2倍の関係にありました。周波数が2倍の音は、耳には「同じ音名の高いド」に聞こえる。この「2倍したら同じ仲間」という性質があったから、成分をこっそり入れ替えても気づかれなかったわけです。
実は、テンポにもまったく同じ性質があります。120BPMの曲に手拍子を打つとき、1拍ごとに打つ人もいれば、2拍に1回でゆったり打つ人も、倍の細かさで刻む人もいます。どれも曲に合っている。テンポ60も120も240も、互いに「同じビートの粗い刻み・細かい刻み」として自然に重なれるのです。周波数の2倍がオクターブなら、テンポの2倍は倍テンポ。リセ・リズムは、この対応関係を使ってシェパードトーンの図式を丸ごとリズムに輸入します。
山は動かさず、刻みの層が山を滑っていく
作り方はこうです。同じ刻みを、テンポ2倍おきに並べた何層も用意します。このデモでは30BPMから960BPMまで、2倍ずつの5層です。そして横軸をテンポ(対数)にとった釣鐘型の音量の山を固定しておき、全層を同じ速さで「速くなる方向」へ滑らせ続けます。
ちょうどよいテンポ帯の真ん中にいる層がいちばん大きく鳴り、速くなりすぎた層は山を下って小さくなりながら右端の無音で消える。同時に左端では、うんと遅い層が無音のまま生まれて、山を登りはじめる。全層がちょうどテンポ2倍まで加速しきった瞬間、層の配置は出発時とぴったり同じに戻ります。1層1層は確かに2倍速くなったのに、全体としては振り出しに戻っている。どの瞬間を切り取っても全層が本当に加速しているので、耳は「速くなっている」と正しく感じ続け、それでいて、いつまで経っても速くはならない。シェパードトーン で音の高さに起きていたことが、そっくりそのままテンポに起きます。
音階版にはなかった、ひとつの難所
ただし、リズムならではの落とし穴がひとつあります。音階版では、各成分は伸ばしっぱなしのサイン波でした。ところがリズム版の層は「刻み」なので、層どうしの拍のタイミングが揃っていないと、パラパラとずれた二重打ち(フラム)が聞こえて、その瞬間に層の存在がバレてしまいます。倍テンポの層たちが自然に混ざれるのは、速い層の刻みのちょうど2発に1発が、遅い層の刻みとぴったり重なっているときだけです。
そこで実装では、層ごとにバラバラのメトロノームを持たせるのではなく、全層の刻みをたった1本の主クロックから導きます。主クロックの位相を $\varphi$ とすると、各層の位相はその $2^k$ 倍($k$ は整数)。どの層の刻みも同じ $\varphi$ が整数に届く瞬間の親戚なので、拍の入れ子は数学的に崩れようがありません。層が端で生まれ直すときも、倍率 $2^k$ を掛け替えるだけなので、揃いはそのまま保たれます。
触ってみる
デモを用意しました。釣鐘の山の上を5つの層が滑り続け、右端で消えた層が左端から生まれ直します。下のタイムラインでは、実際に鳴った刻みが1本1本の縦線で流れていき、細かい縦線(速い層)が薄れて消え、まばらな縦線(遅い層)が濃く育ってくるのが見えます。
うまく表示されないときは、デモを別タブで開く 。
おすすめは、鳴らしっぱなしにして「積み上げた加速」の数字を眺めることです。×100、×1000と計算上の加速は積み上がっていくのに、聞こえるビートはずっと同じ速さの帯にとどまります。向きを切り替えると、今度は永遠に遅くなり続けるビートになります。こちらは巨大な機械がどこまでも止まりきらずに減速し続けるようで、また違った不気味さがあります。
この手のエンドレスな加速は、クラブ音楽やDJのビルドアップ、つまり盛り上がりへ向けてテンポ感を煽り続ける場面と相性がよく、電子音楽の制作では実際にリセ・リズムを組み込んだトラックやツールが作られています。リセ自身は1960年代に計算機でこの種のリズムを合成しており、シェパードの音階とあわせて「終わりのない変化」の一族を築きました。
どう実現するか
デモの中身は、シェパードトーンのコードの周波数をテンポに読み替えたものです。層 $i$ の位置 $u$(0〜$N$)に対して
$$\text{tempo} = T_{\min} \cdot 2^{u}, \qquad a(u) = \tfrac{1}{2}\left(1 - \cos\tfrac{2\pi u}{N}\right)$$
で、テンポと音量が決まります。$a(u)$ は前回と同じ釣鐘で、両端でちょうどゼロ。ここまでは丸写しです。
リズム版で増えるのは、先ほどの主クロックです。刻みを鳴らすタイミングは、主クロックの位相 $\varphi$ を使って「層 $i$ の位相 $m_i\varphi$ が次の整数に届く時刻」を求めて予約します。加速中の $\varphi$ は指数関数で伸びるので、この時刻は近似ではなく式で厳密に解けます。
const N = 5, TMIN = 30; // 30〜960BPM の5層
const bell = u => 0.5 * (1 - Math.cos(2 * Math.PI * u / N));
// 層 i の刻み予約: 位相 m[i]·φ が整数 n に届く時刻を解いて鳴らす
const phiNeeded = n / m[i];
const dt = Math.log2(1 + v * Math.LN2 * (phiNeeded - phi) / rate) / v;
scheduleTick(now + dt, bell(u) * 2 / N); // v=倍加/秒, rate=現在の主クロック速度
// 端をまたいだ層は倍率を 2^N だけ掛け替えて反対側へ(音量0の瞬間なので無音)
if (u >= N) { m[i] /= 2 ** N; }
実装上の勘どころもひとつ。位置 pos は無限に増え続けるので、$2^{\text{pos}}$ がいつか数値としてあふれます。そこで pos が一周($N$)を超えたら、pos から $N$ を引き、全層の倍率を $2^N$ 倍し、主クロック $\varphi$ を $2^N$ で割って帳尻を合わせます。積 $m_i\varphi$ が変わらなければ音はまったく連続のままです。実はこの $\varphi$ の割り忘れが開発中の実バグで、位相が一気に $2^N$ 倍飛んで刻みが止まりました。数値検証を書いていて拾えたバグです。
参考文献
- Jean-Claude Risset の加速するリズムの解説は The Illusions Index: Risset Rhythm がまとまっています。
- 土台になっている音階版の原論文は R. N. Shepard, “Circularity in Judgments of Relative Pitch” (1964)。前回の記事 で扱いました。
- デモの実装には Web Audio API を使用。AudioContext の時計で刻みを予約し、刻み音は OscillatorNode の短い減衰音です。
加速し続けるのに速くならないビート、ぜひデモで一度体験してみてください。数字の上では×1000まで加速したのに、ビートはそこにいるままです。
連載「サウンドプログラミング」
← 前回 マイクの音から音程を当てる
