
概要 📖 – イベント駆動の ADSR エンベロープ生成
Event CHOPは、入力チャンネルのオン/オフをトリガーに ADSR エンベロープを生成し、複数のイベントを並列に管理する CHOPです。MIDI ノート発音や閾値超えのセンサー入力をきっかけにエンベロープを発火させ、ムービー再生やライト点灯の時間制御に使用します。
主な用途 🎯
- 入力チャンネルのオン/オフをトリガーとしたイベント発生
- ADSR (Attack / Decay / Sustain / Release) エンベロープの生成
- MIDI ノートやセンサー入力に応じた多重イベントの並列再生
- state チャンネルによるムービー再生の段階制御 (attack / decay / sustain / release)
- onCreate / onDestroy コールバックによるイベント生成・破棄時のスクリプト実行
データフロー 🔄
入力: トリガーチャンネル (オン/オフ)
↓
イベント生成 (ID 自動採番) + onCreate コールバック
↓
ADSR エンベロープ計算 (Attack → Decay → Sustain → Release)
↓
state / time / adsr / active / input チャンネル出力
↓
onDestroy コールバックでイベント終了
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Channels Page 📁
イベント基本チャンネル 🎛️
Event CHOP が出力するイベントごとの基本チャンネル
ID .id 🔢
– イベントのシーケンス番号 (0 から始まり、各イベントごとに 1 ずつ増加)
– 同時発火する複数イベントの識別に利用
Index .index 📍
– イベントを発生させた入力 CHOP のチャンネル index
– どの入力チャンネルが発火したかを判別
Active .active 🟢
– 入力が 0 より大きい間 1 になり、入力が「オン」の状態を示す
– イベントがアクティブかどうかのフラグ
Input .input 🎹
– イベント発火時 (誕生時) の入力チャンネル値
– MIDI velocity 値などをそのまま保持 (イベント終了まで維持)
Time .time ⏱️
– イベント開始からの経過時間 (秒)
– 各イベントごとに独立してカウント
ADSR / state チャンネル 📈
ADSR ページで設定したエンベロープに基づくエンベロープ値とフェーズ番号
ADSR .adsr 📈
– Attack / Decay / Sustain / Release のレベルに従ったエンベロープ値
– ADSR ページの Attack Time / Attack Level / Decay Time / Sustain Time / Sustain Min / Sustain Max / Release Time / Release Level によって速度とレベルが規定される
State .state 🎬
– 0=attack, 1=decay, 2=sustain, 3=release のフェーズ番号 (フラクショナル値、遷移中は補間)
– ムービーを 4 区分に分けて時間 index に渡し、フェーズに応じた区間を再生する用途に最適
– 例: 8 秒のムービーで state × 2 を Movie File In TOP の time-index に渡すと attack/decay/sustain/release に応じた区間を遷移する
Reset Condition .resetcondition 🔄
2nd Input (Reset Trigger) を接続した場合のリセット動作。第 2 入力が無いときは無効
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off to On | .offtoon |
Reset Trigger が Off → On に変化した瞬間にリセット |
| While On | .on |
Reset Trigger が On の間、継続的にリセット |
| On to Off | .ontooff |
Reset Trigger が On → Off に変化した瞬間にリセット |
| While Off | .off |
Reset Trigger が Off の間、継続的にリセット |
Reset / Reset Pulse .reset 🛑
全イベントを即時クリアする手動リセット
Reset .reset 🛑
– 'On' に設定すると CHOP をリセットし、保持している全イベントをクリア
– 'Off' に戻すまでリセット状態が継続
Reset Pulse .resetpulse ⚡
– クリックしたフレームで即座に CHOP をリセットし、全イベントをクリア
– パルス型 (1 フレームのみリセット動作)
Callbacks DAT .callbacks 📜
イベント生成時・破棄時に呼ばれるコールバックを記述した DAT のパス
Callbacks DAT .callbacks 📜
– onCreate() と onDestroy() を持つ DAT のパスを指定
– イベント発生・終了のたびに対応する関数が呼ばれる
– 例: イベント生成時に Constant CHOP の値を更新、終了時にログを書き込む等
ADSR Page 📈
Attack .attack 📈
イベント発火後、ピークレベルに到達するまでの立ち上がりフェーズ
Attack Time .attacktime ⏱️
– ピーク (Attack Level) に到達するまでの時間
– adsr / state チャンネルの両方に影響
Attack Time Unit .attacktunit 📐
– Attack Time の単位を Samples / Frames / Seconds から選択
Attack Level .attacklevel 📊
– アタック終了時に到達するピークレベル
– adsr チャンネルにのみ影響
Decay .decay 📉
ピーク到達後、Sustain レベルへ降下するフェーズ
Decay Time .decaytime ⏱️
– ピークから Sustain レベルへ降下するまでの時間
– adsr / state チャンネルの両方に影響
Decay Time Unit .decaytunit 📐
– Decay Time の単位を Samples / Frames / Seconds から選択
Sustain .sustain 🎵
保持フェーズ。Sustain Min から Sustain Max へ Sustain Time の間で推移
Sustain Time .sustaintime ⏱️
– Sustain フェーズの長さ
– adsr チャンネルにのみ影響
Sustain Time Unit .sustaintunit 📐
– Sustain Time の単位を Samples / Frames / Seconds から選択
Sustain Min .sustainmin 📊
– Sustain フェーズ開始時のレベル
– adsr チャンネルにのみ影響
Sustain Max .sustainmax 📊
– Sustain フェーズ終了時のレベル
– adsr チャンネルにのみ影響
Release .release 📉
解放フェーズ。Sustain 後、Release Level へ降下してイベント終了
Release Time .releasetime ⏱️
– Release フェーズの長さ
– adsr / state チャンネルの両方に影響
Release Time Unit .releasetunit 📐
– Release Time の単位を Samples / Frames / Seconds から選択
Release Level .releaselevel 📊
– イベントライフサイクル終了時のレベル
– adsr チャンネルにのみ影響
Speed .speed 🏃
イベントの再生速度。エンベロープ全体を伸縮させる
Speed .speed 🏃
– イベントの速度を調整 (個別イベントの寿命を伸縮)
– 1.0 = 等速、2.0 = 2 倍速 (寿命半分)、0.5 = 半速 (寿命 2 倍)
Global Speed .globalspeed 🌐
– 全イベントに一律に適用されるグローバル速度係数
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: MIDI ノートで ADSR エンベロープを発火 🎹
MIDI In CHOP → Event CHOP (ADSR) → Audio Oscillator CHOP の音量
- MIDI In CHOP を Event CHOP の第 1 入力に接続し、velocity を出力するよう設定
- Event CHOP の Attack Time / Decay Time / Sustain Time / Release Time を曲調に合わせて設定
- 出力の adsr チャンネルを Audio Oscillator CHOP のゲインパラメータに Export
- MIDI ノートのオン/オフに応じて自然な音量エンベロープが付与される
Example 2: 閾値超えセンサー入力でライト点灯エンベロープ 💡
Sensor (Serial CHOP) → Logic CHOP (閾値判定) → Event CHOP → Light Intensity
- Serial CHOP でセンサー値を取得
- Logic CHOP で閾値超え判定 (例: > 0.5 で 1)
- Logic CHOP の出力を Event CHOP に入力し、ADSR エンベロープを発火
- 出力の adsr チャンネルをライトの強度パラメータに Export し、自然なフェードイン・フェードアウトを実現
Example 3: state チャンネルでムービーを 4 段階再生 🎬
Trigger CHOP → Event CHOP (state) → Math CHOP (×2) → Movie File In TOP の time-index
- 8 秒のムービーを attack / decay / sustain / release の 4 区分 (各 2 秒) に分割設計
- Event CHOP の state チャンネルを Math CHOP で 2 倍にスケール
- Math CHOP の出力を Movie File In TOP の time-index に渡す
- state が 0→1→2→3 と遷移するに従い、ムービーが対応区間を再生する
関連オペレータ 🔗
類似機能OP 🔍
- Trigger CHOP — 単一エンベロープ発火に特化、複数イベントの並列管理は不可
- LFO CHOP — 周期波形を生成、トリガー駆動ではなく時間連続な波形出力
組み合わせ推奨OP 🔄
- MIDI In CHOP — ノートオン/オフを Event CHOP のトリガー入力に渡す
- Logic CHOP — 閾値判定の結果を Event CHOP に渡してエンベロープを起動
- Math CHOP — Event CHOP の adsr / state を後段でスケール・オフセット
- Trigger CHOP — 単一エンベロープと使い分け (Trigger は単発、Event は多重)
- Audio Oscillator CHOP — Event CHOP のエンベロープを音声合成のゲインに適用
前処理・後処理CHOP 🎯
- 前処理: MIDI In CHOP、Logic CHOP、Trigger CHOP
- 後処理: Math CHOP、Filter CHOP、Audio Oscillator CHOP、Hold CHOP
Info CHOP情報 📊
Event 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:
- 入力チャンネルが 0 から 0 より大きい値に遷移しているか確認 (active は input > 0 で 1 になる)
- 前段に Logic CHOP を入れて閾値判定を明示し、明確な 0/1 信号に整える
- Time Slice モードが想定通りか確認 (Common Page の Time Slice 設定)
❌ Problem: ADSR エンベロープが想定の長さにならない
✅ Solution:
- Attack Time / Decay Time / Sustain Time / Release Time の Time Unit (Samples / Frames / Seconds) を確認
- Speed パラメータが 1.0 以外だとイベント全体が伸縮する (Global Speed も併せて確認)
- Sustain Time が 0 だと Sustain フェーズがスキップされ、Decay 直後に Release へ遷移する
❌ Problem: イベントが残留してクリアできない
✅ Solution:
- Reset を ‘On’ にして全イベントを強制クリア
- Reset Pulse をクリックすると 1 フレームで全イベントを破棄
- 2nd 入力 (Reset Trigger) を接続している場合は Reset Condition の設定 (Off to On / While On / On to Off / While Off) を確認
❌ Problem: Callbacks DAT の onCreate / onDestroy が呼ばれない
✅ Solution:
- Callbacks DAT のパスが正しいか確認 (相対パス・絶対パスのいずれでも可)
- DAT に
onCreate(eventID, index, input)とonDestroy(eventID)の関数定義があるか確認 - DAT のテキスト内に Python シンタックスエラーが無いか Textport で確認
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

