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

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

Monitors DAT が接続中の各モニター情報を行単位のテーブルとして出力し、状態変化を Callbacks DAT で受け取る流れを示す図

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

概要 📖 – 接続中の画面情報を列挙する

Monitors DATは、接続中の各モニターの位置・解像度・スケール情報を行単位のテーブルとして出力し、状態変化を Python コールバックで通知するシステム情報 DATです。マルチプロジェクター上映やプレイバックワークステーションで、表示先ウィンドウの座標を OS のディスプレイ設定から自動で決めたい場合に必須の OP です。Bounds を On にすると全モニターを囲むバウンディングボックスが追加行として出力され、ステージ全体を 1 つの仮想キャンバスとして扱う設計にも対応できます。

主な用途 🎯

  • マルチディスプレイ構成の自動取得 (各モニターの位置・解像度・スケールを 1 テーブルで把握)
  • モニター接続変化の検知 (ホットプラグ / 解像度変更時に Callbacks DATonMonitorsChange を発火)
  • 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 を発火

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

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 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: マルチモニターのプロジェクションウォールでウィンドウ配置を自動化 🖼️

Monitors DAT (Monitors=Non-Primary, Units=Native) → Select DAT (各モニター行) → Window COMP の Size/Offset に CHOP 経由でバインド

本番出力用に複数台つないだプロジェクター群の解像度と物理配置を Monitors DAT から取得し、Window COMP の Size / Offset パラメータに動的反映する自動セットアップ。プロジェクターの解像度や接続順が変わっても TouchDesigner プロジェクト側を書き換えずに済む。

  1. Monitors DAT を配置、MonitorsNon-Primary に設定して UI 用モニターを除外
  2. UnitsNative にしてプロジェクターの物理ピクセル解像度を取得
  3. 出力テーブルを後段の Select DAT で目的のモニター行に絞り込み
  4. 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 を組み直すフェイルセーフ。

  1. Text DAT を 1 個用意し、onMonitorsChange(dat) 関数を定義
  2. Monitors DAT の Callbacks DAT パラメータに上記 Text DAT のパスを設定
  3. onMonitorsChange 内でモニター数や配置を読み、Window COMP のパラメータや UI のレイアウト Storage を更新
  4. テストとして TouchDesigner 上でモニターの解像度を変更し、コールバックが 1 回発火することを確認

Example 3: Bounds行で全体を1枚の仮想画面に 📐

Monitors DAT (Bounds=On, Monitors=All) → Select DAT (rowname=bounds) → 仮想キャンバスのサイズ・原点を取得

複数モニターを並べたステージで、全モニターを囲むバウンディングボックスを 1 枚の仮想キャンバスとして扱いたい場合に Bounds 行が便利。Bounds 行の width / height をキャンバスサイズ、displayX / displayY を原点として TouchDesigner 内の合成座標系を組む。

  1. Monitors DAT の Bounds パラメータを On に設定
  2. MonitorsAll のまま (Bounds は全モニター対象が前提)
  3. 後段の Select DATRowsbounds を指定し、Bounds 行だけ抽出
  4. Bounds 行の width / height を CHOP 化して仮想キャンバス用 Render TOP の解像度に反映

関連オペレータ 🔗

類似機能OP 🔍

  • TODO

組み合わせ推奨OP 🔄

  • Window COMP — Monitors DAT で取得した各モニターの座標・サイズを Window COMP の Size / Offset に動的反映
  • Select DAT — 出力テーブルから特定のモニター行 (primary など) や bounds 行だけ抽出
  • DAT to CHOPwidth / 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 パラメータが意図せず NonePrimary に絞り込まれていないか確認
  • Affinity を選んでいるのに GPU Affinity 未設定のとき空になる仕様 — 通常は All に戻す
  • OS のディスプレイ設定でモニターが認識されているか確認 (Windows: ディスプレイ設定 / macOS: システム設定 → ディスプレイ)
  • ノートPC のクラムシェルモードや省電力でセカンダリモニターが OS 側で休止していないか確認

❌ Problem: 解像度の値が物理ピクセルと一致しない
✅ Solution:

  • UnitsDPI 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 は全モニターを囲む矩形なので、MonitorsPrimary 等に絞ると意図と異なる範囲になることがある (通常は All と併用)
  • 後段で Select DAT を使って bounds 行を抽出する際は Rowsbounds (rowname) を指定

参考資料 📚

その他 🔗

公式リソース 📖

この記事は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をコピーしました