コンテンツにスキップ

TouchDesigner + Python

Updated: 2026-05*

Claude生成記事であり、一部まだ未検証。

1. はじめに

ここではTouchDesigner(以下TD)におけるPython連携の基礎を、Windows / macOS両環境で習得する。TDはノードベースのビジュアルプログラミング環境であるが、内部にPython 3インタプリタを内蔵しており、ノードでは表現が冗長になる処理や、外部データ・外部ライブラリとの接続を簡潔に書くことができる。本教材では「ノードと併用するPython」を前提として、最小構成で動作する事例から外部ライブラリを用いた応用までを段階的に紹介する。

1.1 本教材で扱う内容

  • TDにおけるPythonの実行環境とOS別の注意点
  • DAT・CHOPからのPython参照、Pythonからのノード操作
  • Execute系DATによるイベント駆動の処理
  • 外部Pythonライブラリ(pip)の導入と利用
  • OSC/HTTPなど外部との通信

1.2 参考サイト

本稿の内容は以下のサイトおよび公式ドキュメントを参考にしている。

参考)

2. 開発環境

2.1 Pythonインストールの要否

結論として、TouchDesigner本体のインストールだけでPythonは最初から使える。TDにはPythonインタプリタが同梱されており、numpy、opencv、requestsといった主要ライブラリも同梱済みである。本教材の3章・4章前半の事例は追加インストール一切なしで動作する。

追加のインストールが必要になるのは、TDに同梱されていない外部ライブラリ(python-osc、pyautogui、mediapipe、anthropic等)を使う場合のみで、本教材では4.3節以降と5章のおもしろネタが該当する。

やりたいこと Windows macOS
3章・4章前半の事例(内蔵だけで完結) 追加インストール不要 追加インストール不要
4.3節以降・5章(外部ライブラリ利用) 追加Python不要、pipのみ実行 Homebrew経由でPython追加が必要

※ Mac受講生への注意:WindowsはTDに同梱のpython.exeからpipを直接呼べるため追加でPythonを入れる必要は無い。一方Macの場合、TDが.appバンドル構造であるため同梱pythonを外部から呼びにくく、Derivative公式は「TDと同じバージョンのPythonをHomebrewで別途入れて、そのpipでライブラリを集める」方式を推奨している。Pythonそのものを使うためではなく、pipコマンドを動かすためにインストールする、という位置付けである。よってMac受講生は4.3節以降に進む前に2.5節の環境構築を済ませておく必要がある。

2.2 OSによる前提の違い

TDはWindows/macOS両対応であるが、Pythonまわりの取り扱いは大きく異なる。

項目 Windows macOS
TDインストール先 C:\Program Files\Derivative\TouchDesigner /Applications/TouchDesigner.app
内蔵Python実行ファイル bin\python.exeとして直接呼べる .appバンドル内(外部から直接利用は非推奨)
外部ライブラリ導入の主流 内蔵pythonに対しpip --target Homebrewで同バージョンPythonを別途用意
Apple Silicon考慮 不要 ARM版TDとIntel版TDでHomebrewパスが異なる

macOSは「TDの.appに直接ライブラリを入れる」のではなく、TDと同じバージョンのPythonをHomebrew等で別途インストールし、そのsite-packagesにpipで入れたものをTDから参照する方法がDerivative公式の推奨方法である。

2.3 内蔵Pythonバージョンの確認

両OS共通の手順である。TDを起動してAlt+T(MacはOption+T)でTextportを開く。Textportで以下のコードを実行する。

import sys
print(sys.version)
print(sys.executable)

主なTDバージョンと内蔵Pythonの対応は概ね以下の通り。

TouchDesigner Python
2022.xxxxx 3.9系
2023.xxxxx〜現行 3.11系

※ 上記は目安である。必ず自分のTDで再確認する。

Mac版TDの場合、sys.executableの出力は以下のような形になる。

/Applications/TouchDesigner.app/Contents/Frameworks/Python.framework/Versions/3.11/bin/python3.11

このパスは参考情報である。直接このPythonを叩いてpip操作するのは推奨しないため、後述のHomebrew経由の方法を使う。

2.4 外部ライブラリ導入:Windows編

プロジェクトフォルダの作成

プロジェクトと一緒に持ち歩けるため、プロジェクトフォルダ内にライブラリをインストールする方法を推奨する。共有・再現性が高い。

コマンドプロンプトまたはPowerShellで、プロジェクトフォルダに移動する。

cd C:\TD_Projects\my_project

※ 上記のフォルダが存在しない場合は、エクスプローラーでC:\TD_Projects\my_projectを事前に作成しておくか、mkdirコマンドで作成する。

ライブラリ格納用フォルダの作成

mkdir python_libs

ライブラリのインストール

"C:\Program Files\Derivative\TouchDesigner\bin\python.exe" -m pip install --target=./python_libs python-osc

成功するとSuccessfully installed python-osc-x.x.xのような表示が出る。

TD側で動作確認

TDのTextportで以下を実行する。

import sys
sys.path.append(project.folder + '/python_libs')
from pythonosc.udp_client import SimpleUDPClient
print(SimpleUDPClient)

<class 'pythonosc.udp_client.SimpleUDPClient'>が表示されればOK。

恒常的にパスを通すには、3.4節で扱うExecute DATのonStartに書くか、Edit > PreferencesからPython 64-bit Module Pathにフォルダを指定する。

2.5 外部ライブラリ導入:macOS編

Homebrewのインストール

Homebrewが未導入の場合はbrew.shの手順に従う。Apple Silicon(M1/M2/M3/M4)とIntelでパスが異なる。

Mac Homebrew実体
Apple Silicon /opt/homebrew/bin/brew
Intel /usr/local/bin/brew

TDと同じバージョンのPythonを入れる

TD内蔵が3.11系の場合、ターミナルで以下を実行する。

brew install python@3.11

インストール後、pipのパスが存在するか確認する。

ls /opt/homebrew/opt/python@3.11/bin/pip3.11

ファイル名が表示されればOK。エラーが出る場合はインストールに失敗している。

※ 注意:以前はbin/pip3というシンボリックリンクで参照できたが、現行のHomebrewではpip3libexec/bin/配下に移動した。バージョン番号付きのpip3.11の方が安定して動くため、本教材ではこちらを使う。

プロジェクトフォルダの作成

プロジェクトフォルダはホームディレクトリ配下に作る。Desktopやドキュメント直下は避ける。

まずTD_Projectsフォルダとmy_projectフォルダを作成する。

mkdir -p ~/TD_Projects/my_project

-pオプションは「親フォルダが無ければ一緒に作る」という意味で、TD_Projectsmy_projectを1コマンドで両方作る。

作成したフォルダに移動する。

cd ~/TD_Projects/my_project

ライブラリ格納用フォルダの作成

mkdir python_libs

ライブラリのインストール

/opt/homebrew/opt/python@3.11/bin/pip3.11 install --target=./python_libs python-osc

成功するとSuccessfully installed python-osc-x.x.xのような表示が出る。

※ インストール後に「A new release of pip is available」というpip自身の更新通知が末尾に出るが、これは無視してよい。pipの更新はbrew upgrade python@3.11でHomebrewに任せる。

Intel Macの場合

Intel Macではパスが異なる。以下を使う。

/usr/local/opt/python@3.11/bin/pip3.11 install --target=./python_libs python-osc

Apple Silicon上でIntel版TDを使う場合はIntel版Homebrewが必要となる。エイリアスを切っておくと混乱しにくい。

alias iPIP311=/usr/local/opt/python@3.11/bin/pip3.11

TD側で動作確認

TDのTextportで以下を実行する。

import sys
sys.path.append(project.folder + '/python_libs')
from pythonosc.udp_client import SimpleUDPClient
print(SimpleUDPClient)

<class 'pythonosc.udp_client.SimpleUDPClient'>が表示されれば、ライブラリの読み込みに成功している。

macOS特有の注意

  • TDのアーキテクチャと一致させる。ARM版TDにはARM版Homebrewのpip、Intel版TD(Rosetta)にはIntel版Homebrewのpipを使う。混在するとimport時にクラッシュする。
  • numpy、opencv、requestsはTDに同梱されているため、独自インストールは依存衝突の原因になりやすい。必要が無ければ触らない。同梱版で動作確認していると外部Python環境の整合性検証にならないため、検証には同梱されていないライブラリ(python-osc等)を使う。

2.6 TOEファイルの保存場所とproject.folder

project.folderはTDの.toeファイルが保存されているフォルダのパスを返す。python_libsの場所を相対指定するために頻繁に使われる。

このプロパティを正しく機能させるためには、TOEファイルをpython_libsと同じプロジェクトフォルダに保存する必要がある。

  • TOEファイル:~/TD_Projects/my_project/myproject.toe
  • ライブラリ:~/TD_Projects/my_project/python_libs/

この配置になっていれば、project.folder + '/python_libs'~/TD_Projects/my_project/python_libsを指す。

※ よくある失敗:TOEファイルをDesktopに保存したまま、ライブラリを~/TD_Projects/my_project/python_libsにインストールすると、project.folderがDesktopを指すため、importが失敗する。Textportで以下を実行して保存場所を確認する。

print(project.folder)

期待するパスと違っていれば、File > Save Asで正しい場所にTOEファイルを保存し直す。

2.7 Textportの使い方

両OS共通である。Alt+T(MacはOption+T)で開く。print()の出力先であり、最も基本的な実験場となる。エラー時のスタックトレースもここに出力される。常時開いておくとデバッグが速い。

※ Textportでtime.sleep()を含むコードを実行すると、その間TDのUI全体がフリーズする。連続処理を書きたい場合は、3.4節で紹介するExecute DATのonFrameStartに乗せる方が筋が良い。

3. 簡単なPython連携の事例

ここでは「DATとは何か」から始めて、ノードとPythonの最小の繋ぎ方を4つ紹介する。コード自体はOS非依存で動作する。

3.1 DAT=Data Operator

DATはテキストやテーブルを扱うOperatorである。Pythonスクリプトを書く場所であり、TDの中で文字情報を扱う唯一のファミリーでもある。代表的なDATは以下の通り。

  • Text DAT:単一のスクリプトやテキストを保持
  • Table DAT:表形式のデータを保持
  • Execute DAT:起動・終了・フレーム毎などのイベントで自動実行
  • CHOP Execute DAT:CHOPの値変化をトリガに実行
  • Parameter Execute DAT:パラメータ変更をトリガに実行

3.2 事例①:Text DATでスクリプトを実行する

最小の事例である。Text DATを追加し、右クリック > Run Scriptで実行される。

  • Text DAT
    • 以下のコードを記入:
print('hello touchdesigner from python')
op('constant1').par.value0 = 0.5

op('constant1')は同階層のconstant1という名前のCHOPへの参照を返す。.par.value0がそのパラメータである。ノードのパラメータはPythonから読み書きできる、というのがTD×Pythonの最も重要な原則である。

3.3 事例②:パラメータをPython式で記述する

任意のパラメータを右クリック > Pythonを選ぶと、そのパラメータがPython式モード(紫色)になる。式の評価結果が毎フレーム反映される。

  • Transform TOP
    • Rotate:absTime.seconds * 30

absTime.secondsはTD起動からの経過秒数である。ノード同士をワイヤで繋がなくても、Python式一行で動的なパラメータが書ける。

CHOPの値も式で読める。

  • Transform TOP
    • Rotate:op(’lfo1’)[‘chan1’].eval() * 360

3.4 事例③:Execute DATで起動時に環境を整える

Execute DATを追加し、ParametersタブでStartのチェックボックスをONにすると、対応するコールバック(onStart)が起動時に自動的に呼ばれる。起動時に外部ライブラリのパスを通す典型例は以下の通り。

  • Execute DAT
    • Parametersタブ > Start:ON
    • 以下のコードを記入:
def onStart():
    import sys
    libs = project.folder + '/python_libs'
    if libs not in sys.path:
        sys.path.append(libs)
    return

Mac/Windows両方でそのまま動く(パス区切りに/を使えばOS依存しない)。

3.5 事例④:CHOP Execute DATで値変化を検知する

マウスがクリックされた瞬間にカウントを増やす処理の例である。

  • Mouse In CHOP
  • CHOP Execute DAT
    • CHOP:Mouse In CHOPを指定
    • Channels:left
    • Off to On:ON
    • 以下のコードを記入:
def onOffToOn(channel, sampleIndex, val, prev):
    op('count').par.value0 += 1
    return

「変化があった時だけ走る」イベント駆動のため、毎フレーム監視するよりも軽い。

4. 実践につながる簡単な実験

ここからはノード単体では実現しにくい、Pythonならではの実験を3つ行う。

4.1 実験A:JSON APIの値をテキスト表示する

外部のWeb APIから値を取得して、TDのテキストに描画する。requestsを入れずとも、TD内蔵のWeb Client DATで完結する。Mac/Windows同じ手順である。

ノード構成は以下のように接続する。

  • Web Client DAT
    • Request URL:https://api.open-meteo.com/v1/forecast?latitude=35.68&longitude=139.76&current_weather=true
    • Method:GET
    • Request:Pulseで送信
    • Callbacks DAT:Text DAT(後述のcallbacks用)を指定
  • Text DAT(callbacks用)
    • 以下のコードを記入:
def onResponse(webClientDAT, statusCode, headerDict, data, id):
    import json
    d = json.loads(data)
    temp = d['current_weather']['temperature']
    op('text1').par.text = f'Tokyo: {temp} C'
    return
  • Text TOP
    • Text:text1(コールバック側で書き換えるTextを参照)

APIから取得した気温の値がText TOPに反映される。

これだけで「外部データに反応するビジュアル」の基礎が完成する。気温に応じて色相を変える、風速に応じて粒子の速度を変えるなど、応用への展開が容易である。

4.2 実験B:numpyで生成した波形をCHOPに流し込む

外部ライブラリで作った数値配列をTDに渡す典型パターンである。Script CHOPを使う。numpyはTD同梱のため追加インストール不要(両OS共通)。

  • Script CHOP
    • script1_callbacksに以下のコードを記入:
import numpy as np

def onCook(scriptOp):
    scriptOp.clear()
    n = 512
    scriptOp.numSamples = n          # ← 忘れると最初の1サンプルしか反映されない
    t = np.linspace(0, 4 * np.pi, n)
    y = np.sin(t) * np.exp(-t / 8)   # 減衰サイン波

    chan = scriptOp.appendChan('decay_sine')
    chan.vals = y.tolist()
    return

※ 注意:Script CHOPnumSamplesデフォルトは1である。chan.valsに長いリストを渡してもnumSamplesを増やしておかないと先頭1要素だけが採用される。

  • Timer CHOP(任意)
    • Script CHOPの上流に接続してCookをトリガする

生成されたdecay_sineをMath CHOPやEval CHOPで加工してビジュアルに流す。

4.3 実験C:python-oscでOSC通信する

ここから外部ライブラリ(python-osc)を使う。事前に2.4節(Windows)または2.5節(macOS)の手順でpython-oscをインストールしておく。

OSCはセンサデバイス、機械学習推論サーバ、音響ソフト(Ableton Live、Max/MSP等)との接続で定番となる通信プロトコルである。

OSC In CHOPで受信側を準備

  • OSC In CHOP
    • Network Port:7000
    • Active:ON

Textportから単発送信

TDのTextportで以下を実行する。

import sys
sys.path.append(project.folder + '/python_libs')
from pythonosc.udp_client import SimpleUDPClient

client = SimpleUDPClient('127.0.0.1', 7000)
client.send_message('/test/hello', 1.0)
client.send_message('/test/position', [120.0, 240.0])
print('sent')

OSC In CHOPのビューアを確認すると、以下のチャンネルが現れる。

  • test/hello:1.0
  • test/position1:120.0
  • test/position2:240.0

Execute DATでフレーム駆動の連続送信

Textportで連続実行するとUIがフリーズするため、Execute DATのonFrameStartに処理を乗せる。

  • Execute DAT
    • Parametersタブ > Frame Start:ON
    • 以下のコードを記入:
import sys, math
libs = project.folder + '/python_libs'
if libs not in sys.path:
    sys.path.append(libs)
from pythonosc.udp_client import SimpleUDPClient

client = SimpleUDPClient('127.0.0.1', 7000)

def onFrameStart(frame):
    client.send_message('/test/hello', math.sin(absTime.seconds))
    return

OSC In CHOPのtest/helloの値がサイン波で動き続ける。

※ OSC Out CHOPとOSC Out DATは別物:TDにはOSC Out CHOPOSC Out DATがあるが、PythonからsendOSC()メソッドを呼べるのはDATの方だけである。CHOPは入力ワイヤから値を自動送信するノードであり、Pythonから直接メッセージを送る用途には向かない。本教材ではpython-osc経由で送るため、どちらも使わない。

ファイアウォール許可

  • Windows:初回送受信時に「Windows Defenderファイアウォール」のダイアログが出るので許可する
  • macOS:システム設定 > ネットワーク > ファイアウォールで許可する。システム設定 > プライバシーとセキュリティ > ローカルネットワークでTouchDesignerにチェックを入れる必要がある場合もある

5. おもしろネタ3つ

ここからの3つの事例は、いずれもTDに同梱されていない外部ライブラリを使う。Windows受講生は各事例の準備セクションのpipコマンドをそのまま実行する。Mac受講生は2.5節のHomebrew + Python 3.11のインストールを最初に済ませておく。

5.1 ネタ①:マウスカーソルでお絵描きするBot

pyautoguiを使って、TD自身が自分のカーソルを動かす自己演奏マシンである。プレゼンや展示で「画面が勝手に動いている」演出に使える。

Windows:ライブラリのインストール

"C:\Program Files\Derivative\TouchDesigner\bin\python.exe" -m pip install --target=./python_libs pyautogui

macOS:ライブラリのインストール

/opt/homebrew/opt/python@3.11/bin/pip3.11 install --target=./python_libs pyautogui

macOS追加手順:アクセシビリティ許可

Macの場合、TouchDesignerにアクセシビリティ権限を付与する必要がある。以下の手順を行う。

  1. システム設定 > プライバシーとセキュリティ > アクセシビリティを開く
  2. +ボタンからTouchDesigner.appを追加して有効化する
  3. TDを再起動する

※ アクセシビリティ許可を行わない場合、エラーは出ないのにカーソルが動かないという症状になる。

スクリプト

Execute DATのonFrameStartにリサージュ軌跡でマウスを動かす処理を書く。

  • Execute DAT
    • Parametersタブ > Frame Start:ON
    • 以下のコードを記入:
import sys, math
sys.path.append(project.folder + '/python_libs')
import pyautogui

# 必須:onFrameStartは60fpsで呼ばれる。デフォルトのpyautogui.PAUSE=0.1だと
# 呼び出し毎に100msブロックされ、TDのフレームレートが激落する。
pyautogui.PAUSE = 0
pyautogui.FAILSAFE = False  # 画面左上角に来ても止めない

def onFrameStart(frame):
    t = absTime.seconds
    cx, cy = 960, 540
    x = int(cx + 300 * math.sin(t * 1.7))
    y = int(cy + 300 * math.sin(t * 2.3))
    pyautogui.moveTo(x, y)
    return

TDのMouse In CHOPはこの動いたカーソルを拾うため、TD内のビジュアルがマウス座標に反応するように組んでおけば、自分で自分を演奏する映像になる。展示用の無人デモに有用である。

5.2 ネタ②:MediaPipeで指関節をリアルタイム取得

Google MediaPipeをTDに同居させる。Webカメラ1台で手や顔のランドマークが取得できる。

Windows:ライブラリのインストール

"C:\Program Files\Derivative\TouchDesigner\bin\python.exe" -m pip install --target=./python_libs mediapipe opencv-python

macOS:ライブラリのインストール

/opt/homebrew/opt/python@3.11/bin/pip3.11 install --target=./python_libs mediapipe opencv-python

macOS追加手順:カメラ許可

Video Device In TOPを初めて追加した際にシステム設定 > プライバシーとセキュリティ > カメラでTouchDesignerを許可するダイアログが出る。許可後、TDの再起動が必要である。

Apple Silicon上のMediaPipeに関する注意

  • ARM版MediaPipeは比較的最近対応した。古いTDバージョンではwheelが見つからない場合がある
  • pip installで失敗する場合、mediapipe-siliconという派生パッケージを試す手段もある
  • ARM版TD + ARM版Pythonの組み合わせが最も安定する

ノード構成

  • Video Device In TOP
  • Script CHOP
    • 上記Video Device In TOPをPythonから参照
    • 出力チャンネル:21関節 × xy座標 = 42チャンネル
  • Geometry COMP
    • Instancing:Script CHOPのxyを参照して指先にパーティクル追従

Script CHOPコード

  • Script CHOP
    • 以下のコードを記入:
import sys, numpy as np
sys.path.append(project.folder + '/python_libs')
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=1, min_detection_confidence=0.7)

def onCook(scriptOp):
    scriptOp.clear()
    img = op('videodevicein1').numpyArray(delayed=False)
    if img is None:
        return

    # TDのTOPはY軸が下から上(OpenGL系)でnumpy配列に格納されるため、
    # 行0が画像の下端になる。MediaPipeは画像座標(Y下向き、行0が上端)を前提とするので、
    # flipudで正立に直してから渡す。これをやらないと指先が下向きの「逆さ手」として
    # 認識され、検出精度が大きく落ちる。
    img = np.flipud(img).copy()
    img = (img[:, :, :3] * 255).astype(np.uint8)

    result = hands.process(img)
    if result.multi_hand_landmarks:
        lm = result.multi_hand_landmarks[0].landmark
        for i, p in enumerate(lm):
            # 画像を上下反転して渡しているので、MediaPipeのp.yはそのままTDのY座標として使える。
            scriptOp.appendChan(f'x{i}').vals = [p.x]
            scriptOp.appendChan(f'y{i}').vals = [p.y]
    return

「指先からパーティクル」「手の形でフィルタを切替」「ピンチ操作でズーム」など、ジェスチャ・インタラクションの応用が一気に視野に入る。

5.3 ネタ③:LLMにビジュアルパラメータを提案させる

ClaudeやOpenAIのAPIを叩いて「いまの音楽の雰囲気に合うパラメータを提案して」と依頼し、戻ってきたJSONをTDのパラメータに流し込む応用である。ノードを「演出家」として動かす遊びと言える。ネットワーク通信のみのためOS差は無い。APIキーの取り扱いだけ注意する。

Windows:ライブラリのインストール

"C:\Program Files\Derivative\TouchDesigner\bin\python.exe" -m pip install --target=./python_libs anthropic

macOS:ライブラリのインストール

/opt/homebrew/opt/python@3.11/bin/pip3.11 install --target=./python_libs anthropic

APIキーの保管

ソースコードに直書きせず、環境変数で渡すと事故が減る。

  • Windows:システム > 詳細情報 > 環境変数からANTHROPIC_API_KEYを追加 → TD再起動
  • macOS:~/.zshrcexport ANTHROPIC_API_KEY="..."を追記 → ターミナルからopen /Applications/TouchDesigner.appで起動するとTDも環境変数を継承する

※ macOSでFinderからアプリをダブルクリックで起動した場合、.zshrcの環境変数を継承しないことがある。ターミナルからopenコマンドで起動するのが確実である。

スクリプト

  • Text DAT
    • 以下のコードを記入し、Pulseで実行:
import sys, os, json
sys.path.append(project.folder + '/python_libs')
import anthropic

client = anthropic.Anthropic(api_key=os.environ.get('ANTHROPIC_API_KEY'))

prompt = '''
今からTouchDesignerのビジュアルを演出します。
以下のキーを持つJSONだけを返してください。説明やコードフェンスは不要です。
- hue: 0.0-1.0
- saturation: 0.0-1.0
- speed: 0.0-2.0
- noise_amount: 0.0-1.0
雰囲気のテーマは「深海の静寂」。
'''

msg = client.messages.create(
    model='claude-haiku-4-5-20251001',
    max_tokens=200,
    system='You are a parameter designer. Output strict JSON only, no prose, no code fences.',
    messages=[{'role': 'user', 'content': prompt}]
)
text = msg.content[0].text.strip()

# LLMはたまにマークダウンコードフェンスを付けて返すので剥がしておく
if text.startswith('```'):
    text = text.split('```')[1]
    if text.startswith('json'):
        text = text[4:]
    text = text.strip()

try:
    params = json.loads(text)
except json.JSONDecodeError:
    debug(f'LLM response was not valid JSON: {text!r}')
    raise

op('constant_color').par.colorr = params['hue']
op('constant_color').par.colorg = params['saturation']
op('speed').par.value0 = params['speed']
op('noise1').par.amp = params['noise_amount']

「30秒ごとにテーマを切り替えてLLMに新しいパラメータを聞く」ようにすれば、AI主導で自動演出されるインスタレーションとなる(おまけ)。

※ API課金と応答レイテンシ(数秒)があるため、リアルタイム制御ではなくシーン切替の演出器として使うのが現実的である。

6. まとめ

TDにおけるPythonは、ノードを置き換えるものではなく、ノードが苦手な領域(外部通信、配列処理、分岐の多いロジック、機械学習推論)を引き受ける道具として捉えると役割が明確になる。

OS別のつまずきポイントを整理すると以下の通り。

つまずき Windows macOS
外部ライブラリの入れ方 TD同梱pythonにpip --target Homebrewで並行Python → そのpipで--target
pipコマンドのパス TD同梱のpython.exe -m pip python@3.11/bin/pip3.11(バージョン番号付きが安定)
アーキテクチャ衝突 基本的に問題なし ARM/Intel混在に注意
カメラ・マウス系の許可 初回ダイアログのみ システム設定で明示許可+TD再起動
環境変数の継承 環境変数設定後にTD再起動 ターミナルからopenで起動が確実

import関連のつまずきとしては以下が頻出である。

  • TOEファイルがプロジェクトフォルダの外(Desktop等)に保存されていてproject.folderが想定と違う
  • numpyやrequestsなどTD同梱ライブラリで動作確認してしまい、外部ライブラリの導入経路が検証できていない
  • OSC Out CHOPにsendOSC()を呼ぼうとして失敗(DAT版を使う)

学習の順序としては、以下の流れで取り組むと進めやすい。

  1. パラメータのPython式(3.3)に慣れる
  2. Execute DAT系のイベント駆動(3.4・3.5)を使えるようになる
  3. Script CHOP/TOP/DATで外部ライブラリを取り込む(4.2・5.2)
  4. 通信(4.1・4.3)でTDを開かれたシステムにする

慣れてくると、ノードで5分かかる構成がPython3行で済む場面が増え、表現の試行錯誤が一気に速くなる。