
概要 📖 – 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() でチャンネル生成
↓
出力: スクリプト定義のチャンネル
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
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
- Callbacks DAT の
cook()内でscriptOp.clear()→scriptOp.appendChan('sine')でチャンネルを準備 numpy.sin(numpy.linspace(0, 2*math.pi, 600))で 600 サンプルの sin 波を生成し、scriptOp.numpyArray(c)経由で書き込み- Filter CHOP で軽くスムージングしてから出力
- Pattern CHOP では表現しづらい複雑な波形(カスタム包絡線、ノイズ重畳)をスクリプトで自由に作れる
Example 2: 外部 API からセンサー値を取り込む 📡
Web Client DAT → Script CHOP (cook で JSON parse + appendChan) → Math CHOP → 制御信号
- Web Client DAT で REST API を叩き、JSON 文字列を取得
- Script CHOP の
cook()内でjson.loads()してフィールドを抽出 scriptOp.appendChan('temperature')で値を CHOP チャンネルに反映- Math CHOP で正規化して下流の制御パラメータへ流す
Example 3: numPy 配列で大規模データを高速処理 🔢
Audio Device In CHOP → Script CHOP (numpyArray で FFT) → CHOP to TOP
- 入力 CHOP のチャンネルを
inputs[0].numpyArray()で一括取得 numpy.fft.rfft(samples)で周波数領域に変換- 振幅スペクトルを
scriptOp.numpyArray()経由で書き戻し - CHOP to TOP でビジュアライズ層に渡す
Example 4: setupParameters でカスタム UI を構築 ⚙️
Script CHOP (setupParameters でカスタムページ追加) → cook で par を読み取り → 出力
setupParameters()内でscriptOp.appendCustomPage('Custom')でページ追加page.appendFloat('Amplitude')等でユーザー調整用パラメータを定義- Setup Parameters パルスボタンを押して反映
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 🎯
- 前処理: Audio Device In CHOP、OSC In CHOP、Constant CHOP、Math CHOP
- 後処理: Filter CHOP、Math CHOP、Analyze CHOP、Trail CHOP
Info CHOP情報 📊
Script 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: スクリプトを書き換えても出力が更新されない
✅ 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_timeInfo チャンネルを監視してボトルネックを特定
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – Script CHOP
- TouchDesigner公式ドキュメント – ScriptCHOP Class
- Script SOP / Script DAT / Script TOP(姉妹オペレータ)

