##はじめに
Qiita初投稿になります。
この記事はTouchDesignerにおけるDATの使用時に便利だったこと気づいたことなどのまとめです。
今年の夏、お仕事でTouchDesignerを使ってみました。
ジェネ!画作り!ではなく動画再生の地味な制御処理の実装でしたが、とても学びある案件だったのでメモがてら、参考になるものになれば幸いです。
追記20191208
キャプチャ動画と補足を付けて自身のページで同等の内容を記載しました!
キャプチャ見たほうがわかりやすいという方は、そちらもご参考いただけると。
https://shugohirao.com/blog/654
また先日とある大学で行われた制作展のサポートをさせていただき、学生さんにTouchDesignerなどを教える機会がありました。
今後もそういった機会が増えるため、入門者初心者にもなるたけすげーわかりやすく書けるよう努力します、、!!
ここはこういうやり方あるよ、このほうがいいよ、など引っかかることがあれば気軽に教えていただければ幸いです、、!
ではでは以下、本題です。
DATにまつわる話
CSVの読み込み
FileInDATでcsvファイルなどの読み込みができます。(いくらか前は対応してなかったぽいです。)
FileInDATのRefreshトグルをオンにしておくと、読み込み元のファイルの変更を保存ごとに随時反映してくれます。
ちなみにcsvファイルをドラッグアンドドロップすると自動でTableDATに変換して読み込みができます。が、Tableとして読み込まれるためcsvファイルの変更は反映されません。
※FileInでcsvを読み込む際、csvファイルの最終行が読み込まれない場合があるので注意です。
とりあえずcsvファイルを用意する場合は、最終行に空行を追加するなどするのがよいかもです。
5行目の空行がないと@hello,he,hello
の行を読み込んでくれません。の図
日本語ファイルの読み込み
日本語を含むcsvファイル(ツイートデータ、歌詞データなど)をTouchDesingerに取り込むときにぶつかる問題です。
TouchDesignerではTextに直接日本語を入力したりはできますが、csvなどファイルから読み込んだときにはエンコードの関係で文字化けしてしまいます。
正しく取り込むためにはPythoのスクリプトを書いてutf8として指定して読み込む必要があります。
以下はそんなスクリプトの一例です。
# loadJapaneseFile - Example
import csv
table = op('loadedCSV')
table.clear()
path = project.folder +'/'+ me.parent().par.Csvfile
with open(path, encoding='utf8') as f:
data = csv.reader(f)
cn = len(next(data))
rn = len(list(data))+1
table.setSize(rn,cn)
with open(path, encoding='utf8') as f:
data = csv.reader(f)
r=0
for row in data:
c=0
for col in row:
print( col )
table[r,c] = col.strip()
c+=1
r+=1
上記のスクリプトでは、一度テーブルをリセットして、csvの数だけセル(空白)を作った後、再度読み込んだcsvの値をセットしています。
なんかいろいろ試した際に思うように行かず、取り急ぎ実装した一例なので、あまり効率的でないかも。。いやゼッタイへん。
よりよい実装わかりしだい更新しますね。
指定フォルダ内の動画を再生する
Palleteの中にmoviePlaylistなんてものもありますが。。もっとシンプルでいいんだって時。
FolderDATで、フォルダ内のファイルリストを取得できます。
この際、拡張子の指定や、サブフォルダ(子フォルダ)の中身も参照するかどうかなど、簡単にプロパティから指定できます。
####日付順にソート
最新の動画を取得したいなどの要望を叶えるため、
FolderDATで取得したリストを日付順だったり更新順に並べ替えたいという場合があります。
並べ替えたい時はSortDATというものがあるのですが、基本的には数値順かアルファベット順のみです。Dateを表示させると「Fri Dec 6~」みたいな表示でうまく並べ替えできない場合があります。このためDateをEpochというフォーマットに置き換えソートを掛けます。
またSortDATにはランダムに並べ替える機能もあり、Seedの値を変更することでランダムな並びを変更できます。
いわゆる配列のシャッフルのように使えるので便利です。
ついでにSort後、再度日付に変換するtoxを作っていたのですが、、ファイル行方不明のため後ほどアップしておきます。。
###TextDAT
Pythonのスクリプトを書き込んで実行することができます。
その他、メモ書きのように利用することもできます。プログラミング言語で言うコメントの役割ですね。
####スクリプトを書く
オペレータをアクティブ状態にするとスクリプトを書くことができます。
書き込んだスクリプトはTextDATを右クリック>Run
、またはCtrl (Cmd)+R
で実行できます。(アクティブ状態で選択しているとき、つまりオペレータに直接入力可能な状態の場合はスクリプトの実行ができません!)
その他、他のスクリプト内から、op('text1').run()
のようにオペレータを指定してrun()とすることでスクリプトを実行することができます。
そんでから、実行結果はTextportというウィンドウで確認することができます。
ツールバー>Dialogs>Textport and DATs
、またはAlt (option)+T
でウィンドウを開くことができます。
####関数ごとにTextを作る
Execute系のオペレータから実行するとき、直接その中に書くと、デバッグしづらいことがあります。
たとえばChopの0,1(OFF,ON)をフラグとして関数を実行する場合、「Chopの値をもとにDATのTextで書いたスクリプトを実行したい」ので、ChopExcuteを使用することになるかと思います。
このとき直接ChopExecuteの中に処理のスクリプトを書いてもいいのですが、ChopExecuteを選択してCtrl+RとしてもonOffToOn()というイベント関数になっているので実行されません。
作業中は任意のタイミングで処理を実行させたい場合が往々にしてあると思います。そんなときのために処理のスクリプトは別のTextDATにわけて書くと後々融通がききやすいです。
後々知りましたが、このことは、かの先生も自身のサイトで述べられていたので、真理なんだと思います。
また関数をひとつのTextDATに書いた際、
print(me) #とか
print('---'+me.name+'---') #とか
などを追加しておけばスクリプトの実行順が追いやすいのでデバッグしやすいかもです。
その他ちょっとしたスクリプトTips
- オペレータのpulseパラメータをスクリプトから叩く
たとえばMovieFileInのCuepulsewを叩く時
op('moviefilein1').par.cuepulse.pulse()
- ButtonCOMPをスクリプトからクリックする。
op('button1')click()
-
EvaluateDATのExpressionでスクリプトの簡易チェック
単純に値をとってくるときなどに意外と便利かもです。 -
TD高速化Tips
op('lfo1')['chan1'] よりも op('lfo1')[0] のほうが処理速度は早い(らしい)
名前指定よりindex指定のほうが早いという話。詳しく試してはないですが、なんとなくそんな感じはします。
D&Dで参照したときは名前指定になるのがデフォルトなようです。
初Qiitaなのでおまけ
はじめてなのでちょっとうかれています。
####オペレータに色を付ける。
自作のtoxなどのオペレータに色を付けたい。調べてもパッと出てこなかったけど、何かのチュートリアル動画を見ていたときにしれっと色をつけているのを見てやり方を知りました。
- Cキーを押してカラーパレットを表示
- 色を付けたいオペレーターを選択してカラーパレットから色を選択
自作toxのロードについて
いい感じのオペレータ群ができたら、オペレータ群をまるっと選択>右クリック>CollapseSelected
でひとつのコンテナにまとめる。
このコンテナをtoxとして利用するため、Save Component .tox
でtoxファイルに書き出すのですが、このときのもとの自作コンテナは自動ではtoxファイルを参照していることにはなりません。
CommonでExternal.toxを指定でき、これを指定することで初めて、toxファイルを参照して利用することができます。
Reload .tox on Start
で起動時にtoxファイルを読み込んできますが、作業中にtoxを編集して再度読み直す場合は、Common>Re-Init
が便利です。
また初期値として、ReloadCustomParametersがONになっています。このため、toxを使いまわしそれぞれパラメータを調整しても、ここがONのままだと次回起動時に元になっているtoxファイルの値が入ってしまい、調整が水の泡になってしまいます。適宜OFFにするなど注意してください!
ちなみに、Built-inのパラメータはOP.par.cuepulse
のようにパラメータ名がオール小文字ですが、カスタムパラメータはOP.par.Customparameter
とParameter名の1文字目のみが必ず大文字になります。
標準パラメータとカスタマイズの干渉を防ぐためだったりすると思うのですが、
そんな些細なことになんとなく気がついていたおかげで僕は何度か幸せになることがありました。
##おわりに
DATまわりの知見というか基礎的なところから些細なTipsを書かせていただきました。
なにかひとつでも役に立つものがあれば幸いです。
TouchDesignerはリアルタイム映像ジェネレータとしてとても優秀なソフトでVJ方面での利用が目立つ印象ですが、その一方で、データの管理など裏方処理がバチボコ楽、シリアル通信がバチボコ楽など、
プログラミングしたことないけど何か作りたい学生 にも"うってつけ"だと制作展のサポートで思いました。
(のちのちはプログラミングなどにも興味持ってもらいたいですけど)
今後もちょろりちょろり書いていきたいです。
- ドングルまわりの話(みんなどうしてるんですか?)
- Instantiateの話
- MovieFileInの話
引き続き、TouchDesigner Advent Calendar 2019 楽しみにしております。
よろしくどうぞ。