
概要 📖 – イベントで処理を発火させる
Execute DATは、TouchDesigner プロセスやフレーム進行に応じた Python コールバックを発火させるイベントトリガー DATです。onStart / onCreate / onExit といったライフサイクル系から、onFrameStart / onFrameEnd の per-frame 系、onPlayStateChange / onDeviceChange の状態変化系まで、トリガーしたい event だけをトグルで有効化して使います。同種の DAT Execute DAT や CHOP Execute DAT が値変化トリガーであるのに対し、本 DAT はシステム側のイベントトリガーを担当します。
主な用途 🎯
- onFrameStart / onFrameEnd による毎フレーム Python 実行で軽量な per-frame 処理を仕込む
- onStart / onCreate による起動・生成時の初期化 (
sys.stdoutリダイレクトや storage 初期化など) - onExit によるクリーンアップ (外部接続のクローズや一時ファイルの後始末)
- onPlayStateChange による再生・一時停止イベントの捕捉でタイムライン状態に応じた処理切替
- onDeviceChange によるデバイス hot-plug 検知 (MIDI / カメラ / ジョイスティック等の接続変化に追従)
データフロー 🔄
システムイベント発生 (起動 / ノード生成 / フレーム進行 / 再生状態変化 / デバイス変化)
↓
Execute DAT が対応するon*コールバック関数を Python として実行
↓
関数本体で任意の副作用 (OP 操作 / storage 更新 / ログ出力 / 外部 I/O)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Execute Page ⚡
基本制御 🟢
Active .active 🔌
– On のとき、下記で有効化されたイベントに対して DAT がコールバックを発火
– Off にすると on* 関数本体は変更せずに一括で停止できる (デバッグ時の素早い無効化に便利)
実行コンテキスト (Tscript legacy) 🧭
Execute from .executeloc 📍
– Tscript 専用のレガシーパラメータで、スクリプトが実行される基点位置を決定
– Python コールバックを使う現代的な運用ではほぼ意識しないが、後段の From Operator と組で機能する
From Operator .fromop 🎯
– Execute from が Specified Operator のときに、スクリプトを実行する基点となるコンポーネント参照
– 相対パスの解決基点となる Component を明示的に固定したい場合に指定する
ライフサイクルイベント (Start / Create / Exit) 🌅
Start .start 🚀
– On のとき、TouchDesigner プロセス起動時に onStart() が 1 回実行される
– TouchEngine では「コンポーネントが TouchEngine 起動後に読み込まれる」性質上、このコールバックは呼ばれない点に注意
Create .create 🌱
– On のとき、このノードが生成された瞬間に onCreate() が実行される
– 起動時の読み込み・ディスクからのロード・コピー&ペースト・任意のノード生成経路すべてが対象
Exit .exit 🛑
– On のとき、TouchDesigner プロセスが終了する直前に onExit() が呼ばれる
– 外部接続のクローズや一時ファイルの後始末などクリーンアップ処理を仕込む箇所
フレームイベント (Frame Start / Frame End) 🎞️
Frame Start .framestart ⏱️
– On のとき、毎フレームの開始時に onFrameStart(frame) が実行される
– フレーム頭で行いたい状態更新・センサー値取得・スクリプト先頭処理を仕込むスロット
Frame End .frameend 🏁
– On のとき、毎フレームの終端で onFrameEnd(frame) が実行される
– 1 フレーム分の cook が確定した後の集計・ログ出力・後段送信などに使う
状態変化イベント (Play State / Device) 🎚️
Play State Change .playstatechange ⏯️
– On のとき、タイムラインの play / pause が切替わるたびに onPlayStateChange(state) が発火
– 一時停止中だけ重い処理を止めたい、再生開始時にリセットを走らせたいなどの状態依存処理を仕込める
Device Change .devicechange 🔄
– On のとき、入出力デバイスの接続変化があった瞬間に onDeviceChange() が発火
– MIDI コントローラ・カメラ・ジョイスティック等の hot-plug を検知して再列挙する処理に使う
スクリプト編集 ✏️
Edit.. .edit 📝
– クリックで外部テキストエディタを開き、DAT 内の Python コールバック本体を編集するパルスパラメータ
– onStart() 内で sys.stdout = op('text1') のように Python 標準出力を Text DAT へリダイレクトする運用が典型例 (公式ドキュメント記載のティップス)
File Page 📁
ファイル参照とロード 📂
File .file 🗂️
– 読み込むスクリプトファイルのパスとファイル名
– 受け付け拡張子は .txt と .dat
Sync to File .syncfile 🔁
– On のとき、プロジェクト開始時に該当ファイルをディスクから DAT に読み込み、以降は双方向で同期
– ディスク側で外部エディタが編集すれば DAT が更新され、DAT が編集されればディスク側にも即書き戻される
– ファイルが存在しない場合は DAT が初めて更新された時点で自動生成され、ファイルが削除された場合は DAT は現在の内容を保持する
Load on Start .loadonstart 🚦
– On のとき、プロジェクト開始時にディスク上のファイルを DAT に再ロード
– 起動時にはディスク側を真の値として強制反映したい運用に使う
Load File .loadonstartpulse ⤵️
– クリック (パルス) で即座にディスク上のファイルを DAT に再ロードする手動トリガー
– 外部編集後にプロジェクトを起動し直さずに反映したいときに使う
ディスクへの書込み 💾
Write on Toe Save .write 📤
– On のとき、.toe プロジェクトファイルを保存した瞬間に DAT 内容をディスク上のファイルへ書き出す
– プロジェクトと外部スクリプトファイルの内容を保存時に同期させたい場合に使う
Write File .writepulse ⤴️
– クリック (パルス) で即座に DAT 内容をディスク上のファイルへ書き出す手動トリガー
– プロジェクト保存を待たずにファイルへ反映したいときに使う
Common Page 🔧
Language .language 📝
DAT が動作するスクリプト言語の決定方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT のスクリプト言語を使用 |
| Node | .node |
この DAT 自身のスクリプト言語を使用 |
Edit/View Extension .extension 📄
外部エディタに公開するファイル拡張子の選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| dat | .dat |
汎用的なファイル拡張子 dat を使用 |
| From Language | .language |
DAT のスクリプト言語に応じた拡張子を自動選択 |
| Custom Extension | .custom |
Custom Extension で指定したカスタム拡張子を使用 |
Custom Extension .customext 🔤
Edit/View Extension が Custom Extension のときに適用される拡張子:
- Custom Extension 文字列:
Edit/View Extensionがcustomのときに使用される任意のファイル拡張子
Word Wrap .wordwrap 🔁
ノード表示でのワードラップ (折り返し) の有効化
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT の Word Wrap 設定を継承 |
| On | .on |
Word Wrap を有効化 (ノード上の長い行を折り返し表示) |
| Off | .off |
Word Wrap を無効化 (折り返さずそのまま表示) |
実践アイデア 💡
Example 1: onFrameStartで毎フレーム処理 🎞️
TouchDesigner フレーム進行 → Execute DAT (Frame Start = On, onFrameStart 実装) → 任意の OP 操作 / storage 更新
毎フレーム決まった処理を Python で記述したい場合、CHOP ネットワークではなく Execute DAT の onFrameStart に書くと、Python レベルで一貫した制御フローを保てます。
- Execute DAT を配置し、
Activeを On、Frame Startを On にする Edit..パルスを押して外部エディタを開き、def onFrameStart(frame): ...の本体を実装frame引数からは現在のフレーム番号が得られるので、これを基にした周期処理や時間制御を組む- デバッグ時は
Activeを Off に戻すだけで一括停止できる (関数本体を残したまま安全に無効化可能)
Example 2: onStart で起動時初期化 + 標準出力リダイレクト 🚀
TouchDesigner 起動 → Execute DAT (Start = On, onStart 実装) → sys.stdout を Text DAT に差し替え
公式ドキュメントが推奨するように、onStart() でプロセス起動直後に Python の標準出力をプロジェクト内 Text DAT にリダイレクトすると、Textport を開かなくてもログをノード上で常に確認できます。
- Execute DAT を配置し、
ActiveとStartを On にする Edit..からonStart()内にimport sys; sys.stdout = op('text1')を記述- 復元可能にしたい場合は
prev = sys.stdoutを退避し、終了時onExit()でsys.stdout = prevに戻す - TouchEngine 環境では
onStartが呼ばれない仕様のため、TouchEngine 配下のコンポーネントではonCreate側にフォールバックする
Example 3: onPlayStateChangeで処理切替 ⏯️
タイムライン play/pause 切替 → Execute DAT (Play State Change = On, onPlayStateChange 実装) → 処理 ON/OFF
重い解析処理や外部 I/O を「再生中だけ動かしたい」「一時停止中は止めたい」シーンで、onPlayStateChange を起点にすると分岐ロジックを 1 箇所に集約できます。
- Execute DAT を配置し、
ActiveとPlay State Changeを On にする onPlayStateChange(state)内でstate引数 (再生中なら True、停止中なら False) を判定- 再生開始時にはサンプリングを再開、一時停止時には外部接続をアイドル状態にするなど、必要な分岐処理を Python で記述
- 対になる初期化を
onStart()/onCreate()に置き、終了処理をonExit()に置くことでライフサイクルを 1 つの Execute DAT に集約できる
関連オペレータ 🔗
類似機能OP 🔍
- DAT Execute DAT — 対象 DAT のセル変更・行列変化を検知して Python コールバックを発火させる値変化トリガー DAT
- CHOP Execute DAT — 対象 CHOP のチャンネル値変化を検知して Python コールバックを発火させる DAT
- Parameter Execute DAT — 対象 OP の特定パラメータが変化したときに Python コールバックを発火させる DAT
- Panel Execute DAT — Panel COMP 上の UI イベント (クリック / ドラッグ等) を Python コールバックで受ける DAT
- OP Execute DAT — 対象 OP のクック・名前変更・削除など OP ライフサイクルイベントを捕捉する DAT
組み合わせ推奨OP 🔄
- Text DAT — Execute DAT 内のコールバック本体をプレーンテキストとして別 Text DAT に切り出し、外部エディタで管理
- Examine DAT — Execute DAT が触る storage / globals の中身をリアルタイムで可視化してデバッグ
前処理・後処理DAT 🎯
- 前処理: Text DAT、Table DAT
- 後処理: Null DAT、Examine DAT
Info DAT情報 📊
Execute DAT は Info DAT による詳細情報取得に対応しています (num_rows / num_cols / total_cooks / cook_time 等の共通 DAT Info チャンネルを参照可能)。
DAT 固有情報 📋
num_rows: DAT の行数num_cols: DAT の列数type: DAT の型 (table / text)is_table: テーブル形式の場合 1、テキスト形式の場合 0
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: コールバックがまったく呼ばれない
✅ Solution:
Activeパラメータが On になっているか確認 (Off だと全イベントが停止する)- 対象イベントのトグル (
Start/Create/Frame Start等) が個別に On になっているか確認 Edit..で開いたコールバック関数のシグネチャがドキュメント通り (def onFrameStart(frame):等) になっているか確認、関数名のタイポは無音失敗の典型原因- TouchEngine 環境下では
onStartが呼ばれない仕様のため、onCreate側へフォールバックして検証する
❌ Problem: 想定外のタイミングで onCreate / onStart が発火する
✅ Solution:
onCreate()は「起動・ロード・コピー&ペースト・任意のノード生成経路すべて」で呼ばれる仕様のため、起動時だけ走らせたい初期化はonStart()側に置く- コピー&ペースト由来の発火を区別したい場合は、
onCreate()内で Component の storage 等に「初回フラグ」を持たせて二重実行を防ぐ - ライフサイクルイベントとフレームイベントを 1 つの Execute DAT に詰め込みすぎている場合は、責務単位で Execute DAT を分割する
❌ Problem: 複数の Execute DAT を使ったとき発火順が安定しない
✅ Solution:
- 公式ノート: 複数の Execute DAT の
Start/Create関数は、DAT 名の numbered-alphanumeric 順で発火する - 順序を強制したい場合は DAT 名に
01_init_execute/02_post_init_executeのように数値プレフィックスを付ける - そもそも順序依存を避けたい場合は、初期化処理を 1 つの Execute DAT に集約し、内部関数呼び出しで順序を明示する
- 順序の検証には Examine DAT や Text DAT へのログ出力を併用すると確認しやすい
❌ Problem: Sync to File が機能せず DAT とディスクが乖離する
✅ Solution:
Fileパラメータが空でないか、パス区切りが OS 規約と一致しているかを確認Sync to Fileを一度 Off → On に切替えてからプロジェクトを保存し直すと初期同期が走り直す- 対象ファイルが別プロセス (外部エディタの未保存バッファ等) でロックされていないかを確認
- 起動時にディスク側を強制反映したい場合は
Load on Startも併用、即時反映したいときはLoad Fileパルスを叩く
参考資料 📚
その他 🔗
- TouchDesigner Wiki — DAT 概要
- TouchDesigner Wiki — Category:DATs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – Execute DAT
- TouchDesigner公式ドキュメント – Category:Python
- Storage (Component Storage)

