[TouchDesigner] DATまわりの話

はじめに

# TouchDesigner Advent Calendar 2019

この記事はQiitaに投稿した記事の動画補足つきVerです。

また先日とある大学で行われた制作展のサポートをさせていただき、学生さんにTouchDesignerなどを教える機会がありました。
今後もそういった機会が増えるため、入門者初心者にもなるたけすげーわかりやすく書けるよう努力します、、!!

ここはこういうやり方あるよ、このほうがいいよ、など引っかかることがあれば気軽に教えていただければ幸いです、、!🙏


DATにまつわる話

CSVの読み込み

FileInDATでcsvファイルなどの読み込みができます。(いくらか前は対応してなかったぽいです。)
FileInDATのRefreshトグルをオンにしておくと、読み込み元のファイルの変更を保存ごとに随時反映してくれます。

ちなみにcsvファイルをドラッグアンドドロップすると自動でTableDATに変換して読み込みができます。が、Tableとして読み込まれるためcsvファイルの変更は反映されません。

※FileInでcsvを読み込む際、csvファイルの最終行が読み込まれない場合があるので注意です。
とりあえずcsvファイルを用意する場合は、最終行に空行を追加するなどするのがよいかもです。

5行目の空行がないと @hello, he, helloの行を読み込んでくれません。(動画1:51)

日本語ファイルの読み込み

日本語を含む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というフォーマットに置き換えソートを掛けます。

上記の動画で操作しているように、ポイントはFolderのDateFormatをEpochにするところ。
これによって正しくSortをかけることができます。
またSortDATにはランダムに並べ替える機能もあり、Seedの値を変更することでランダムな並びを変更できます。
いわゆる配列のシャッフルのように使えるので便利です。(動画2:05)

ついでに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_evaluate.png
    単純に値をとってくるときなどに意外と便利かもです。

  • TD高速化Tips
    op('lfo1')['chan1'] よりも op('lfo1')[0] のほうが処理速度は早い(らしい) 

おまけ

オペレータに色を付ける。

自作のtoxなどのオペレータに色を付けたい。調べてもパッと出てこなかったけど、何かのチュートリアル動画を見ていたときにしれっと色をつけているのを見てやり方を知りました。

  1. Cキーを押してカラーパレットを表示
  2. 色を付けたいオペレーターを選択してカラーパレットから色を選択

td_opColor.png

自作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にするなど注意してください!

td_base_common.png

ちなみに、Built-inのパラメータはOP.par.cuepulseのようにパラメータ名がオール小文字ですが、カスタムパラメータはOP.par.CustomparameterとParameter名の1文字目のみが必ず大文字になります。
標準パラメータとカスタマイズの干渉を防ぐためだったりすると思うのですが、
そんな些細なことになんとなく気がついていたおかげで僕は何度か幸せになることがありました。

おわりに

DATまわりの知見というか基礎的なところから些細なTipsを書かせていただきました。
なにかひとつでも役に立つものがあれば幸いです。

TouchDesignerはリアルタイム映像ジェネレータとしてとても優秀なソフトでVJ方面での利用が目立つ印象ですが、その一方で、データの管理など裏方処理がバチボコ楽、シリアル通信がバチボコ楽など、
プログラミングしたことないけど何か作りたい学生 にも"うってつけ"だと制作展のサポートで思いました。
(のちのちはプログラミングなどにも興味持ってもらいたいですけど)

ちなみに、今回動画の撮影はFonePawというソフト(無料版は3分間の書き出し制限)を使いました。
入力キーの表示はKeyCastrOWを使いました。KeyCastrOWはGithubから自分でビルドする必要がありますが、ビルド済みのものを配布している方がいらっしゃったのでそちらから拝借。

今後もちょろりちょろり書いていきたいです。

  • ドングルまわりの話(みんなどうしてるんですか?)
  • Instantiateの話
  • MovieFileInの話

コメントを残す

メールアドレスが公開されることはありません。