
概要 📖 – MIDI イベントをテーブル形式で記録
MIDI In DATは、MIDI デバイスから受信したノート・CC・ピッチベンド等のイベントを 1 行 1 イベントでテーブル形式に記録する DATです。Callbacks DAT 経由で受信ごとに Python を発火させる per-event スクリプティングや、フィルタによる必要メッセージのみの抽出、14bit MSB/LSB の統合受信、出力行数の上限制御まで備えており、MIDI 入力のテーブル化基盤として使われます。
主な用途 🎯
- MIDI デバイス受信イベントのテーブル化(ノート / CC / ピッチベンド / プログラムチェンジ / SysEx 等を 1 行 1 イベントで記録)
- Callbacks DAT による Python 駆動(行追加ごとに
onTableChange経由で per-event 処理を実行) - メッセージ種別・チャンネル・index・value のフィルタリングで必要なイベントだけ抽出
- 14bit MIDI 値の統合受信(MSB/LSB を 1 つの高分解能値に合成)
- ライブパフォーマンスのイベントログ(演奏履歴・コントローラ操作履歴のデバッグ・記録用途)
データフロー 🔄
入力: MIDI デバイス受信イベント
↓
MIDI メッセージ解析(type / channel / index / value 抽出)
↓
フィルタ判定(Skip Sense / Skip Timing / Filter Messages)
↓
出力: テーブル DAT(time / channel / index / value / type 列、1 行 1 イベント)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Connect Page 📋
デバイス接続 🎹
Active .active ✅
– On 時、MIDI イベントを受信してテーブルに記録
– Off 時は受信処理を停止(テーブルへの書込みなし)
Device Table .device 📋
– 参照する MIDI デバイス Table DAT へのパス
– 通常は op('midiin1').par.device = 'midideviceintable1' 等で MIDI Device Mapper / midideviceTable DAT を指定
Device ID .id 🔢
– Device Table から実際に使用するデバイスの id を整数で指定
– Device Table の行のうち id 列の値と一致するデバイスが受信源になる
14 Bit Values .value14 🎚️
– On 時、2 つの 7bit メッセージ(MSB / LSB)を 1 つの 14bit 値として統合して記録
– index 0-31 が MSB、index 32-63 が LSB に対応(LSB index = MSB index + 32)
– 98/99 ペアと 100/101 ペアも同様に統合される
– MSB のみ受信し LSB が来ない場合は出力されない
– index 64-95 の範囲は 14bit 化されず通常の 7bit として記録される
Filter Page 🎛️
Skip 設定 🚫
Skip Sense .skipsense 💤
– On 時、Active Sense メッセージをテーブルに記録しない(ノイズ低減・行数節約)
Skip Timing .skiptiming ⏱️
– On 時、MIDI クロックなどの Timing メッセージをテーブルに記録しない
メッセージフィルタ 🎯
Filter Messages .filter 🔘
– On 時、以下の Message / Channel / Index / Value フィルタが有効化される
– Off 時は全イベントが無条件で記録される
Message Type .message 🎼
フィルタ対象とする MIDI メッセージ種別の選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| Note On | .noteon |
ノートオン(鍵盤押下)のみ記録 |
| Note Off | .noteoff |
ノートオフ(鍵盤離鍵)のみ記録 |
| Control Change | .controlchange |
コントロールチェンジ(CC)のみ記録 |
| Program Change | .programchange |
プログラムチェンジ(音色切替)のみ記録 |
| Pitch Wheel | .pitchwheel |
ピッチベンドホイールのみ記録 |
| Channel Pressure | .channelpressure |
チャンネルプレッシャー(アフタータッチ)のみ記録 |
| Polyphonic Pressure | .polypressure |
ポリフォニックキープレッシャーのみ記録 |
| System Exclusive | .sysex |
SysEx メッセージのみ記録 |
Channel / Index / Value フィルタ 🔢
Channel .channel 📻
– フィルタ対象とする MIDI チャンネル(1-16 の範囲)
– 該当チャンネルのイベントのみ記録
Index .index 🔑
– フィルタ対象とする MIDI index(1-128 の範囲)
– ノート番号や CC 番号など、メッセージ種別ごとに意味が変わる識別値
Value .value 📈
– フィルタ対象とする MIDI value(0-127 の範囲)
– ベロシティや CC 値の生値
Received Messages Page 📨
Callbacks .callbacks 🐍
Callbacks DAT .callbacks 📜
– 行追加(MIDI イベント受信)ごとに 1 回スクリプトを実行する Callbacks DAT のパス
– Python コールバック API は midiinDAT_Class に準拠
実行スコープ .executeloc 📍
Callbacks DAT のスクリプトを実行する OP の場所を決定するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Current Node | .current |
現在の Node 位置からスクリプトを実行 |
| Specified Operator | .specified |
From Operator パラメータで指定した OP からスクリプトを実行 |
| Parent of Callbacks DAT | .callback |
Callbacks DAT の親 OP からスクリプトを実行(sibling 参照が容易) |
From Operator .fromop 🔗
Execute from が Specified Operator のときに参照される OP パス:
- From Operator パス:
Execute fromがSpecified Operatorのときに参照される OP のパス
出力行数制御 📏
Clamp Output .clamp 🚧
– On 時、Maximum Lines の値で出力テーブル行数を上限制御
– デフォルトでは 100 行に制限されているが、Clamp Output によって任意値・無制限に変更可能
Maximum Lines .maxlines 📐
– 出力テーブルに保持するメッセージ数の上限
– 上限を超えると古いメッセージから順に削除される(FIFO)
Clear Output .clear 🗑️
– パルスで出力テーブルをクリア(ヘッダ行以外を全削除)
– Python から呼ぶ場合: op('midiin1').par.clear.pulse()
Bytes Column .bytes 🔣
– On 時、各 MIDI メッセージの raw bytes を別カラムとして出力に追加
– デバッグ用途・SysEx の生バイナリ確認に有用
Common Page 🔧
Language .language 📝
DAT が動作するスクリプト言語の決定方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT のスクリプト言語を使用 |
| Node | .node |
この DAT 自身のスクリプト言語を使用 |
Edit/View Extension .extension 📄
外部エディタに公開するファイル拡張子の選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| dat | .dat |
汎用的なファイル拡張子 dat を使用 |
| From Language | .language |
DAT のスクリプト言語に応じた拡張子を自動選択 |
| Custom Extension | .custom |
Custom Extension で指定したカスタム拡張子を使用 |
Custom Extension .customext 🔤
Edit/View Extension が Custom Extension のときに適用される拡張子:
- Custom Extension 文字列:
Edit/View Extensionがcustomのときに使用される任意のファイル拡張子
Word Wrap .wordwrap 🔁
ノード表示でのワードラップ (折り返し) の有効化
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT の Word Wrap 設定を継承 |
| On | .on |
Word Wrap を有効化 (ノード上の長い行を折り返し表示) |
| Off | .off |
Word Wrap を無効化 (折り返さずそのまま表示) |
実践アイデア 💡
Example 1: MIDI コントローラの CC 受信ログをリアルタイム表示 🎛️
MIDI Controller → MIDI In DAT (Filter: Control Change) → Text TOP
ハードウェア MIDI コントローラからの CC メッセージを MIDI In DAT で記録し、行追加ごとに最新行を Text TOP に書き戻してオペレータが操作内容を即座に確認できるようにするデバッグフロー。
- MIDI Device Mapper でコントローラを登録し、midideviceTable DAT のパスを
Device Tableに設定 Filter Messagesを On、MessageをControl Changeにして CC のみ記録- Callbacks DAT を作成し、
onTableChange(dat)内でdat[-1, 'value'].valから最新値を取得 - Text TOP の
textパラメータに「CH<channel> CC<index> = <value>」形式で書き戻す Maximum Linesを 200 程度に設定し、長時間運用でも履歴が膨張しないようにする
Example 2: ノートオン受信から Constant CHOP へ値を流し込む 🎹
MIDI Keyboard → MIDI In DAT (Filter: Note On) → DAT Execute DAT → Constant CHOP
MIDI 鍵盤からのノートオンイベントを MIDI In DAT に記録し、DAT Execute DAT で行追加を捕捉して Constant CHOP の値に変換。MIDI ノート番号とベロシティをそのままビジュアル制御信号として扱うパターン。
- MIDI In DAT で
Filter Messagesを On、MessageをNote Onに固定 - DAT Execute DAT を配置し、
DATパラメータに MIDI In DAT のパスを指定 onTableChange(dat)内でnote = int(dat[-1, 'index'].val)/vel = int(dat[-1, 'value'].val)を取得op('constant1').par.value0 = note / 127.0等で Constant CHOP に正規化して書き込み
Example 3: 演奏全イベントのログ保存(録音 / リプレイ用途) 💾
MIDI Devices → MIDI In DAT (Bytes Column ON) → Table DAT → File Out DAT
演奏セッション中の全 MIDI イベントを raw bytes 付きで MIDI In DAT に蓄積し、定期的に Table DAT へコピーして CSV / JSON ファイルとして書き出すロギング用途。後日 MIDI File に再生したり統計分析したりするための素材として利用。
Bytes Columnを On にして raw バイト列を出力に含めるClamp Outputを On、Maximum Linesを十分大きい値(例: 10000)に設定- Callbacks DAT の
onTableChange内で一定間隔ごとに Table DAT へ追記コピー - プロジェクト終了時に File Out DAT で
.csv/.jsonとして書き出し
関連オペレータ 🔗
類似機能OP 🔍
- MIDI Event DAT — MIDI イベントをテーブル形式で扱う近接 DAT(イベントトリガー用途)
- OSC In DAT — OSC プロトコル受信版。同様にメッセージを 1 行 1 イベントで記録
- Serial DAT — シリアル受信版。マイコンからの行データをテーブル化
組み合わせ推奨OP 🔄
- MIDI In CHOP — CHOP 版の MIDI 入力。チャンネル値として扱いたいときは併用
- MIDI In Map CHOP — MIDI を Mapper 経由で柔軟にチャンネル割当する版
- DAT Execute DAT — 行追加イベントをトリガーに Python を発火する定番ペア
- Table DAT — 受信ログを別 DAT に転記・保存する用途
- Constant CHOP — コールバックから値を Constant CHOP に書き戻して CHOP ネットワークへ流す
前処理・後処理DAT 🎯
- 前処理: Table DAT
- 後処理: DAT Execute DAT、Table DAT、Null DAT
Info DAT情報 📊
MIDI In DAT は Info DAT による詳細情報取得に対応しています (num_rows / num_cols / total_cooks / cook_time 等の共通 DAT Info チャンネルを参照可能)。
DAT 固有情報 📋
num_rows: DAT の行数num_cols: DAT の列数type: DAT の型 (table / text)is_table: テーブル形式の場合 1、テキスト形式の場合 0
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: MIDI デバイスが Device Table に出てこない
✅ Solution:
- MIDI Device Mapper を開き、OS が認識している MIDI デバイスがリストアップされているか確認
- デバイスを USB 再接続し、Project → MIDI Device Mapper で再スキャン
- macOS の場合は Audio MIDI Setup、Windows の場合はデバイスマネージャでドライバが正しくロードされているか確認
- midideviceTable DAT のパスを
Device Tableパラメータに正しく設定しているか確認
❌ Problem: イベントが記録されない・フィルタで全部消える
✅ Solution:
Activeパラメータが On になっているか確認Filter Messagesが On のとき、Message/Channel/Index/Valueの条件が想定どおりか再点検Skip Sense/Skip Timingを一旦 Off にして全イベント受信を確認Device IDが Device Table の id と一致しているか確認
❌ Problem: Callbacks スクリプトが発火しない / エラーで止まる
✅ Solution:
- Callbacks DAT のパスが
Callbacks DATパラメータに正しく設定されているか確認 Execute fromの選択が意図したスコープ(Current Node / Specified Operator / Parent of Callbacks DAT)になっているか確認- コールバック内を
try / except Exception as e:で囲み、Textport にトレースバックを出力して例外を特定 - 重い処理(ファイル I/O・ネットワーク)はコールバック内で完結させず、別 thread や非同期処理に逃がす
❌ Problem: 出力行数が無制限に増えてメモリを圧迫する
✅ Solution:
Clamp Outputを On にし、Maximum Linesで適切な上限(例: 200-1000)を設定onTableChange内で必要な情報を別 DAT / 外部ファイルに転記したあとop('midiin1').par.clear.pulse()で定期クリアSkip Sense/Skip Timingを On にして不要な高頻度メッセージを除外
参考資料 📚
その他 🔗
- TouchDesigner Wiki — DAT 概要
- TouchDesigner Wiki — Category:DATs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

