
概要 📖 – 接続中の画面情報を列挙する
Monitors DATは、接続中の各モニターの位置・解像度・スケール情報を行単位のテーブルとして出力し、状態変化を Python コールバックで通知するシステム情報 DATです。マルチプロジェクター上映やプレイバックワークステーションで、表示先ウィンドウの座標を OS のディスプレイ設定から自動で決めたい場合に必須の OP です。Bounds を On にすると全モニターを囲むバウンディングボックスが追加行として出力され、ステージ全体を 1 つの仮想キャンバスとして扱う設計にも対応できます。
主な用途 🎯
- マルチディスプレイ構成の自動取得 (各モニターの位置・解像度・スケールを 1 テーブルで把握)
- モニター接続変化の検知 (ホットプラグ / 解像度変更時に
Callbacks DATでonMonitorsChangeを発火) - Window COMP のフルスクリーン配置自動化 (取得したモニター座標から表示先ウィンドウの位置・サイズを動的決定)
- Native ピクセルと DPI スケール座標の切替 (
Unitsパラメータで OS の DPI スケーリングを反映するか否かを選択) - Primary / Non-Primary / Affinity フィルタによる対象モニター絞り込み (UI 用と本番出力用を分離するセットアップで有用)
データフロー 🔄
OS から接続中モニター情報を読み取り
↓Monitorsでフィルタ (All / Primary / Non-Primary / Affinity / None)
↓Unitsで Native ピクセル or DPI Scaled を選択
↓
各モニター 1 行のテーブルとして出力 (name/primary/displayX/displayY/width/height/scale等)
↓Callbacks DATがモニター状態変化時にonMonitorsChangeを発火
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Monitors Page 🖥️
コールバックと追加行 🔔
Callbacks DAT .callbacks 📜
– モニター状態変化 (接続 / 切断 / 解像度変更 / 配置変更) が起きるたびに 1 回ずつ呼ばれる Python スクリプトを保持する Text DAT へのパス
– 関数シグネチャは monitorsDAT_Class のリファレンスに準拠 (onMonitorsChange(dat) 等)
Bounds .bounds 📐
– On にすると、全モニターを囲むバウンディングボックスを表す bounds 行が追加される
– bounds 行の primary 列にはプライマリモニターのテーブル上のインデックスが入る
– ステージ全体を 1 枚の仮想キャンバスとして扱うレイアウト計算に有効
Monitors .monitors 🎛️
テーブルに含めるモニターをフィルタするメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| All | .all |
接続中の全モニターを出力 |
| Primary | .primary |
OS で Primary に指定されているモニターのみを出力 |
| Non-Primary | .nonprimary |
Primary 以外の補助モニターのみを出力 |
| Affinity | .affinity |
GPU Affinity が設定されているモニターのみを出力 |
| None | .none |
テーブルにモニター行を含めない (ヘッダー行のみ) |
Units .units 📏
座標とサイズの単位 (OS の DPI スケーリングを反映するか否か) を選択するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Native | .native |
OS の DPI スケーリングを無視した物理ピクセル単位で出力 (4K モニターなら 3840×2160 等) |
| DPI Scaled | .dpiscaled |
OS の DPI スケーリングを反映した論理ピクセル単位で出力 (Windows の拡大率設定 150% 等を考慮した値) |
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: マルチモニターのプロジェクションウォールでウィンドウ配置を自動化 🖼️
Monitors DAT (Monitors=Non-Primary, Units=Native) → Select DAT (各モニター行) → Window COMP の Size/Offset に CHOP 経由でバインド
本番出力用に複数台つないだプロジェクター群の解像度と物理配置を Monitors DAT から取得し、Window COMP の Size / Offset パラメータに動的反映する自動セットアップ。プロジェクターの解像度や接続順が変わっても TouchDesigner プロジェクト側を書き換えずに済む。
- Monitors DAT を配置、
MonitorsをNon-Primaryに設定して UI 用モニターを除外 UnitsをNativeにしてプロジェクターの物理ピクセル解像度を取得- 出力テーブルを後段の Select DAT で目的のモニター行に絞り込み
- DAT to CHOP で
displayX/displayY/width/heightを CHOP 化し、Window COMP のパラメータに参照式でバインド
Example 2: モニターのホットプラグを検知して UI を再構築 🔌
Monitors DAT (Callbacks=Text DAT) → onMonitorsChange で Python 実行 → UI 再レイアウト処理を発火
インスタレーション運用中にモニターケーブルが抜けたり差し直されたりする変化を Monitors DAT の Callbacks DAT 経由で検知し、Python で UI レイアウトや出力先 Window を組み直すフェイルセーフ。
Text DATを 1 個用意し、onMonitorsChange(dat)関数を定義- Monitors DAT の
Callbacks DATパラメータに上記 Text DAT のパスを設定 onMonitorsChange内でモニター数や配置を読み、Window COMP のパラメータや UI のレイアウト Storage を更新- テストとして TouchDesigner 上でモニターの解像度を変更し、コールバックが 1 回発火することを確認
Example 3: Bounds行で全体を1枚の仮想画面に 📐
Monitors DAT (Bounds=On, Monitors=All) → Select DAT (rowname=bounds) → 仮想キャンバスのサイズ・原点を取得
複数モニターを並べたステージで、全モニターを囲むバウンディングボックスを 1 枚の仮想キャンバスとして扱いたい場合に Bounds 行が便利。Bounds 行の width / height をキャンバスサイズ、displayX / displayY を原点として TouchDesigner 内の合成座標系を組む。
- Monitors DAT の
Boundsパラメータを On に設定 MonitorsはAllのまま (Bounds は全モニター対象が前提)- 後段の Select DAT で
Rowsにboundsを指定し、Bounds 行だけ抽出 - Bounds 行の
width/heightを CHOP 化して仮想キャンバス用 Render TOP の解像度に反映
関連オペレータ 🔗
類似機能OP 🔍
- TODO
組み合わせ推奨OP 🔄
- Window COMP — Monitors DAT で取得した各モニターの座標・サイズを Window COMP の Size / Offset に動的反映
- Select DAT — 出力テーブルから特定のモニター行 (
primaryなど) やbounds行だけ抽出 - DAT to CHOP —
width/height/scale等の数値列を CHOP に変換して後段で参照式や演算に利用 - DAT Execute DAT — Callbacks DAT とは別経路で、出力テーブルの値変化をトリガーに Python を発火させたい場合の汎用フック
- Perform CHOP — Perform Mode 時の Window 情報と組み合わせて、編集モードと上演モードでウィンドウ挙動を切替
前処理・後処理DAT 🎯
Monitors DAT 出力テーブルの列 📊
Monitors DAT の出力テーブル列の代表例 (各行が 1 つのモニター、Bounds=On のときは末尾に bounds 行が追加されます)。
DAT 固有情報 📋
num_rows: DAT の行数num_cols: DAT の列数type: DAT の型 (table / text)is_table: テーブル形式の場合 1、テキスト形式の場合 0
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
モニター識別情報 🪪
name: OS が認識するモニターの表示名primary: Primary モニターなら 1、それ以外は 0 (Bounds 行では Primary モニターのテーブル上インデックスが入る)isAffinity: GPU Affinity が割り当てられているモニターなら 1、それ以外は 0
座標と解像度 📐
displayX: デスクトップ仮想座標系におけるモニター左上の X 座標 (Unitsパラメータの単位に従う)displayY: デスクトップ仮想座標系におけるモニター左上の Y 座標width: モニターの幅 (Native ならピクセル、DPI Scaled なら論理ピクセル)height: モニターの高さscale: OS で設定されている DPI スケーリング倍率 (Windows の拡大率 150% なら 1.5 等)
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: Monitors DAT のテーブルが空、または期待したモニターが出てこない
✅ Solution:
Monitorsパラメータが意図せずNoneやPrimaryに絞り込まれていないか確認Affinityを選んでいるのに GPU Affinity 未設定のとき空になる仕様 — 通常はAllに戻す- OS のディスプレイ設定でモニターが認識されているか確認 (Windows: ディスプレイ設定 / macOS: システム設定 → ディスプレイ)
- ノートPC のクラムシェルモードや省電力でセカンダリモニターが OS 側で休止していないか確認
❌ Problem: 解像度の値が物理ピクセルと一致しない
✅ Solution:
UnitsがDPI Scaledになっていると OS の拡大率に応じた論理ピクセルが返るため、物理解像度がほしい場合はNativeに切替- 逆に Window COMP の Size を画面表示と一致させたい場合は
DPI Scaledが必要なケースもある - OS の拡大率設定 (Windows 100%/125%/150% 等) を変更したら DAT が再クックされているか
total_cooksで確認
❌ Problem: モニターを抜き差ししてもコールバックが発火しない
✅ Solution:
Callbacks DATパラメータに対象の Text DAT パスが正しく設定されているか確認 (タイプミス / 相対パスのずれ)- Text DAT 内の関数名が
onMonitorsChange(dat)と一致しているか (monitorsDAT_Classリファレンス参照) - Text DAT 内のコードに構文エラーがあると無音で呼ばれない場合があるため、
Textportでエラー出力を確認 - OS によっては解像度変更でなくケーブル抜挿のみで再認識まで数秒かかることがあり、即座にコールバックが返らないケースを想定する
❌ Problem: Bounds 行が出てこない / Bounds の値が想定と違う
✅ Solution:
Boundsパラメータが On になっているか再確認- Bounds は全モニターを囲む矩形なので、
MonitorsをPrimary等に絞ると意図と異なる範囲になることがある (通常はAllと併用) - 後段で Select DAT を使って
bounds行を抽出する際はRowsにbounds(rowname) を指定
参考資料 📚
その他 🔗
- TouchDesigner Wiki — DAT 概要
- TouchDesigner Wiki — Category:DATs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

