
概要 📖 – 共有メモリへのチャンネル書き出し
Shared Mem Out CHOPは、入力チャンネルを OS の共有メモリブロックに書き出し、外部アプリケーションや他プロセスからリアルタイムに読取可能にする CHOPです。ファイル I/O やネットワーク経由よりも低遅延でプロセス間通信を実現し、Local / Global の 2 つのメモリタイプから用途に応じて選択できます。
主な用途 🎯
- TouchDesigner と外部アプリケーション間のチャンネルデータ共有
- 同一マシン内の別プロセスへの低遅延データ転送
- 複数 TouchDesigner インスタンス間のチャンネル同期
- C++ / Python / Unity 等の外部プログラムへのリアルタイム出力
- ファイル I/O やネットワークを介さない高速プロセス間通信
データフロー 🔄
入力: チャンネルデータ
↓
Active によるクック制御
↓
Shared Mem Name で識別される共有メモリ領域
↓
Local / Global メモリタイプの選択
↓
出力: OS 共有メモリブロック (外部プロセスから読取可能)
Tips
初心者の方は、以下日本語書籍も手元にあると安心です。
リンク
リンク

まる。
実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
SharedMemOut Page 📋
Active .active 🟢
共有メモリ書き込みの有効化:
- Active: オン時に CHOP が入力をクックして共有メモリブロックへ書き込む。オフ時は書き込みを停止し、外部プロセスから読まれる値は固定される
Shared Mem Name .name 🏷️
共有メモリブロックの識別名:
- Shared Mem Name: 書き込み対象の共有メモリブロック名。読取側 (外部アプリや Shared Mem In CHOP) と同じ名前を指定することで接続される
Shared Mem Type .memtype 🗂️
ローカル共有メモリとグローバル共有メモリの切替メニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Local | .local |
指定名ごとに固有の共有メモリセグメントを使用。TouchDesigner 以外のアプリケーションとデータを共有する場合は必ずこのモードを使う |
| Global | .global |
全ノードが共通の共有メモリセグメントを読み書きするモード。詳細は Global Shared Memory の公式ドキュメントを参照 |
Common Page 🔧
Time Slice .timeslice ⏱️
Time Slice モードの強制設定:
- オン: チャンネルを「タイムスライス」モードに強制
- タイムスライス: 前回のクックフレームから現在のクックフレームまでの時間
Scope .scope 🎯
影響を受けるチャンネルの絞り込み:
- Scope 文字列: 影響を受けるチャンネルを指定する文字列
- パターンマッチング:
*や[1-10]等のパターンが使用可能
Sample Rate Match .srselect ⚡
複数の入力 CHOP のサンプルレートが異なる場合の処理方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Resample At First Input’s Rate | .first |
最初の入力のレートで他をリサンプル |
| Resample At Maximum Rate | .max |
最高サンプルレートでリサンプル |
| Resample At Minimum Rate | .min |
最低サンプルレートでリサンプル |
| Error If Rates Differ | .err |
レート不一致でエラー |
Export Method .exportmethod 📤
CHOP チャンネルをパラメータに接続する方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| DAT Table by Index | .datindex |
DAT テーブルのインデックスでチャンネルとパラメータを対応付け |
| DAT Table by Name | .datname |
DAT テーブルの行名でチャンネルとパラメータを対応付け |
| Channel Name is Path:Parameter | .autoname |
チャンネル名を `path:parameter` 形式で記述し直接対応付け |
Export Root .autoexportroot 🌳
Channel Name is Path:Parameter モード時のパス基点:
- Export Root パス:
autonameモードでチャンネル名のパス部分を相対化する基点 OP のパス
Export Table .exporttable 📋
DAT Table エクスポート方式での参照 DAT:
- Export Table DAT:
datindex/datnameモード時に参照する DAT のパス
Rename from .commonrenamefrom 🔤
リネーム対象チャンネルのパターン:
- Rename from パターン: リネーム対象とするチャンネル名のパターンマッチング文字列
Rename to .commonrenameto 🔁
リネーム後の置換パターン:
- Rename to パターン: Rename from にマッチしたチャンネルの新しい名前パターン (デフォルトはリネームなし)
実践アイデア 💡
Example 1: 外部Pythonへチャンネルを送信 🐍
Constant CHOP → Math CHOP → Shared Mem Out CHOP (Local, name='td_to_python') → 外部 Python プロセス
- Constant CHOP / Math CHOP 等で送信したいチャンネルを構成
- Shared Mem Out CHOP を接続し、Shared Mem Name を
td_to_pythonに設定 - Shared Mem Type を Local に設定 (外部アプリ連携の必須条件)
- 外部 Python 側で同名の共有メモリブロックを開いてチャンネル値を読み取る
Example 2: 2つのTD間でチャンネル同期 🔗
TD #1: Audio Device In CHOP → Shared Mem Out CHOP → 共有メモリ → TD #2: Shared Mem In CHOP
- 送信側 TD で Shared Mem Out CHOP に Shared Mem Name
audio_busを設定 - 受信側 TD で同名の Shared Mem In CHOP を配置
- Shared Mem Type は両側で同じものを選択 (Local 同士、または Global 同士)
- ネットワーク経由よりも低遅延でチャンネルが共有される
Example 3: Active で出力を一時停止して値をフリーズ ⏸️
Serial CHOP → Shared Mem Out CHOP (Active toggle) → 外部読取側
- Shared Mem Out CHOP の Active をオフに切り替え
- オフ中は共有メモリ書き込みが停止し、最後の値が外部プロセスから読まれ続ける
- デバッグ時や一時停止が必要な場面で入力変動から切り離せる
- Active を再度オンにすると最新値の書き込みが再開される
関連オペレータ 🔗
類似機能OP 🔍
- Shared Mem In CHOP — 対となる読取側 CHOP、同じ Shared Mem Name で接続する
- OSC Out CHOP — ネットワーク経由でチャンネルを送信、別マシン宛にも到達可能
- Pipe Out CHOP — TCP/IP パイプ経由でチャンネル送信、別マシン間通信向け
組み合わせ推奨OP 🔄
- Math CHOP — 送信前のスケーリングや正規化に併用
- Filter CHOP — ノイズの多い信号を平滑化してから共有メモリへ書き出し
- Select CHOP — 送信したいチャンネルだけを抽出してメモリ帯域を節約
- Rename CHOP — 外部プロセス側の命名規則に合わせてチャンネル名を整形
- Constant CHOP — 固定値テスト送信や初期化用の上流ソース
前処理・後処理CHOP 🎯
Info CHOP情報 📊
Shared Mem Out CHOPは Info CHOP による詳細情報取得に対応しています。
CHOP固有情報 🎚️
start: CHOPインターバルの開始(サンプル単位)length: CHOPのサンプル数sample_rate: フレーム毎秒のサンプルレートnum_channels: CHOPのチャンネル数time_slice: タイムスライス有効時は1、無効時は0export_sernum: Export接続の更新回数
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間(ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: 外部プロセスから値を読み取れない
✅ Solution:
- Shared Mem Name が送信側と受信側で完全一致しているか確認 (大文字小文字も区別)
- Shared Mem Type が両側で同じか確認 (Local 同士、または Global 同士)
- TouchDesigner 以外のアプリケーションと共有する場合は必ず Local モードを使用
❌ Problem: Active をオフにしても外部側で古い値が読まれ続ける
✅ Solution:
- これは仕様で、Active オフ時は共有メモリ書き込みが停止し最後の値が残る
- 完全に出力を消したい場合は前段に Math CHOP を入れて値をゼロ化してから送る
- 受信側の Shared Mem In CHOP 側で Active をオフにして読み取りを停止することも可能
❌ Problem: Global モードで他ノードと値が混線する
✅ Solution:
- Global は全ノードが共通セグメントを共有するため、Shared Mem Name の重複が即座に衝突する
- 用途ごとに一意な Shared Mem Name を割り当てるか、Local モードに切替
- 外部アプリ連携用途では必ず Local モードを選択して衝突を回避
❌ Problem: チャンネル数やサンプルレートが変動すると外部側が破綻する
✅ Solution:
- 前段に Resample CHOP を入れてサンプルレートを固定
- Select CHOP でチャンネル数を固定化
- 外部側のバッファサイズ前提と Shared Mem Out 出力の構造を一致させる
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

