
概要 📖 – チャンネル展開と統合
Fan CHOPは、1 つのインデックス値を複数のオン/オフチャンネルに展開、または複数のオン/オフチャンネルからインデックス値を統合する CHOPです。Fan Out / Fan In の双方向変換により、整数インデックスとマルチチャンネルのオン/オフ状態をシームレスに行き来できます。
主な用途 🎯
- 1 つの整数値チャンネルを複数のオン/オフチャンネルに展開(Fan Out)
- 複数のオン/オフチャンネルから「オン」のインデックスを 1 チャンネルに統合(Fan In)
- Switch CHOP / Select CHOP の選択ステートをマルチチャンネル化
- ボタン群(複数ボタン)と単一インデックス値の相互変換
- MIDI / OSC のノート番号やボタン配列とインデックス値の橋渡し
データフロー 🔄
入力: 整数インデックス または 複数オン/オフチャンネル
↓
Operation 選択(Fan Out / Fan In)
↓
Outside Range 処理 / All Channels Off 処理
↓
Quantize(整数化)
↓
出力: N チャンネル または 1 チャンネル
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Fan Page 📋
Operation .fanop 🔀
Fan In と Fan Out のどちらの方向で変換するかを選択するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Fan Out | .out |
1 チャンネルを 2 つ以上のチャンネルに展開。入力値のインデックスに対応するチャンネルだけが 1、他は 0。生成チャンネル数は Channel Names で決まる |
| Fan In | .in |
複数チャンネルを入力にとり、「オン」になっているチャンネルのインデックスを 1 チャンネルとして出力。複数オンの場合は最初のオンチャンネルが選ばれる |
Channel Names .channame 🏷️
Fan Out モードでの出力チャンネル名と数の指定:
- Channel Names パターン: 出力チャンネルの名前を指定する文字列。Fan Out では名前 1 つにつき 1 チャンネル生成され、これによってチャンネル数も決まる。
chan[1-8]のようなパターン記法が使用可能 - Fan In モード時の挙動: Fan In では出力は 1 チャンネルのみ生成され、その名前は最初の入力チャンネル名のベース名(数字 suffix を除いた部分)になる
Outside Range .range 🚧
入力値がインデックス範囲(0〜N-1)の外にある場合の処理方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Clamp Index | .clamp |
0 未満なら 0 に、N-1 を超えたら N-1 にクランプ |
| Loop Index | .loop |
インデックスをループ(modulo)させて範囲内に折り返す |
| Set Channels To 0 | .zero |
どのチャンネルも選択せず、すべてのチャンネルを 0 にする |
All Channels Off .alloff 🌀
Fan In モードで全入力チャンネルがオフのときの出力値の決め方
| 項目 | 内部名 | 説明 |
|---|---|---|
| Set To 0 | .set0 |
出力を 0 にする(最初のチャンネルを選んだ扱い) |
| Set To -1 | .setneg |
出力を -1 にする(どのチャンネルも選ばれていない明示的な状態) |
Quantize Output .quantize 🔢
出力チャンネルを最も近い整数に量子化するかどうか
| 項目 | 内部名 | 説明 |
|---|---|---|
| Quantize Output | .quantize |
デフォルトでオン。チャンネルが最も近い整数に量子化される。例: 入力値が 5.6 で 6 チャンネル生成時、チャンネル 5 が 1 で他は 0 になる |
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: 整数インデックスから複数ボタンの点灯ステートに展開 💡
Constant CHOP (index 値) → Fan CHOP (Fan Out, channame=btn[1-8]) → 8 ボタンのオン/オフ
- Constant CHOP で 0〜7 の整数インデックスを出力
- Fan CHOP の Operation を「Fan Out」、Channel Names を
btn[1-8]に設定 - インデックス値に対応する 1 チャンネルだけが 1、他 7 チャンネルが 0 になる
- 各チャンネルを UI ボタンの輝度や 3D シーンのライト強度にエクスポート
Example 2: 複数ボタン入力からアクティブインデックスを取り出す 🎛️
Button COMP (btn1〜btn5) → Fan CHOP (Fan In) → アクティブボタンのインデックス値
- 5 つのボタンチャンネル(btn1〜btn5)をもつ CHOP を入力
- Fan CHOP の Operation を「Fan In」に設定
- オンになっているボタンのインデックス(0〜4)が 1 チャンネルとして出力
- All Channels Off を「Set To -1」にすれば未選択状態を -1 として明示的に区別できる
Example 3: MIDI ノート番号からドラムパッド点灯ステートを生成 🥁
MIDI In CHOP → Math CHOP (オフセット調整) → Fan CHOP (Fan Out) → 16 パッド LED 制御
- MIDI In CHOP でドラムパッドの note 番号を取得
- Math CHOP で note 番号を 0〜15 のインデックスに変換
- Fan CHOP の Channel Names を
pad[1-16]、Outside Range を「Set Channels To 0」に設定 - 範囲外の note は無視され、範囲内のパッドだけが瞬間的に 1 になる
関連オペレータ 🔗
類似機能OP 🔍
- Switch CHOP — インデックスで複数入力 CHOP の中から 1 つを選択。Fan Out が「インデックス → オン/オフ展開」なのに対し、Switch は「インデックス → CHOP 選択」
- Select CHOP — チャンネル名パターンで特定チャンネルだけを抜き出す。Fan In と組み合わせると名前ベースのインデックス取得が可能
組み合わせ推奨OP 🔄
- Constant CHOP — Fan Out の入力としてインデックス値を供給
- Math CHOP — Fan Out の前段でインデックスをスケーリング・整数化
- Logic CHOP — Fan In の前段で複数チャンネルを 0/1 のオン/オフ信号に変換
- Switch CHOP — Fan In の出力(インデックス値)で複数 CHOP を切替
- Trigger CHOP — Fan Out の各オン/オフチャンネルでイベントを起動
- MIDI In CHOP — ノート番号やボタンステートを Fan の入力として活用
前処理・後処理CHOP 🎯
- 前処理: Math CHOP、Logic CHOP、Constant CHOP、MIDI In CHOP
- 後処理: Switch CHOP、Select CHOP、Trigger CHOP、Hold CHOP
Info CHOP情報 📊
Fan 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: Fan Out でどのチャンネルもオンにならない
✅ Solution:
- 入力値がインデックス範囲(0〜N-1)の外側にあり、Outside Range が「Set Channels To 0」になっている可能性を確認
- 範囲外でもいずれかを点灯させたい場合は Outside Range を「Clamp Index」または「Loop Index」に変更
- 前段に Math CHOP を入れてインデックスを期待範囲に正規化
❌ Problem: Fan In の出力インデックスが想定と異なる
✅ Solution:
- 複数チャンネルが同時にオンの場合、最初のオンチャンネルのインデックスのみが選ばれる仕様を確認
- 全チャンネルがオフのとき、All Channels Off の設定(Set To 0 / Set To -1)で出力値が変わる
- 前段に Logic CHOP を入れて 0/1 にしっかり二値化してから Fan In に渡す
❌ Problem: Fan Out の出力チャンネル数が想定と違う
✅ Solution:
- Channel Names のパターンを確認。
chan[1-8]なら 8 チャンネル、btn[1-16]なら 16 チャンネル - Channel Names を変更すると出力チャンネル数も連動して変わる
- 下流の Export 設定や受け側パラメータが新しいチャンネル数に対応しているかも確認
❌ Problem: Quantize Output をオフにすると挙動が変わる
✅ Solution:
- デフォルトでは Quantize Output がオンで、入力値は最も近い整数に丸められる
- オフにすると小数値がそのまま使われ、隣接する 2 チャンネルに按分されるような挙動になる
- 離散的なインデックス選択をしたい用途では基本的にオンのまま使用
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

