[TouchDesigner]SceneChangerで複数人開発やシーン管理を行う[MUTEK.JP Digi Lab WS]


# はじめに

UT-Virtualアドカレ20日目に投稿させていただきます。
[UT-Virtual](http://utvirtual.tech/)の誕生とともに生きてきて、（修士も)3年目になった[@theruleisobeyed](https://twitter.com/theruleisobeyed)です。

先日の[MUTEK.JP Digi Lab / Derivative TouchDesigner Workshop](https://www.eventbrite.com/e/mutekjp-digi-lab-derivative-touchdesigner-workshop-tickets-83582650959#)に参加してきました。本ワークショップはオーディオ関連のTips紹介、SceneChangerの紹介及びAbletonLiveとの連携(TDAbleton)の紹介を踏まえて、実際にチームで個々のPC上で作ったTDAbletonを利用したオーディオリアクティブな表現を一台のPCのTouchDesigner上でSceneChangerを利用してマージすることを試すといった流れでした。

# SceneChangerについて
本稿では先のワークショップで紹介のあったSceneChangerについてまとめていきます。Derivative開発チームのJarrettさんが制作された本システムは、まだ現時点ではPalette Browser内には無いですが、いずれ追加される予定の汎用システムです。
[Derivative Forum: Bare Bones Scene Change Show System](https://forum.derivative.ca/t/bare-bones-scene-change-show-system/12152)
サンプルファイルとしては上記記事内からダウンロード可能なSceneChanger.toeを利用しています(2019版以降の新機能であるBindを利用して簡単に参照が外れない強固なシステムにしている関係で、古いTouchDesignerでは動かないようですのでご注意ください)。

TouchDesignerはコンポーネントの切り替えがしにくく、そういったフォーラムへ寄せられる数多くの質問への回答として本システムは開発されました。
> This system is optimized in the sense that if you keep your scene component contained with a single TOP output, this system will properly shut down scenes that are not displayed.

メリットとしては実行しているシーン以外のcookを切るため、シーン数をいくら増やしても一つのシーンの処理しか行わないため、全体のシステムの処理が重くならないことが挙げられます（フェードインフェードアウトをする場合、二つのシーンが同時に描画されてしまうのは避けられないですが）。



##プロジェクト全体の構成

全体の構成(/project1/exampleShow)はこのようになっています。
![2019-12-20_14h32_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/9449d618-ccbd-a52c-f8d0-2eab4573f4e6.png)

- scenesCOMP:各シーンで実行したい各ビジュアルコンテンツをテンプレート内に格納し、配置します。
- showCOMP:各シーンのLoading・Blending・Fadingを司ります。pythonスクリプトのShowExtクラスにてシーンの変更に関する関数が定義されており、SettingsタブからFireScenesのPulseをクリックするか、定義された関数を実行することで各シーン間をその通りに移行します（後述）。


## scenesCOMPについて

![2019-12-20_14h52_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/35362159-fd9f-d86f-0533-0926f03a1f18.png)
scenesCOMP内には、このように各シーンで実行したい各ビジュアルコンテンツをテンプレートとなるCOMPに格納して配置されています。

### 各シーンの設定とワークフロー
(/project1/exampleShow/scenes)内の各シーンのCOMPにはComponent Editorより設定がされています。
> The fade In Out time can be defined on the scene comps themselves or locally on the show component parameters.

これにより、各コンポーネント単位でもフェードイン・フェードアウトの設定が可能です。
![2019-12-20_14h53_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/c261186c-6c55-a570-33a8-7f20c492efca.png)

また、このように既にシーンの雛型が設計されているので、実際に複数人で分業で各シーンを製作していく際にはscene0COMPをtoxファイルとして書き出して共有して、出力したいビジュアルをCOMP内のout TOPに接続してもらい、再度そのtoxをこの(/project1/exampleShow/scenes)へ配置して名前をscene1など連番になるようにリネームするワークフローになります。
![2019-12-20_14h54_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/ccb203c2-5795-f1fc-fb92-689ecfac2803.png)

Parent Shortcutが活用されており、複数人で各シーンを担当して開発を行う場合にも強固なシステムになっています。
Parent Shortcutについては私のこちらの記事をご覧ください。
[[TouchDesigner]Parent Shortcutを活用して強固なシステムを作る](https://qiita.com/ktkt40208/items/8fd7343218d06761d432)

### 処理の最適化
各シーンが実行時のみcookされていることを各シーンのCOMP上確認してみてください。COMPのプレビューはすべて切っておき、COMPから何もコンポーネントが接続されていなければ、cookが停止しているはずです。
![2019-12-12_15h44_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/293c68c1-54b2-f409-2e33-7fe45b80adb7.png)
まれに、COMP内部で特別な処理が走ってしまっている場合にcookが止まらない場合がありますが、その際はその原因をPaletteのProbeを利用して突き止め、最適化していきましょう。
![2019-12-12_15h51_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/f322fa31-9b33-6f79-cf64-a32e28e3cd93.png)


## showCOMPについて
![2019-12-20_14h31_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/5e7aef81-8091-dd68-d5c5-0ecbc6c85b72.png)
showCOMP内には、このように各シーンを切り替える際の設定に関するスクリプトや利用するシーンの設定をするテキストDATが格納して配置されています。

### 使用するシーンとその順番の定義

ShowCOMPのView Scene IndexをPulseすることで現在設定されているシーンの順番のindexと名前が確認できます。
![2019-12-20_17h27_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/5625f338-ad62-d172-b2f7-0b6cb8134f68.png)
これは、SceneIndexの内部のsceneIndexDATを参照しており、デフォルトだと自動で(/project1/exampleShow/scenes)の全シーンCOMPを数字の順番に登録してくれていますが、自分でtableDATを作成して使用するシーンを選び
並び替えることも可能です。
![2019-12-20_18h11_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/6942929e-0816-ae0f-59d1-2afb0bba9b91.png)


### シーンの切り替え
ShowCOMPのNext SceneとFade Timeを設定し、Fire SceceをPulseする方法と、スクリプトから実行するパターンがあります。
![2019-12-20_15h44_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/4a8d7e6f-102f-6ab3-6a45-7fdeea85c4b7.png)
ShowCOMPを見ると、内部にExtentionが登録されていることが分かります。
![2019-12-12_15h23_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/8ac36d76-ed68-0666-5cd7-643eda0e1c3f.png)
(/project1/exampleShow/show)を見ると、pythonスクリプトのShowExtクラスにてシーンの変更に関する関数が定義されていることが確認できます。
![2019-12-20_14h48_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/f0d3375b-418d-82f1-02ad-0510f602d70e.png)

スクリプトはscenesCOMPやshowCOMPと同階層(/project1/exampleShow)に配置して実行します（[一番最初の図](#プロジェクト全体の構成)を参照）。

## 実際に複数人開発のワークフローで使ってみた

実際にワークショップではこの仕組みをTDAbletonを利用してAbeltonLiveと組み合わせてオーディオビジュアルパフォーマンスをしてみるところまでトライしました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">TouchDesignerワークショップ2日目、、TouchDesigner↔AbletonLive連携(TDAbleton)を使ってグループでオーディオリアクティブな映像制作。SceneCahngerを利用して複数人での制作の成果を一つに統合していき(使わないシーンはcookしない)、Abletonのシーンと同期させる。<a href="https://twitter.com/hashtag/mutekjp2019?src=hash&amp;ref_src=twsrc%5Etfw">#mutekjp2019</a> <a href="https://twitter.com/hashtag/ToichDesigner?src=hash&amp;ref_src=twsrc%5Etfw">#ToichDesigner</a> <a href="https://t.co/BexlZk0Hk7">pic.twitter.com/BexlZk0Hk7</a></p>&mdash; Kota Isobe (@theruleisobeyed) <a href="https://twitter.com/theruleisobeyed/status/1205427263920996354?ref_src=twsrc%5Etfw">December 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

TDAbletonについてはこちらの記事をご覧ください。
[TouchDesigner document: TDAbleton](https://docs.derivative.ca/TDAbleton)
[TDAbletonを使ったTouchDesignerとAbleton Liveの連携方法](https://qiita.com/ToyoshiMorioka/items/9d26115c56872c9658c6)

TDAbletonコンポーネントなど全体に掛かるコンポーネントはscenesCOMPやshowCOMPと同階層(/project1/exampleShow)に配置します。

### 所感
実際にチームで先のワークフローに従ってやってみて感じたことは、TDAbleton COMPが各シーンのテンプレートに入ってしまっていたtoxがあり、その参照を(/project1/exampleShow)のTDAbleton内からの参照に置き換える作業が発生したことと、AbletonLiveのトラックに対して各人がAbleton上でTouchDesignerのコレクションの中からオーディオエフェクトとして割り当てた編集内容のマージがやや厄介だった点、各人のPCスペックを確認してコンテンツ制作に取り組むべきだった（GTX2070ノート上で作ったパーティクルがGTX1070ノート上ではFPSガタ落ちるなど）こと以外は、TouchDesigner上でのプロジェクトのマージは非常にスムーズにいき、参照の崩壊もなく実演までできました。

## 最後に
以上がSceneChangerの解説と実際に複数人開発のワークフローで使ってみた所感になります。

Thanks a lot for Ben from Derivative to run such an amazing workshop in Tokyo!