2018年5月24日木曜日

OpenMusicの基礎 番外編 〜omloopの基礎〜

※この記事は「はじめての<脱>音楽 やさしい現代音楽の作曲法」における私執筆の「OpenMusic」の基礎及び,前回のOpenMusicの基礎 番外編をお読みください.


はじめての<脱>音楽 やさしい現代音楽の作曲法」,すでに重版になったようで,ご好評いただいているようです.私が担当したのはほんの一部だけですが,非常に嬉しく思います.

OpenMusicの特徴は,ソースコードを書かなくても良いグラフィカル・プログラミングですが,グラフィカル・プログラミングは見た目の難しさが少なく,直感的にプログラムを作成しても何らかの結果を得やすいという利点がありますが,一方で,プログラムの制御構造が,グラフィカル・プログラミングという名前とは裏腹に,見ただけでは分からないという欠点もあります.(その制御構造の分かりづらさは前回の記事でお分かりいただけたと思います.)なので,込み入ったプログラムを書こうとすると途端に難しくなってきます.今日ご紹介する繰り返し処理もその一つ.パッチの見た目からこの制御構造を理解するのはほぼ不可能だと思います.

プログラミングでよく使うテクニックに,繰り返し処理があります.その名の通り,同じ処理を指定した回数繰り返す処理です.例えば,10000個の整数全部に100を足す等の処理です.正攻法でいけば,10000回同じ処理を書かないといけないように思えますが,繰り返し処理を使えば,一回だけ処理を書いておいて,それを10000回繰り返させる,といった書き方が可能です.この処理はプログラミングの常識的なテクニックなので,何らかのプログラミング言語を学んだことがある人ならご存知のはずです.

OpenMusicでも繰り返し処理を記述することができます.繰り返し処理を行うオブジェクトが"omloop"オブジェクトです.

パッチ内でomloopオブジェクトを出して,ダブルクリックすると,画像の右側のようなウィンドウが出てきます.このウィンドウが,omloopの中身のパッチを作成するウィンドウで,このウィンドウで作った処理が,繰り返し処理されることになります.


"eachTime"と"finally"というオブジェクトが既にあります.この2つのオブジェクトは繰り返し処理に必須のオブジェクトなので,最初から出ています.

omloopの処理がどのように行われるか知るために,このようなパッチを作りました.Eval Boxすると,OM Listenerウィンドウにこのように表示されます."forloop"オブジェクトは,所謂for文を実装するオブジェクトで,第1インレットの値から第2インレットの値まで内部変数の値を1ずつ増やしながら繰り返しを行うオブジェクトです.


前回の記事で,OpenMusicは,パッチの下から上のオブジェクトにデータの要求を行うという制御構造を説明しました.その考え方でこのパッチを見ると,以下のようなことが起きています.重要なのは,eachTimeの使い方です.eachTimeは,ループの各回の開始時点でデータの要求を行い,データが到着すると,ループが終了するまで,次のデータ要求を繰り返します.

① forloopオブジェクトの内部変数は0(第1インレットで設定したので)
② eachTimeオブジェクトがprintオブジェクトに値を要求
③ printオブジェクトはデータを持っていないのでさらに上のテキストボックスにデータを要求
④ テキストボックスは"hello"を出力
⑤ printオブジェクトはOM Listenerウィンドウに"hello"を表示し,アウトレットからも出力
⑥ eachTimeオブジェクトに"hello"が入力されたので,この回は終了.forloopオブジェクトの内部変数が1増える
⑦ ②〜⑥をforloopオブジェクトの内部変数が9になるまで繰り返す
⑧ forloopオブジェクトの内部変数が9になったのでループは終了.finallyオブジェクトがデータ要求を行い,データを受け取るとomloopオブジェクトの処理は終結.(この時,finallyオブジェクトに入力された値が,omloopオブジェクトのアウトレットから出力される

このようになります.この処理の結果が,上の画像のOM Listenerウィンドウの表示です.尚,最後,"finish"が2回表示されているのは,1個目は,omloop内のprintオブジェクトに入力された時点の"finish",2個目は,omloopをEval Boxした結果としての"finish"です.

また,forloopオブジェクトの内部変数は,forloopオブジェクトのアウトレットから整数で出力されます.



値の範囲を変えると,この通り.


また,omloopウィンドウ左上にある,緑色の矢印ボタンをクリックすると,インレットオブジェクトが出てきます.そして,パッチウィンドウのomloopオブジェクトには,インレットが増えています.この操作を繰り返すと,インレットをいくつでも増やすことができます.このようにして,omloopオブジェクトの外からomloopオブジェクトに入力した値を,omloopオブジェクトの処理で使うことができるのです.



この他によく使うループの方法として,listloopがあります.listloopオブジェクトは,インレットに入力されたリストの要素をループ毎に順番に1つずつ出力していくオブジェクトです.


長くなりそうなので今回はここまで.

0 件のコメント:

コメントを投稿