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

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

Expression CHOP による数式変換の概念図

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

概要 📖 – Python 数式によるチャンネル値の動的変換

Expression CHOPは、入力チャンネルの各サンプルに Python 数式を適用して値を任意関数で変換する CHOPです。me.inputValme.inputs[1][0] で複数入力に同時アクセスでき、固定演算 OP では難しい非線形変換や条件分岐を 1 ノードで完結します。

主な用途 🎯

  • Python 数式によるサンプル単位のチャンネル値変換me.inputVal を介した任意関数の適用)
  • 複数入力チャンネルを参照した複合演算me.inputs[1][0] 等で第 2 入力以降にアクセス)
  • 非線形変換・条件分岐・三角関数等、固定 OP では実装できないカスタム数式の適用
  • 1 オペレータ内で複数式を切り替えて適用(Channels per Expr で式ごとの担当チャンネル数を制御)
  • 出力チャンネル数の制限による軽量化(Limit Output Channels で必要分だけクック)

データフロー 🔄

入力: チャンネルデータ

Expression CHOP(各サンプルに Python 数式を適用、me.inputVal で参照)

Channels per Expr で式ごとの担当範囲を決定

Limit Output Channels で出力数を制限(任意)

出力: 数式変換後のチャンネル

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

Expression Page 🧮

出力チャンネル制御 🎛️

Channels per Expr .chanperexpr 🔢
– 1 つの式が担当するチャンネル数
– この数を超えると次の式に切り替わり、式が尽きると最初の式に巻き戻して再利用される

Limit Output Channels .limitexpr 🚦
– オン: Expression CHOP が出力するチャンネル数を制限
– 不要なチャンネルをクックしないことで負荷を削減

Number of Channels .limitnum 🔢
Limit Output Channels がオンのときに出力する最大チャンネル数
– 入力が多くても、ここで指定した数までしか出力されない

Expression シーケンス .expr 📝

Expression .expr 📝
– 適用する数式のシーケンス(複数式を持てる)
Channels per Expr ごとに次の式へ切り替わる

Expression (式本体) .expr0expr ✏️
– 各シーケンス要素に書き込む実際の Python 式
– 入力値は me.inputVal で参照、me.inputs[1]['chan1'] で第 2 入力の chan1 を参照可能


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: 入力値の sin 変換による振動信号生成 🌊

LFO CHOP → Expression CHOP (math.sin(me.inputVal*2)) → 出力チャンネル
  1. LFO CHOP で 0〜1 の周期信号を生成
  2. Expression CHOP の式に math.sin(me.inputVal * 6.28) を入力
  3. 入力値が周波数に変換され、サイン波が出力される
  4. Mult-Add 系では作れない非線形変換を 1 ノードで実現

Example 2: 2 入力の差分による相対値計算 📊

Serial CHOP (input 0) + Constant CHOP (input 1) → Expression CHOP (me.inputVal - me.inputs[1][0]) → 差分チャンネル
  1. 第 1 入力にセンサー値、第 2 入力に基準値を接続
  2. Expression に me.inputVal - me.inputs[1][0] を記述
  3. 第 1 入力の各サンプルから第 2 入力の対応値を引いた結果が出力
  4. キャリブレーション用のオフセット除去や差分監視に活用

Example 3: 条件分岐によるしきい値クランプ 🚦

Serial CHOP → Expression CHOP (me.inputVal if me.inputVal > 0.5 else 0) → 出力
  1. センサー入力を Expression CHOP に接続
  2. 式に me.inputVal if me.inputVal > 0.5 else 0 を記述
  3. 0.5 未満は 0、それ以上はそのまま通過
  4. Logic CHOP では難しいパススルー型しきい値処理を 1 行で実装

関連オペレータ 🔗

類似機能OP 🔍

  • Math CHOP — 固定演算(加減乗除・Range 変換)は Math CHOP の方が高速、自由度は Expression が上
  • Logic CHOP — AND/OR/しきい値判定は Logic CHOP が専用、複雑な条件式は Expression
  • Lookup CHOP — テーブル参照型の値変換、関数として書ける場合は Expression の方が簡潔

組み合わせ推奨OP 🔄

  • Math CHOP — Expression で複雑変換 → Math で最終正規化の段階処理
  • Filter CHOP — Expression の出力をスムージングしてポップを除去
  • Logic CHOP — Expression の出力をしきい値判定にかける
  • Trigger CHOP — Expression の数式結果でエンベロープを起動
  • Evaluate DAT — テーブル単位の任意式評価、CHOP サンプル単位なら Expression を使う

前処理・後処理CHOP 🎯


Info CHOP情報 📊

Expression 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: 式の構文エラーで全チャンネルが 0 になる
✅ Solution:

  • Expression パラメータの式を見直し、Python 構文 (括弧の対応・インデント・コロン) を確認
  • math モジュールを使う場合、TouchDesigner では import 不要だが、math.sin(...) のように完全パスで記述
  • テキストポートで op('expression1').par.expr0expr.eval() を実行して個別検証

❌ Problem: me.inputs[1][0] で IndexError が出る
✅ Solution:

  • 第 2 入力(input 1)が実際に接続されているか確認、未接続だと me.inputs[1] 自体が空
  • 前段に Merge CHOP を置いて 1 入力にまとめてから me.inputVal で参照する代替案も検討
  • チャンネル名でアクセスする場合は me.inputs[1]['chan1'] のように文字列キーで安全に取得

❌ Problem: 出力サンプル数が想定より多い・少ない
✅ Solution:

  • 出力長は第 1 入力 (input 0) の長さに従うため、入力 CHOP の長さ・Time Slice 設定を確認
  • Channels per Expr の値が小さすぎると、式が早く巻き戻って意図しないチャンネルに同じ式が適用される
  • Limit Output Channels がオンの場合、Number of Channels で出力数が打ち切られていないか確認

参考資料 📚

その他 🔗

公式リソース 📖

この記事は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をコピーしました