[Diary/2004/September]

教育用途としてのPython / 2004-09-14 (火)

PDのpyオブジェクト

PureDataにはpyというPythonでエスクターナルを書けるオブジェクトが存在するらしい.
で,簡単な解説ページがあった

う…面白そうだ.
DSPは書けないみたいだけど,PDってDSPやるだけが能じゃないからねぇ.
DSPだけがコンピュータ音楽じゃない.
それこそ,Millerはスコア記述用途としてPDを使うって選択を提案してるわけだし.
そういう意味で,これは非常に面白い.
Max的なプログラミングじゃ繁雑になることを,手続き系(?)の言語で書けるわけだから.
てか,DSPは普通にMaxパッチ書いた方が楽そう…
(まぁそれは,僕がMaxプログラミングに慣れてるからなのだけれど)
DSPの制御系は,これ使って書いた方が楽そう.
グラニュラーサンプリングとか一から書くのは本当に面倒くさいもんなぁ.

ただ,そのエクスターナルオブジェクトを複数インスタンス化した時(JavaとかC++だと,この表現はおかしいけど,Maxってそういう感じなのだ,と僕は理解してる),Pythonスクリプト中に書かれたグローバル変数は共用されるらしい.
…理由がわからない.なぜ?
スクリプトはpyオブジェクトのインスタンス化の時に動的に読み込まれるんじゃないの?
Cで書いた時みたいに構造体が上手く使えないからなのか?
(this->dataみたいな)
pyオブジェクト同士がバックグラウンドで処理を共用してる?
…それ,Maxのオブジェクトとして問題あるような気もするが,Pythonインタプリタを大量に立ち上げるのを回避してるのか.

ま,それはともかく.
ヨーロッパではPythonが爆発的に普及していて(当然と言うかなんと言うかRubyは影も形もない),色々使われている.
実際,コースの同期でコンピュータ上のプログラムを書く人達はみんなPythonを選択したようだ.
(ロボットアート作ってる人達は別.マイコンはアセンブラかCで書かなきゃいけないから)

というのも,えらい簡単なのだそうだな.
他の学校の初級プログラミング授業じゃ当り前のように採用されているらしい.
上記のページでもアルペジエータ作成やってます.
うむ,これ既存オブジェクトだけじゃえらい面倒くさいもんな.
ちょっと細かなルール書くだけで相当繁雑になる.

んー,こっちで散々Pythonを布教された事だし,ここらへん手を出して見るべきなのかなぁ.

あ,OSXのMax/MSPだと,アプリ本体に加えて開発環境買わなきゃいけないから出費がものすごくでかい.
それに対してPDだと全部無料,ってのは,かなりのアドバンテージだなぁ.

よくMax/MSPだけがMaxだと思っているヤツがいるが,そういうヤツには鉄槌を.
どっちかっていうと,Max/MSPの方が邪道だ.邪道過ぎる.癖がありすぎる.
「トランスMaxエクスプレス」…あの本が元凶のような気もするが.

翻訳依頼されると困る

ちょっと前に同級生の作品が日本の雑誌で取り上げられたって話を書いたけど.
もう一人来ました.

記事がこれ.二人出てるけど上の方ね.

…勘弁して.
むっちゃ翻訳しにくい文章だよ.

おまけにかなり観念的で,この記事書いた人のバックグラウンド想像するか記事全文読む必要がある.
「内心忸怩たる思いをした」って,「この記事書いた人はすごく悔しかったみたい」って訳したんだけど.
「なんで?」って聞かれても,その理由が記事中に明確に書かれてないのね.
つまりこの記事の筆者も似たようなパフォーマンスでプレゼンしたんだろう,としか想像出来なくて,そう伝えたんだけど.
返ってきた答えは,やっぱり「なんで?」でした.

ええ,疲れましたよ.かなり.
せめてもう一人日本人がいればいいんだけどなぁ.
僕より英語が上手な人希望.
いや,僕より英語がダメな人なんていないだろうけどさ.

そういえば…

明日,修論のプレゼンなんだよねぇ.
原稿とスライドはまとめたんだけど,英語のチェックがな.
ネイティブの人にチェックしてもらうと,10ページとかのが1週間以上かかるし.
勿論,今まで直してもらった文からフィードバックしてるんだけど.
ま,オフィシャルなセッションじゃないからいいか.

[ ツッコミの受付は終了しています ]
1: Akira (09/15 06:43)
…理由がわからない.なぜ?

PD自体がシングルトンの構造をしているからかと思います。
オブジェクトと呼ばれるものはすべてひとつでnewもcloneもできない。
だからpyオブジェクトもひとつのインタプリタで
複数のスクリプトを動かすようになっているのではないのでしょうか。

すみません。
pyオブジェクトのことは知らないし、正しくないことかもしれません。
2: daichi (09/15 07:10)
あー,すいません.僕はPDではオブジェクト書いたことないですが(jMaxの時もシステムの詳細を理解してなかったし).
まぁ,Maxのオブジェクトって普通のOOPで言うオブジェクトと全然違いますからねぇ.

オブジェクト(?一応そう呼ぶ)自体はPD起動時にインスタンス化(またこれも微妙な表現だけど.そのページからリンクされてるcounterオブジェクトだと*_setupって名前になってる)されるんですけど,
データ用の構造体はパッチ上でオブジェクト作った時に新規でアロケート(*_newってメソッド)されるわけですから.
そこで複数のPythonインタプリタ立ち上げることは可能なんじゃないかな,と.
いや,素人考えですけどね.Cでの制限とかよくわかってないので.
だから,多分,単にインタプリタ複数立ち上げないためだけにこの仕組みにしたんじゃないかな,と想像したのです.
3: Akira (09/19 04:11)
いえいえ、私もPDではオブジェクトを書いたことがありません(jMaxを.NETにポートしているのですがなかなか)。

言いたかったことは、

パッチ上でオブジェクト作るときに、当然箱の中でnew hogeとかnewメッセージをつないだりしませんよね?

これってプロトタイプベース・オブジェクト指向じゃないですか(詳しくは以下参照、http://sumim.no-ip.com:8080/wiki/493)。
しかし、だからといってcloneもつかってないです。

では、パッチ上に複数の同じオブジェクトを置いたとき、あるいは複数パッチ上に同じオブジェクトを置いたとき、
それらのオブジェクトはどこ指しているのかといえば。
文法的に言えば全く同一の物となります。
4: Akira (09/19 04:12)
これは奇妙に思えるでしょう。
いわゆる他のIDEではいくつかボタンを作ればそれぞれ違うのはあたりまえなのですから。
でも、コードを見てみてください。new Button()とか書いてあるでしょう。

ここが違うところです。
Maxはソースコードを視覚化しているのであって、ある作業よりソースコードを生成しているのではないということでしょう。
(いや違うなコードをだしてるもんな、もっとうまい言い方があれば...)

これらがメタファーでもなんでもなくてそのとおりに実装されています。
5: Akira (09/19 04:13)
外部オブジェクトが呼び込まれるとインスタンス化され、オブジェクトは最初からメモリ上に存在します。
ですので、FTSの実行時のMemory Usageを見てください。かなりなもんです。
そして、これらのオブジェクトはグローバルに定義されています。

ゆえに、(同じ)オブジェクトと呼ばれるものは(いくつあっても)すべてひとつ(の物を指している)。

ということです。

ごめんなさい長すぎました。
6: daichi (09/19 10:13)
あーはい.それは仰る通りで,オブジェクトはFTSの起動時に全部読み込まれるんですけど,
シングルトンとはまたちょっと違うと思います.
イメージとしては…メンバ関数は全てstaticで,データだけがインスタンス化されるという感じでしょうか.
で,そのstaticなメンバ関数は,そのオブジェクト自体を引数に取るようになってる,と.
7: daichi (09/19 10:14)
で,パッチ上にオブジェクトを作った時に,そのオブジェクトが持っていると定義された構造体だけは新しく作成されるので,
その時点でPythonインタプリタを立ち上げて,その新しく作られた構造体のどこかにバインドするように出来るのならば,
画面上での一つのオブジェクトが一つのPythonインタプリタを持つ…ということが可能なんでないかな,と想像したのです.
そういうことがCで可能なのかは解りませんが.
8: daichi (09/19 10:14)
ともあれ,pyオブジェクトのソース読んでみないことには始まりませんねw
9: Akira (09/20 00:16)
シングルトンとはまたちょっと違うと思います.

そうなんです。
でもjMaxのJavaコードがシングルトンで書いてあり、いやなるほどと思ったので。

pyオブジェクトのサイト落っこちるみたいです。