TD初心者が一日触ったところでUIの素晴らしさについて語る

# はじめに
https://peatix.com/event/327787

12/2 に福岡で行われたTouchDesigner（以下TD）のワークショップ`Touch in Kyushu vol.1`に参加してきたメモ。
内容盛りだくさんのワークショップでレポートみたいに全部書くととっちらかりそうなのと、
ノードベースのプログラミング環境にしては珍しくUIが良いと思ったので、
今回はUI関連の話に限定して、筆者が特にここすげーとか覚えとこうとか思ったもののリストにします。
これからTD始めようとか、一度触ったけどよくわからなくてやめたという人の助けになればと思っています。

わかってる人にはつまらない内容かもしれませんが、うんうんそうだよね、と暖かく見てもらえるとうれしいです。
そんなことできたのか！とひとつでも思ってもらえたらさらにうれしいです。

記事の最後にワークショップ中に書き溜めたメモをそのまま置いておきます。
なんとなく何が行われたのかわかっていただけるかもしれません。

筆者のスキルレベルとしては

- TDは他人の作ったプロジェクトを起動したことがある程度
- openFrameworksとMaxは日常的に仕事で使っている

です。

# 用語
TD流の言葉遣いじゃないかもしれないですがこの記事では以下使います。
TDではどういうのか知っている方は教えてもらえるとうれしいです。
_※末尾のメモではこの限りではありません。フィーリングで読んで下さい。_

|もの|この記事での表記|
|:--|:--|
|オペレーター|OP|
|オペレーターをつなぐ線|ワイヤ|
|オペレーターの入力口|インレット|
|オペレーターの出力口|アウトレット|
|オペレーターの型(TOP,CHOPなど)|カテゴリ|
|型の違うオペレーターの関連付け表示|矢印ワイヤ|
|同じ名前のオペレーターに複数の型がある場合の区別|`TOP/Constant`, `CHOP/Constant`などと書き分ける|

では以下どうぞ。

---

# UIすごい洗練されてるなーって思いました。
ノード系のグラフィックスプログラミング言語はいくつか触りましたが、TD超良かったです。
ちゃんと使う人のことを考えて設計されている感がありますね。
使い込めば不満は出てくるんだろうし現時点で何も不満がないわけじゃないですが、
今のところの感想としては超良いです。

### ちなみによく使うショートカット
- `u` : 上階層へ
- `i` : 下階層へ
- `h` : 俯瞰
- `p` : パラメータウィンドウ（？）表示トグル
- `a` : OPのアクティブ/非アクティブトグル
- `o` : 全体のレイアウト確認
- `F1`/`esc` : Performモード/復帰
- `Shift+L` : 整列
- `Option+左右` : 階層移動のUndo/Redo
- `Option` : 押している間全OPがアクティブになる

## `OP Create Dialog`の出る場所
ダイアログの中央がマウス中央になるように出てきてくれる。
地味ですがうれしいです。

## 操作の仕方によってそれっぽいOP同士を勝手に繋いでくれる
- インレット/アウトレットで右クリックしてOPを作るといきなりワイヤが繋がってる
- ワイヤを右クリックからinsertOPができる
- 間のOPを削除すると両端を繋ぎ直してくれる
- コピペ時もいい感じ
    - A->Bと接続されている場合に両方コピペするとA'->B'も繋がってる
    - BをコピペするとA->B'も繋いでくれる
        - ちなみにAをコピペした場合、例えBのインレットが(`TOP/Comp`みたいに）複数受け入れ可能なものだったとしてもA'->Bは接続されない。

![mouse_op_wire_great.gif](https://qiita-image-store.s3.amazonaws.com/0/16556/580da07a-5149-d0a7-cf09-8a1e633962d4.gif)

## 違うカテゴリのオペレーター同士を繋ぐ操作がちょっと特殊
この仕様は慧眼ですねー。いやほんとに。
なんでも繋げるようにしちゃうと一見便利ですごいツールっぽく見えるけど、ユーザーにとって意味不明な挙動をする原因になったり開発時にもデバッグが大変になったりすると思うんです。
そこをすっぱり切り捨てちゃうのは良い判断だなと思います。

パラメータウィンドウにドロップだったりOPをOPにドロップだったりいろんな操作があるのはちょっと戸惑いポイントですが・・・。

## ワイヤの表示のこまやかさ
いまそのワイヤをデータが流れているかどうかがワイヤのアニメーションでわかる。
矢印ワイヤも同様。
上が流れてて下が流れてない。
![wire_stream_or_not.gif](https://qiita-image-store.s3.amazonaws.com/0/16556/0bef75ec-0054-0985-51b6-349ac378ca81.gif)

それと、地味ですが矢印ワイヤがちゃんとマウスで操作できなそうに見えるのもポイントですね。
普通のワイヤと違ってモノクロで直線なのでそう見えるのかな？
<img width="634" alt="wire_types.png" src="https://qiita-image-store.s3.amazonaws.com/0/16556/2a573154-ab02-9d59-4134-5f0128c7079f.png">

## ファイル指定系のOPがデフォルトで何か読み込んでる
`TOP/Movie File In`とか`CHOP/Audio File In`とか。さっと試したいときに超便利でした。
動作を確認したいだけなのにOPを作るたびに毎回`Load File...`みたいなダイアログ開かなくても良いのはでかい。
![default_fileload.gif](https://qiita-image-store.s3.amazonaws.com/0/16556/a95d8705-1a20-a16f-2699-e1d839e6f8c5.gif)

## 中ボタンドラッグで値の編集
パラメータウィンドウ（OP選択中にpキーで出るやつ）の中の数値をマウスで編集できる。
例えば`CHOP/Constant`のvalueの上で中ボタンを押して左右にドラッグすると変化する。
そしてこれがすごいと思ったんですけど、上下ドラッグで動かす値のスケールが変えられます。
類似のUIを見たことがないんですがこの方式ってポピュラー？
![parameter_center_button_edit.gif](https://qiita-image-store.s3.amazonaws.com/0/16556/14f7639e-60a7-8d71-b0b6-842680441863.gif)

## Displayフラグで結果を確認しながら編集できる
各OP右下の青い丸いやつを押すと背景にそのOPの出力が表示される。
複数選択するといい感じに敷き詰めて出してくれる。
ありがたい。
![preview_back.gif](https://qiita-image-store.s3.amazonaws.com/0/16556/c4309ebd-dfff-d433-b08a-9fcfe12076a9.gif)

フラグ立てても出るやつと出ないやつとあるんだけど何が違いなのかまだわかってない・・。

## `o`で出るやつ
`o`キーを押すと左下に今いるネットワーク全体の簡略図みたいなものが出てきます。
マウス操作もできてすばらしい。
![overview_pane.gif](https://qiita-image-store.s3.amazonaws.com/0/16556/6d4cf274-7cd3-c2c4-7f25-7289aae817f2.gif)

## 負荷チェックがお手軽
PaletteにあるTools->probeを使うとネットワーク全体の負荷チェックができる。
どの部分が高負荷かがわかるのでチューニングに役立ちそう。
![probe.gif](https://qiita-image-store.s3.amazonaws.com/0/16556/9b5a58a8-e84c-9c92-5e19-f02cd2d41dfb.gif)

---

# ここがいまひとつ
全体的にUI素晴らしいんですが、これができればいいのに！ここが改善されればいいのに！というポイントもあるにはあります。
以下挙げていきます。
既にできるものがあったら是非教えてください。

## トラックパッドでの中ボタン操作
ワークショップでは3ボタンマウスを使っていて、帰ってからトラックパッドで触ってみたんですが意外と不自由なく使えました。
~~しかし、中ボタンがないので中ボタンクリックを使う機能が使えないですね。
OPの情報を見たり、パラメータウィンドウで値の編集をしたり。
これらができればマウスいらなくなる気がするのでなんとかなれば良いなあ・・・。~~

※ありました。`Preferences->General`に`Use Alt+Right-Click alternative for Middle-Click`がありました。最高です。

## 範囲を指定してのビュー移動
`h`キーでの俯瞰視点移動はとても便利なんですが、ネットワーク内の特定の範囲だけ拡大表示したい場面がありますよね。
これができる機能がキーボードショートカットに欲しいですね。
例えば複数OPを選択した状態で`h`キー（もう一度押すと俯瞰へ）とか、`h`キー押しながら右ドラッグとか？

## インレットから複数アウトレットに接続
例えばMaxだとワイヤをつなぐ際にShiftを押しっぱなしにしていると、ポチポチ連続でアウトレットを選択できるんですが、これができると良いですね。

## キーボード操作の充実
グラフィカルなツールなんでしょうがないのかもしれませんが、基本的な操作にマウスやトラックボール、タッチパネルといったポインティングデバイスが要ります。
しかしスクリーンがどんどん広くなっていっている昨今、ポインティングデバイスが必須というのは根本的に辛い仕様に思えます。
キーボードから手を離さずに以下のことができるとものすごく快適になるなーと思いました。

### キーボードのみでOP生成
`Tab`キーで`OP Create Dialog`を開き、さらに`Tab`でカテゴリを選択し、キーボード入力で絞込検索。
ここまでは完璧で快適なんですが、その後OPを選択して生成するところがマウス必須ですね？
これが例えばアローキーで選択してエンターキーで生成などできると良いですよね。

### キーボードのみでワイヤ接続
OPが多くなってくると、全体を見渡せるスケールでのマウス作業が辛くなってきますよね。
ズームインとアウトを繰り返すのも無駄が多いので視点を変えずに選択的に編集できる手段が欲しいです。

## パラメータウィンドウを移動
これができないのは端的に辛い

## 複数ウィンドウでPerformモード
UIの話ではないんですが・・・。
現段階でもモニタをまたいでのフルスクリーンはできるようですが、複数のCOMP/Windowにそれぞれ座標と大きさを指定してPerformモードができると大規模プロジェクションマッピングマンには嬉しいのではないでしょうか。
どうせ負荷高くなるからダメよってことかな。

## バージョン管理
UIの話ではないんですが・・・。
手動でセーブするたびにナンバリングされたtoeファイルができるんですが、これ保存が手癖になってると辛い仕様ですね。。。
<img width="195" alt="versions.png" src="https://qiita-image-store.s3.amazonaws.com/0/16556/eba1994e-b6b4-a0f5-f818-3a898f8ee041.png">

いちおう`Preferences->General->Increment Filename on Save`でBackupフォルダに保存するよう設定できるようですね。
gitと併用したい場合はBackupフォルダをgitignoreしておくのが良いのですかね？
それでも最新のナンバリングファイルは親フォルダに残るんだよなあ・・・。
うちはこうやってるよ！っていう手法があったら知りたいです。

---

# 以下はワークショップ時に書いていたほぼ時系列のメモです
最新版のインストール 15240

事例・プロジェクトの紹介。

TDを勉強するにはここ！
https://www.derivative.ca/Archive.asp
https://www.derivative.ca/Blog/
https://www.facebook.com/groups/437766143072915/
https://qiita.com/advent-calendar/2017/touchdesigner

参加者の自己紹介
デザイン系の教員
グラフィック系の教員
クリエイティブコーダー
CG制作会社
音楽やってる学生
イベント企画制作

経験者と初心者に分かれてレクチャー。
経験者はベンさんに直接聞きながら。
初心者は松波さんから。

初心者コースにいきました。

Windowsはデバイスに強い
Macはオーディオに強い

おすすめはトラックボール

i,u,h,p
オペレーター
左ダブル/Tab

Tabでカテゴリ移動、キーボードで検索

COMP -> 環境？
3D -> 3D環境
Panel -> UI
Other -> Other

TOP -> TextureOperator
グレーアウトは使えない
濃い色がソースになり得るもの
絞込み検索できる

op出口で右クリックするとお手軽
線の上で右クリックするとお手軽

opのサイズ変更をくりっくで適当なサイズにしてくれる

OPにバツが出てるときは中ボタンで　内容を確認

CHOP -> チャンネルOP
センサー、オーディオ、ネットワーク
constant -> 変数
math/range -> 範囲を変える

同じカテゴリのOP同士はつなぐことができる

SOP -> Surface OP
3D系のオブジェクト
box プラス押してマウスでぐりぐりできる
右クリックからモデルジオメトリ
頂点インデックスとか情報が見られる

MAT -> マテリアル

DAT -> データ？

3Dちょっとレンダリングしてみる

Camera, Geometry, Light, Renderを置くと勝手につながる
Renderのpウィンドウでどれを使うか選択できる

geoの中身消して作り直すと、戻ると消えてる
RenderとDisplayのフラグをオンにする必要がある

geoの中に作る方法と、作ってからCOMPのGeoでgeoにする方法がある

geoにMATをつなぐときは左クリックで乗せるか
geoのpウィンドウのRenderにドラッグもしくは指定する

背景に色を付ける
TOP/Constant
解像度をあわせてoverにつなぐ
CompositeでOperationをoverにするのと一緒。こっちを使う
レイヤーの順序を変えられるし、入力いくつも扱えるし、演算変えられるし。

お作法としてoutを繋いでおく

mouseInでマウス入力が取れる

compでサイズの違うやつを扱うときはPウィンドウでTransform/Pre-Fit Overlayを操作

mouseInからMath->nullでCHOP EXPORTでcompのTransformをコントロール

mouseIn が動かない！
Mutekでも60人中2,3人あったらしい
プログラマへバグレポしてもらう
その後アプリ再起動でなおったっぽい？いつの間にか正常に動いてた。

対処法
COMP->ContainerをPanelにつなぐ(ContainerをPanelのPウィンドウにドロップ)
Panelでinsideu insidevを受けてtx tyで出す


サブパッチ作れるよ
右クリックから保存

performモード
最終バージョンでは無駄なくしたい
複数ウィンドウあるとつらいのでひとつにす

performというCOMP->Windowがトップにある
pウィンドウで選択したopをフルスクリーン表示できる
TOP,CHOPが選べるけど、Containerを選んだほうがサイズ調整が柔軟で良い
NON Comercialだと1280x720サイズしかレンダリングできないけど、拡大で良ければこの方法でアウトプットはできる

左上のアイコンクリックか、F1(Fn+F1)でperfomeモード
escで復帰

DAT/Monitorが便利

monitor選ぶとどのモニタでフルスクリーンするか選べる
枠線を消すにはBorder

事前にモニタサイズがわからない場合
FillLocationを選ぶと良い
DPIレートとかRetinaモードとか注意

インスタレーションではCursorVisible使おう
WhenMoving!!!

メニューDialog/Window Placement
チェックStart in Perform Mode

複数画面を使いたい場合、全ウィンドウにまたがるようなサイズのContainerを作って
All Monitorsを選ぶ
サイズ変更時、数値入力時に演算できるよ

Containerのワイヤーは下から上

２つのContainerをContainerに繋いで片方のオフセットを動かす方法もあるけど
ContainerのChildrenタブで動かすこともできる。こっちが良い。

3Dを2DにレンダリングしてからWindowに当てると、3Dのカメラ操作とかが失われてちょっと辛い。
3Dのままなら、Containerにコンポジットしてもインタラクティブなまんま

いままでのフルスクリーン話はHigh Sierraだとできるけどそれ以前はちょっと方法が違う

モニタ毎にWindowCOMPを用意する

CHOP/performにスクリプトを書いて設定する
op('window1').par.winopen.pulse()


opの切り替え/ルーティング
切り替えたい奴らの子にswitchをつなぐ

切り替えの方法としてButtonをExportしてドカーン

exportの仕方は、D&Dの他にも
つなぐ先のpウィンドウでexpressionを手打ちする方法もある
op('null5')['chan1']

オーディオヴィジュアルやります！
AudioFileIn->Select -> CHOP to
CHOP to にSOP/Lineをつなげて合成
COMP/GeometryにしてMAT/constantで色つけ
CamとLightを作ってレンダリング
compからfeedback->blur->levelで

負荷チェックはPalette/toolsからProbeを作る
F2でPerformanceMonitorも良い下のAnalyzeボタンを押す

Dialog/Textport and DATからpythonが打てる
DAT/Textをアクティブにしてpythonが打てる
非アクティブで右クリック->RunScriptで実行
実行結果はTextportで確認できる

opのパラメータにスクリプトからアクセスしたいばあい、
pウィンドウの望みのパラメータの上で右クリック->Copy Parameter
使いたいところでPasteすれば良い。普通にテキストでペーストはできないので、どこか適当なConstantとかにReferenceとしてペーストしてから改めてテキストをコピーすると良い


オーディオ信号はどんなデータなの？
マルチサンプルデータ。長さを持った値。
CHOP/Constantもpウィンドウでマルチサンプルにすることができる

Palette/AudioAnalysisがすごいぞ

パーティクルはPaletteのGpuParticlesで行ける
SOPにメッシュを突っ込めばエミットする場所を変えられる


中ボタンでValueを動かせるぞ！

Help/OperatorSnippetsが便利