
概要 📖 – 共有メモリからのチャンネル読み込み
Shared Mem In CHOPは、名前付き共有メモリブロックからチャンネルデータを読み込んで出力する CHOPです。Local モードでは TouchDesigner 外部のアプリケーション(C++ / Python / Unity / Unreal 等)と、Global モードでは複数 TouchDesigner プロセス間でチャンネルを受け渡しできます。
主な用途 🎯
- 外部アプリケーションが書き込んだ共有メモリブロックからチャンネルデータを読み込み
- TouchDesigner プロセス間でのチャンネル受け渡し(Global モード)
- C++ / Python / Unity / Unreal 等の外部プログラムからのリアルタイムデータ取得(Local モード)
- OSC や TCP より低レイテンシな同マシン内チャンネル転送
- センサー値・解析結果・パラメータの共有メモリ経由ブリッジ
データフロー 🔄
入力: 外部プロセスが書き込んだ共有メモリブロック
↓
メモリブロック名で識別
↓
Shared Mem Type(Local / Global)の選択
↓
出力: チャンネルデータ(書き込み側が定義したサンプル長・チャンネル数)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
SharedMemIn Page 📋
Active .active ✅
共有メモリ読み込みの有効化:
- Active: オンの間 CHOP がクックされ、共有メモリブロックから値を読み込みます。オフにすると最後の値を保持したまま停止します
Shared Mem Name .name 🏷️
共有メモリブロックの識別名:
- Shared Mem Name: 読み込み元となる共有メモリブロックの識別名。書き込み側(外部アプリ or Shared Mem Out CHOP)と同じ名前を指定します
Shared Mem Type .memtype 🔀
共有メモリの種類(Local / Global)を選択するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| Local | .local |
指定名専用の共有メモリセグメントを使用。TouchDesigner 以外のアプリケーション(C++ / Python / Unity / Unreal 等)とデータをやり取りする場合はこのモードを使用 |
| Global | .global |
複数の Shared Mem ノードが共通の共有メモリセグメントを参照するモード。同 TouchDesigner 内・複数 TouchDesigner プロセス間でのデータ共有に使用 |
※ 注意: Local モードは TouchDesigner 外部アプリケーションとのデータ共有時の必須モード。書き込み側と読み込み側で同じ Shared Mem Name + 同じ Shared Mem Type を指定しないとデータが受け渡されません。
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 プロセスからのリアルタイムデータ取り込み 🐍
External Python (numpy → shared memory) → Shared Mem In CHOP (Local) → Visualizer
- 外部 Python スクリプト側で
multiprocessing.shared_memory等を使い共有メモリブロックを作成 - Shared Mem In CHOP の Shared Mem Type を「Local」に設定
- Shared Mem Name を Python 側と同じ名前に揃える
- Active をオンにしてチャンネルデータを取得、後段の Math CHOP で正規化してビジュアライザへ
Example 2: 複数 TouchDesigner プロセス間でのチャンネル共有 🔗
TouchDesigner A (Shared Mem Out CHOP) → 共有メモリ → TouchDesigner B (Shared Mem In CHOP, Global)
- プロセス A 側で Shared Mem Out CHOP を配置し Shared Mem Type を「Global」に設定
- プロセス B 側に Shared Mem In CHOP を配置し同じ Name + Global を指定
- プロセス A の Active をオンにして書き込みを開始、B の Active もオンに
- プロセス間で同じチャンネルデータがリアルタイムに流れる構成が完成
Example 3: Unity / Unreal からのセンサーデータ受け取り 🎮
Unity/Unreal (C++ プラグイン) → 共有メモリ → Shared Mem In CHOP (Local) → CHOP 解析
- Unity / Unreal 側で C++ プラグインから共有メモリセグメントを作成・書き込み
- Shared Mem In CHOP の Shared Mem Type を「Local」に固定(外部アプリ連携は必須)
- Active をオンにしてデータ取得、Analyze CHOP で統計値を抽出
- ゲームエンジン内のセンサー値・トランスフォーム値を TouchDesigner 演出に即時反映
関連オペレータ 🔗
類似機能OP 🔍
- Shared Mem Out CHOP — 対となる書き込み側 CHOP
- OSC In CHOP — ネットワーク経由で同等のチャンネル受信を行う代替手段
- Pipe In CHOP — ローカルマシン内 IPC のもうひとつの選択肢
組み合わせ推奨OP 🔄
- Math CHOP — 受け取った値の正規化・スケーリング後段
- Filter CHOP — 外部プロセスからのノイズ含みデータの平滑化
- Analyze CHOP — 共有メモリ経由で取得したデータの統計値抽出
- Null CHOP — 外部から流れ込むチャンネルの接続点として配置
前処理・後処理CHOP 🎯
Info CHOP情報 📊
Shared Mem In 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: チャンネルデータが取得できない / 全て 0 が出力される
✅ Solution:
- 書き込み側と読み込み側で
Shared Mem Nameが完全一致しているか確認(大文字小文字含む) - Shared Mem Type が両側で揃っているか確認(Local 同士 / Global 同士)
- 書き込み側プロセスが起動中かつ Active がオンになっているか確認
❌ Problem: 外部アプリケーション(C++ / Python / Unity 等)とデータが共有できない
✅ Solution:
- Shared Mem Type を必ず「Local」に設定(Global は TouchDesigner 同士専用)
- 外部アプリ側のメモリレイアウト(チャンネル数・サンプル数・データ型)が TouchDesigner 仕様と一致しているか公式 docs で確認
- OS 権限の問題で共有メモリにアクセスできない場合があるため、両プロセスを同一ユーザー権限で起動
❌ Problem: 値が更新されず古い値のまま停止する
✅ Solution:
- Active がオフになっていないか確認(オフ時は最後の値で停止)
- 書き込み側がクックされているか、Time Slice 設定が両側で一致しているか確認
- 後段に Null CHOP を挟んで値の到達を可視化
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

