TouchDesignerを起動した瞬間にあれこれ

最近、発信したり記録に残すって大切だなと思い、Qiitaで記事を書いてみることにしました。
まだまだTouchDesignerは始めたばかりですがよろしくお願いします。

さて、toeファイルを起動した瞬間になんか処理したい時ってないですかね？
そんな時の小ネタ備忘録になります。

## **Extension Code**
COMPの機能としてExtension Codeというものがあり、Componentを拡張できます。
これを使っていろいろ試してみます。

詳しい解説はおなじみMatthewさんの[TouchDesigner | Understanding Extensions](https://matthewragan.com/2015/07/05/touchdesigner-understanding-extensions/)に載ってるので興味がある人はこちらをどうぞ！

まずは基本的な操作。
Base COMPの上で、右クリックしてCustomize Componentを選択します。

<img width="934" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/73f5abaf-98c4-562f-06f8-32d503a4fe51.png">

するとComponent Editorが出てきます。ここでParameterの追加やTagの変更ができるのですが、今回はExtension Codeのタブの左にある三角を押して開きます。

<img width="1163" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/4d4088ea-3012-3c1e-087d-c49167cc17cb.png">

このbase1のCOMPにExtClassというクラスを追加していきます。ExtClassと入力してAddを押します。

<img width="400" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/d0c138c3-69da-fb10-22e1-26a63a3661b4.png">

するとExtClassが追加され、編集できるようになります。

<img width="400" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/25783ccd-bb07-c59b-e17d-9b9afcf46864.png">

Editを押すとText Editが立ち上がります。

<img width="591" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/9e3b86db-3eb2-04d4-fe31-39edc26b96ba.png">

色々書いてありますが、一旦無視して↑のExtClass descriptionとコメントアウトしてあるところにExtClassのFunctionを追加していきます。

```python3
class ExtClass:
    	
	def passThrough(self, x):
		return x

	def double(self, x):
		return 2 * x
```

そのまま受け流すものと、2倍して返すFunctionを定義します。保存してNetworkEditorに戻り、EditボタンのとなりにあるInitボタンを押します。

Geometry COMPを出して、確認してみます。
Translateのパラメータに`op('base1').ext.ExtClass.passThrough(1.5)`や`op('base1').ext.ExtClass.double(1.5)`と入力してみると

<img width="1089" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/bb6f310e-02be-9b13-7941-2bffd5106ca8.png">

`op('base1').ext.ExtClass.double(1.5)`の方は引数の2倍の値が返ってきてgeo1が移動してますね！

もちろんCHOPの値を読み出すといったことも可能です。Lfo CHOPの値をbase内のnullに格納して

`/project1`
<img width="787" alt="7.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/609b5117-3fa3-61d2-cbc3-5210f8642b49.png">

`/project1/base1`
<img width="954" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/af30d796-c808-4d8c-9dcb-f31aa80cff75.png">

ExtClassに以下を追記すると

```python3
class ExtClass:
    	
	def wave(self, x):
		y = op('null1')['chan1']
		return x * y 
```

<img width="1221" alt="9.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/cfeec011-2341-896d-6197-118270bc1921.png">

lfoの値によってgeo1が動きますね！
## **0フレーム目に乱数を出す**
前段が長くなってしまいましたが、今回はtoeファイルを起動して0フレーム目に乱数を出してみます。
先ほどの要領でBase COMPのExtension Codeを作り、乱数を生成します。

```python3
import random

class ExtClass:

	def Setup(self):
		frame = absTime.frame;
		rand = random.randint(1, 10)
		text = 'Frame : ' + str(frame) + ' Number : ' + str(rand) 
		print(text)
	
		return
```

Excute DATの`onStart()`で起動時に呼び出します。（ちゃんと書くと`op('base1').ext.ExtClass.Setup()`ですかね）

<img width="839" alt="10.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/c9f4058e-e6a6-8a67-b9d2-6ebde08f6f80.png">

この状態でtoeファイルを起動してみると

<img width="1408" alt="11.png" src="https://qiita-image-store.s3.amazonaws.com/0/102231/d04ff42e-7b12-1b13-ae20-dd0028ca2a53.png">

0フレーム目に乱数が生成できました！

## **おわりに**
初めて自分で記事を書いてみて、すばらしい先輩方へのリスペクトがより深まりました。
もっとこうした方がいいんじゃない？などご指摘ありましたらありがたいです！！

## **余談**

TouchdesignerはDAT系のオペレーターでPythonによる処理も可能ですが、処理速度を気にする場合、Extensionsを利用するのがベターのようです。とはいえ基本はCHOPで頑張るのがセオリーですかね？

詳細は[公式wiki](https://www.derivative.ca/wiki099/index.php?title=Extensions#Promoting_Extensions)へ。よきTouchDesignerライフを！