「Risset Rhythm」 温故知新

2020年7月 長嶋 洋一


概要

これは、ピッチに関する有名な錯聴の「Shepard Tone」をJean-Claude Rissetがリズムに拡張した錯聴である「Risset Rhythm」について、SUAC研究生の王福瀛さんが研究テーマとして探してきたことを発端に、SUACでの担当講義「音楽情報科学」の受講学生とともに検討するための資料である。 YouTubeにある この動画 をmp3サウンド化したものが これ であり、目標としては「Risset Rhythm」の原理を理解した上で、このようなサウンドを生成するMaxパッチ、あるいはその手法を確立することである。

第1章 「Shepard Tone」の復習

「Shepard Tone」も「Risset Rhythm」も、その基本にあるのは「複合サウンドの漸増/漸減」であるために、まずは「Shepard Tone」について確認する。 このzip には「Shepard_01.maxpat」と「Shepard_02.maxpat」という2つのMaxパッチが入っている。 いずれも14個の同一のパーシャル生成サブパッチ「sub_block」を順にトリガするという構成になっており、「sub_block」内の元波形ジェネレータが、前者はサウンドが「cycle~」による純音であり、後者はサウンドが「phasor~」による鋸歯状波である、という違いがあるだけで、他は完全に同一である。

Shepard_01.maxpat

上が「Shepard_01.maxpat」であり、サウンドとしては こんな音 になる。

Shepard_02.maxpat

上が「Shepard_02.maxpat」であり、サウンドとしては こんな音 になる。

上が共通の「sub_block」と、その内部で参照されているテーブルである。 「sub_block」は外部からbangでトリガされると、「line」オブジェクト(浮動小数点演算)により、20.0から127.0に向けて、浮動小数点数(実数)を20秒間(20000msec)かけて線形(リニア)に増加させていく。 この数値は「mtof」オブジェクトによって浮動小数点演算で補間されて、入力のMIDIノートナンバに対応/補間された周波数(ピッチ)となって、音源のオシレータを駆動する。 この「mtof」でのMIDIノートナンバとピッチとの関係は「オクターブ上がる(MIDIノートが12増える)ごとにピッチが2倍になる」という指数関数的な変換である。 また一方で、テーブルを参照した値によって、ゼロから最大値127まで直線的に増加し、その後は127からゼロまで直線的に減少するエンベロープとなって、オシレータの出力と乗算される。 結果として、この「sub_block」のパーシャルでは、ピッチがMIDI=20のノートからMIDI=127のノートに対応して指数関数的な一定速度で上昇するサウンドが、最初はゼロから次第に上昇して中間で最大値となり、その後は次第にゼロに向かうような音量変化を持つことになる。 このパーシャルが14個並んで1.6秒ないし1.45秒ごとに次々にトリガされることで、全体としての音響は「上昇し続ける」という「Shepard Tone」を構成する。

第2章 「Ghost Notes」仮説

このサウンド を最初に聞いた時の長嶋のメモは以下である。 まずはこの方針で攻めることにした。 本章での検討については このzip にあるパッチとデータを参照されたい。

上がとりあえずゴーストノートを加えたパターンを生成する「Ghost_Notes_01.maxpat」である。 ただし、このテンポを決定するmetroの数値で「一定の加速感(指数関数的変化?)」を実装するのは難しそうだったので、このシーケンスを延々と走らせたものを「seq」オブジェクトで記録して「test.mid」というmidiファイルに書き出した。 そして「test.mid」をQuickTimePlayer7に読み込ませてリアルサウンドのAIFFファイルとしてexportしたのが「11times.aif」であり、およそ11回のパターンで49秒ほどの素材ファイルとなった。 そのサウンドとは こんな音 である。

単調に長く続くリズムパターンの素材サウンドファイルを、「刻々と一定の指数関数的な加速感」でテンポアップしつつ再生するために最適なのは「groove~」である。 そこで上の「Ghost_Notes_02.maxpat」では、第1章でのShepard Toneとほぼ同じ戦略で、同一のサブパッチ「part_sub」を3つ並べて、それぞれを順に駆動する構成とした。 「groove~」に「sig~」経由で与える再生ピッチとは、「1.0」で元サウンドと同一のピッチ、「0.5」であればオクターブ下(半分の速度)、「2.0」であればオクターブ上(2倍の速度)なので、「mtof」と同様に指数関数的な関係でサウンドファイルの再生速度を制御できる。 そこで、音楽関係では定番の「expr pow(2.,$f1/12)」という関数を定義した。 これは、12等分平均律に対応して「2の12乗根のx乗」(xは浮動小数点数)という「指数関数的な相対比」を演算する関数であり、x=0なら1.0(元のまま)、x=12なら2.0(オクターブ上)、x=-12なら0.5(オクターブ下)、というように、再生速度をMIDIノートナンバに相当する感覚で指定できることになる。 この「Ghost_Notes_02.maxpat」では、3つの同等のサブパッチ「part_sub」を13秒ごとにトリガしているが、その「part_sub」内では、「-6., 12. 39000」という指定で「line」オブジェクト(浮動小数点演算)を駆動しているので、「6半音だけ下からスタートして12半音(オクターブ上)のゴールまでを、等速で39秒間かけて増加」させていることになる。 「39秒」という長さの理由は、素材ファイルが49秒ぐらいだったので、最初は低速でも後半に加速しているので、49秒より短い時間でファイルが終わってしまうために、実験的に「終わらないあたり」として決定した。 そして、「part_sub」の右側でエンベロープ乗算している部分は、「最初の13秒間でゼロから1まで増加」、「次の13秒間はずっと最大値の1のまま」、「最後の13秒間は1からゼロまで減少」、という等脚台形の形状である。 結果として、「6半音だけ下からスタートしてゼロ(等倍スピード)まで次第に大きくなり」 → 「ゼロから6半音までの加速が最大音量」 → 「6半音の速度からオクターブ上まで次第に小さくなる」という、13秒×3ブロックを交互に生成している。 この結果を録音してみると こんな音 になった。 騒然としているものの、よく聞いてみるとけっこう「次第に加速している」感じがある、という学生の感想を得た。

上の「Ghost_Notes_03.maxpat」では、全体を3ブロックでなく4ブロックとしたものである。 その理由は、上の「Ghost_Notes_02.maxpat」のエンベロープ等脚台形では、最後のゼロに向かうブロックのいちぱん最後にようやく再生速度が2倍になるが、その瞬間にはサウンドが消えてしまって、次のブロックの「元スピード」と一緒に聞こえてくれないことに気付いたからである。 そこで、4つの同等のサブパッチ「part_sub」を8秒ごとにトリガしているが、その「part_sub」内では、「-6., 18. 32000」という指定で「line」オブジェクト(浮動小数点演算)を駆動している。 つまり、「6半音だけ下からスタートして18半音(オクターブと6半音だけ上)のゴールまでを、等速で32秒間かけて増加」させていることになる。 「32秒」という長さの理由は、素材ファイルが49秒ぐらいだったので、最初は低速でも後半にさらに加速しているので、実験的に「終わらないあたり」を試すと、3ブロックの場合に比べてより短い32秒間となったためである。 そして、「part_sub」の右側でエンベロープ乗算している部分は、「最初の8秒間でゼロから1まで増加」、「次の16秒間はずっと最大値の1のまま」、「最後の8秒間は1からゼロまで減少」、という、中央部分が長くなった等脚台形の形状である。 結果として、「6半音だけ下からスタートしてゼロ(等倍スピード)まで次第に大きくなり」 → 「ゼロからオクターブ上までの加速が最大音量」 → 「オクターブ上の速度からさらに6半音上まで次第に小さくなる」という、8秒×4ブロックを交互に生成している。 この結果を録音してみると こんな音 になった。 こちらはさらに騒然としているものの、よく聞いてみるとそこそこ「次第に加速している」感じがある、という学生の感想を得た。

第3章 文献調査

第2章の実験で、なんとなく加速感はあったものの、どうにも騒然としていて このサウンド には程遠いという反省点は残った。 そこでようやく、ネットで検索できる範囲での文献調査をしてみると、色々な情報が入手できた。 例えば、 このサイト には、 このサウンド を生成したという、以下のようなSuperColliderプログラムが載っていた。
b = Buffer.read(s,"sounds/break2.snd"); // Provide a simple breakbeat loop
(
var ampTable = Signal.hanningWindow(1024,100).squared;
var ampBuf = Buffer.loadCollection(s, ampTable);

SynthDef("accelerando_inf1", { arg out=0,bufnum=0;
	var pos, posses, pitches, amps, sons;
	// "pos" is a kind of master pitch control, linear varying between one and zero
	pos = Phasor.ar(1, 0.007 / SampleRate.ir, 0, 1);
	posses = (pos + ((0..4)/5)).wrap(0.0, 1.0); // Evenly spaced circularly within 0 to 1
 	pitches = (0.2 * 2.0.pow(posses * 5));
	amps = BufRd.kr(1, ampBuf.bufnum, posses * BufFrames.ir(ampBuf.bufnum));
	sons = (PlayBuf.ar(1, bufnum, pitches.poll(100), loop:1) * amps * 10);
	Out.ar(out,
		Pan2.ar(sons.mean.softclip)
	)
}).play(s,[\out, 0, \bufnum, b.bufnum]);
)
また、 Jean-Claude_RissetのWikipedia からは、 このページ にある、どうやらそのサウンドの素材となったらしい11個のmp3サウンドファイルをゲットすることが出来た。 さらに このサイト からは、ICMC2011で発表したらしい こんな論文 もゲットできた。 そして、この論文はまだチェック中であるが、そこに書かれていた「Shepard Toneでは個々のpartialsの位相は気にしなくていいが、Risset Rhythmでは個々のpartialsの位相が非常に重要である」という記述に出会ってピンときた。 そこで、上のSuperColliderプログラムをなぞったのでは単に真似っこの「追試」になるだけなので、文献調査はいったん棚上げしておいて、このアイデアを実験してみることにした。

第4章 Loopからの生成とCrossFade

第2章の実験では、それなりの加速感はあったものの、全体として騒然としていた原因が、まさにこの「位相」の欠如にある・・・ということから、ゴーストノートのアイデアをとりあえず棚上げして、有限な長さの素材サウンドファイルを用いるのではなくて、シンプルなパターンをMaxパッチ内でループさせる(無限長の素材)方針とした。 一見すると似ているようだが、 このzip にある以下のパッチ「Risset_001.maxpat」では、まず音素材として このページ にあった素材サウンドの一つを採用し、厳密にはループしていなかったのを耳を頼りに手作業でトリミングした このサウンド を「groove~」でループ再生している。

そして、同一の4つのブロックでは、「-6., 18. 61520」ということで「原音ピッチの半音6つ下」から「原音ピッチのオクターブと半音6つ上」までの、計2オクタープにわたって、61.52秒かけてテンポアップしており、この時間を4分割した区間のうち最初の区間1でゼロから1へ音量が増加して、「原音 → オクターブ上」のテンポアップに対応した区間2と区間3は最大音量1のままで、最後の区間4で1からゼロまで音量が減少するようにした。 4つのブロックはこの区間の幅に相当するインターバルで次々にトリガされてクロスフェードしていくので、全体として「原音 → オクターブ上」のテンポアップに対応した区間は常に最大音量で鳴り続けていることになる。
この61520msecという時間幅については適当に与えた値ではなくて、以下のように予備実験として「位相を合わせる」ことを追求した結果の値である。 最初におよそ30秒程度ということで「0., 12. 30000」という値を走らせて、その際に「groove~」の右端出力(波形読み出しのランプ関数がゼロクロスする「Loop Sync Output」)からLoop Endのタイミングを抽出し、全体のスタートからの経過時間を計測する「clocker」をn回目のLoop Endでストップさせる、というアルゴリズムを走らせると、n=24の時にclockerは30510から30525あたりになった。 そこで値を「0., 12. 31000」にするとclockerは30790あたりになり、この間で両者がほぼ等しくなる数値を試行錯誤的に調べて、このパッチのように30760という値(この時にclockerは30730付近)を決定した。 これにより、各ブロックの位相はほぼ合っていることになり、ループの先頭のビートはほぼ一致することになる。 この結果を録音してみると こんな音 になった。 第2章よりも合っている感じもするが、しかしまだまだである。 その理由としては、整数でビートが揃うわけではない「6半音」というポイントで相互に接続しているところに問題があるように思われた。

第5章 2の累乗の完全Loop

第4章の結果がいまいちだったものの、問題意識がかなり明確になってきたのか この論文 をあらためて読んでみると、以下の図から新たな構想がピンときた。 そこでこれまでのCrossFadeの戦略から変更して、「2の累乗の完全Loopを重ねる」という方針を実験してみることにした。 関連するパッチとデータは このzip にまとめてある。

そこでまず以下のような、ループの素材となっている このサウンド に対して、「2オクターブと6半音だけ下 → 1オクターブと6半音だけ下」の最低速度域でちょうど4ループとなる時間を試行錯誤的に決定するためのパッチ「LoopChecker.maxpat」を作って、この時間フレーム( この論文 では「metabar」)の長さを28962msecと決定した。

これを受けて、以下のようなパッチ「Risset_002.maxpat」を作ってみたところ、見事に こんな音 になり、これは完全に立派なRisset Rhythmとなった(^_^)。 この方針で正しかったことになり、まずは一安心である。

パッチ「Risset_002.maxpat」全体は5つの加速ブロックからなっていて、下から順に、「2オクターブと6半音だけ下 → 1オクターブと6半音だけ下」に加速する第1ブロック、「1オクターブと6半音だけ下 → 6半音だけ下」に加速する第2ブロック、「6半音だけ下 → 6半音だけ上」に加速する第3ブロック、「6半音だけ上 → 1オクターブと6半音だけ上」に加速する第4ブロック、「1オクターブ6半音だけ上 → 2オクターブと6半音だけ上」に加速する第5ブロック、からなる。 音量変化を与えているのは、全体をかけてゼロから1に増加する第1ブロックと、全体をかけて1からゼロに減少する第5ブロックの二つだけであり、残りの第2ブロックから第4ブロックまでは音量はずっと最大音量の1のままである。 この「metabar」を単純ループすると、例えば第1ブロックの最後は第2ブロックの先頭と自然に連結し、第2ブロックの最後は第2ブロックの先頭と自然に連結し・・・ということで、全体は「加速ブロックの螺旋」のような構造のために、無限に加速し続けるサウンドとなる。 これがRisset Rhythmの本質であった。

第6章 別サウンドで手法の確認

第5章の成果に味をしめて、別のループ素材(打楽器というよりもピッチ感のあるもの)で、まったく同一の手法でRisset Rhythmになるかを実験してみた。 関連するパッチとデータは このzip にまとめてある。 ループの素材としたのは、 このページ にあった素材サウンドの別のもので、 こんなサウンド である。 これを前の実験とまったく同様の「LoopChecker2.maxpat」によって、最低速度域でちょうど2ループとなる時間を31952msecと決定した。 これを受けて、以下のようなパッチ「Risset_003.maxpat」を作ってみたところ、見事に こんな音 になり、こちらも完全に立派なRisset Rhythmとなった(^_^)。

第7章 逆方向 : 無限に遅くなるサウンド

この論文 の最後のあたりでは、Risset Rhythmの音楽的な考察をしている。 これまでの作曲理論や音楽美学では、音楽の速度がテンポアップすることは、気持ちの高揚や興奮といった影響があり、作曲家も指揮者も演奏家も聴衆も、その効果を暗黙の共通理解として共有していた。 ところがRisset Rhythmで「無限に加速する」となれば、そんなに永遠に気持ちの高揚や興奮が続くはずがないので、これは美学的におおいなる問題提起であり、新たな音楽の可能性を提示することにもなる。 ところで、ここまで「無限に加速するサウンド」ばかりを扱ってきたが、サウンドのテンポ変更の方向を単純に逆向きにするだけで、「無限に減速するサウンド」も実現できる筈である。 音楽心理学的には、テンポダウンによって、気持ちが落ち着いたり気分が落ち込んだりするはずなので、「無限に減速する」となれば、これはどこまでも落ち込む気分を齎す可能性がある。

そこで、第4章で「無限に加速」していた素材をそのまま使用して、加速指定のメッセージの起点と終点を入れ替えただけの上のようなパッチ「Risset_004.maxpat」を作ってみたところ、見事に こんな音 になり、まさに「無限に遅くなり続けるリズム」が出来た。 じっと聞いていると、たしかに、どんどん落ち込む感じがする。

さらに、第5章で「無限に加速」していた素材をそのまま使用して、加速指定のメッセージの起点と終点を入れ替えただけの上のようなパッチ「Risset_005.maxpat」を作ってみたところ、見事に こんな音 になり、まさに「無限に遅くなり続けるリズム」が出来た。 こちらもじっと聞いていると、たしかに、どんどん落ち込む感じがするし、落ち着いてくるのでこちらの方が精神衛生上は良い感じもある。 なお、本章での関連するパッチとデータは このzip にまとめた。

第8章 We Will Rock You

ここまで来ると、単純なパターンをループさせてRisset Rhythmにするのは、ほぼ「以下同文」で出来そうな気がしてきた。 そこで思い出したのが、2007年7月の 欧州ツアー2007 で立ち寄ったロンドンで行った、QueenのRockミュージカル"We Will Rock You"の、あのリフレインだった。

そこで、メロディーと長さがそこそこある、この印象的なリフレインを素材としたらどうなるか、という実験に取り掛かった。 本章での関連するパッチとデータは このzip にある。 まずは、ずっと昔に購入していたCDから"We Will Rock You"の冒頭のリフレイン(1回分:4小節)を切り出して、またまた手作業でトリミングしてループ素材を作った。 そして、「LoopChecker3.maxpat」を使って、最低速度ブロックで4小節のリフレイン1回の所要時間(metabar)を23155msecと決めて、改訂パッチ「Risset_006.maxpat」で作ってみたサウンドが こんな音 である。 確かにあの曲の面影もあるし、確かに加速しているが、わずかにどこかが物足りない気がした。

この不自然さの原因は、ピッチ換算でオクタープ、つまりテンポで言えば原曲から倍速まで変化する時間枠(metabar)が23155msecと短いため、なんかせわしなくなるからか? とはじめは推理した。 そこで「LoopChecker3.maxpat」のループ指定を「1」から「2」に、つまり1回分4小節のリフレインを「2回ループ」するように改訂した「LoopChecker4.maxpat」で改めて微調整して探した結果、所要時間(metabar)を46285msecとした。 そして上のように改訂したパッチ「Risset_007.maxpat」で作ってみたサウンドが こんな音 である。 オクターブ上のループがさきほどの最低音域のスピードで鳴っているので、「聴感上のテンポ感」としては、聞いてみるとほとんど同じだった。 ただしさらに注意して聞いてみると、いちばん下の音域から重低音のループが出てくるあたりがわずかに違っていて、こちらの方がやや好ましいような気もした。 そして、さらに悪ノリして、このパッチ「Risset_007.maxpat」をほんのちょっとだけ改訂したパッチ「Risset_008.maxpat」で作った、「無限に遅くなる"We Will Rock You"」のサウンドが こんな音 である。 繰り返して盛り上がる筈の曲が、このサウンドを聞いていると、どこまでも落ち込んでいく気分になるから不思議である。 こちらは、聴覚的な「注意」が下降していくサウンドに向いているため、いちばん下の音域の重低音のループがあることが有効であるように思われた。 こうなると、さらに何か、素材を吟味して実験してみたくなってきた。

第9章 サウンド素材特性の実験

第8章での実験から、ここではさらに大きくキャラの異なる3種類のサウンド素材を使っての実験を進めることにした。 素材の歌手としてはせっかくなので筆者と同級生の、マイケルジャクソン(鬼籍入り) と 石川さゆり(同年生まれ1学年上) と 山口百恵 の3人を選択し、いずれの音源もずっと昔に購入していたCDから取り出した。 ここまでの実験から、経験的に「ループ1回のmetabar時間」の2倍がおよそ「ループ2回のmetabar時間」となっている模様だが、誤差が拡大するので素材[1]と素材[3]では安易に2倍せずに、いちいち手作業で調整して決定した(フレーズの後半に主たるサウンドを持つ素材[3]は他に比べて短いので「ループ2回」・「ループ4回」とした)。しかし素材[2]では異様に長くなったので、ループ2回については「ループ1回のmetabar時間」の2倍とした。 なお、本章での関連するパッチとデータは このzip にある。 Maxパッチのスクリーンショットはほとんど同じで代わり映えがしないので省略である。
    • 素材[1] : マイケルジャクソン 「スリラー」より
      • 「metabar=ループ1回」の実験
        • ループ探索パッチ : LoopChecker5.maxpat
        • metabar = 31842msec
        • 無限加速パッチ : Risset_009.maxpat →サウンド例
        • 無限減速パッチ : Risset_010.maxpat →サウンド例
      • 「metabar=ループ2回」の実験
        • ループ探索パッチ : LoopChecker6.maxpat
        • metabar = 63674msec
        • 無限加速パッチ : Risset_011.maxpat →サウンド例
        • 無限減速パッチ : Risset_012.maxpat →サウンド例

    • 素材[2] : 石川さゆり 「津軽海峡・冬景色」より
      • 「metabar=ループ1回」の実験
        • ループ探索パッチ : LoopChecker7.maxpat
        • metabar = 46260msec
        • 無限加速パッチ : Risset_013.maxpat →サウンド例
        • 無限減速パッチ : Risset_014.maxpat →サウンド例
      • 「metabar=ループ2回」の実験

    • 素材[3] : 山口百恵 「プレイバックpart2」より
      • 「metabar=ループ2回」の実験
        • ループ探索パッチ : LoopChecker8.maxpat
        • metabar = 30150msec
        • 無限加速パッチ : Risset_017.maxpat →サウンド例
        • 無限減速パッチ : Risset_018.maxpat →サウンド例
      • 「metabar=ループ4回」の実験
        • ループ探索パッチ : LoopChecker9.maxpat
        • metabar = 60290msec
        • 無限加速パッチ : Risset_019.maxpat →サウンド例
        • 無限減速パッチ : Risset_020.maxpat →サウンド例
実験の結果は上のようになった。 こちらでも、「1/2回ループ」(metabarが短い時間)と「2/4回ループ」との比較に注目して聞いてみたが、まず連続加速版ではその違いは感じられなかった。 そして連続減速版において、最低速度音域の動きに注目してみたが、metabarが60秒という領域は十分に低音域のためか、こちらもほとんど違いは感じられなかった。 また、単純に数値を2倍にしたため誤差は増えている筈だが、素材[2]の「metabar=ループ2回」の実験でも、不自然さは感じられなかった。 ここまでの経験則として言えば、もっとも最初のRissetのオリジナルRisset Rhythmのmetabarが約30秒であったが、オーダとしてその倍の60秒というのはおそらくoverspecというか無駄である、という感じであり、唯一、「metabar=23秒」というサンプルでの連続減速版で、わずかに聞き分けられるような違いがあった事になる。 最初はループの先頭にビートがある「打楽器系」のサウンドがRisset Rhythmに適しているという印象があったが、ずっと鳴っている素材[1]や素材[2]でも、フレーズの後半に重点のある素材[3]でも、それなりの面白いサウンドが得られたことは大きな収穫である。

第10章 「逆Shepard Tone」の復習

ここでちょっとだけ、第1章の「Shepard Toneの復習」に戻る。 だいぶ昔(1990年代前半)にワークステーションで苦労してやったことも、今ならMaxで簡単なのだ。 まず、第1章のMaxパッチ「Shepard_02.maxpat」を使って、64秒間の 無限に上昇するサウンド を作った。 次にこれを波形編集ソフトに読み込んで、「リバース」つまり逆方向に編集して書き出した、64秒間の 無限に下降するサウンド を作った。

上のパッチ「Shepard_04.maxpat」は、「無限に上昇するサウンド」を再生している期間に、バンドパスフィルタの中心周波数が指数関数特性で最高音域から最低音域まで「下降」するものである。 その結果、得られるサウンドは、内部的には「上がり続けている」のに、全体としては高音域から低音域に「下がり続けている」ように知覚される こんなサウンド となる。

上のパッチ「Shepard_05.maxpat」は、「無限に下降するサウンド」を再生している期間に、バンドパスフィルタの中心周波数が指数関数特性で最低音域から最高音域まで「上昇」するものである。 その結果、得られるサウンドは、内部的には「下がり続けている」のに、全体としては低音域から高音域に「上がり続けている」ように知覚される こんなサウンド となる。 これをかつて僕は「逆Shepard Tone」と呼んだかもしれない。 なお、本章での関連するパッチとデータは このzip にある。 まったく方針が無いのだが、さて、ここで問題である。 Risset Rhythmで、これは出来るだろうか、出来ないだろうか。 つまり、「どんどん加速しつつどんどん減速するリズム/サウンド」または「どんどん減速しつつどんどん加速するリズム/サウンド」ってのはあるのか? もし、これが出来れば、「逆Risset Rhythm」と言えるだろう。 ここはもはや、未開の世界である。

第11章 新たな「逆Shepard Tone」探求

常に頭に問題意識を持って過ごす、というのはいい事である。 夜中にフト目覚めた瞬間に、本命の「逆Risset Rhythm」の前に、まずはShepard Toneで実験すべきアイデアが「3つ」ある、と浮かんだので、まずはここから実験である。 実はRisset Rhythmについても「さらに先」(ゴール??)のアイデアが浮かんだのだが、ここはグッと堪えておこう。 なお、本章での関連するパッチとデータは このzip にある。 ここで開発したRisset Rhythmの生成パッチは、スタートした瞬間から「無限に加速/減速する」サウンドを生成し続けるが、これまで使ってきたShepard Toneの生成パッチは、いくつものパーシャルが順に起動していって一巡するとようやく「無限に上昇/下降する」サウンドを生成して、それを「record~」で保存したサウンドファイルを後で「再生」すると、その長さが有限だった。 つまりはちょっとした未完成だったのである。 そこでまずスタートラインとして、「無限に上昇/下降する」サウンドを生成し続ける、という基準Shepard Tone音源パッチを用意することにした。

上のパッチ「Shepard_06.maxpat」は、素材として「30秒間の上昇Shepard Tone」ファイルを使って、上段では3つのブロックがこれをそのまま再生していて、「10秒間でゼロ→1に音量増加」・「10秒間はそのままの音量」・「10秒間で1→ゼロに音量現象」という動作を、10秒ごとに繰り返すことで、「無限に上昇する」サウンドを生成し続ける。下段では3つのブロックが素材ファイルを逆方向に再生していて「無限に下降するShepard Tone」となり、「10秒間でゼロ→1に音量増加」・「10秒間はそのままの音量」・「10秒間で1→ゼロに音量現象」という動作を、10秒ごとに繰り返すことで、「無限に下降する」サウンドを生成し続ける。 そしてこのパッチ「Shepard_06.maxpat」では、その2系統の生成サウンドをモノラルのまま足しあわせているので、結果として得られるサウンドは上昇も下降もなく、適当に短い上下を繰り返したような こんなサウンド になった。 上段と下段のスタートの時間差の「delay 123」は、他に10とか100とか1000とか適当にしてもほぼ響きは同様である。 実験すべきアイデアの「第1」のこれが駄目だろう、というのは、最初から想定内であった。

そして、実験したいと思ったアイデアの「第2」が、上のパッチ「Shepard_07.maxpat」での実験である。 Shepard Toneの生成部分はまったく同一である。 前のパッチとの違いは、「無限に上昇」と「無限に下降」のそれぞれの系列を、ステレオの左右に分離した、というところである。 ここはスピーカでなくイアホンかヘッドホンで聞かないと絶対に無意味となるが、 こんなサウンド になった。 そのつもりで聞いてみれば、左右それぞれのサウンドは「無限に上昇」と「無限に下降」となりそうだが、上のミックスと似たような繰り返しの周期も感じられるので、脳内で左右のチャンネルのサウンドがミックスされる機構が働いているような気がする。 この点はもう、聴覚心理学実験として新たにやってみなければならないテーマかもしれない。

そして、実験したいと思ったアイデアの「第3」が、上のパッチ「Shepard_08.maxpat」での実験である。 Shepard Toneの生成部分はまったく同一である。 ここでは出力サウンドは60秒間の有限なファイルとなり、 こんなサウンド になった。 これは、「第2」の実験で左右に分かれていたチャンネルのサウンドを、60秒間かけて、片方はゆっくりと左→右に、もう片方はゆっくりと右→左に音像を移動させる、というPANPOTの実験である。 過去に電子音響音楽の作曲において、あるサウンドの定位を固定せず、例えば「常にゆっくりと左→右に移動」などのルールを用いると、それぞれの音源が混濁せずに浮き立ってくれた、という経験則がここで生きないか・・・という仮説だったが、結果は無残にも駄目だった(^_^;)。 それぞれのサウンドが移動して、中央付近では「第1」の実験のようにミックスされて不自然な上下フレーズのようになってShepard感が消えてしまっていた。 これはまぁ、心理学実験のネタ(「第2」の実験)は得られたものの、ちょっと期待はずれという結果になった。

第12章 metabar生成規則性の探求

前章の実験から、比較的シンプルなShepard Toneであっても、「上昇しつつ下降」・「下降しつつ上昇」というのはパンポット応用の路線では難しい、と判明したので、とりあえずこのパンポット戦法での「逆Risset Rhythm」攻略については諦めて、まずはちょっと棚上げである。 そこで、これまで手作業のトライアンドエラーで進めてきた「Risset Rhythm生成アルゴリズム」の「metabar計測」について、ここまでの事例からなんらかの法則性を見出せるかどうか、整理してみることにした。 完全なRisset Rhythmが生成できるようになった第5章から第9章までのMaxパッチに関して、「ループ素材の長さ」と「最低速音域のループ数」と「metabarの長さ」との間に、例えば簡単な線形性などの数学的関係性が見出せるかどうか、という検討である。 数学的関係性が見出せればどうなるかというと、任意のループ素材に対して「最低速音域のループ数」だけ指定すると、それだけで簡単にRisset Rhythmが生成できることになり、ライヴComputer Musicの場においては、ステージ上でライヴサンプリングした音素材をその場で次々にRisset Rhythm化する・・・という、これまで世界で誰もやってこなかった新しい音楽の出現となる可能性があるので、インタラクティブComputer Music派の僕としては、モロに直面する大テーマとなるのだ。

ループチェッカ ループ素材 ループ素材の長さ ループ回数 素材×回数の長さ [a] metaberの長さ [b] [b] / [a] の比
第5章 LoopChecker.maxpat break3.aif 1846.666633 4 7386.6664 28962 3.9208485
第6章 LoopChecker2.maxpat beat1.aif 4075.011263 2 8150.0224 31952 3.92048
第8章 LoopChecker3.maxpat RockYou4.aif 5901.677896 1 5901.677896 23155 3.9234605
第8章 LoopChecker4.maxpat RockYou4.aif 5901.677896 2 11803.355 46285 3.9213427
第9章 LoopChecker5.maxpat MJ04.aif 8118.344522 1 8118.344522 31842 3.9222282
第9章 LoopChecker6.maxpat MJ04.aif 8118.344522 2 16236.689 63674 3.9216123
第9章 LoopChecker7.maxpat tsugaru6.aif 11795.011121 1 11795.011121 46260 3.9219971
第9章 LoopChecker8.maxpat momoe7.aif 3843.333263 2 7686.6664 30150 3.9223765
第9章 LoopChecker9.maxpat momoe7.aif 3843.333263 4 15373.332 60290 3.9217262

そして、うすうすそんな感じはしていたが、上の表のように(これはエクセルでなく電卓で計算して手入力した)、綺麗に比例関係が見出せた。 LoopCheckerのパッチでは手作業の試行錯誤でmetabarをエイヤと決めていった誤差が生じていたが、この表はまずまず誤差を含めた上でも良くできている。 おそらく数学的には時間的に積分してちゃんと出てくると思うのだが、「[b] / [a] の比」については、およそ3.9218あたり(9件の平均は3.9217855)で、あとは誤差という感じである。 こうなると、逆に厳密にキチンとした長さのサンプル音素材を用意して、そこからRisset Rhythmを自動生成するというパッチを作る、という道が見えてきた。 第9章で考察したように、metabarの長さのオーダとしては、最初のRissetの「オリジナルRisset Rhythm」が「metabar=約30秒であった」が、オーダとしてその倍の60秒というのはoverspecというかおそらく無駄である。 また、唯一「metabar=23秒」というサンプルでの連続減速版で、わずかに聞き分けられるような違いがあった事から、目安として「metabar=約25秒以上」(50秒未満)という範囲がここまでの経験則となる。

以上を考慮して、ここまでに登場した6種類の音素材から選んで、パラメータとして「3.92083」をカットアンドトライで決定して作ったのが、上の無限加速パッチ「Risset_021.maxpat」であり、「Risset_022.maxpat」が同様の無限減速パッチである。 そして最後に、以下のような「Risset_023.maxpat」を作ってみたが、これはステレオ(定位は動かさずに固定)として、Lチャンネルが無限加速、Rチャンネルが無限減速しているのだが、面白いことにウインドウ最下段のバーグラフで「metabar中での進行具合」を表示してみると、その両端のあたりで左右の音像が急に中央に移動する。 これこそ第5章の最後に確認したRisset Rhythmの本質そのものであり、オクターブの螺旋が連結するために、途中ではステレオで分離しているのに、ちょうどmetabarの端っこでは両者がぴったり合っている、という事実をスッキリと体感できる。(^_^)

6種類の素材ループとともにそれぞれ約2分間のサウンドファイルとしたものが、 これこれこれこれこれこれ である。 なお本章でのパッチとデータを このzip にまとめた。 これでここまでの実験としては一区切りとなるが、この「先」についての構想もぼちぼち浮かんでいるので、さらに追求してみよう。

第13章 Real Time Risset Rhythm Generator

前章までで、いわば「Risset Rhythmのおさらい」は完了である。与えられた任意のループ素材(サウンドファイル)を使用して、それを使ったRisset Rhythmを生成することは、ほぼ定型作業として確立した。 「面白いRisset Rhythmのサンプル」を作り出すことはこれで可能となったものの、ここで終わりでは面白くない。 本章では、大きく目標を「Real Time Risset Rhythm Generator」と掲げて、これに向けた実験の最初の一歩を進めてみた。 なお、パッチとデータは このzip にまとめた。

上のように、ここでのパッチ「Risset_024.maxpat」では、ループ素材としての波形バッファメモリをぴったり「2000msec」(96000サンプル/48kHzサンプリング)と定めているために、metabarの誤差がまったく無いという環境とした。 そして、Maxユーザにはお馴染みの「drumLoop.aif」という素材から、バスドラム、スネアドラム、裏打ちスネア、オープンハイハットなどの断片を「peek~」で切り出して、波形バッファメモリのちょうどのタイミングのところに貼り込むことで、刻々ときちんとしたループ素材のRisset Rhythmが生成される。 さらにポイントとしては、4回=8秒間のループ素材から生成されるmetabar(31.36664秒)の区間の途中3箇所で、「drumLoop.aif」からの断片を「peek~」で切り出して波形バッファメモリに貼り込むパターンを、randomにさじ加減を変えつつ変更している。 randomで選ばれる候補の位置はいずれもビートに乗っているのでヘンになる事はないが、走らせてみると途中でパターンが変わることで、ある意味「飽きがこない」Risset Rhythmとなっている。 ほんの一例であるが、モノラルで「永遠に加速する」というサンプル(約3分)が これ であり、ステレオにして片方は永遠に加速しつつもう片方は永遠に減速しているサンプル(約3分)が これ である。 特に後者において、metabarの周期ごとに、加速してきたパターンと減速してきたパターンが中央定位のあたりで一致する、という繰り返しがはっきりと聞こえて面白い。



→ その発展