こんにちは!こちらは TouchDesigner Advent Calendar 2021 6日目の記事です。よろしくお願いします。
今回作ったサンプルは以下にあります。
https://github.com/chimanaco/touchdesigner-advent-calendar-2021
はじめに
Media Ambition Tokyo 2021 というイベントのトークセッションで Kezzardrix さんが Premiere からタイムラインを作るという話をされていまして、いつか自分でも作ってみようと思っていたところ、UE4 でライブ用のプリレンダーの映像を作るという案件がありまして。
UE4 でシーンを作っておいて決まったタイミングでカメラと一部プロップを切り替えるという構造的には単純なもので、TouchDesigner と UE4 の OSC 経由の疎通は以前からよくやっていたこともあり、自動で OSC を飛ばすタイムラインを作りました(バイブスで作ったのでKezzardrix さんが仰られていたものとはちょっと異なるはずです)。
その時作ったものをベースに同僚の凄腕 Premiere 使いたちと今後いい感じにコラボできるようにドキュメントを残すついでに Advent Calendar にも、というモチベーションで書いています。
サンプル

サンプルはこんな感じでタイムラインの指定のフレームで指定のコメントを出力する、というものです。
手順
- [Premiere] 実際の曲と同じ長さでビデオコンテを作る。
- [Premiere] 任意のフレームにマーカーでコメントをつけて、テキストファイルを export する
- [TouchDesigner] export したファイルを読み込んでパースする
- [TouchDesigner] コメントがついているところは1、それ以外は0となる CHOP = タイムラインを作る
- [TouchDesigner] 該当フレームで該当コメントを出力する
という感じです。それでは実際に作り方を見ていきます。
[Premiere] マーカーを配置する

Premiere に動画ファイルを読み込みます。試す分にはなんでもいいので、VJ LOOPS | BEEPLE | the work of mike winkelmann から DL しました。タイムラインに D&D した後、この Source: ファイル名 タブがあるウィンドウを表示します。(Premiere力が低いため正式名称が分かりませんすみません)

この Source: ファイル名 タブでマーカーを置きたい箇所までタイムラインを動かし、右クリックして Add Marker を選択します。

マーカーが追加されました。

追加されたマーカーをダブルクリックすると、ポップアップが出てきます。Comments のテキストフィールドに、任意のシーン名を入れます。ここでは s1 としました。

同じ要領で別のシーンを追加していきます。 s2, s3, s4 としました。

Markersタブを見ると追加したマーカーたちの情報を一覧することができます。
[Premiere] export する

マーカーたちの位置とシーン名が決まったらファイル書き出しをします。File > Export > Markers を選択します。

File Type は Text File を選択します(csv でもいけると思いますが、今回のやり方だと自分は txt の方が早かったです)。

TouchDesigner のネットワークに D&D するとこんな感じです。これで Premiere の方は完了です!
[TouchDesigner] 読み込んだデータをパースする

まず全体のフレーム数とフレームレートを Premiere の設定と同じにします。今回使用した動画ファイルは 30:01 の 30 FPSなのでこの設定を TouchDesigner にも反映させます。31 * 30 = 930 としました。

ConvertDATで TouchDesigner に読み込んだ txt を table に変換します。使わない Columns があるので、selectDAT で In Point と Description の Column を取得して Merge します。Premiere の Comments は export したら Description になってますね。

ScriptDATで 00:00:05:03 のような表記をフレーム数に変換します。def cook(scriptOp) 内に以下のようなコードを書いて別の TableDAT にデータをコピーします。
so = scriptOp
so.copy(so.inputs[0])
to = op('TableTD')
to.clear()
to.appendRow( ['Marker', 'Description'])
orgNum = so.numRows
fps = float(var('FPS'))
for r in range(1, so.numRows):
tex = str(so[r,0])
mm = tex[3:5]
ss = tex[6:8]
ms = tex[9:11]
mmf = float(mm) * 60 * fps
ssf = float(ss) * fps
msf = float(ms)
frame = mmf + ssf + msf
des = so[r, 1]
to.appendRow([frame, des])
return
これで Premiere で作られたマーカーたちの位置とコメントが TouchDesigner で使いやすいデータになりました。ここで作った TableTD という TableDAT は後で使用します。
[TouchDesigner] タイムラインを作る
ここで得られたフレームの時だけ合図を送る、つまり1にするようにして、それ以外の時は0になるような CHOP を作ります。これが実質タイムラインになります。

フレーム数が入った Column だけにして CHOP に変換します。channel 毎に同じ処理を繰り返すので Replicator を使います。

こちらは master1 の中身です。"chan" + str(parent().digits)を使って Replicate された item がそれぞれのナンバリングに基づいた channel を取得するようにします。
End パラメータを var('RANGEEND')とした 0 の入った ConstantCHOP を用意しておき、SpliceCHOPを使って該当するフレームと置き換えます。ここではサンプル数930、153サンプル目に153という数値が入っているという CHOP ができました。このままでもいいのですが1が入ってくれればいいので、他のフレームと揃えるために LimitCHOPで値を1にします。

Replicate したそれぞれの item の出力を Merge して MathCHOP で Combine Channels を Add にすると、Premiere のマーカー位置に該当するフレームが1、それ以外は0というものができました。
[TouchDesigner] 指定のフレームで指定のコメントを出力する

Trim TOPを使って、現在のフレームだけを取得するようにすると、該当フレームになった時に1を出力してくれます。

毎フレーム毎に先に作った TableTD の Description をチェックして、別の TextDAT を更新します。ここが更新される前にさきほどの CHOP の値が1になって1つ前の Description が使われてしまうと困るので 0.5s だけ早めに更新しています(しなくても大丈夫かもしれません。未確認です)。
1つ目の前は s0、それ以降は Description にある値を取得するよう以下のようなコードを書いています。
frameDelay = project.cookRate / 2
to = op('TableTD')
do = op('Description')
for r in range(1, to.numRows):
if(val > to[r,0] - frameDelay ):
do.text = to[r,1]
elif(val < to[1,0] - frameDelay ):
do.text = 's0'

あとは1が飛んできたタイミングで Description を使って何かするだけです。このサンプルでは単純に print(シーン名) していますが、このあたりはお好みでどうぞ。
おまけ
おまけとしてサンプルには UI がついています。reset ボタンで1フレームに戻る、frame スライダーを動かすとフレーム移動となっています。
おわりに
11/11 の DUSTCELL 3rd ONE-MAN LIVE『自白』にて SOPPY という曲で使って頂いた映像が、このシステムをベースに作ったものになります。その節は関係者の皆さまありがとうございました!
DUSTCELLが憧れの地・Zepp Tokyoに、新曲も披露された3rdワンマン(ライブレポート / 写真28枚) - 音楽ナタリー
それでは引き続き TouchDesigner Advent Calendar 2021 をお楽しみください!
ありがとうございました~