
概要 📖 – 双方向バインドによる値同期
Bind CHOPは、複数の入力チャンネル間で値を双方向にバインドし、いずれかの変更を他方へ即時反映する CHOPです。Match by で対応付け方式を選び、Pickup と Callbacks DAT で物理コントローラとの段差吸収・変更検知ハンドリングを実現します。
主な用途 🎯
- 複数 UI / パラメータ間の双方向バインドによる値同期
- UI スライダーと内部パラメータの一対多リンク
- 変更検知とコールバック起動による状態管理
- Pickup モードによる物理コントローラの値段差吸収
- Python スクリプトと連携した値変更イベント処理
データフロー 🔄
入力: 複数 CHOP のチャンネル値
↓
Match by によるチャンネル対応付け
↓
Pickup 判定 (値の交差検知)
↓
値同期 / Callbacks DAT 起動
↓
出力: バインドされたチャンネル
Tips
初心者の方は、以下日本語書籍も手元にあると安心です。
リンク
リンク

まる。
実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Bind Page 📋
Match by .match 🔍
複数入力間でチャンネルをどう対応付けるか
| 項目 | 内部名 | 説明 |
|---|---|---|
| Channel Number | .index |
チャンネルのインデックス順で対応付け |
| Channel Name | .name |
チャンネル名で対応付け |
Channel Pickup .pickup 🎯
オン時、入力値が現在の出力値を「跨ぐ」までチャンネル値が更新されない (物理コントローラの段差吸収用)
| 項目 | 内部名 | 説明 |
|---|---|---|
| Channel Pickup | .pickup |
オン: 入力側の変化値が現在の出力値と交差するまで更新を抑制し、フィジカルフェーダー / ノブの位置不一致による値ジャンプを防ぐ。オフ: 即時反映 (デフォルト)。 |
Callbacks DAT .callbacks 📜
チャンネル値変更時に呼ばれる Python コールバックを記述する DAT のパス
| 項目 | 内部名 | 説明 |
|---|---|---|
| Callbacks DAT | .callbacks |
値変更が発生したとき、参照先 DAT 内の Python コールバック関数が呼ばれ、変更元 (どの入力から発生したか) を判定して任意のスクリプト処理を実行できる。 |
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: UI スライダーと内部パラメータの双方向同期 🎚️
Slider COMP → Bind CHOP ← Constant CHOP (内部値) → Export to target parameter
- Slider COMP の出力チャンネルと Constant CHOP を Bind CHOP に接続
- Match by を
Channel Nameに設定して名前で対応付け - どちらか一方を変更しても他方が自動追従、UI ↔ 内部値が常に同期
- Bind CHOP の出力をターゲットパラメータに Export して制御を完結
Example 2: MIDI フェーダーと Pickup モードによる段差吸収 🎛️
MIDI In CHOP → Bind CHOP (Pickup ON) → 内部パラメータ
- MIDI In CHOP からハードウェアフェーダーの値を取得
- Bind CHOP の Channel Pickup をオンに設定
- Project ロード時にフェーダー位置と内部値が乖離していても、フェーダーが内部値を「跨いだ」瞬間からのみ追従開始
- 値ジャンプを起こさず物理コントローラとの整合を保つ
Example 3: Callbacks DAT による変更検知とログ記録 📝
Multiple CHOPs → Bind CHOP (Callbacks DAT) → Python script → Logger
- Bind CHOP に複数の入力 CHOP を接続
- Callbacks DAT に Python の
onValueChange関数を実装 - 値変更が発生するたびに変更元・新旧値が引数として渡される
- ログ出力 / OSC 送信 / 状態遷移トリガなどの後続処理を起動
関連オペレータ 🔗
類似機能OP 🔍
- Constant CHOP — 固定値の保持に特化、双方向バインドや Pickup は不可
- Null CHOP — 値のパススルーと参照ポイントとして使用、変更検知機能はなし
組み合わせ推奨OP 🔄
- Constant CHOP — Bind の入力ソースとして内部状態保持に組合せ
- MIDI In CHOP — ハードウェアコントローラと UI のバインド (Pickup と相性良)
- OSC In CHOP — ネットワーク経由の値同期で双方向バインド
- Trigger CHOP — Callbacks DAT 内から Trigger CHOP を起動して連鎖イベント
- Filter CHOP — Bind 後段でスムージングして UI 反映の角を取る
前処理・後処理CHOP 🎯
- 前処理: Constant CHOP、MIDI In CHOP、OSC In CHOP、Filter CHOP
- 後処理: Null CHOP、Trigger CHOP、Math CHOP、Switch CHOP
Info CHOP情報 📊
Bind 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:
- Match by の設定が
Channel Nameなのに入力チャンネルの名前が一致していない可能性、まずは名前を揃えるかChannel Numberに切替 - 前段に Rename CHOP を入れてチャンネル名を統一
- Common Page の Scope でチャンネルが除外されていないか確認
❌ Problem: Pickup モードで値が動かない
✅ Solution:
- 現在の出力値と入力値の乖離が大きく、入力側がまだ出力値を「跨いで」いない状態 (仕様通りの挙動)
- 一度 Pickup をオフにして値を強制同期させてから再度オンに戻す運用で解消
- Pickup の必要がない用途 (内部値同士のバインド) では Pickup をオフのままにする
❌ Problem: Callbacks DAT のコールバックが呼ばれない
✅ Solution:
- Callbacks DAT のパスが正しく Bind CHOP の Callbacks DAT パラメータに指定されているか確認
- DAT 内部の関数シグネチャ (引数名・関数名) が公式テンプレートと一致しているか確認
- DAT が Text DAT 等の正しいタイプか、Python 構文エラーが出ていないかをエラーログで確認
❌ Problem: サンプルレートの異なる入力で警告が出る
✅ Solution:
- Common Page の Sample Rate Match を
Resample At First Input's Rate等に設定して明示的にリサンプル - 前段に Resample CHOP を挟みレートを統一
Error If Rates Differ設定でデバッグ時にエラーを表面化
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

