忘れちゃうCHOP達 [TouchDesigner]


覚えておきたい奴のメモ
随時更新
最終更新 : 2023/02/26 09:00

CHOPの概念

Chopにおける値の概念として重要なものをまとめておく。

  • channel

  • (single) value, sample value(配列)


Channel

一つのCHOPに複数の変数を抱えることができる。一見して一般的なプログラミング言語における配列のように感じるが、この後その配列を扱う。
どちらかというとこのチャンネルは変数がたくさん入っている感覚で、オブジェクトや構造体に近い。


single value
sample


(single) valueとsample value(配列)


(single) value

(single) valueはいわゆる値を一つだけ持つようなCHOPの形態
以下は3channel持っている Value

(single) value

(single) valueのCHOPは以下のようOptimized Python Expressionで書きたいときはにopに対して、['channel name']で取得する。

op('contant')['chan1']


sample value(配列)

サンプリングされているCHOP。配列として考えてもおk

sample value

sampleにはsample rate、length,  Amplitude(value)の概念が付き纏う。

sample rateはいわゆるサンプリングレートと呼ばれるもので、
1秒間に何回標本化(sampling)を行うかということになる。デフォルトの各種CHOPでは、me.time.rateとなっており、timelineのFPS設定の値が引き継がれるようになっている。

FPS

Lengthは表示される、扱う、横軸(時間)の長さのことを言っている。
多くのCHOPの場合、lengthを設定できる項目で、単位を選べるsamples, Frames, Secondsで指定できて、
samplesで1だと1 sampleということで、fps分のlengthが設定される。

length
1 sample 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]


Value
単一の値です。CHOPで扱う値の最小単位です。日本語訳すると『値』ですね。

Sample
Valueが連なったものです。
と書きましたが恐らく逆で、Sampleの標本数が1つしかないものがValue、というのがTouchDesigner上の概念のようです。
なのでぱっと見『配列』(Array)のように見えますが、日本語訳としては『標本』が妥当かと思います。

https://qiita.com/ToyoshiMorioka/items/bcc7452fb983885c6742


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のこと

チャンネルのナンバーとネームは、入出力の間で変わりませんが、出力のフレーム・レンジがタイム・スライスになります。: これは、TouchDesignerがcookした前のフレーム+1、から現在のフレームへ進行しています。
例えば、TouchDesignerのFPSが60で、現在のフレームが235で、TouchDesignerがcook、描画した前のフレームが231だった場合、 リアルタイムを保持するには、4フレームスキップしなければなりません。 Time Slice CHOPへの入力は、TouchDesignerが描画する時サンプリングされただけのスライダー値という事になります。 フレーム231と235のスライダー値は持たれます。しかし、フレーム232、233と234のスライダー値はありません。
この例でMethodがLinearに設定された場合、Time Slice CHOPは、フレーム232~235の4-sample CHOPの”time slice”を出力します。232~234フレームの値は、231フレームと235フレームのスライダー値で補間された値になります。

したがって、TouchDesignerがすべてのフレームをcookしなくても、Time Slice CHOPの後にGesture, RecordまたはLag CHOPのような、どんなCHOPであっても、スムーズなデータが入ってきます。

[引用] http://ted-kanakubo.com/touchdesigner-jp/?p=12


Time Slicing is a feature in TouchDesigner that keeps your CHOP channels smooth, even when your overall frame rate goes down and your timeline skips frames. Time Slicing keeps your overall animation smoother and more accurate, and helps keep your audio from popping when your frame rate drops.

[引用] https://derivative.ca/UserGuide/Time_Slicing

TimeSliceがYesになっているCHOPは
本来だと、Start/Endが補完分の長さになっている。

Lag CHOP, Filter CHOP, LFO CHOPなどはTime Slice FlagがYesになっているようなCHOPとなっている。


LFOなどは、cookのgapでもちゃんと生成されている。


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 CHOPOperationFan Inにします。
1つめのChannelに1が入っていると0、2つめのChannelに1が入っていると1、3つめのChannelに1が入っていると2を返します。



Constant

定数の値を生成できる

Snat tab

snap

例えば、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なしに、更新させる。


勝手に更新される。

2番目の入力は、オフセットを一定値に加える事が出来ます。
2番目の入力(アクティブ)が0以上の時、1番目の入力のどの変更でもCHOPの出力に加算されます。
これは、MIDIスライダーボックスのような外部入力デバイスからConstant CHOPの値を調整することに役立ちます。
例えば、マウスまたはMIDIスライダー・ボックスをMouse CHOPまたはMIDI In CHOPで接続することができます。そして、アクティブな入力がオンの状態を保持しつつ、一方で、マウスまたはスライダーを動かしながら、Constant CHOP値を上昇/下降することができます。

http://ted-kanakubo.com/touchdesigner-jp/?p=43


Active Needs Currentについてはちょっとまだ理解できていない。

Active Needs Current current - This is used with the second input as described above, when you want to add a displacement to channels by using external devices or sources.
When Active Needs Current is On, the second CHOP input (the Active input) has an effect only if the Constant CHOP is the current CHOP.
When Active Needs Current is Off, the Constant CHOP is affected any time the Active input is on (greater than 0).
This is used by the Channel Editor when editing keyframes using CHOPs. An input device like a button in the Keyboard In CHOP or a MIDI keyboard can be fed to the Active input of many Constant CHOPs. Only the current CHOP will be affected if this option is On.

DeepL翻訳
Active Needs Current - 外部デバイスやソースを使用してチャンネルに変位を加えたい場合に、上記のように2番目の入力と一緒に使用します。

Active Needs Current が On の場合、Constant CHOP がカレント CHOP のときのみ、2 番目の CHOP 入力 (Active 入力) に効果があります。
Active Needs Current が Off の場合、Constant CHOP は Active 入力が ON(0より大きい)であれば、いつでも影響を受けます。
これは、CHOPを使用してキーフレームを編集するときに、チャンネルエディタで使用されます。Keyboard In CHOPのボタンやMIDIキーボードのような入力デバイスは、多くのConstant CHOPのActive入力に供給することができます。このオプションがOnの場合、現在のCHOPのみが影響を受けます。

https://derivative.ca/UserGuide/Constant_CHOP


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しない。

Time Slice / timeslice
入力のcookごとにスライドしているウィンドウをキャプチャします。 継続的なログのキャプチャに役立ちます。
Only When Input Cooks / inputcooks
入力がcookするときにのみキャプチャします。 長いポーズで区切られた個別のイベントをキャプチャするのに役立ちます。

http://ted-kanakubo.com/touchdesigner-jp/?p=119
trail

ResampleをONにすると、inputのもう一回リサンプリングを行える。
デフォルトでは以下のようになる。
resampleの値に設定したLengthでリサンプルを行なって、
RateをONにすると、デフォルトのグローバルフレームレート($ FPS)(me.time.rate)以外のsample Rateを使ってリサンプリングできる。

デフォルト




Grow Lengthをonにすると、
名前の通り、lengthが成長していって、どんどん時間経過に合わせて長くなっていく




Trim

入力のLengthを分けることができる。
周波数別に分けたいときとか

画像2
画像1


Resample

lengthを変えたいときに使える。

CommonのTime SliceをOffにして、
ResampleのNew Rate New Intervalを選ぶと自由に調整できる。

画像3
画像4



Audio Spectrum

横軸が周波数、縦軸が振幅のスペクトラムに変更できる。



Audio Filter

High pass  / Low pass のフィルターになる
フィルターのカットオフ周波数調整もできる

画像8


Filter

Type別の値と値の補完を行ってくれる

波形(sample)につないじゃうと大変重たくなった

画像9


Delay

時間差を設けれる。

Lag

時間差を設けれる、かつ補完もできる。
比較的動きが滑らかになる

LAg per sampleを押すと波形グラフになる

画像5


Envelope

各サンプルの最大振幅を出力とした包絡線(envelope)を出力する
必ず絶対値になる。

Exponential Decay / expを選ぶと、
前のサンプルのenvelopeより少ないならだんだんと指数関数的に減衰するようにできる。

Local Maximum Window / windowを選ぶと、
envelopeを毎サンプル事ではなくて、Nでエンベロープの個数を分割できる。窓関数的な感覚 width



Commonタブ



Export Method

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を基にした範囲の下の入力配列のインデックスとして、値を返す

配列から値をとれる感覚

画像6
画像7

Splice 

CHOP Aの波形とCHOP Bの波形をつなげる


Analyze

平均値や最大値など代表値を得られる。


S curve

S時のカーブを作りやすいpattern的な奴
対数関数が使える


Limit

値のリミット、上限(Clamp)、繰り返しなどをつけれるのと
Quantize(量子化、縦軸)でround / celing / floor などをつけれる。


Join

二つの入力を横に並べれる。

画像11


3チャンネルとかあれば、
そのチャンネルごとにやってくれる。つまり、channel名ごとにまとめてくれる。




Top to CHOP

CropをFull Imageにすればピクセルごとの値をチャンネルに分けれる

Row and Columnにすれば全ピクセルのrgbaを受け取れる、ピクセルが多すぎると重たすぎる

Shuffle

大量のチャンネルを持っている物とかを
合わせて波形にしたり、
ぐちゃぐちゃにしたりできる。

Sequence Channels by Nameにすれば、チャンネルの名前別に
波形なら横軸別に合わせて一本にできる。

画像10

Sequence Every Nth Channel

N個のチャンネル個に分けて
横に並べる
分け方は、単純に順番にindex順に1/N個までで一区切りに分けていく。


画像15

N Value = 1

画像14

N Value = 3

画像16


Secuence All Samples Nth Channel

例えばなんかの動画ファイルのデータファイルのように、
jsonやxmlみたいなものを想像して、それが毎フレームのデータが入っているときに
毎フレームのxのデータが欲しいみたいなときに
周期的にxのデータがくるときに
xのデータをまとめてsamplesにしたいときに便利





Stretch

波形ではない値を
そのままsample数を増やしたいときにできる。

画像35

Start / Endでsampleの横軸を決めれる。
Unit Valuesで絶対か相対かを決めれて、
Length Scaleの値倍でLengthをつけれる。

画像36
画像37
画像39
画像38


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

色んな有名関数が使える


画像12


Angle

弧度法からラジアンとかに変更できる。


Speed

値の変化の速さを得られる。


Hold

下の入力のパルスに合わせて、値を維持する。

画像13




Expression

条件分岐ができる。

Expression 0(もっと増やすことができる)
には条件を書ける。

expression 0は channel 0に適用されt
expression 1は channel 1に適用される。(以下同文)


初期値 me.input.Val になっているのでインプットの値がそのまま出てくる

画像18
画像17

多岐条件分布するには
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]で値が撮れる

The corresponding input values are me.inputVal in the expressions. me.inputs[1][0] gets from the first channel of the second input.
[引用] https://docs.derivative.ca/Expression_CHOP

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一つに対して何チャンネルずつ適用させるかが変わる

画像20
画像19

2チャンネルずつexpressionが適用される

画像22
画像21

ちなみにチャンネル数を増やすとまた、expression0から適用されていく

画像24
画像23



Bind

あんまりよくわかってないが、

入力を複数設けられて、
入力の信号が変わったときにそちらの信号が伝わるようになる
Switch CHOP value change ver的な感じだと思われる。

画像25

tutorialでは、MIDIのinputとOSCのinputをつなげてどちらかが動いたときに、そっちの入力に切り替わるみたいな使い方をされてた

追記
2023/02/25
bind chopの特徴は大きく2つ
1 : bind chopからexportしてつなげた値がbindのようになる。
2 : bind chopへの複数入力されていてたときに、値が更新された方を採用する。

1 : 例えば、null chopから値をexportして、何かしらのパラメータとつないだとする。
その時繋いだパラメータを動かすとexpressionの関係性が崩れてしまう。


null chopからexportされている。
パラメーターの値を動かすとexportが外れる。

これがbind chopの場合は異なり、
parmaeter同士でbindさせているような感覚でchopとparameterをbindしたような感じで、使える。


bind chopからexportされている。
パラメータの値を動かすとbind chopの値まで更新される。

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のパラメーターを取得できる。

画像29

Timelineについては、下記のCOMPまとめに書いてある。



Perform

再生FPSの表示やその他、時間、CPU / GPU等々のあれこれをパフォーマンスに関わるもの値を得ることができる。

現在のパフォームとしてのframes per seconds (fps)
frame Timer
Cook

画像26


Panel

(一つ上の階層の)COMP上で状況が反映される。
クリックしたり、Shift / Alt / Mouse位置などを取り出すことができる

Perform mode時でのことや、親COMPを右クリックして、Viewを出したときに反映をチェックすることができる。

insedeu insidevは view上でのマウス位置を表している。

画像27

Componentにpanel系COMPなら指定することができる。
どこのpanel系COMPでもpathを指定すればよい。
/project1/container1

画像28



Object

様々な機能があるらしい。

クォータニオンとオイラー角の変換等もできるみたい

Target Objectに 3Dobject系COMPを入れる。

画像30
画像31
画像33


Outputタブの
ComputeをMeasurementsに設定すると、
Position / Rotation / Scale / Quaternion / Bearing / Single Bearing Angle / Distance / Inverse Square Distance
を測ってくれる

Distanceとかは、原点からの距離になっているが、
ObjectタブでReference Objectにオブジェクトを設定すると、TargetとReferenceの距離とかを得られる。

画像33
画像34



CHOPのチャンネルからも適用することができる。
例として、ObjectからObject CHOPでpositionを出したものを二つ用意して、3つ目のObject CHOPでDistanceを選ぶとそれらの距離を測れる。

画像40


sampleの値だとしても
Channelタブのoutput RangeをStart / Endに変えて、
(初期単位がSecondsになっているので注意)
指定すればSampleでoutputされる。

画像43
画像41
画像42






Hog

意図的にCPUサイクルを消費して、遅い、ラグのある環境を作り出してテストすることができる。Slow systemをsimulateできる。
このHog CHOPをどこかに繋ぐというわけでなく、Active を Onにしてすればいいだけ。

DelayでこのCHOPが消費する時間を指定できる。
0.133であれば0.133 sec



Replace

input0の方を基本として出力して、
input1の方に同じチャンネルがあるとき、そちらが優先して出力される。

Length First Input


input1にchannelがあるとき


input1にチャンネルがないとき





使用例として、midiのような入力されたものしかチャンネルが存在しないようなchopのときに、midiからの入力と、デフォルトの設定を共存させたいときに有効



この記事が気に入ったらサポートをしてみませんか?