
概要 📖 – C++ プラグインによるカスタム CHOP 拡張
CPlusPlus CHOPは、C++ で記述したプラグインを読み込み、独自のチャンネル生成・演算ロジックを実行する CHOPです。コンパイル済みの .dll / .plugin を Plugin Path に指定し、Re-Init / Unload で動的に再ロードできます。
主な用途 🎯
- C++ で記述したカスタム CHOP プラグイン(.dll / .plugin)の読み込みと実行
- 高速な数値演算・DSP 処理を Python より低オーバーヘッドで実装
- 外部 SDK(OpenCV / Eigen / FFTW 等)と TouchDesigner の橋渡し
- 独自ハードウェア(センサー・通信デバイス)との低レベル統合
- リアルタイム性が要求される信号処理パイプラインの最適化
データフロー 🔄
入力: 任意の上流 CHOP(ある場合)
↓
C++ プラグイン本体(execute/getOutputInfo等のコールバック)
↓
出力: プラグインが生成したチャンネル
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Load Page 📋
Plugin Path .plugin 📂
ロードしたい C++ プラグインのファイルパス:
- Plugin Path: ロードしたい C++ プラグインのファイルパスを指定
Re-Init Class .reinit 🔄
Re-Init Class .reinit 🔄
– オンにするとプラグインが生成したクラスインスタンスを破棄し、新規インスタンスを再生成
– 内部状態をリセットしたい場合に使用
Re-Init Class (pulse) .reinitpulse ⚡
– パルスボタン: 1 回押下で即座にクラスを再初期化
– トグル状態を保持せず、ワンショットで再初期化したい場合に使用
Unload Plugin .unloadplugin 🚪
Unload Plugin .unloadplugin 🚪
– パラメータ値が 1 を超えるとクラスインスタンスを破棄しプラグインをアンロード
– 同じプラグインを複数の CPlusPlus CHOP がロードしている場合は、すべての CHOP がアンロードしないとファイルが解放されません
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: 高速 DSP プラグインによる音声処理 🎵
Audio Device In CHOP → CPlusPlus CHOP (custom DSP plugin) → Audio Device Out CHOP
Python ベースの Script CHOP では追従できない高サンプルレート(48kHz 以上)の音声 DSP を、C++ プラグインで実装し低レイテンシで処理する事例。FFT・畳み込み・IIR フィルタ等を SIMD 最適化済みコードで実行できる。
- Visual Studio / clang で
.dllプラグインをコンパイル(Derivative 公式 SDK サンプル準拠) Plugin Pathにコンパイル成果物の絶対パスを指定- Audio Device In CHOP の出力を CPlusPlus CHOP に接続
Re-Init Classでパラメータ変更時にインスタンスを再生成
Example 2: 外部 SDK(OpenCV / Eigen)との連携 🔬
Serial CHOP → CPlusPlus CHOP (OpenCV linkage) → 解析チャンネル
OpenCV や Eigen 等の C++ 数値計算ライブラリを CPlusPlus CHOP プラグインにリンクし、TouchDesigner ネイティブには無い行列演算・特徴量抽出を CHOP チャンネルとして取り出す事例。
- プラグインプロジェクトに OpenCV / Eigen を静的リンク
executeコールバック内で入力チャンネルを行列に変換し演算- 結果を
getOutputInfoで宣言したチャンネル数に書き戻す
Example 3: 独自ハードウェア通信ブリッジ 🔌
独自デバイス → CPlusPlus CHOP (ベンダー SDK ラップ) → 制御チャンネル
ベンダー提供の C++ SDK しか持たない計測・通信デバイスを、CPlusPlus CHOP プラグインで包み込み TouchDesigner 上の通常のチャンネルとして扱う事例。
- ベンダー SDK のヘッダ・ライブラリをプラグインプロジェクトに取り込む
- デバイス初期化を
getOutputInfo等のライフサイクルコールバックで実行 Unload Pluginでデバイスを安全にクローズし再ロード可能にする
関連オペレータ 🔗
類似機能OP 🔍
- Script CHOP — Python でカスタム CHOP ロジックを記述(C++ より高レイヤ)
組み合わせ推奨OP 🔄
- Info CHOP — プラグインの cook 状況・チャンネル数などを監視
- Trigger CHOP — プラグイン側のイベント出力からエンベロープを起動
- Math CHOP — プラグイン出力を後段で正規化・スケーリング
前処理・後処理CHOP 🎯
Info CHOP情報 📊
CPlusPlus 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:
Plugin Pathが絶対パスで、対象.dll/.pluginが実在するか確認- プラグインのビルド構成(x64 / Release)が TouchDesigner 本体と一致しているか確認
- Derivative 公式 SDK のサンプル
CHOP_CPlusPlusBase派生クラスとして適切にエクスポートされているか確認
❌ Problem: プラグインを再コンパイルしても変更が反映されない
✅ Solution:
Unload Pluginを 1 以上にしてプラグインを解放してから再ビルドする- 同じプラグインを複数の CPlusPlus CHOP で参照している場合は、全インスタンスでアンロードする
Re-Init Class (reinitpulse)でクラスインスタンスのみリセットする
❌ Problem: 出力チャンネル数 / 名前が想定と違う
✅ Solution:
- プラグイン側
getOutputInfoでチャンネル数・サンプル数を正しく宣言しているか確認 getChannelNameで各チャンネル名を割り当てているか確認- 後段でInfo CHOPを接続して
num_channelsを確認
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

