
概要 📖 – チャンネル演算と値域変換
Math CHOPは、チャンネル値に算術演算(加減乗除・平均・最大最小・範囲変換)を施す CHOPです。複数の入力を束ねる結合演算と、Mult-Add / Range による値域変換を 1 オペレータで完結します。
主な用途 🎯
- チャンネル値の四則演算(加算・減算・乗算・除算・平均)
- 値域の変換(From Range / To Range によるノーマライズ・スケーリング)
- 複数チャンネルの結合(合計・平均・最大・最小・ベクトル長)
- 値のクランプ・整数化(Ceiling / Floor / Round による離散化)
- 制御信号の前処理・後処理(Pre OP / Post OP の単項演算)
データフロー 🔄
入力: チャンネルデータ
↓
Channel Pre OP(単項処理)
↓
チャンネル間結合 / CHOP 間結合
↓
Mult-Add / Range 変換
↓
Channel Post OP / Integer 化
↓
出力: 演算後のチャンネル
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
OP Page 📋
Channel Pre OP .preop 🎛️
各チャンネルが Math CHOP に入った直後に適用される単項演算メニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
何もしない(パススルー) |
| Negate | .negate |
各サンプル値の符号を反転 |
| Positive | .pos |
負の値を絶対値に変換 |
| Square | .square |
各サンプル値を二乗 |
| Inverse | .inverse |
各サンプル値の逆数(1/x)を取る |
Combine Channels .chanop 🔗
1 つの入力 CHOP の中で、チャンネル同士を結合する演算
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
結合しない |
| Add | .add |
全チャンネルを合計 |
| Subtract | .sub |
最初のチャンネルから残りを減算 |
| Multiply | .mul |
全チャンネルを乗算 |
| Divide | .div |
最初のチャンネルを残りで除算 |
| Average | .avg |
全チャンネルの平均値を取る |
| Minimum | .min |
全チャンネルの最小値を取る |
| Maximum | .max |
全チャンネルの最大値を取る |
| Length | .len |
チャンネルをベクトルとみなして長さを計算 |
Combine CHOPs .chopop 🪢
複数の入力 CHOP を 1 つに結合する演算
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
結合しない |
| Add | .add |
全 CHOP を合計 |
| Subtract | .sub |
最初の CHOP から残りを減算 |
| Multiply | .mul |
全 CHOP を乗算 |
| Divide | .div |
最初の CHOP を残りで除算 |
| Average | .avg |
全 CHOP の平均値 |
| Minimum | .min |
全 CHOP の最小値 |
| Maximum | .max |
全 CHOP の最大値 |
| Length | .len |
CHOP をベクトルとみなして長さを計算 |
Channel Post OP .postop 🎚️
上記の結合演算後に最終段で適用される単項演算メニュー(Pre OP と同じ選択肢)
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
何もしない |
| Negate | .negate |
符号反転 |
| Positive | .pos |
絶対値化 |
| Square | .square |
二乗 |
| Inverse | .inverse |
逆数化 |
Match by .match 🔍
複数入力間でチャンネルをどう対応付けるか
| 項目 | 内部名 | 説明 |
|---|---|---|
| Channel Number | .index |
チャンネルのインデックス順で対応付け |
| Channel Name | .name |
チャンネル名で対応付け |
Align .align 📏
複数入力 CHOP の開始・終了タイミングが異なるときの揃え方
| 項目 | 内部名 | 説明 |
|---|---|---|
| Automatic | .auto |
Time Slice があれば trim、無ければ Extend Min/Max |
| Extend to Min/Max | .none |
最早 start と最遅 end まで拡張 |
| Stretch to Min/Max | .stretch |
最早 start と最遅 end まで引き伸ばし |
| Shift to Minimum | .start |
全 CHOP を最早 start に揃えて拡張 |
| Shift to Maximum | .end |
全 CHOP を最遅 end に揃えて拡張 |
| Shift to First Interval | .shift1 |
最初の CHOP の範囲に shift してサンプリング |
| Trim to First Interval | .trim1 |
最初の CHOP の範囲に trim |
| Stretch to First Interval | .stretch1 |
最初の CHOP の範囲に伸縮 |
| Trim to Smallest Interval | .trim |
最小範囲に trim |
| Stretch to Smallest Interval | .squash |
最小範囲に伸縮 |
Interp Pars per Sample .interppars 🎚️
入力がタイムラインより高周波(例: 音声)のときに、Multiply / Add / Range パラメータの変動による出力のポップ・クラックを回避するためサンプル毎にパラメータを補間する
| 項目 | 内部名 | 説明 |
|---|---|---|
| Interp Pars per Sample | .interppars |
オン: Multiply / Pre-Add / Post-Add / From Range / To Range の値をサンプル毎に線形補間して滑らかに反映する。オフ: フレーム単位でのみ更新(高周波信号で不連続音が発生する可能性)。 |
Integer .integer 🔢
結果値を整数に変換するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
値をそのまま(小数のまま) |
| Ceiling | .ceiling |
切り上げ(次の整数) |
| Floor | .floor |
切り下げ(前の整数) |
| Round | .round |
四捨五入 |
Mult-Add Page ➕
Mult-Add パラメータ 🧮
Pre-Add .preoff ➕
– 各サンプル値に加算する初期オフセット
– 入力値を任意の方向へシフトしたいときに使用
Multiply .gain ✖️
– Pre-Add 適用後の値に乗算するゲイン
– 信号の振幅やレンジをスケーリング
Post-Add .postoff ➕
– 乗算後の値に加算する最終オフセット
– y = (x + preoff) × gain + postoff の形で線形変換
Range Page 📏
Range 変換パラメータ 📏
From Range .fromrange 📥
– 入力値の想定範囲(low, high)
– センサー値の生レンジなどを指定
To Range .torange 📤
– 出力値の目標範囲(low, high)
– 例: From [0, 1023] To [0, 1] で 10bit ADC を正規化
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 → Math CHOP (From Range / To Range) → Light Intensity
- Audio Device In CHOP で音声入力を取得
- Math CHOP の From Range を [-1, 1]、To Range を [0, 1] に設定
- 出力をライトの強度パラメータに Export
- 音量レベルが 0〜1 の正規化された値で照明にマッピング
Example 2: 複数センサーの平均値で滑らかな制御信号 📊
Multiple Serial In CHOPs → Math CHOP (Combine CHOPs: Average) → Filter CHOP → Output
- 複数のセンサーから Serial In CHOP で取得
- Math CHOP で Combine CHOPs を「Average」に設定
- 後段の Filter CHOP で時間方向のスムージング
- 個別のノイズが平均化された安定した制御信号が得られる
Example 3: 2D 座標の距離計算 📐
tx, ty channel → Math CHOP (Combine Channels: Length) → 距離値
- x 座標と y 座標の 2 チャンネルを持つ CHOP を入力
- Combine Channels を「Length」に設定
- 原点からのベクトル長(√(x²+y²))が 1 サンプルで出力
- オブジェクト間の距離をリアルタイムで計算する
Example 4: 閾値ベースのインタラクション 🎮
Serial CHOP → Math CHOP (Range mapping) → Logic CHOP → Trigger CHOP
- センサー値を Math CHOP で 0〜1 にマッピング
- Logic CHOP で「> 0.7」の条件判定
- Trigger CHOP で閾値超え時にイベント発火
- ジェスチャー検出やプレッシャー反応の起点として活用
関連オペレータ 🔗
類似機能OP 🔍
- Logic CHOP — 閾値判定や論理演算(AND/OR)に特化、四則演算は不可
- Constant CHOP — 固定値を出力(Math CHOP の Pre-Add / Post-Add の上流ソース用途で多用)
組み合わせ推奨OP 🔄
- Filter CHOP — Math 後段のスムージングに最適
- Logic CHOP — Math で正規化した値を閾値判定にかける
- Trigger CHOP — Math 出力でエンベロープを起動
- Lag CHOP — Math と組み合わせて遅延付きスムージング
- Trail CHOP — Math 出力の時間履歴を可視化
- CHOP to TOP — 正規化した値を GPU シェーダ uniform に渡す
- Analyze CHOP — Math 出力の統計値(最大・平均・ピーク)を抽出
前処理・後処理CHOP 🎯
- 前処理: Filter CHOP、Resample CHOP、Lag CHOP、Audio Device In CHOP、OSC In CHOP
- 後処理: Logic CHOP、Trigger CHOP、Limit CHOP、Switch CHOP、Hold CHOP
Info CHOP情報 📊
Math 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 で割って NaN / Inf が発生する
✅ Solution:
- Combine Channels / Combine CHOPs を「Divide」にしている場合、入力に 0 が混じると Inf になる
- 前段に Logic CHOP や Limit CHOP を入れて 0 を除外
- Pre-Add でわずかなオフセット(1e-6 等)を足して 0 除算を回避
❌ Problem: Range 変換後の値が想定外
✅ Solution:
- From Range の low/high が入力データの実際のレンジと一致しているか確認
- From Range = To Range のとき、Math CHOP は何もしない(恒等変換)
- 入力値が From Range の外側にある場合、出力は To Range の外側へ線形外挿される
❌ Problem: 複数 CHOP を結合したらサンプル数が変わった
✅ Solution:
- Sample Rate Match の設定で Resample 動作が決まる(First / Max / Min / Error)
- 想定外の Resample が発生した場合は Resample CHOP で明示的に揃える
- Align パラメータで開始・終了の揃え方を確認
❌ Problem: Integer 化で値が飛び飛びになる
✅ Solution:
- Integer = Round / Floor / Ceiling の選択で挙動が変わる、用途に合うものを選択
- 離散化が不要な場合は Integer = Off に戻す
- 後段の整数依存処理(Index 系)が必要な場合のみ Integer 化する
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

