#はじめに
登録時にTouch Designerって書いててすいませんでした!!!!
お触り警察の人ごめんなさい!!!!
#TDはリアルタイムな増減が苦手
単純な図形を楽器のアタックに合わせて散らかすことは良くあることだ。
oFならまあ一瞬ですが、
TDだと辛い。
TDは個数が決まってるものを、
大量にざっくり似たような動きでコピーするのは得意ですが、
- 動的に数が変わる
- 決まった点Aから点Bに移動する
的な地味な絵作りは結構難しい。
もちろんReplicatorやCopy Sop使っても可能ですが、
めちゃ重い。
頓知を効かせてChopだけで何とかして、
インスタンシングで描画する必要があります。
##Event Chopを使う
というわけでEvent Chopを使います。
こいつはPulseを突っ込んであげたり、
createEventなどの関数を呼んであげると、
ADSRベースのチャンネルデータを作ってくれます。
##ADSR
ADSRとはAttack, Decay, Sustain, Releaseの略で、
DTMやってる人にはお馴染みだと思います。
ADSRの解説
ざっくりいうと、1から0まで時間をかけて減衰する値を作ります。
Trigger Chopでも同じようなことは出来るんですが、
Event Chopの良いところは、叩けば叩くだけチャンネルのサンプル数が増えていくところです。
そして決めた時間が経ったらサンプルはちゃんと死んでくれる。
サンプル数が増減するので、こいつをインスタンシングに使うと良さそうです。
##固定の値も持てるよ
Event ChopはADSRに影響されない、
つまり時間で変化しない固定の値を持つこともできます。
これで四角形の発生元と向かい先を作れば良いですね。
##流れ
- Event Chopに任意のチャンネルを作る(四角形の初期値と向かい先)
- 使い回すADSRの値を設定
- createEvent関数でEventを発生させる
- ADSRを使ってBlend Chopで2つの値を補間
- インスタンシングする
##チャンネルの準備するよ
3番目のインレットにconstantsなどでチャンネルの名前を教えてあげます。
##ADSRの値を設定
後述のcreateEvent関数で設定しなかった値は、
UI上で設定した値が入ります。
なので、共通の値は設定しときましょう。
今回は1から0までシンプルに落ちて欲しいのでこんな感じ。
ただ、これだと何も動かないのでDecay Timeのみスクリプトから設定します。
##createEvent関数呼ぶよ
次にcreateEvent関数を呼びます。
ポイントはsamples引数です。
ここにリストを突っ込んでやると
1で作った名前の順番でチャンネルが作られます。
また、decayTimeなど、ADSRの値をチャンネル毎にランダマイズしたりもできます。
要は四角形が飛んでく速さをランダマイズ出来るってことです。
start = 0
goal = random.random() * 2.0 - 1.0
decay = random.random()
e = op('event1')
e.createEvent(decayTime = decay, samples=[start,goal])
##ADSRで補間するよ
Select ChopでADSR、初期値、向かい先、とそれぞれのチャンネルを取り出して、
Blend ChopでADSRの値を利用して補間します。
ついでにADSRの値もrenameしてscaleなどに使います。
これで移動しながら徐々に消えていく四角形が出来ます。
この時にBlend Chopの入力順に注意しましょう。
特にいうことなし
##補足
###S Curve Chopとの相性が最高
エクスペリメンタルビルドだけにしか入ってないですが、
ADSRの値をLookUpとSCurveでぐんにゃりさせると使い勝手良いです。
###孔明の罠
世間のチュートリアルの中には、
Event Chopを使わずにTableに必要な値を格納して、
Execute Datで毎フレーム更新して死活管理する、みたいなのもあります。
が、これ落とし穴があって、TableはStringなので、
値の読み書き時に文字列の変換が走るんですね。
なのであんまり数増やせずにすぐに重たくなります。
非推奨。