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

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

Script CHOP の Python 駆動チャンネル生成を示す図

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

概要 📖 – Pythonスクリプトでチャンネル生成

Script CHOPは、クック毎に Python スクリプトを実行し、チャンネルを手続き的に生成する CHOPです。Callbacks DAT に紐づく cook() / onPulse() / setupParameters() メソッドを介して、numPy 配列との相互変換やカスタムパラメータの動的追加にも対応します。

主な用途 🎯

  • Pythonによるチャンネルデータの自律生成(クック毎に cook() を呼び出して値を更新)
  • numPy配列とCHOPチャンネル間の双方向変換(高速数値処理の橋渡し)
  • カスタムパラメータの動的追加(setupParameters() による UI 拡張)
  • 外部データソース(CSV / API / ソケット)からチャンネルへの取り込み
  • アルゴリズミックな波形・パターン生成(プログラム可能な信号源)

データフロー 🔄

入力: 任意の CHOP(オプション)

Callbacks DAT 内の cook() スクリプト実行

scriptOp.appendChan() / numpyArray() でチャンネル生成

出力: スクリプト定義のチャンネル

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

Script Page 📋

Callbacks DAT .callbacks 📜

コールバック関数を保持する DAT への参照:

  • Callbacks DAT: cook / onPulse / setupParameters の 3 メソッドを保持する DAT のパス。デフォルトでは Script CHOP 作成時に docked DAT が自動生成される

Setup Parameters .setuppars ⚙️

Setup Parameters .setuppars 🔘
– パルスボタン。クリックすると Callbacks DAT 内の setupParameters() が呼び出される
– カスタムパラメータの動的追加・削除・再構成に使用

Modify Outside of Cook .modoutsidecook 🔓

Modify Outside of Cook .modoutsidecook 🛠️
– 通常 CHOP は cook 中のみ書き換え可能だが、これをオンにすると外部スクリプトから lock なしでチャンネルを更新できる
– 非同期コールバック(OSC In DAT のコールバック等)から直接 Script CHOP のチャンネルを書き換える用途に有効


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: サイン波の手続き的生成 🌊

Script CHOP (cook で sin 波計算) → Filter CHOP → Output
  1. Callbacks DAT の cook() 内で scriptOp.clear()scriptOp.appendChan('sine') でチャンネルを準備
  2. numpy.sin(numpy.linspace(0, 2*math.pi, 600)) で 600 サンプルの sin 波を生成し、scriptOp.numpyArray(c) 経由で書き込み
  3. Filter CHOP で軽くスムージングしてから出力
  4. Pattern CHOP では表現しづらい複雑な波形(カスタム包絡線、ノイズ重畳)をスクリプトで自由に作れる

Example 2: 外部 API からセンサー値を取り込む 📡

Web Client DAT → Script CHOP (cook で JSON parse + appendChan) → Math CHOP → 制御信号
  1. Web Client DAT で REST API を叩き、JSON 文字列を取得
  2. Script CHOP の cook() 内で json.loads() してフィールドを抽出
  3. scriptOp.appendChan('temperature') で値を CHOP チャンネルに反映
  4. Math CHOP で正規化して下流の制御パラメータへ流す

Example 3: numPy 配列で大規模データを高速処理 🔢

Audio Device In CHOP → Script CHOP (numpyArray で FFT) → CHOP to TOP
  1. 入力 CHOP のチャンネルを inputs[0].numpyArray() で一括取得
  2. numpy.fft.rfft(samples) で周波数領域に変換
  3. 振幅スペクトルを scriptOp.numpyArray() 経由で書き戻し
  4. CHOP to TOP でビジュアライズ層に渡す

Example 4: setupParameters でカスタム UI を構築 ⚙️

Script CHOP (setupParameters でカスタムページ追加) → cook で par を読み取り → 出力
  1. setupParameters() 内で scriptOp.appendCustomPage('Custom') でページ追加
  2. page.appendFloat('Amplitude') 等でユーザー調整用パラメータを定義
  3. Setup Parameters パルスボタンを押して反映
  4. cook() から scriptOp.par.Amplitude.eval() で値を読み、信号生成に利用

関連オペレータ 🔗

類似機能OP 🔍

  • CPlusPlus CHOP — C++ プラグインで同等の手続き的チャンネル生成(高速処理向け)
  • Expression CHOP — 短い式ベースの手続き生成(スクリプトより軽量・即時)

組み合わせ推奨OP 🔄

  • Constant CHOP — Script CHOP のカスタムパラメータ値を Constant 化して下流に渡す
  • Math CHOP — Script で生成した値を後段で正規化・スケーリング
  • Filter CHOP — Script の離散的な出力をスムージング
  • Trail CHOP — Script で生成した値の時間履歴を可視化
  • Analyze CHOP — Script 出力の統計値(最大・平均・ピーク)を抽出

前処理・後処理CHOP 🎯


Info CHOP情報 📊

Script 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: スクリプトを書き換えても出力が更新されない
✅ Solution:

  • Script CHOP は手続き的依存関係を自動追跡するが、外部ファイル / グローバル変数を参照する場合は依存が登録されない
  • Callbacks DAT を編集後、Script CHOP ノードを右クリックして「Reinitialize Script」または手動で再クック
  • op('script1').cook(force=True) で強制クックを呼び出す

❌ Problem: 外部コールバックから書き換えられない
✅ Solution:

  • Modify Outside of Cook パラメータをオンにする
  • 非同期コールバック(OSC In DAT / Web Server DAT 等)から書き換える場合は必須
  • オフのまま外部から触ると lock エラーまたは silent fail が発生する

❌ Problem: numPy 配列のサイズが合わずエラー
✅ Solution:

  • scriptOp.numpyArray() で書き込む配列は (num_channels, num_samples) の 2 次元 numpy 配列が前提
  • 1 次元配列を渡す場合は arr.reshape(1, -1) で形を整える
  • dtype は numpy.float32 推奨(自動変換されるが明示すれば余計な copy を避けられる)

❌ Problem: パフォーマンスが重い
✅ Solution:

  • Python ループは遅い。numpy ベクトル演算(numpy.sin / numpy.fft 等)に書き換える
  • 毎クック内で重い処理が必要な場合は CPlusPlus CHOP への移行を検討
  • cook_time Info チャンネルを監視してボトルネックを特定

参考資料 📚

その他 🔗

公式リソース 📖

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