
概要 📖 – 前フレームの値を循環させる
Feedback CHOPは、前フレームの出力チャンネルを参照して循環ループを構築できる CHOPです。通常の CHOP 直結では作れない再帰的な参照をフレーム遅延付きで成立させ、累積処理・IIR スムージング・状態保持などを実現します。
主な用途 🎯
- 前フレームの出力値を再帰的に取り込むフィードバックループの構築
- 累積カウンタ・積分器・状態保持などの履歴依存処理
- IIR 風のスムージング(前回値と現在値のブレンド)
- パーティクル・物理シミュレーションの内部状態の保持
- Reset / Reset Pulse による状態リセット制御
データフロー 🔄
入力: 初期値チャンネル
↓
Feedback CHOP(前フレーム値を取り込み)
↓
演算ノード(Math / Logic / Filter 等)
↓
再び Feedback CHOP の参照先(ループ)
↓
出力: 履歴依存の状態値
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Feedback Page 🔁
Output .output 📤
Feedback CHOP がフィードバック先からどのタイミングのチャンネル値を取得するかを決めるメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Previous Channels at Previous Time | .previous |
前回クック時のチャンネル値を、前フレームのタイムスタンプで取得 |
| Previous Channels at Current Time | .shift |
前回クック時のチャンネル値を、現在のタイムスタンプにシフトして取得 |
| Last Sample at Current Time | .sample |
前回クック時の最終サンプル 1 つだけを取得(時系列を持たない単発値) |
Delta Time .delta ⏱️
Delta Time .delta ⏱️
– オン: 出力チャンネルに dt という追加チャンネルを付与し、前回クックからの経過時間を秒単位で格納
– 積分器・物理シミュレーションでフレームレート非依存の更新量を計算したいときに利用
Reset .reset 🛑
Reset .reset 🛑
– 値が 0 のときフィードバックが有効(前フレームのチャンネルを取り込み続ける)
– 値が 1 のときフィードバックが無効化され、入力に接続された CHOP の値がそのまま通過する
Reset Pulse .resetpulse 💥
Reset Pulse .resetpulse 💥
– クリックすると 1 フレームだけフィードバックを初期状態に戻すパルスパラメータ
– インタラクションのリセットボタン・周期リセット・エラー復帰などの起点として使用
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: 累積カウンタ(フレーム数を加算し続ける) 🧮
Constant CHOP (1) → Math CHOP (Add) ← Feedback CHOP → 出力
Feedback CHOP の最も基本的な用途。前フレームの自分の値に毎フレーム +1 を加えて、起動からの累積フレーム数をチャンネルとして保持します。
- Constant CHOP で値
1のチャンネルを 1 つ用意 - Math CHOP の Combine CHOPs を Add に設定し、Constant CHOP と Feedback CHOP の出力を入力に接続
- Feedback CHOP の Feedback Op パラメータを Math CHOP に向ける(再帰参照を成立)
- Reset Pulse をクリックすると累積値が 0 にリセットされる
Example 2: IIR 風スムージング(前回値とのブレンド) 📉
Serial CHOP → Math CHOP (Multiply 0.1) → Math CHOP (Add) ← Feedback CHOP (Multiply 0.9) → 出力
前回出力値 × 0.9 + 現在入力 × 0.1 の係数ブレンドで、低コストな IIR スムージングを実装します。Filter CHOP より細かい時定数調整が可能です。
- 現在入力に
0.1の係数を掛ける(Math CHOP の Multiply) - Feedback CHOP の出力に
0.9の係数を掛ける(別 Math CHOP) - Math CHOP の Combine CHOPs Add で 2 つを合算
- 結果を Feedback CHOP の Feedback Op として参照、係数の合計が
1.0になっていれば発散しない
Example 3: 簡易積分器(Delta Time でフレームレート非依存) 🎯
速度チャンネル → Math CHOP (Multiply by dt) → Math CHOP (Add) ← Feedback CHOP (Delta Time on) → 位置チャンネル
Feedback CHOP の Delta Time をオンにすると dt チャンネルが追加され、速度に dt を掛け前フレーム位置に足すことで、フレームレート変動の影響を受けない物理積分が成立します。
- Feedback CHOP の Delta Time を オン
- 速度チャンネルに
dtを Math CHOP(Combine Channels: Multiply)で掛ける - 結果を前フレーム位置(Feedback の出力)に Add で加算
- 30fps から 120fps に変動しても積分速度が変わらない
関連オペレータ 🔗
類似機能OP 🔍
- Delay CHOP — 信号を一定時間遅延させる、循環参照ではなく単方向の遅延
- Hold CHOP — トリガで値を保持、状態保持目的だが循環ループは持たない
組み合わせ推奨OP 🔄
- Math CHOP — Feedback の値に演算を加える定番ペア(累積・ブレンド・積分の中核)
- Filter CHOP — Feedback ループ内のスムージング、または Feedback の代替としての FIR 平滑
- Logic CHOP — Feedback の値に閾値判定を組合せ、状態遷移を実装
- Constant CHOP — Feedback ループの初期値供給・加算定数として併用
- Trigger CHOP — Reset Pulse の代替として、特定条件でフィードバックを再起動
前処理・後処理CHOP 🎯
Info CHOP情報 📊
Feedback 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: Feedback ループが値を取り込まず、入力がそのまま通過する
✅ Solution:
- Reset パラメータが
1になっていないか確認(0でフィードバック有効) - Feedback Op パラメータでループ先 OP のパスを正しく指定しているか確認
- ループ先 OP が一度もクックされていないと初期値が空のまま、初期値供給用の Math CHOP や Constant CHOP を入力に接続
❌ Problem: 値が無限大に発散する / NaN が出る
✅ Solution:
- ブレンド係数の合計が
1.0を超えていないか確認(IIR では合計 = 1.0 が安定条件) - 前段に Limit CHOP を入れて値を有限範囲にクランプ
- Reset Pulse で初期化後、係数を見直して再起動
❌ Problem: フレームレートを変えると挙動が変わる
✅ Solution:
- Delta Time を オン にし、
dtチャンネルを使ってレート非依存に書き換え - Time Slice モードを使って前回クックからの経過時間ベースで処理
- 係数を時定数 τ から
α = dt / (τ + dt)形式に変換しフレームレート補正
❌ Problem: Output メニューの選択でループが意図通りに動かない
✅ Solution:
- 時系列を保ちたい場合は Previous Channels at Previous Time を選択(既定)
- 現在時刻に揃えたい場合は Previous Channels at Current Time に切替
- 単発の最終サンプル値だけ欲しい場合は Last Sample at Current Time を選択
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

