第8回 DAT + Python 基礎

Tuesday, June 15, 2021

今回は文字やスクリプト、データベース、外部との通信などを扱う DAT と それらを使う上で必要になってくる Python の勉強をしていきます!

サンプルファイル

chimanaco/takara-univ-media-programming-2021
08が本日のディレクトリです。

最終課題について

突然ですが、この講義の最終課題についてです。先週勉強した音のデータを可視化する方法を使って、音に反応して変化する作品を TouchDesigner で制作してください。この後実習が多いのと終盤講義に参加できない方がけっこうおられるとのことなので、早めにお知らせしています。「こういうの作りたいんだけどどうすればいいの?」など質問等ありましたらお気軽にいつでもどうぞ!

Python について

Python はとても広く使われている言語で、行列計算や統計処理などの数学的処理に使えるモジュールが豊富なため、近年では AI 開発に使用されることが多くなっています。読みやすく書きやすいプログラミング言語として設計されたため、プログラミング初心者にもおすすめです。

また、Maya, Blender, Houdiniなどの DCC(Digital Content Creation)ツールのスクリプト言語として使われています。TouchDesigner だけでなく、他のツールにも応用していけるのでこの機会に是非はじめてみてください!

TouchDesigner で Python を使う

Textport を使う

alt + T で Textport のウィンドウを表示することができます。

python >>> の後に print('Hello')とタイプして Enter を押すと Hello という文字が表示されます。 これは print という文字列を出力する関数に Hello という文字列を入れて表示したものです。関数というのは、何かを入れると何かが行われて何かが出てくる仕組み、と考えられます。

Network

Text DAT を使う /project1/TextDAT

TouchDesigner を使っていて、実際に Textport で Python を実行することは少ないと思いますので、今度は別の方法としてText DAT を使用して Python のコードを実行してみましょう。

Text DAT をネットワークエディタに配置して、右下の+ボタンをクリックします。これでテキストを入力できる状態になります。 print('Hello') とタイプして、Run Script を実行すると、Textport に実行結果が表示されます。

このように Textport は Python の実行結果を確認する時によく使います。

まずは一般的な Python の文法をいくつかご紹介します。

数値演算 /project1/Arithmetic_operations

以下のような数値演算子が使えます。

Operator Function Examples Result
+ 加算 2 + 10 12
- 減算 2 - 10 8
* 乗算 2 * 10 20
/ 除算 2 / 10 0.2
% 剰余 2 % 10 2
** べき乗 2 ** 10 1024

Network

変数 /project1/Variable

変数とは値を格納する箱のようなものです。 格納したものを後で使用することができます。

a = 10 + 2
print(a)
# output: 12

プログラミング言語によっては、変数を宣言する際に、型宣言(この変数にはこの型を格納するという宣言)を行う必要がある言語があります。 Python でよく使われる型には以下のものがあります。

Type Function Examples
int 整数 2, 10
float 小数点 0.2, 10.5
str 文字列 “takara”, “宝塚”
bool 真偽 True, False
list リスト [1, 2, 3, 4], [ “takara”, “宝塚” ]

Python の変数には型宣言が必要ないため、変数にどのような型でも入れることができるのですが、 型に注意しないと計算結果が意図しないものになることがあります。 例えば、以下のように整数と文字列では似ているものでも出力結果が異なります。

print(1 + 1)
# output: 2

print("1" + "1")
# output: 11

このように Python では + 演算子を使うことで複数の文字列を連結して 1つの文字列にすることができますが、文字列に数値を連結することはできません。 例えば、文字列(str)に整数(int)を足して表示しようとするとエラーになります。

c = 1
print("Index" + c)
# output: Error

解決法としては型変換をよく使います。以下は整数を文字列に変換する例です。

c = 1
print("Index" + str(c))
# output: Index1

比較演算子

Operation Examples Meaning
< x < y x が y より小さい
<= x <= y x が y 以下
> x > y x が y より大きい
>= x >= y x が y 以上
== x == y x と y が等しい
!= x != y x と y が異なる

これらは値の比較をするもので、条件分岐と合わせて使用されることが多いです。

c = 2
if( c < 10 ):
    print("C is bigger than 10")
else:
    print("C is smaller than 10)"

: に続く行はインデント(字下げ)を行う必要があります。 1つのブロックでインデントが同じになっていないとエラーになってしまいますので注意しましょう。 例えば、以下はエラーになります。

if( c < 10 ):
print("C is bigger than 10")

IndentationError: expected an indented block のようにエラー文の中に indent という文字列があったら該当する行のインデントをチェックしましょう。

モジュール

Python には様々な機能をもった関数が簡単に使えるように用意されています。これらは使いやすいように目的や種類ごとに分類して提供されていて、こういった Python が機能を分類する単位をモジュールといいます。

例えば、多くの数学関連の機能は math というモジュールに分類されています。モジュールに入った関数を利用する際には、そのモジュールをimport 文で指定します。

import math

# PI
print(math.pi)
# floor
print(math.floor(5.2))
# ceil
print(math.ceil(5.2)))

以下は random な値を生成するモジュールです。

import random

# Generate random value
print(random.random())

簡単に一般的に Python でよく使われるものをご紹介しました。 他にもまだまだ沢山の文法がありますので是非勉強してみてください!

ここからは TouchDesigner 独自の使われ方を勉強していきます。

よく使う Expression

Textport、Text DAT とともに、 オペレーターのパラメーターで expression として使うこともよくりあります。パラメーターの青い部分をクリックすることで明示的に使用できます。

Network

時間

## ファイルを開いてからのフレーム数
absTime.frame
## ファイルを開いてからの秒数
absTime.seconds

Operator を参照する /project1/Operators

operator オブジェクトを参照する時は op('name') を使用します。 自分自身を参照する場合は me を使用します。 また、ひとつ上の階層を参照する場合は parent() を使用します。

Operator のメンバー変数を参照する

メンバー変数という各オペレーターが共通で持っている変数を表示してみます。Operatorの後に . を入れてその後に変数名を入れていきます。

# name
op('circle1').name
# output: circle1

# type
op('circle1').type
# output: circle

# digits
op('circle1').digits
# output: 1

Operator の parameters を参照する /project1/Operator_parameters

par を使用してオペレーターのパラメーターを参照することができます。パラメーター名は parameter window で確認することができます。

Network

# parameters
print(op('circle1').par.radiusx)
print(op('circle1').par.fillcolorr)
print(op('circle1').par.radiusx)

CHOP Execute

イベントが起こった時に反応する機能をCallbacksといいます。例えば CHOP Execute は指定した CHOP に変化が起こった時に呼び出される DAT です。

Definition Meaning
onOffToOn Off から On になった時
whileOn On になっている間ずっと
onOnToOff On から Off になった時
whileOff Off になっている間ずっと
onValueChange 値が変わった時

Button COMP とその直後に Null CHOPを配置し、CHOP Execute を追加します。Button COMPButton TypeToggle Down にしておいてください。 CHOP Execute デフォルトだと onValueChange がオンになっています。以下のコードを書いて、ボタンをクリックしてみましょう。

def onValueChange(channel, sampleIndex, val, prev):
    print('change!')
    return

Value Change を Off にして、Off to On を On にします。

def onOffToOn(channel, sampleIndex, val, prev):
    print('change!')
    return

こうすることで 0 から 1に数値が変化した時に print が呼ばれます。

CHOP Execute + Text DAT /project1/CHOP_execute

Value Change を Off にして、Off to On を On にします。

def onOffToOn(channel, sampleIndex, val, prev):
    op('text9').text = "ON"
    return

On to Off を On にします。

def onOnToOff(channel, sampleIndex, val, prev):
    op('text9').text = "OFF"
    return

本日の課題: Button と Python を使って切り替えを行う

今日勉強した Python を使って、Button を押したら何か変化が起こるものを作ってください。数値でもテキストでも色でもサイズでも何でも構いません。 プロジェクトフォルダごと Teams に提出してください。

課題のサンプル: /project1/Example

講師が作成した課題のサンプルです。

参考

第9回 Kinect を使ってみよう

第7回 Audio Data Visualization 基礎