Logic CHOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

※当サイトにはプロモーションリンクが含まれます。

Logic CHOP の論理演算と条件判定機能を示す図

記事更新の通知はXでアナウンス٩(๑❛ᴗ❛๑)
@maru6o6をフォロー

概要 📖 – 論理演算と条件判定

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 のチャンネル

Tips

初心者の方は、以下日本語書籍も手元にあると安心です。

まる。
まる。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!


パラメータ解説 ⚙️

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 InputOff 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

音量が一定範囲に入ったときだけ後段にイベントを送る、最も基本的な閾値判定パターン。

  1. Audio Device In CHOP の出力を Analyze CHOP の RMS Power に通して 1 サンプル長のレベル値を取得する
  2. Logic CHOP の Convert Input を Off When Outside Bounds に設定し、Bounds に許容範囲(例: 0.2 〜 0.9)を入れる
  3. Channel Pre OP を Rising Edge にして、範囲に入った瞬間だけ 1 サンプルの On パルスを出す
  4. 後段の Trigger CHOP に渡してエンベロープを起動

Example 2: 複数ボタンのラジオボタン化 🎛️

Constant CHOP (8 ch) → Logic CHOP (Channel Pre OP=Radio Button) → Switch CHOP

8 個のボタンチャンネルを「同時に 1 つだけ On」に強制し、UI のラジオボタンとして振る舞わせる。

  1. Constant CHOP で 8 個のチャンネルを用意し、各ボタン UI から値を流し込む
  2. Logic CHOP の Channel Pre OP を Radio Button に設定し、最後に On になったチャンネルだけが残るようにする
  3. Combine Channels を Highest Index On にすれば、現在 On のインデックス(0〜7)が 1 チャンネルで取り出せる
  4. そのインデックスを Switch CHOP の Index に渡してシーン切替

Example 3: 値変化のエッジ検出ログ 📝

OSC In CHOP → Logic CHOP (Convert=On When Value Changed, Pre OP=Rising Edge) → CHOP to DAT

外部からの OSC 値が変化した瞬間だけログテーブルに行を追加するイベント駆動パターン。

  1. OSC In CHOP で外部からの数値を受信
  2. Logic CHOP の Convert Input を On When Value Changed、Channel Pre OP を Rising Edge に設定
  3. 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 🎯


Info CHOP情報 📊

Logic CHOPは Info CHOP による詳細情報取得に対応しています。

CHOP固有情報 🎚️

  • start: CHOPインターバルの開始(サンプル単位)
  • length: CHOPのサンプル数
  • sample_rate: フレーム毎秒のサンプルレート
  • num_channels: CHOPのチャンネル数
  • time_slice: タイムスライス有効時は1、無効時は0
  • export_sernum: Export接続の更新回数

汎用オペレータ情報 🔄

  • total_cooks: プロセス開始からのクック回数
  • cook_time: 最後のクック時間(ミリ秒)
  • cook_frame: 最後にクックされたフレーム番号
  • warnings: 警告数
  • errors: エラー数

トラブルシューティング ⚠️

よくある問題と解決策 🔧

❌ Problem: 意図したタイミングで 1 が出ない
✅ Solution:

  • Convert Input の選択を確認(Off When ZeroOff When Zero Or Less は負値の扱いが異なる)
  • Channel Pre OP が Rising Edge / Falling Edge の場合、出力は 1 サンプル幅のため、後段で Hold CHOPTrigger CHOP で受け止める
  • 前段で Filter CHOP でノイズを抑え、エッジ誤検出を減らす

❌ Problem: 複数入力で結果が想定と違う
✅ Solution:

  • Combine Channels(同 CHOP 内)と Combine CHOPs(CHOP 間)のどちらが適用されているか確認
  • Match by が Channel NumberChannel Name かで対応付けが変わる
  • Align の設定で開始フレームが揃っているか確認(特に Trim to Smallest Interval は短い側に切り詰められる)

❌ Problem: Bounds 範囲指定が効かない
✅ Solution:

  • Convert Input が Off When Outside Bounds になっているか確認(他モードでは Bounds が無視される)
  • 下限と上限の値を取り違えていないか確認(下限 > 上限になると常に 0 になる)
  • 前段で Math CHOP によるスケーリング後に Bounds を再調整する

参考資料 📚

その他 🔗

公式リソース 📖

この記事はLLMと共に内容を執筆、更新しています。
最新バージョンとの項目差異など、情報の不一致を見つけた心優しい方はXもしくはInsta、メールなどよりサイト管理者までご連絡ください😎


まる。

お仕事のご依頼はDM又はメールにて。
━━━━━━━━━━━━━━━━━
Python/Touchdesigner/M5Stackをこよなく愛すフルスタックエンジニア。
専門は生理心理学、趣味はヨガやサウナ、EMS電気風呂などヘルスケア全般。
脳波や筋電、心拍を中心とした生体情報のセンシング&インタラクティブアートづくりがライフワーク。

普段はワントゥーテンという会社で空間演出エンジニアをしています。
リファラル採用お繋ぎできますので、我こそはという尖った方は経歴と希望職種添えてDMください(エンジニア以外、営業職等もOK)。
ご飯行きましょう。

↓日常垢
Instagram:@malmal0v0

まる。をフォローする
その他の記事はこちら
Math Combine POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED Select TOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Window COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Widget COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

タイトルとURLをコピーしました