
概要 📖 – 行追加トリガーで動く先入れ先出しメッセージキュー
FIFO DATは、外部からのメッセージを先入れ先出しのテーブルに蓄積し、行追加ごとに Python コールバックを発火させる DATです。最新行がテーブル先頭に追加され、Maximum Lines を超えた古い行から自動的に削除されます。Callbacks DAT を指定すると 1 行追加ごとに Python 関数が起動するため、非同期イベントのハンドラとして機能します。
主な用途 🎯
- OSC / Serial / UDP / Web 等の外部メッセージをリアルタイム受信してキューに蓄積
- イベント駆動の Python ハンドラを 1 行追加ごとに発火 (Callbacks DAT)
- 固定行数のリングバッファとして最新 N 件のみ保持 (Maximum Lines + Clamp Output)
- 時系列ログのスナップショットとして Text TOP / Table DAT に流し込み可視化
- 非同期メッセージのバッファリングで重い後段処理を batch 化
データフロー 🔄
外部入力 (Script DAT / Web Server DAT / Serial DAT 等) からの行追加
↓
FIFO テーブル先頭への append
↓
Maximum Lines 超過時に末尾の古い行を自動削除
↓
Callbacks DAT がonRowAddedコールバックを行ごとに実行
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
FIFO Page 📋
コールバック設定 🔔
Callbacks DAT .callbacks 📜
– 1 行追加されるたびに実行される Python 関数を定義した Text DAT へのパス
– 関数内では追加された行データ + 全テーブル参照が可能
– コールバック関数のシグネチャは公式 fifoDAT_Class の仕様に従う
コールバック実行スコープ .executeloc 📌
Callbacks DAT 内のスクリプトを実行する OP コンテキストを決定するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Current Node | .current |
現在の Node 位置からスクリプトを実行 (Tscript 互換) |
| This Node | .here |
FIFO DAT 自身の親 OP からスクリプトを実行 (sibling を相対参照しやすい) |
| Specified Operator | .op |
From Operator パラメータで指定した OP からスクリプトを実行 |
From Operator .fromop 🔗
Execute from が Specified Operator のときに参照される OP パス:
- From Operator パス:
Execute fromがSpecified Operatorのときにスクリプト実行コンテキスト + 状態変化トリガー元として参照される OP のパス
バッファサイズ制御 📏
Clamp Output .clamp 🔒
– On 時、Maximum Lines で指定した行数を上限としてキューを制限
– Off 時はメッセージが無制限に蓄積される (長時間運用ではメモリ圧迫の原因になり得る)
– デフォルトは On (100 行制限)
Maximum Lines .maxlines 🔢
– 保持する最大行数 (Clamp Output が On のときのみ有効)
– 上限到達時は末尾の最も古いメッセージから先入れ先出しで削除
– デフォルトは 100
Clear Output .clear 🧹
– パルスでヘッダー行を除く全行を削除
– Python からは op('opname').par.clear.pulse() で起動可能
– デバッグセッションの区切りやモード切替で履歴をリセットするときに使用
Keep First Row .firstrow 📎
– On 時、テーブル先頭の行 (ヘッダー想定) を FIFO の対象外として保持
– 列名ヘッダーを保持しつつ下にメッセージを溜める用途で使用
– Off 時は先頭行も通常の FIFO 行として上書き対象になる
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: OSC メッセージのリングバッファ受信 📡
OSC In DAT → Script DAT (FIFO append) → FIFO DAT (Maximum Lines=50) → Text TOP overlay
外部アプリ (Max/MSP / SuperCollider / TouchOSC など) から飛んでくる OSC メッセージを Script DAT で受け取り、FIFO DAT の先頭に append していくリングバッファ構成。直近 50 件のみテーブルに残るので、ライブパフォーマンス中のメッセージフローを画面の隅に常時可視化できる。
- OSC In DAT を配置し port / アドレスパターンを設定
- Script DAT のコールバックで OSC のメッセージを FIFO DAT に
appendRowで追記 - FIFO DAT の
Clamp Outputを On +Maximum Linesを 50 に設定 - Text TOP の
textパラメータに FIFO DAT のセル参照式を入れ、最新行から数行を画面に重ねる - 本番中はメッセージ流量が想定範囲内かを目視で確認
Example 2: Serial/UDPをPythonで処理 🔌
Serial DAT → Script DAT (FIFO appendRow) → FIFO DAT (Callbacks DAT) → onRowAdded で値を CHOP に反映
Arduino / ESP32 等のマイコンから Serial 経由で送られてくるセンサ行データを FIFO DAT にキューイングし、Callbacks DAT 内の onRowAdded 関数で 1 行ごとに値を Constant CHOP へ書き戻すパターン。重い解析処理を逃がしつつ、UI 側はリアルタイムにデータを受け取れる。
- Serial DAT を
active+ 適切なボーレートで起動し、行単位のメッセージを受信 - Serial DAT の callback で FIFO DAT に
appendRow([timestamp, channel, value])を実行 - FIFO DAT の
Callbacks DATパラメータに Text DAT (onRowAdded関数) のパスを指定 onRowAdded内で末尾追加された行の値を Constant CHOP のチャンネルに反映 (op('const1').par.value0 = float(dat[row, 2]))Maximum Linesを 200〜500 に設定して短時間履歴も並走確認できる状態に
Example 3: Webhook イベントの永続化ロギング 🪵
Web Server DAT → Script DAT (parse JSON → FIFO append) → FIFO DAT → Callbacks DAT → File Out DAT (永続化)
Web Server DAT で受け取った外部サービスからの Webhook ペイロードを Script DAT で JSON パースし、FIFO DAT に時系列で蓄積するロギング構成。FIFO の Callbacks DAT 内で File Out DAT に同じ行を書き出し、メモリ上のリングバッファとは別にディスクへ恒久的に保存する。
- Web Server DAT を任意ポートで listen させ、POST リクエストを受信
- Script DAT で JSON ペイロードをパースし、必要な field を抽出して FIFO DAT に
appendRow - FIFO DAT の
Maximum Linesを 1000 程度に設定してメモリ上の直近履歴を保持 - Callbacks DAT 内で
onRowAddedを実装し、File Out DAT (fileout1) に同じ 1 行を追記 - 本番開始前に
Clear Outputパルスでテーブルを空にしてから運用へ切替
関連オペレータ 🔗
類似機能OP 🔍
- TODO
組み合わせ推奨OP 🔄
- OSC In DAT — 外部アプリからの OSC メッセージを受信して FIFO に append
- Serial DAT — マイコン / 周辺機器のシリアル行データを FIFO に流し込む
- Web Client DAT — Callbacks DAT 内から Webhook / REST API へ FIFO の行内容を POST
- File Out DAT — FIFO テーブルを CSV / ログファイルに恒久書き出し
- Execute DAT — 起動時 / 終了時に FIFO DAT の
Clear Outputパルスを自動発火 - Info DAT — FIFO DAT の
num_rows/ cook 統計を別ノードから参照
前処理・後処理DAT 🎯
- 前処理: OSC In DAT、Serial DAT、Web Server DAT、Script DAT
- 後処理: File Out DAT、Web Client DAT、Convert DAT、Table DAT
Info DAT情報 📊
FIFO DAT は Info DAT による詳細情報取得に対応しています (num_rows / num_cols / total_cooks / cook_time / cook_frame / warnings / errors 等の共通 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: 行が FIFO テーブルに追加されない
✅ Solution:
- 上流の Script DAT / Callbacks DAT 内で FIFO DAT に対し
appendRowが正しく呼ばれているか確認 - FIFO DAT のパスが Python の
op('fifo1')等で正しく解決されているかを textport で検証 - 受信側 (OSC In DAT / Serial DAT 等) の
activeパラメータが On で、メッセージ自体が届いているかを別 DAT に直接ダンプして確認
❌ Problem: 古い行が想定より早く消える / 残りすぎる
✅ Solution:
Clamp OutputとMaximum Linesの組合せが意図したリングバッファサイズになっているか確認Keep First Rowを On にしている場合、ヘッダー行を含めた行数で Maximum Lines が計算されるため 1 行分余裕を持たせるClear Outputパルスが意図せず別の Execute DAT 等から発火していないかワイヤリングを確認
❌ Problem: Callbacks DAT 内の関数が実行されない
✅ Solution:
Callbacks DATパラメータに Python 関数を持つ Text DAT のパスが正しく設定されているか確認- 関数名が公式
fifoDAT_Classの API (onRowAdded等) と一致しているか確認 Execute from/From Operatorの設定で意図した OP コンテキストになっているか確認- コールバック内で発生した例外が他の通知を止めていないか
try / exceptで囲んで textport にトレースを出す
❌ Problem: FIFO の追記が頻繁でプロジェクトが重い
✅ Solution:
Maximum Linesを小さくして 1 回の更新コストを下げる- Callbacks DAT 内の重い処理 (HTTP POST / ファイル I/O) は別スレッド / 非同期に逃がす
- 上流側で間引き / バッチ化してから FIFO に append する設計に変更
- Info DAT で
cook_timeを観測し、ボトルネックが本当に FIFO 側にあるかを定量確認
参考資料 📚
その他 🔗
- TouchDesigner Wiki — DAT 概要
- TouchDesigner Wiki — Category:DATs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

