FIFO DAT 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

※当サイトにはプロモーションリンクが含まれます。

FIFO DAT の先入れ先出しキュー機能を示す図

記事更新の通知はXでアナウンス٩(๑❛ᴗ❛๑)
@maru6o6をフォロー

概要 📖 – 行追加トリガーで動く先入れ先出しメッセージキュー

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 コールバックを行ごとに実行

Tips

初心者の方は、以下日本語書籍も手元にあると安心です。

まる。
まる。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!


パラメータ解説 ⚙️

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 fromSpecified Operator のときに参照される OP パス:

  • From Operator パス: Execute fromSpecified 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 ExtensionCustom Extension のときに適用される拡張子:

  • Custom Extension 文字列: Edit/View Extensioncustom のときに使用される任意のファイル拡張子

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 件のみテーブルに残るので、ライブパフォーマンス中のメッセージフローを画面の隅に常時可視化できる。

  1. OSC In DAT を配置し port / アドレスパターンを設定
  2. Script DAT のコールバックで OSC のメッセージを FIFO DAT に appendRow で追記
  3. FIFO DAT の Clamp Output を On + Maximum Lines を 50 に設定
  4. Text TOP の text パラメータに FIFO DAT のセル参照式を入れ、最新行から数行を画面に重ねる
  5. 本番中はメッセージ流量が想定範囲内かを目視で確認

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 側はリアルタイムにデータを受け取れる。

  1. Serial DAT を active + 適切なボーレートで起動し、行単位のメッセージを受信
  2. Serial DAT の callback で FIFO DAT に appendRow([timestamp, channel, value]) を実行
  3. FIFO DAT の Callbacks DAT パラメータに Text DAT (onRowAdded 関数) のパスを指定
  4. onRowAdded 内で末尾追加された行の値を Constant CHOP のチャンネルに反映 (op('const1').par.value0 = float(dat[row, 2]))
  5. 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 に同じ行を書き出し、メモリ上のリングバッファとは別にディスクへ恒久的に保存する。

  1. Web Server DAT を任意ポートで listen させ、POST リクエストを受信
  2. Script DAT で JSON ペイロードをパースし、必要な field を抽出して FIFO DAT に appendRow
  3. FIFO DAT の Maximum Lines を 1000 程度に設定してメモリ上の直近履歴を保持
  4. Callbacks DAT 内で onRowAdded を実装し、File Out DAT (fileout1) に同じ 1 行を追記
  5. 本番開始前に 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 🎯


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 OutputMaximum 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 側にあるかを定量確認

参考資料 📚

その他 🔗

公式リソース 📖

この記事はLLMと共に内容を執筆、更新しています。
最新バージョンとの項目差異など、情報の不一致を見つけた心優しい方はXもしくはInsta、メールなどよりサイト管理者までご連絡ください😎


まる。

お仕事のご依頼はDM又はメールにて。
━━━━━━━━━━━━━━━━━
Python/Touchdesigner/M5Stackをこよなく愛すフルスタックエンジニア。
専門は生理心理学、趣味はヨガやサウナ、EMS電気風呂などヘルスケア全般。
脳波や筋電、心拍を中心とした生体情報のセンシング&インタラクティブアートづくりがライフワーク。

普段はワントゥーテンという会社で空間演出エンジニアをしています。
リファラル採用お繋ぎできますので、我こそはという尖った方は経歴と希望職種添えてDMください(エンジニア以外、営業職等もOK)。
ご飯行きましょう。

↓日常垢
Instagram:@malmal0v0

まる。をフォローする
その他の記事はこちら
Math Combine POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED Select TOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Window COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Widget COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

タイトルとURLをコピーしました