
概要 📖 – 閾値カウントとイベント計数
Count CHOPは、入力チャンネル値が閾値を越えた回数をカウントし、ステート遷移ごとに任意の演算を適用する CHOPです。Trigger / Release の双方向閾値、Loop / Clamp / Zigzag の値域モード、Reset 入力による初期化を組み合わせて、UI クリック数のような単純カウントから複雑なステートマシンまで 1 オペレータで構築できます。
主な用途 🎯
- 入力チャンネル値の閾値超え検出によるイベントカウント
- ボタン押下・タップ・ジェスチャー回数のリアルタイム計数
- Loop / Clamp / Zigzag による値域の循環・固定処理
- Off→On / On→Off / While On / While Off の各状態遷移ごとに異なる演算を割り当てるステートマシン構築
- Reset 入力と Reset Value による任意タイミングのカウンタ初期化
データフロー 🔄
入力: チャンネル値
↓
Trigger Threshold 超過判定(増加 / 減少スロープ)
↓
Off→On / While On / On→Off / While Off の各遷移演算
↓
Limit(Loop / Clamp / Zigzag)で値域処理
↓
Reset 入力で初期化
↓
出力: カウント値
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Trigger Page 🎯
閾値パラメータ 📏
Release = Trigger Threshold .threshold 🔗
– オン: Trigger Threshold を Release Threshold としても兼用(単一閾値モード)
– オフ: Trigger / Release を別々の値で設定可能(ヒステリシス付き判定)
Trigger Threshold .threshup ⬆️
– カウント発火の基準となるチャンネル値
– この値を超えると trigger イベントが発生
Release Threshold .threshdown ⬇️
– チャンネル値がこの値を下回ると release イベントが発生
– Release = Trigger Threshold がオフのときのみ有効
Re-Trigger Delay .retrigger ⏳
– 一度 trigger が発生してから次の trigger を受け付けるまでの待機時間
– チャタリング(連続誤発火)を抑制するためのデバウンス用途に有効
Re-Trigger Delay Unit .retriggerunit ⏲️
– Re-Trigger Delay の単位(Frames / Seconds / Samples)
Trigger On .triggeron 🎚️
閾値通過のどちらの方向で trigger を発火させるかを決定するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Increasing Values | .increase |
チャンネル値が上昇しながら閾値を越えるときに trigger(release は逆方向) |
| Decreasing Values | .decrease |
チャンネル値が下降しながら閾値を越えるときに trigger(release は逆方向) |
Count Page 🔢
Limit .output 🚧
カウント値が Min / Max を超えたときの処理方法を選択するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
値域制限なし(カウントは無制限に増減) |
| Loop Min/Max | .loop |
Min と Max の間でループ(最大に達したら最小に戻る) |
| Clamp Min/Max | .min |
Min / Max でクランプ(範囲外では値を保持) |
| Loop Min, Clamp Max | .lc |
下限はループ、上限はクランプ |
| Clamp Min, Loop Max | .cl |
下限はクランプ、上限はループ |
| Zigzag Min/Max | .zigzag |
Min / Max の間で折り返し(端点で方向反転) |
値域パラメータ 📐
Limit Minimum .limitmin ⬇️
– カウント値の下限(Limit が Off 以外のときに有効)
Limit Maximum .limitmax ⬆️
– カウント値の上限(Limit が Off 以外のときに有効)
Off to On .offtoon 🔼
trigger イベント(off→on の遷移)が発生した瞬間に実行する演算
| 項目 | 内部名 | 説明 |
|---|---|---|
| None | .none |
何もしない |
| Increase Count | .inc |
カウントを 1 増やす(最頻出: ボタン押下回数の計測等) |
| Decrease Count | .dec |
カウントを 1 減らす |
| Increase Count by Time | .inctime |
経過時間ぶんカウントを増やす |
| Decrease Count by Time | .dectime |
経過時間ぶんカウントを減らす |
| Reset Count to Zero | .reset |
カウントをゼロに戻す |
While On .on 🟢
入力が trigger 状態(on)を維持している間に毎フレーム実行する演算
| 項目 | 内部名 | 説明 |
|---|---|---|
| None | .none |
何もしない |
| Increase Count | .inc |
毎フレームカウントを 1 増やす |
| Decrease Count | .dec |
毎フレームカウントを 1 減らす |
| Increase Count by Time | .inctime |
経過時間ぶんカウントを増やす(押し続けによる連続加算に有効) |
| Decrease Count by Time | .dectime |
経過時間ぶんカウントを減らす |
| Reset Count to Zero | .reset |
カウントをゼロに戻す |
On to Off .ontooff 🔽
release イベント(on→off の遷移)が発生した瞬間に実行する演算
| 項目 | 内部名 | 説明 |
|---|---|---|
| None | .none |
何もしない |
| Increase Count | .inc |
カウントを 1 増やす |
| Decrease Count | .dec |
カウントを 1 減らす |
| Increase Count by Time | .inctime |
経過時間ぶんカウントを増やす |
| Decrease Count by Time | .dectime |
経過時間ぶんカウントを減らす |
| Reset Count to Zero | .reset |
カウントをゼロに戻す |
While Off .off ⚪
入力が trigger されていない(off)間に毎フレーム実行する演算
| 項目 | 内部名 | 説明 |
|---|---|---|
| None | .none |
何もしない |
| Increase Count | .inc |
毎フレームカウントを 1 増やす |
| Decrease Count | .dec |
毎フレームカウントを 1 減らす |
| Increase Count by Time | .inctime |
経過時間ぶんカウントを増やす |
| Decrease Count by Time | .dectime |
経過時間ぶんカウントを減らす |
| Reset Count to Zero | .reset |
カウントをゼロに戻す |
Reset Condition .resetcondition 🔁
Reset 入力(第 2 入力)の状態がチャンネル初期化を引き起こす条件
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off to On | .offtoon |
Reset 入力が off→on に遷移した瞬間にリセット |
| While On | .on |
Reset 入力が on の間リセット値を保持(off に戻るまで動かない) |
| On to Off | .ontooff |
Reset 入力が on→off に遷移した瞬間にリセット |
| While Off | .off |
Reset 入力が off の間リセット値を保持(on に戻るまで動かない) |
Reset パラメータ ♻️
Reset Value .resetvalue 0️⃣
– リセット時にチャンネルへ書き込まれる値(既定 0)
Reset .reset ⏸️
– On の間 Reset Value で固定し、Off に戻るまでカウントを再開しない
Reset Pulse .resetpulse ⚡
– クリックすると即座に Reset Value で初期化(パルス動作)
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: ボタン押下回数のカウント 🖱️
Mouse In CHOP → Math CHOP (閾値前処理) → Count CHOP (Off to On = Increase Count) → 表示
- Mouse In CHOP で左ボタン信号を取得
- Count CHOP の Trigger Threshold を 0.5、Off to On を「Increase Count」に設定
- Re-Trigger Delay を 0.05 秒前後に設定してチャタリングを防止
- 出力チャンネルが押下回数として 1 サンプル単位で増加していく
Example 2: 音声ピーク数のリアルタイム計測 🎙️
Audio Device In CHOP → Analyze CHOP (RMS Power) → Count CHOP (Trigger Threshold + Loop) → 出力
- Audio Device In CHOP でマイク音を取得
- Analyze CHOP の Function を「RMS Power」に設定して音量レベルを 1 サンプル化
- Count CHOP の Trigger Threshold を環境ノイズより高い値に設定
- Limit を「Loop Min/Max」、Min=0 / Max=10 に設定して 0〜10 を循環するヒットカウンタを構成
Example 3: Zigzag モードによる往復アニメーション制御 🎞️
LFO CHOP → Count CHOP (Limit = Zigzag, While On = Increase by Time) → Lookup → アニメ
- LFO CHOP の出力を入力に接続
- Count CHOP の Limit を「Zigzag Min/Max」、Min=0 / Max=1 に設定
- While On を「Increase Count by Time」に設定
- 出力値が 0↔1 を周期的に往復し、Lookup CHOP のインデックスとして滑らかな往復モーションを生成
関連オペレータ 🔗
類似機能OP 🔍
- Trigger CHOP — 閾値通過時にエンベロープを発火(カウントではなく波形生成に特化)
- Logic CHOP — 閾値判定と論理演算(AND / OR)に特化、累積カウントは持たない
組み合わせ推奨OP 🔄
- Logic CHOP — 前段で複数信号の AND / OR を取って Count に渡す
- Math CHOP — Count 出力をスケーリングして UI / アニメに割り当て
- Trigger CHOP — Count の節目(Limit Maximum 到達等)でエンベロープを発火
- Analyze CHOP — 音声ピーク検出と組み合わせ閾値超過回数を集計
- Lookup CHOP — Count の整数値をインデックスにテーブル参照
前処理・後処理CHOP 🎯
Info CHOP情報 📊
Count 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: 1 回の押下でカウントが複数回増えてしまう(チャタリング)
✅ Solution:
- Re-Trigger Delay を 0.05〜0.2 秒程度に設定して連続発火を抑制
- Release = Trigger Threshold をオフにして、Trigger / Release に異なる閾値を設定(ヒステリシス付き判定)
- 前段に Filter CHOP を入れて入力波形を平滑化
❌ Problem: Limit を設定したのに値域が想定どおり制御されない
✅ Solution:
- Limit が「Off」のままだと Min / Max は無視される。「Loop Min/Max」「Clamp Min/Max」「Zigzag Min/Max」のいずれかに切替
- Limit Minimum と Limit Maximum の大小関係を確認(Min < Max が必須)
- 整数カウントを期待している場合、後段の Math CHOP で Integer = Round / Floor / Ceiling に丸める
❌ Problem: Reset 入力に信号を送ってもカウントが初期化されない
✅ Solution:
- Reset Condition の選択を確認(Off to On / While On / On to Off / While Off で挙動が大きく異なる)
- Reset Value にカウント開始値を明示的に設定(既定 0 で問題ないが、別値からスタートしたいときは要設定)
- 即座に強制初期化したい場合は Reset Pulse パラメータをクリック(パルス動作)
❌ Problem: Off to On / While On 等を設定しても全くカウントしない
✅ Solution:
- 入力チャンネル値が Trigger Threshold を実際に越えているか Analyze CHOP や CHOP Viewer で確認
- Trigger On が「Increasing Values」のとき、入力が下降スロープでは発火しない(必要なら「Decreasing Values」に切替)
- Reset パラメータが On のままになっていないか確認(On の間はカウント停止)
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

