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

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

Math CHOP の演算機能を示す図

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

概要 📖 – チャンネル演算と値域変換

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 化

出力: 演算後のチャンネル

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

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
  1. Audio Device In CHOP で音声入力を取得
  2. Math CHOP の From Range を [-1, 1]、To Range を [0, 1] に設定
  3. 出力をライトの強度パラメータに Export
  4. 音量レベルが 0〜1 の正規化された値で照明にマッピング

Example 2: 複数センサーの平均値で滑らかな制御信号 📊

Multiple Serial In CHOPs → Math CHOP (Combine CHOPs: Average) → Filter CHOP → Output
  1. 複数のセンサーから Serial In CHOP で取得
  2. Math CHOP で Combine CHOPs を「Average」に設定
  3. 後段の Filter CHOP で時間方向のスムージング
  4. 個別のノイズが平均化された安定した制御信号が得られる

Example 3: 2D 座標の距離計算 📐

tx, ty channel → Math CHOP (Combine Channels: Length) → 距離値
  1. x 座標と y 座標の 2 チャンネルを持つ CHOP を入力
  2. Combine Channels を「Length」に設定
  3. 原点からのベクトル長(√(x²+y²))が 1 サンプルで出力
  4. オブジェクト間の距離をリアルタイムで計算する

Example 4: 閾値ベースのインタラクション 🎮

Serial CHOP → Math CHOP (Range mapping) → Logic CHOP → Trigger CHOP
  1. センサー値を Math CHOP で 0〜1 にマッピング
  2. Logic CHOP で「> 0.7」の条件判定
  3. Trigger CHOP で閾値超え時にイベント発火
  4. ジェスチャー検出やプレッシャー反応の起点として活用

関連オペレータ 🔗

類似機能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 🎯


Info CHOP情報 📊

Math 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 で割って 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 化する

参考資料 📚

その他 🔗

公式リソース 📖

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