
概要 📖 – 論理演算と条件判定
Logic CHOPは、入力チャンネルを 0/1 にバイナリ化して論理演算(AND / OR / XOR 等)を行い、条件判定の結果を出力する CHOPです。閾値判定・エッジ検出・複数チャンネルのラジオボタン化など、制御フローの「if」を 1 オペレータで完結します。
主な用途 🎯
- チャンネル値を 0/1 のバイナリへ変換した上での論理演算(AND / OR / XOR / NAND / NOR / EQV)
- 閾値判定とトリガー生成(Off When Zero / Outside Bounds 等の条件評価)
- Rising Edge / Falling Edge 検出によるイベント駆動制御
- 複数チャンネル束のラジオボタン化(Radio Button / Last Two On)
- 値変化・チャンネル名変化のモニタリング(Value Changed / Name Changed)
データフロー 🔄
入力: チャンネルデータ
↓
Convert Input(バイナリ化)
↓
Channel Pre OP(単項論理処理)
↓
Combine Channels(チャンネル間結合)
↓
Combine CHOPs(CHOP 間結合)
↓
出力: 0/1 のチャンネル
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Logic Page 📋
Convert Input .convert 🎛️
入力チャンネル値をバイナリ(0/1)に変換する方法を決定するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off When Zero | .nonzero |
値がゼロのとき 0、非ゼロのとき 1 を返す |
| Off When Zero Or Less | .pos |
値がゼロ以下のとき 0、正のとき 1 を返す |
| Off When Outside Bounds | .bound |
値が Bounds パラメータ範囲外のとき 0、範囲内のとき 1 を返す |
| On When Value Changed | .valchange |
チャンネル値が変化したサンプルで 1 を返す |
| On When Channel Name Changed | .namechange |
チャンネル名が変化したとき 1 を返す |
Channel Pre OP .preop 🔁
Convert Input でバイナリ化した後、各サンプルに適用する単項論理演算メニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
何もしない(パススルー) |
| Invert | .invert |
0 を 1 に、1 を 0 に反転 |
| Toggle | .toggle |
入力チャンネルの 0→1 遷移ごとに、現在の状態を 0/1 で切替 |
| Radio Button | .radio |
1 入力につき同時に 1 チャンネルだけが On。他がオンになると前の On チャンネルは Off |
| Last Two On | .radio2 |
Radio Button と同じ振る舞いだが、同時に最大 2 チャンネルまで On を保持。Lag CHOP と組み合わせるとペア間ブレンドに有効 |
| Rising Edge | .rise |
チャンネルが Off → On に変化したサンプルでのみ 1 サンプル幅の On を出力 |
| Falling Edge | .fall |
チャンネルが On → Off に変化したサンプルでのみ 1 サンプル幅の On を出力 |
Combine Channels .chanop 🔗
1 つの入力 CHOP 内のチャンネル同士を結合する論理演算
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
結合しない |
| And | .and |
全チャンネルが On のときのみ 1 |
| Or | .or |
1 つでも On なら 1 |
| Exclusive Or | .xor |
ちょうど 1 チャンネルだけ On のとき 1 |
| Not And | .nand |
全チャンネルが On のときのみ 0、それ以外は 1 |
| Not Or | .nor |
1 つでも On なら 0、すべて Off のときのみ 1 |
| Equivalence | .eqv |
全チャンネルが同じ状態(全 On または全 Off)のとき 1 |
| Lowest Index On | .lowest |
On 状態のチャンネルのうち最小インデックスを返す。すべて Off なら -1 |
| Highest Index On | .highest |
On 状態のチャンネルのうち最大インデックスを返す。すべて Off なら -1 |
Combine CHOPs .chopop 🧩
複数の入力 CHOP 間で、同じインデックス(または同じ名前)のチャンネル同士を結合する論理演算
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
CHOP 間結合を行わない |
| And | .and |
全入力が On のとき 1、それ以外は 0 |
| Or | .or |
1 つでも入力が On なら 1、それ以外は 0 |
| Exclusive Or | .xor |
ちょうど 1 入力だけが On のとき 1 |
| Not And | .nand |
全入力が On のとき 0、それ以外は 1 |
| Not Or | .nor |
1 つでも入力が On なら 0、それ以外は 1 |
| Equivalence | .eqv |
全入力が同じ状態(全 On または全 Off)のとき 1 |
| Lowest Index On | .lowest |
On 状態のチャンネルのうち最小インデックスを返す。すべて Off なら -1 |
| Highest Index On | .highest |
On 状態のチャンネルのうち最大インデックスを返す。すべて Off なら -1 |
Match by .match 🔤
Combine CHOPs で複数入力のチャンネルを対応付けるときの照合方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Channel Number | .index |
入力間のチャンネルをインデックス順で対応付け |
| Channel Name | .name |
入力間のチャンネルを名前で対応付け |
Align .align 📐
開始フレームが異なる入力 CHOP 同士の整列方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Automatic | .auto |
入力に応じて自動で整列方式を選択 |
| Extend to Min/Max | .none |
全入力の最小〜最大インターバルへ延長 |
| Stretch to Min/Max | .stretch |
全入力の最小〜最大インターバルに合わせて伸縮 |
| Shift to Minimum | .start |
全入力を最小開始フレームへシフト |
| Shift to Maximum | .end |
全入力を最大終了フレームへシフト |
| Shift to First Interval | .shift1 |
1 番目の入力のインターバルへシフト |
| Trim to First Interval | .trim1 |
1 番目の入力のインターバルへ切り詰め |
| Stretch to First Interval | .stretch1 |
1 番目の入力のインターバルへ伸縮 |
| Trim to Smallest Interval | .trim |
最も短いインターバルへ切り詰め |
| Stretch to Smallest Interval | .squash |
最も短いインターバルへ伸縮 |
Bounds .bound 📊
Bounds .bound 📊
– Convert Input が Off When Outside Bounds のときに参照される下限・上限値
– 範囲内なら 1、範囲外なら 0 をバイナリ出力する
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: 閾値を超えたらトリガー 🚦
Audio Device In CHOP → Analyze CHOP (RMS Power) → Logic CHOP (Off When Outside Bounds) → Trigger CHOP
音量が一定範囲に入ったときだけ後段にイベントを送る、最も基本的な閾値判定パターン。
- Audio Device In CHOP の出力を Analyze CHOP の RMS Power に通して 1 サンプル長のレベル値を取得する
- Logic CHOP の Convert Input を
Off When Outside Boundsに設定し、Bounds に許容範囲(例: 0.2 〜 0.9)を入れる - Channel Pre OP を
Rising Edgeにして、範囲に入った瞬間だけ 1 サンプルの On パルスを出す - 後段の Trigger CHOP に渡してエンベロープを起動
Example 2: 複数ボタンのラジオボタン化 🎛️
Constant CHOP (8 ch) → Logic CHOP (Channel Pre OP=Radio Button) → Switch CHOP
8 個のボタンチャンネルを「同時に 1 つだけ On」に強制し、UI のラジオボタンとして振る舞わせる。
- Constant CHOP で 8 個のチャンネルを用意し、各ボタン UI から値を流し込む
- Logic CHOP の Channel Pre OP を
Radio Buttonに設定し、最後に On になったチャンネルだけが残るようにする - Combine Channels を
Highest Index Onにすれば、現在 On のインデックス(0〜7)が 1 チャンネルで取り出せる - そのインデックスを Switch CHOP の Index に渡してシーン切替
Example 3: 値変化のエッジ検出ログ 📝
OSC In CHOP → Logic CHOP (Convert=On When Value Changed, Pre OP=Rising Edge) → CHOP to DAT
外部からの OSC 値が変化した瞬間だけログテーブルに行を追加するイベント駆動パターン。
- OSC In CHOP で外部からの数値を受信
- Logic CHOP の Convert Input を
On When Value Changed、Channel Pre OP をRising Edgeに設定 - CHOP to DAT で 1 サンプル幅のパルスをテーブルに追記し、変化履歴をログ化
関連オペレータ 🔗
類似機能OP 🔍
- Math CHOP — 算術演算側の対概念。Logic は 0/1 のバイナリ判定、Math は連続値の演算
- Limit CHOP — 閾値処理を「クリッピング」側で行う。Logic はバイナリ化、Limit は値そのものを丸める
組み合わせ推奨OP 🔄
- Analyze CHOP — 前段で統計値(min / max / RMS)を取り、Logic で閾値判定する組合せ
- Trigger CHOP — Logic の 0→1 エッジを ADSR エンベロープのトリガーとして使用
- Switch CHOP — Combine Channels の Highest/Lowest Index On 出力で Switch のインデックスを制御
- Lag CHOP — Last Two On と組み合わせ、ペアチャンネル間の滑らかなブレンドを実現
- Math CHOP — Logic 出力の 0/1 を Mult-Add でゲート信号として使用
前処理・後処理CHOP 🎯
- 前処理: Analyze CHOP、Math CHOP、Filter CHOP、Constant CHOP
- 後処理: Trigger CHOP、Switch CHOP、Select CHOP、Lag CHOP、Hold CHOP
Info CHOP情報 📊
Logic 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:
- Convert Input の選択を確認(
Off When ZeroとOff When Zero Or Lessは負値の扱いが異なる) - Channel Pre OP が
Rising Edge/Falling Edgeの場合、出力は 1 サンプル幅のため、後段で Hold CHOP や Trigger CHOP で受け止める - 前段で Filter CHOP でノイズを抑え、エッジ誤検出を減らす
❌ Problem: 複数入力で結果が想定と違う
✅ Solution:
- Combine Channels(同 CHOP 内)と Combine CHOPs(CHOP 間)のどちらが適用されているか確認
- Match by が
Channel NumberかChannel Nameかで対応付けが変わる - Align の設定で開始フレームが揃っているか確認(特に
Trim to Smallest Intervalは短い側に切り詰められる)
❌ Problem: Bounds 範囲指定が効かない
✅ Solution:
- Convert Input が
Off When Outside Boundsになっているか確認(他モードでは Bounds が無視される) - 下限と上限の値を取り違えていないか確認(下限 > 上限になると常に 0 になる)
- 前段で Math CHOP によるスケーリング後に Bounds を再調整する
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

