
概要 📖 – OSC メッセージの受信とテーブル化
OSC In DATは、OSC プロトコルでネットワーク受信したメッセージをテーブル化し、コールバックで Python に渡す DATです。プロトコルは UDP / Multicast / UDT の 3 種類に対応し、メッセージはアドレス・引数・タイムスタンプを列に展開できます。
主な用途 🎯
- 外部アプリ / モバイル / コントローラからの OSC メッセージを受信
- アドレスパターン (例:
/synth/freq) で受信メッセージを絞り込み - Callbacks DAT でメッセージ受信ごとに Python アクションを実行
- テーブル形式で履歴を保持し、後段の OP に逐次配信
- OSC バンドルを行・列に展開し、タイムスタンプを保持
データフロー 🔄
入力: ネットワーク上の OSC メッセージ (UDP / Multicast / UDT)
↓
アドレス / 型タグ解析
↓
出力: テーブル DAT (1 行 = 1 メッセージ) + Callbacks 起動
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Connect Page 📋
接続有効化とネットワーク基本設定 🌐
Active .active ✅
– On 時、指定ポートで OSC メッセージを受信
– Off 時は受信せず、ポートに届いたデータは破棄される
Network Address .address 🌐
– Multi-cast プロトコル時は受信するマルチキャストアドレス
– UDT プロトコル時はサーバの IP アドレス
Port .port 🔌
– OSC In がメッセージを受け取る UDP ポート番号
Local Address .localaddress 🏠
– 受信に使う NIC の IP アドレスを指定 (複数 NIC 環境での選択用)
– 空欄なら全 NIC で受信
Shared Connection .shared 🤝
– 同じプロトコル / ポートを使う他の DAT と接続を共有
Protocol .protocol 📡
使用するネットワークプロトコルを選択するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Messaging (UDP) | .msging |
通常の UDP ユニキャスト (デフォルト・最頻出) |
| Multi-Cast Messaging (UDP) | .multicastmsging |
マルチキャストグループへの送受信 |
| Reliable Messaging (UDT Library) | .reliablemsging |
UDT ライブラリによる順序保証つき配送 |
アドレススコープとメッセージ整形 🎯
OSC Address Scope .addscope 🔍
– 受信するメッセージのアドレスパターンを絞り込む文字列
– 例: ^*accel* で iPhone / iOS の accelerometer メッセージを除外
Include Type Tag .typetag 🏷️
– On 時、メッセージに OSC 型タグ (i / f / s 等) を列として含める
– 受信側で型判定が必要なときに有効
Split Bundle into Messages .splitbundle 📦
– On 時、OSC バンドル内の各メッセージを別行に展開
– バンドル全体を 1 行に集約したい場合は Off
Split Message into Columns .splitmessage 📊
– On 時、OSC アドレスと各引数を個別の列として展開
– Off 時は 1 つの message 列にまとめて格納
Bundle Timestamp Column .bundletimestamp ⏱️
– On 時、各バンドルのタイムスタンプ値を列として追加
Received Messages Page 📁
コールバックと出力制御 🐍
Callbacks DAT .callbacks 📜
– メッセージ受信ごとに 1 回呼ばれる Python コールバックを保持する DAT を指定
– 利用可能 API は oscinDAT_Class を参照
Execute from .executeloc 📍
– コールバックスクリプトが実行される場所 (コンテキスト) を指定するメニュー
From Operator .fromop 🎯
– Execute from が Specified Operator のとき、スクリプト実行コンテキスト OP を指定
Clamp Output .clamp 📏
– 既定では DAT は 100 メッセージで打ち切られる
– On にすると Maximum Lines まで保持 (= 履歴を増やせる、unlimited 設定も可能)
Maximum Lines .maxlines 🔢
– 保持する最大メッセージ数
– 上限を超えると古いメッセージから削除される
Clear Output .clear 🧹
– パルスでヘッダ以外の全行を削除
– Python では op('oscin1').par.clear.pulse() で実行可
Bytes Column .bytes 📦
– On 時、メッセージの生バイト列を列として追加
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: iPad TouchOSC からスライダー値を受信してパラメータ制御 📱
iPad TouchOSC → OSC In DAT → OSC In CHOP → Math CHOP → 対象 OP
- OSC In DAT の Port を TouchOSC アプリ側と同じ番号に設定 (例: 7000)
- Active を On、Protocol を
Messaging (UDP)に - アドレスごとの履歴を DAT で確認しつつ、リアルタイム数値は OSC In CHOP 側で受け取り後段に渡す
- Math CHOP で値域を 0〜1 に正規化して対象 OP のパラメータへ Export
Example 2: Callbacks DAT でアドレスごとに Python アクション分岐 🐍
OSC In DAT → Callbacks DAT (onReceiveOSC) → 各種アクション
- Callbacks DAT に Text DAT を指定し
onReceiveOSC(dat, rowIndex, message, bytes, timeStamp, address, args, peer)を実装 - コールバック内で
addressによる分岐 (例:'/scene/next'なら次シーン、'/audio/volume'なら音量変更) - args (引数リスト) を Python で float / int / str にキャストして使用
- 重い処理は別 thread か
run('...', delayFrames=1)でメインスレッドに後追い
Example 3: アドレススコープでメッセージを絞り込み、不要分を除外 🎯
OSC 送信元 (多数) → OSC In DAT (OSC Address Scope) → 必要メッセージのみ
- 送信側が多数のアドレスを送ってきても DAT 行が膨らみすぎないよう絞り込みを設定
- OSC Address Scope に
^*accel*(= accel を含むアドレスを除外) のようなパターンを指定 - Maximum Lines + Clamp Output で履歴上限を設定し、メモリ消費を抑える
- 残ったメッセージだけが行として蓄積される
関連オペレータ 🔗
類似機能OP 🔍
- OSC In CHOP — OSC メッセージを CHOP チャンネル値として受信 (DAT 行ではなくチャンネルが欲しい場合)
- OSC Out DAT — 逆方向: TouchDesigner から OSC を送信
- UDP In DAT — OSC ではない生 UDP メッセージを受信
組み合わせ推奨OP 🔄
- OSC In CHOP — DAT で履歴 / コールバック + CHOP で数値リアルタイム制御の併用が定番
- Select DAT — 受信履歴から特定 address の行だけ抽出
- DAT to CHOP — テーブル化された引数列を CHOP チャンネルに変換
- Script CHOP — Callbacks DAT 経由で Script CHOP に値を書き込んで保持
- MIDI In CHOP — MIDI と OSC を並列に受け取りたい場合の併用
前処理・後処理DAT 🎯
Info DAT情報 📊
OSC In DAT は Info DAT による詳細情報取得に対応しています。
DAT 固有情報 📄
num_rows: 受信した OSC メッセージの行数num_cols: DAT の列数 (Split Message into Columns / Bytes Column 等で変動)type: DAT の型 (table / text)is_table: テーブル形式の場合 1、テキスト形式の場合 0
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数 (ポート占有 / バインド失敗時にカウント)
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: メッセージが届かない / DAT に何も表示されない
✅ Solution:
- Active が On になっているか確認
- Port が送信側と一致しているか確認 (アプリ側の送信ポート設定も確認)
- Windows ファイアウォール / OS の受信制限で UDP がブロックされていないか確認
❌ Problem: 複数 NIC 環境で意図しない NIC で受信される / 受信できない
✅ Solution:
- Local Address に明示的に受信したい NIC の IP アドレスを指定
- Shared Connection を Off にして他 DAT との接続共有を一時切断
- Wireshark 等で実際にパケットがどの NIC に届いているか確認
❌ Problem: DAT 履歴がすぐ満杯になり、新しいメッセージが流れていく
✅ Solution:
- Clamp Output を On にして Maximum Lines を増やす (unlimited も可能)
- OSC Address Scope で不要なメッセージを除外して受信頻度自体を下げる
- 履歴が不要なら Callbacks DAT で即座に処理してから Clear Output で履歴を破棄
❌ Problem: Callbacks DAT のコールバックで処理が重く、フレーム落ちする
✅ Solution:
- コールバック内ではメインスレッドの重い処理を避ける
run('...', delayFrames=1)で遅延実行に逃がす- 受信頻度自体を OSC Address Scope で絞る
参考資料 📚
公式リソース 📖
- TouchDesigner公式ドキュメント – OSC In DAT
- DAT概要ページ
- Network Protocols(UDP / Multicast / UDT 解説)
- oscinDAT_Class(Python API 一覧)
- OSC – Open Sound Control 仕様


