
概要 📖 – トリガーで値をサンプル&ホールド
Hold CHOPは、第 2 入力のトリガーに応じて第 1 入力のチャンネル値をサンプルし、次のサンプルまで値を保持する CHOPです。ボタン押下や閾値超えなどのイベントタイミングで信号のスナップショットを取得し、保持する用途に使います。
主な用途 🎯
- トリガー入力に応じて第 1 入力チャンネル値をサンプルし、その値を保持
- ボタン押下・閾値超え等のイベント時点の信号スナップショット取得
- 連続変化する制御信号から離散的な状態値の切り出し(サンプル&ホールド)
- センサー値の瞬時値キャプチャ(測定タイミング制御)
- マルチサンプルチャンネル全体に対する per-sample ホールド処理
データフロー 🔄
入力 1: サンプル対象チャンネル
↓
入力 2: トリガーチャンネル
↓
Sample モード判定
(Off to On / While On / On to Off / While Off / On Value Change)
↓
Hold Last / Hold per Sample 適用
↓
出力: ホールドされた値
Tips
初心者の方は、以下日本語書籍も手元にあると安心です。
リンク
リンク

まる。
実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Sample Page 📋
Sample .sample 🎛️
第 2 入力(トリガーチャンネル)の状態変化に応じて、いつ第 1 入力をサンプルするかを決定するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off to On | .offtoon |
トリガーチャンネルが 0 から正の値に立ち上がった瞬間にサンプル |
| While On | .whileon |
トリガーチャンネルが 0 より大きい間は連続的にサンプル |
| On to Off | .ontooff |
トリガーチャンネルが正の値から 0 に立ち下がった瞬間にサンプル |
| While Off | .whileoff |
トリガーチャンネルが 0 の間は連続的にサンプル |
| On Value Change | .valuechange |
トリガーチャンネルの値が変化するたびにサンプル |
Hold Last .hold 🔁
サンプリング継続 / ホールド の切替:
- オン: 入力を継続的にサンプル(パススルー的挙動)
- オフ: 最後にサンプルした値を保持(ホールドモード)
Hold Last Pulse .holdpulse 🎯
手動トリガー用パルスボタン:
- Hold Last Pulse ボタン: パルス時に入力値を即時サンプル&ホールド(手動トリガー用)
Hold per Sample .holdsamples 🔢
マルチサンプルチャンネルへの per-sample ホールド適用:
- オン: チャンネル内の各サンプル位置ごとに個別にホールド処理を適用(マルチサンプル 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: ボタン押下時の信号スナップショット 🔘
Serial CHOP → Hold CHOP (Sample: Off to On) ← Button COMP → 出力
- 第 1 入力にセンサー信号 CHOP を接続(連続値)
- 第 2 入力にボタンの On/Off チャンネルを接続
- Hold CHOP の Sample を「Off to On」に設定
- ボタンが押された瞬間のセンサー値が出力にラッチされる
Example 2: 閾値超え時のピーク値ホールド 📈
Audio Device In CHOP → Math CHOP (RMS) → Hold CHOP ← Logic CHOP (> 0.7) → ライト強度
- 音声入力を Math CHOP で RMS 値に変換
- Logic CHOP で「> 0.7」の閾値判定をトリガーチャンネルに使用
- Hold CHOP の Sample を「Off to On」、Hold Last をオフに設定
- 閾値を超えた瞬間の RMS 値がホールドされ、次の閾値超えまで保持される
Example 3: 値変化時のみ最新値を更新(On Value Change) 🔄
OSC In CHOP → Hold CHOP (Sample: On Value Change) → 表示用 CHOP
- OSC In CHOP で外部から不定期に届く制御値を受信
- 第 2 入力に同じ OSC 値、または別の更新フラグを接続
- Sample を「On Value Change」に設定し値が変化したときのみホールド更新
- 高頻度の連続値ではなく、変化があったタイミングだけを離散イベントとして取り出す
関連オペレータ 🔗
類似機能OP 🔍
- Trigger CHOP — トリガーで envelope を生成(Hold は値保持、Trigger は形状生成)
- Switch CHOP — 複数入力から 1 つを選択(Hold は単一入力のサンプル&ホールド)
組み合わせ推奨OP 🔄
- Logic CHOP — 閾値判定でトリガーチャンネルを生成し Hold へ供給
- Trigger CHOP — Hold 出力をエンベロープ起動の信号源にする
- Math CHOP — ホールド前後で値域変換やオフセット適用
- Filter CHOP — Hold の階段状出力を時間方向に滑らかに補間
- Constant CHOP — テスト用のトリガー信号源として使用
前処理・後処理CHOP 🎯
- 前処理: Logic CHOP、Math CHOP、Constant CHOP、OSC In CHOP
- 後処理: Filter CHOP、Trigger CHOP、Math CHOP、Switch CHOP
Info CHOP情報 📊
Hold 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:
- 第 2 入力にトリガーチャンネルが正しく接続されているか確認
- Sample モードと実際のトリガー信号の振る舞いが一致しているか(Off to On は立ち上がり、On to Off は立ち下がりのみ反応)
- トリガーチャンネルの値が想定通りに 0 と正値の間を動いているか Info CHOP や CHOP Viewer で確認
❌ Problem: 出力が階段状でカクカクする
✅ Solution:
- Hold は離散的サンプル&ホールド動作のため階段状になるのが正常
- 滑らかにしたい場合は後段に Filter CHOP を入れて時間方向に補間
- Sample を「While On」にすると連続サンプルになり階段が解消する場合あり
❌ Problem: マルチサンプルチャンネルで最後のサンプルしかホールドされない
✅ Solution:
- Hold per Sample をオンにしてチャンネル内の各サンプル位置ごとに個別ホールドを有効化
- オフのままだとチャンネル最後のサンプル位置のみが対象になる仕様
- Time Slice モードと組み合わせる場合は両方の設定を確認
❌ Problem: 手動でホールド値を更新したい
✅ Solution:
- Hold Last Pulse ボタンを使うとその瞬間の入力値を強制サンプル&ホールド
- テスト用途では Constant CHOP をトリガー入力にして任意のタイミングで値を切り替える
- Hold Last をオン・オフでトグルすればパススルー / ホールド を即時切替可能
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

