忘れちゃうCHOP達 [TouchDesigner]
覚えておきたい奴のメモ
随時更新
最終更新 : 2023/02/26 09:00
CHOPの概念
Chopにおける値の概念として重要なものをまとめておく。
channel
(single) value, sample value(配列)
Channel
一つのCHOPに複数の変数を抱えることができる。一見して一般的なプログラミング言語における配列のように感じるが、この後その配列を扱う。
どちらかというとこのチャンネルは変数がたくさん入っている感覚で、オブジェクトや構造体に近い。
(single) valueとsample value(配列)
(single) value
(single) valueはいわゆる値を一つだけ持つようなCHOPの形態
以下は3channel持っている Value
(single) valueのCHOPは以下のようOptimized Python Expressionで書きたいときはにopに対して、['channel name']で取得する。
op('contant')['chan1']
sample value(配列)
サンプリングされているCHOP。配列として考えてもおk
sampleにはsample rate、length, Amplitude(value)の概念が付き纏う。
sample rateはいわゆるサンプリングレートと呼ばれるもので、
1秒間に何回標本化(sampling)を行うかということになる。デフォルトの各種CHOPでは、me.time.rateとなっており、timelineのFPS設定の値が引き継がれるようになっている。
Lengthは表示される、扱う、横軸(時間)の長さのことを言っている。
多くのCHOPの場合、lengthを設定できる項目で、単位を選べるsamples, Frames, Secondsで指定できて、
samplesで1だと1 sampleということで、fps分のlengthが設定される。
Frameだと2 Frameだとすると、1/Sample Rate * frame = 1/23.976 * 2 分のsampleがされて、lengthが出てくる。
Secondsは Sample Rate * seconds = 23.976 * 2(sec)分のlengthが設定される。
Amplitude = 振幅はその時の値の大きさによって決まるので、そのときそのとき。
値は下記のようにop()[チャンネル名][sample index]で取得できる。
op('noise1')['chan1'][0]
info
infoで見れる情報。
Start/Endで見れる情報が複数存在している
iと書いてあるやつが、indexでの表示。indexで言えば、0 to 119だよってこと。
f って書いてあるのがframe
sがsec
Time Slice状態かどうかも表示される。
Time Slice
TimeSlice状態とはどういことか?
実験として、keyboard in CHOPにTrail CHOPを繋いでhistoryが見れるようにしてみる
keyboard chopが入力を受け取ったタイミングでvalue 1が出力される。
(chopで+ボタンを押して触れるようにした後、d(dot per sample)を押すとsample毎のdotが見えるようになる。)
(Hを押すと、自動でampに合わせてグラフを調整してくれる)
(中クリックでドラッグアンドドロップするとampのグラフのスケールを変えれる)
次にconstant CHOPをtrail CHOPに繋いでみて、constant chopの値を動かしてみる。
この状態でhog CHOPを作ってみて、Delayを0.039secとかにしてみる。そうすると、hog CHOPがEvery Cookに対して、0.039 secの時間を泥棒していって、TD全体が重たくなってくる。
Constant CHOPをまた動かしてみると先ほどとは違い、明らかに重たくなったせいで値が止まっている時間が多くなった。(steppy)
fpsも60から落ちた
Time Slice CHOPをConstantとtrailの間に挟んでみる。
time sliceのMethodをLinearにしてみる。
そしてまたConstant CHOPの値を動かしてみる。
すると結果が異なり、先ほどまであったステップ感がなくなり、値がどのsampleでも動いているようなグラフになった。
何が起きているかわかりやすくするために、hog CHOPのDelay量を大きくして10fps近くの環境を作ってみる。かつ、Perform CHOPのCook channelだけをONにしたものを用意して、素のConstant CHOPとmergeしたものをtrailに突っ込んでみる。
すると、CookされているタイミングでConstant の値が更新されていることに気づく。CookはHog CHOPにより、遅くなっている。
TimeSlice CHOPもmergeに混ぜてみる。chan2(green)がtimeslice
Time Slice(Linear)状態は、sampleRateに比べて、cook数が足りていないときにそこを補完するようになっている。
つまり、TimeSlice状態とは、cookできていないタイミングに値をスムーズに補完しながら生成するようなCHOPのこと。
TimeSliceがYesになっているCHOPは
本来だと、Start/Endが補完分の長さになっている。
Lag CHOP, Filter CHOP, LFO CHOPなどはTime Slice FlagがYesになっているようなCHOPとなっている。
Noise CHOPなどの一部のCHOPでは、Common ParameterでTime Sliceがgray outしていなく、押すことができる。
初期状態ではStart/Endはsampleの数の600になっている。
TimeSlice buttonを押すと、Time Slice Step分に変化し、値が補完するように変動するようになる。
TransformのTxなどにabsTime.frameを打つのとはまたちょっと違う状態。そもそもnoise関数がcook数ようによるgapを補完するように変動するがのtime slice状態、そのnoiseの形状をそもそもいじるのがTxのため意味が違う。
Ref
よくある使いたくなるシチュエーション
Valueをsampleにする
変動するValueからsampleを作る
trail CHOP
複数のValueからsampleを作る
Join CHOP
Sampleを逆順に並び替える
Stretch CHOPのReverse IntervalをOn
現在のsample値からValueにする
Sampleを分解して、複数のチャンネルのValueにする
Shuffle CHOPのMethodをSplit All Samples
Channelとsampleのスワップ
sampleの後ろにsampleを合体
Shuffle CHOPのMethodをSequence All Channels
Sampleの間にSampleを挿入
Splice CHOPを使います。
複数ChannelのValueのうち、アクティブなChannelだけ抽出
Fan CHOPのOperationをFan Inにします。
1つめのChannelに1が入っていると0、2つめのChannelに1が入っていると1、3つめのChannelに1が入っていると2を返します。
Constant
定数の値を生成できる
Snat tab
例えば、midiコントローラの値など何かしらに動いている値がconstant chopのinput1(snap)に入力されているとき、
Snapshot Inputを押すことで、その時の値を保持することができる。
First Channelは例えば複数チャンネルのchopがInputされていたときに、
first channel 2にしてあれば、
index2番(つまり3つ目)からsnapshotされることとなる。
defautlで0でindex0番つまり、全チャンネルsnapshotされることとなっている。
2つ目のinputはActiveという名前になっていて、
入力された値が0より大きいときにinput0(snap)から入力されている値をsnapshopt buttonなしに、更新させる。
Active Needs Currentについてはちょっとまだ理解できていない。
LFO
Low Frequency Oscilator(低周波発信器)
Trail
入力チャンネルの履歴をsampleにしていく。
Window Lengthは単位(Samples, Frames, Seconds)に合わせて、履歴として記録する量を決めれる。4sampleにすると、inputの4sample分を記録する。
デフォルトではSecondsになっていて、WindowLengthの値を変えることで1sec, 2secと記録する量(history)を変えれる。
CaptureではTime SliceとOnly When Input Cooksが選べて、
Time Sliceだとsample Rate(FPS)に合わせて、勝手にサンプルされていく。
Only When Input Cooksにすると、入力のCHOPがCookしているときのデータしかsampleしない。
ResampleをONにすると、inputのもう一回リサンプリングを行える。
デフォルトでは以下のようになる。
resampleの値に設定したLengthでリサンプルを行なって、
RateをONにすると、デフォルトのグローバルフレームレート($ FPS)(me.time.rate)以外のsample Rateを使ってリサンプリングできる。
Grow Lengthをonにすると、
名前の通り、lengthが成長していって、どんどん時間経過に合わせて長くなっていく
Trim
入力のLengthを分けることができる。
周波数別に分けたいときとか
Resample
lengthを変えたいときに使える。
CommonのTime SliceをOffにして、
ResampleのNew Rate New Intervalを選ぶと自由に調整できる。
Audio Spectrum
横軸が周波数、縦軸が振幅のスペクトラムに変更できる。
Audio Filter
High pass / Low pass のフィルターになる
フィルターのカットオフ周波数調整もできる
Filter
Type別の値と値の補完を行ってくれる
波形(sample)につないじゃうと大変重たくなった
Delay
時間差を設けれる。
Lag
時間差を設けれる、かつ補完もできる。
比較的動きが滑らかになる
LAg per sampleを押すと波形グラフになる
Envelope
各サンプルの最大振幅を出力とした包絡線(envelope)を出力する
必ず絶対値になる。
Exponential Decay / expを選ぶと、
前のサンプルのenvelopeより少ないならだんだんと指数関数的に減衰するようにできる。
Local Maximum Window / windowを選ぶと、
envelopeを毎サンプル事ではなくて、Nでエンベロープの個数を分割できる。窓関数的な感覚 width
Commonタブ
Export Methodを変更するとDATへのテーブルの出力が変わる
CHOP to DATでCHOPから情報をもらうときに
CHOP to DATのInclude NamesをONにすると
1行目がName(ex:position)になって
op('CHOP TO DAT')[me.inputPrim.index + 1, 'position'] * me.par.py
[row, column]配列でとってくることができる。
Channel Name is Path:Parameter
にすると、channel nameをPath:Parmaterにすると、勝手にexportされるようになる。
詳しい使い方は以下を参照。
Look up
下からの入力波形を配列として考えて、
上からの入力波形の各横軸別に、値をLook upのindex rangeを基にした範囲の下の入力配列のインデックスとして、値を返す
配列から値をとれる感覚
Splice
CHOP Aの波形とCHOP Bの波形をつなげる
Analyze
平均値や最大値など代表値を得られる。
S curve
S時のカーブを作りやすいpattern的な奴
対数関数が使える
Limit
値のリミット、上限(Clamp)、繰り返しなどをつけれるのと
Quantize(量子化、縦軸)でround / celing / floor などをつけれる。
Join
二つの入力を横に並べれる。
3チャンネルとかあれば、
そのチャンネルごとにやってくれる。つまり、channel名ごとにまとめてくれる。
Top to CHOP
CropをFull Imageにすればピクセルごとの値をチャンネルに分けれる
Row and Columnにすれば全ピクセルのrgbaを受け取れる、ピクセルが多すぎると重たすぎる
Shuffle
大量のチャンネルを持っている物とかを
合わせて波形にしたり、
ぐちゃぐちゃにしたりできる。
Sequence Channels by Nameにすれば、チャンネルの名前別に
波形なら横軸別に合わせて一本にできる。
Sequence Every Nth Channel
N個のチャンネル個に分けて
横に並べる
分け方は、単純に順番にindex順に1/N個までで一区切りに分けていく。
N Value = 1
N Value = 3
Secuence All Samples Nth Channel
例えばなんかの動画ファイルのデータファイルのように、
jsonやxmlみたいなものを想像して、それが毎フレームのデータが入っているときに
毎フレームのxのデータが欲しいみたいなときに
周期的にxのデータがくるときに
xのデータをまとめてsamplesにしたいときに便利
Stretch
波形ではない値を
そのままsample数を増やしたいときにできる。
Start / Endでsampleの横軸を決めれる。
Unit Valuesで絶対か相対かを決めれて、
Length Scaleの値倍でLengthをつけれる。
Trigger
閾値をつけて、それ以上のinputが来ないと次にoutputしないようにできる。
attackとかも調整できる。
来たpulseがなめら中になるのも特徴
Logic
インプットを全部バイナリに変えて、処理して出力できる。
Convert inputで Inputをどういうルールでバイナリにするかを選べる
On When Value Changed / valchange
チャネル値が変更されると1を返す
Combine Channels か Conbine Chopで
and とか or とか Xorとかできる。
Channel pre opは演算する前に調整できるとこ
Function
色んな有名関数が使える
Angle
弧度法からラジアンとかに変更できる。
Speed
値の変化の速さを得られる。
Hold
下の入力のパルスに合わせて、値を維持する。
Expression
条件分岐ができる。
Expression 0(もっと増やすことができる)
には条件を書ける。
expression 0は channel 0に適用されt
expression 1は channel 1に適用される。(以下同文)
初期値 me.input.Val になっているのでインプットの値がそのまま出てくる
多岐条件分布するには
expressionに条件を書く(書き方が少し特殊)
//ifの返り値 if 条件 else elseの返り値
me.inputVal if me.inputVal >= 0.5 else 0
// or (and)
me.inputVal == 0 or me.inputVal == 1
波形になっているとき、
me.inputs[波形横軸 index][channnel index]で値が撮れる
me.sampleIndex で波形の横軸のindexが得られる。
sampleのindexが偶数の時10,それ以外-1
2 if me.sampleIndex % 10 == 0 else -1
me.chanIndex でチャンネルのインデックが得られる
Limit output Channels が onの時は
Number of Channelsの値だけのチャンネルの数しかoutputが出てこない。
Channnel per Exprの値は expression一つに対して何チャンネルずつ適用させるかが変わる
2チャンネルずつexpressionが適用される
ちなみにチャンネル数を増やすとまた、expression0から適用されていく
Bind
あんまりよくわかってないが、
入力を複数設けられて、
入力の信号が変わったときにそちらの信号が伝わるようになる
Switch CHOP value change ver的な感じだと思われる。
tutorialでは、MIDIのinputとOSCのinputをつなげてどちらかが動いたときに、そっちの入力に切り替わるみたいな使い方をされてた
追記
2023/02/25
bind chopの特徴は大きく2つ
1 : bind chopからexportしてつなげた値がbindのようになる。
2 : bind chopへの複数入力されていてたときに、値が更新された方を採用する。
1 : 例えば、null chopから値をexportして、何かしらのパラメータとつないだとする。
その時繋いだパラメータを動かすとexpressionの関係性が崩れてしまう。
これがbind chopの場合は異なり、
parmaeter同士でbindさせているような感覚でchopとparameterをbindしたような感じで、使える。
2 :
これは以下の公式のbind chopの説明を見た方が早い。
Match byによって、複数入ってきた値をマッチさせるかを決めれる。
channel number or channel nameでできる。
Channel Pickupはbind chopの値が例えば0.94とかになってたする。そのbind chopより前段で動かしている値が0.3とかになっているときに0.94を超える数値が来ない限り、bind chopの値が更新されないようにする機能。
使ってみるとわかりやすい。複数個所でコントロールできるような(midiコンとTouchdesignerのUIとOSCみたいな)環境で構築されているときにパラメーターによっては主導権の奪い合いみたいなことを起こさせたくないときに使うと便利なのかも。
分かりやすい解説は下。
Timeline
タイムラインに同期した、
Frame / Seconds / Absolute Frame / Absolute Second
Rate (FPS) / Start / End / Range Start(RStart) / Range End(REnd)
Signature1 / Signature2 / BPM
Play
を取得することができる。
Reference OperatorにTimelineが設定されているCOMPを指定することでそのTimelineのパラメーターを取得できる。
Timelineについては、下記のCOMPまとめに書いてある。
Perform
再生FPSの表示やその他、時間、CPU / GPU等々のあれこれをパフォーマンスに関わるもの値を得ることができる。
現在のパフォームとしてのframes per seconds (fps)
frame Timer
Cook
Panel
(一つ上の階層の)COMP上で状況が反映される。
クリックしたり、Shift / Alt / Mouse位置などを取り出すことができる
Perform mode時でのことや、親COMPを右クリックして、Viewを出したときに反映をチェックすることができる。
insedeu insidevは view上でのマウス位置を表している。
Componentにpanel系COMPなら指定することができる。
どこのpanel系COMPでもpathを指定すればよい。
/project1/container1
Object
様々な機能があるらしい。
クォータニオンとオイラー角の変換等もできるみたい
Target Objectに 3Dobject系COMPを入れる。
Outputタブの
ComputeをMeasurementsに設定すると、
Position / Rotation / Scale / Quaternion / Bearing / Single Bearing Angle / Distance / Inverse Square Distance
を測ってくれる
Distanceとかは、原点からの距離になっているが、
ObjectタブでReference Objectにオブジェクトを設定すると、TargetとReferenceの距離とかを得られる。
CHOPのチャンネルからも適用することができる。
例として、ObjectからObject CHOPでpositionを出したものを二つ用意して、3つ目のObject CHOPでDistanceを選ぶとそれらの距離を測れる。
sampleの値だとしても
Channelタブのoutput RangeをStart / Endに変えて、
(初期単位がSecondsになっているので注意)
指定すればSampleでoutputされる。
Hog
意図的にCPUサイクルを消費して、遅い、ラグのある環境を作り出してテストすることができる。Slow systemをsimulateできる。
このHog CHOPをどこかに繋ぐというわけでなく、Active を Onにしてすればいいだけ。
DelayでこのCHOPが消費する時間を指定できる。
0.133であれば0.133 sec
Replace
input0の方を基本として出力して、
input1の方に同じチャンネルがあるとき、そちらが優先して出力される。
使用例として、midiのような入力されたものしかチャンネルが存在しないようなchopのときに、midiからの入力と、デフォルトの設定を共存させたいときに有効
この記事が気に入ったらサポートをしてみませんか?