
概要 📖 – Python 数式によるチャンネル値の動的変換
Expression CHOPは、入力チャンネルの各サンプルに Python 数式を適用して値を任意関数で変換する CHOPです。me.inputVal や me.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 で出力数を制限(任意)
↓
出力: 数式変換後のチャンネル
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
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)) → 出力チャンネル
- LFO CHOP で 0〜1 の周期信号を生成
- Expression CHOP の式に
math.sin(me.inputVal * 6.28)を入力 - 入力値が周波数に変換され、サイン波が出力される
- Mult-Add 系では作れない非線形変換を 1 ノードで実現
Example 2: 2 入力の差分による相対値計算 📊
Serial CHOP (input 0) + Constant CHOP (input 1) → Expression CHOP (me.inputVal - me.inputs[1][0]) → 差分チャンネル
- 第 1 入力にセンサー値、第 2 入力に基準値を接続
- Expression に
me.inputVal - me.inputs[1][0]を記述 - 第 1 入力の各サンプルから第 2 入力の対応値を引いた結果が出力
- キャリブレーション用のオフセット除去や差分監視に活用
Example 3: 条件分岐によるしきい値クランプ 🚦
Serial CHOP → Expression CHOP (me.inputVal if me.inputVal > 0.5 else 0) → 出力
- センサー入力を Expression CHOP に接続
- 式に
me.inputVal if me.inputVal > 0.5 else 0を記述 - 0.5 未満は 0、それ以上はそのまま通過
- 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 🎯
- 前処理: Filter CHOP、Math CHOP、Lag CHOP、Resample CHOP
- 後処理: Logic CHOP、Trigger CHOP、Limit CHOP、Filter CHOP
Info CHOP情報 📊
Expression 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: 式の構文エラーで全チャンネルが 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 で出力数が打ち切られていないか確認
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

