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

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

MIDI In DAT の MIDI イベント取り込みを示す図

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

概要 📖 – 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 イベント)

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

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 fromSpecified Operator のときに参照される OP パス:

  • From Operator パス: Execute fromSpecified 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 ExtensionCustom Extension のときに適用される拡張子:

  • Custom Extension 文字列: Edit/View Extensioncustom のときに使用される任意のファイル拡張子

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 に書き戻してオペレータが操作内容を即座に確認できるようにするデバッグフロー。

  1. MIDI Device Mapper でコントローラを登録し、midideviceTable DAT のパスを Device Table に設定
  2. Filter Messages を On、MessageControl Change にして CC のみ記録
  3. Callbacks DAT を作成し、onTableChange(dat) 内で dat[-1, 'value'].val から最新値を取得
  4. Text TOP の text パラメータに「CH<channel> CC<index> = <value>」形式で書き戻す
  5. 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 ノート番号とベロシティをそのままビジュアル制御信号として扱うパターン。

  1. MIDI In DAT で Filter Messages を On、MessageNote On に固定
  2. DAT Execute DAT を配置し、DAT パラメータに MIDI In DAT のパスを指定
  3. onTableChange(dat) 内で note = int(dat[-1, 'index'].val) / vel = int(dat[-1, 'value'].val) を取得
  4. 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 に再生したり統計分析したりするための素材として利用。

  1. Bytes Column を On にして raw バイト列を出力に含める
  2. Clamp Output を On、Maximum Lines を十分大きい値(例: 10000)に設定
  3. Callbacks DAT の onTableChange 内で一定間隔ごとに Table DAT へ追記コピー
  4. プロジェクト終了時に 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 🎯


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 にして不要な高頻度メッセージを除外

参考資料 📚

その他 🔗

公式リソース 📖

関連記事 🔗

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