2013年11月30日土曜日

Data structures 覚え書き(1)



PdのData structuresを使ったオブジェクト操作は,
・scalar(data structuresのインスタンス)自体を見れないこと
・何もワイヤーがつながっていないオブジェクトが動作しはじめること
というPdの基本的な処理フローと違う2要素の合わせ技が,まずワカリニクイところだと思う.



(1) 自ウィンドウのscalarのリストを取得

scalarは,canvasごとに管理されている.
ここでcanvasとはパッチやサブパッチのウィンドウのことを指す.
要するに,ウィンドウ単位でscalarのリストを管理しているということのようだ.

まず最初に[pointer]にtraverseメッセージを投げて,今からscalar操作を加える対象ウィンドウのscalarのリストを参照する.
ウィンドウの指定には,パッチ名・サブパッチ名に"pd-"の修飾子が必要.[pd aho]というサブパッチを作っていたら"pd-aho"と指定する.パッチファイルの場合は拡張子".pd"もお忘れなく.

traverseが完了したら,[pointer]にbangメッセージを投げるとscalarリストへのポインタが出力される.
ちなみに,パッチ内のあらゆるオブジェクト[ ]の内容を変えるとtraverseがリセットされるので,変更するたびにこれを実行してポインタを取得しなおす必要がある.

(2)新たにmeterarray型のscalar(インスタンス)を加える

 取得したscalarリストに,[append]でmeterarray型のscalarを追加する.初期化引数としてxに10をセットした.

(3) meterarrayのdata structureはここに定義

メンバ変数として
 ・float型のx
 ・float型のy
 ・square型のarrayであるme
を持たせている.
ここで注意だが,[struct]にとってfloat x, float yは,そのdata structureが何らかの描画機能で描画されるときに,その対象座標として使われる変数である.別の事に使っても良いが,x, yはそういった描画系の機能によって用途が予約済みであることを覚えておかないといけない.ほかにもw, hなどを予約している描画系機能もある.

いきなり出てきたsquareには四角形を描く機能を持たせているが,その機能の記述はサブパッチを作って行う.

(4)squareのdata structureを定義

メンバ変数として
  ・float型のy
  ・float型のcol
を持たせている.
このyもやはり描画の際の座標として予約済みである.

(5)四角を描く機能

[pd square]というサブパッチ内に
・squareというdata structure
・filledpolygonという描画命令
が置かれている.
これは,
「square型のscalarが作られたら,そのscalarをもとに[filledpolygon]が実行されます」
という意味になる.[filledpolygon]は多角形の描画オブジェクトを生成する命令.

[filledpolygon]は,自分のフィールド(ウィンドウ)に存在するあらゆるdata structureがscalar化したときに実行される.
仮に[pd square]内でsquare型のscalarを作ったら(5a),この[filledpolygon]によってウィンドウ内に四角形が出現するのだが,abcmeter.pdのウィンドウ内でメンバ変数としてsquare型のarrayをもつmeterarray型のscalarを作った場合,[filledpolygon]はこの時点では実行されない.scalarを持っているのはabcmeter.pdのウィンドウだからだ.

(6) というわけで,[append] でmeterarray型のscalarが作られた.

このscalarは,メンバ変数としてsquare型のarrayであるmeを持っている.

(7) [plot]でarrayの中身を描画

[plot]は,自分のフィールド(ウィンドウ)にscalarがあり,しかもそのscalarが引数で指定した名前のarrayを持っているとき,その中身を描画する.今回の引数meはsquare型のarrayなので,squareに関連付けられた描画…[filledpolygon]が描画される.引数値"20"は,描画されるarrayの各要素の横方向の間隔.他にもarray間を線で繋いだりする引数がある.arrayの初期サイズは1のようなので,はじめはsquareに基づいて[filledpolygon]で描かれた四角形が1つだけ現れる.その出現位置には,meterarrayのメンバ変数であるx,yが勝手に使われる.今回の場合,(2)のappendでx=10をセットしたので,(x,y)=(10,0)の位置に四角形が現れる.もし[square]内に他の描画命令も描いていたら,それもまとめて[plot]によって実行される.

(8) nextメッセージでscalarへのポインタを取得

[pointer]にnextメッセージを投げると,対象traverseのリストの「中身」へのポインタを返す.
現在参照しているのはリスト自体へのポインタ.nextを投げることで,リストの中に入って,さきほど作られたmeterarray型scalarへのポインタを取得する.複数のscalarが作成されている場合,nextで参照をインクリメントしていくことで選択できる.

(9) arrayのサイズを変更してみる

そのmeterarray型scalarには,square型のarrayであるメンバ変数meがある.[setsize]は指定したarrayのサイズを変更することができる.ためしにスライダを使って5とか10とか数字を増やしてみると,[plot]が,サイズの変更されたarrayを描画してくれるはずだ.

(10) yをセットしてplotを下にずらす

[set]は,ポインタで指定されたscalarに含まれる,指定された名前のメンバ変数に対して値をセットする.
meの各エレメントはsquare型だが,そこにはy と colが定義されている.yは[filledpolygon]が描画のy座標として勝手に使うので,yの値をスライダで変えてみると,plotされているarrayの全体がyの値だけ下にオフセットする,また,colを[filledpolygon]の色を指定する引数に割り当てててみた(10a).

(11) [element]でarrayのインデックスを指定

[element]でmeのエレメント(square型)を1つ選ぶのだが,ここでは4を入力することでmeの5番目の要素を選択した.
(11a) y colにそれぞれ数値をセットすると,5番目の四角形の位置と色が変わる.

(12)array各要素にyとcolをセット

yとcolに,arrayのインデックスに応じた値をセットしてみると,plotがグラデーションの階段状になる.

(13)plotを横に並べずに重ねる

[plot]の間隔を指定する引数"20"を"0"にすると横方向のオフセットがなくなるので,arrayが縦一直線に並ぶ.


とりあえず今日はこんなところで…
何を作りたいかと言うと,かっこいいミキサーですw

0 件のコメント :

コメントを投稿