SpectrumScroll

image171227_01

先日のTouchDesigner勉強会でサウンドのスペクトラム波形がスクロールするような表現はどう作るのか、仕組みが知りたいという質問を頂いたので、自分流にロジックを組み立ててみました。

image171227_02

スペクトラム波形がスクロールするロジックの全体です。「3DCGで」という縛りがあったので、スクロールする波形のステップ分同じ処理を何回も繰り返してマージするという形になっています。これ以外にスマートな方法が考えつかなかった。。。w

image171227_03

image171227_04

CHOPのスペクトラム波形を3DCG化するのはお決まりの CHOP to SOP を使用しますが、ソースとなるラインジオメトリは若干ポイント数を少なめにして、まずは荒い波形を生成します。

image171227_05

ここからがスクロールネタの核心部分です。作成した波形にChach SOPを接続します。Chach SOPはフレーム単位で過去のジオメトリデータをメモリに保持して、インデックスで参照することが出来ます。つまり、過去の状態を現在のフレームに表示することが出来ます。Cach Sizeは何フレーム分のジオメトリをメモリに保持するかの設定で、サンプルでは20フレーム分遡って保持するよう設定しています。これにStep Sizeを2に設定しているので、実質2フレームおきに40フレーム前まで遡ってジオメトリを保持しています。
そして、Output Indexパラメータで参照するジオメトリを20個分数値を変えてズラズラ〜っと並べればスクロールするスペクトラム波形になるのですが、20個もパラメータをチマチマ変えるのも面倒じゃない??ということで、スクリプトで設定します。

(me.digits)-1

これだけです。このコードでオペレータ名に使用されている数字、例えば Chach1というオペレータ名の場合は、1を数値として返します。これに-1されるので、結果、Chach SOPでメモリに保持された、インデックス0番のジオメトリが参照されます。

image171227_06

次に繋げているTransform SOPでも同じように、digitsを使用して、等間隔でスペクトラム波形を並べています。
この2つのオペレータを1組作成した後、コピー&ペーストを繰り返せば、オペレータの番号が1つづつ増えるので、結果的にインデックスが1つ増えたジオメトリを−0.5づつZ方向にずらして配置されます。
この手法で注意することは他とオペレータの名前がかぶると番号がずれてしまうので、デフォルト以外の名前をつけておくとロジックに不具合が発生するのを防ぐことが出来ます。

image171227_07

あとは、並べた波形ジオメトリをマージすれば完成なのですが、そのままですと波形がギザギザなままなので、PolyPatch SOPで波形のポイント数を増やして滑らかにしています。最初からポイント数の多いラインジオメトリにCHOP to SOPで処理することも出来ますが、波形からジオメトリの変換処理やキャッシュからの参照が重くなるので、こうした流れにしました。

DownLoad TouchDesigner File