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つずつ出力していくオブジェクトです.


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

2018年5月17日木曜日

コンテンポラリーミュージックユニットAffine始めました.

Twitterではちょこちょこ言っていますが,今年の初めから,これまでずっと活動してきたmacaroomに加え,「Affine(アファイン)」というユニットを始めました.macaroomでは主にポップな歌モノをやっていますが,こちらはコンテンポラリーミュージック.完全なる実験音楽です.
macaroomが去年行った"Cage Out"という一連の企画で出会ったSaKi 汐音さん(名前暫定)という作曲家(?)にお誘いいただきまして始めることになりました.始めはこんなにがっつりやるつもりではなかったのですが,以前から興味のあった実験音楽や,本格的なライブ・エレクトロニクスの実践ができると思い,また,相方の常人離れした感性に惹かれ,何か面白いことができるのではないかと思い,今は,このユニットで私のできるだけのことをやってみようという気持ちになっています.

そんなAffineの頭のおかしい相方が,Affineのことを記録するブログを始めました.

http://affinedrawing.blogspot.jp/

ブログを始める際,「私が手間をとってブログをやるのだからお前も同じだけの手間を取れ」という非常に日本人的な発想丸出しの要望が来たので(頭おかしいくせにこういう時だけ日本人根性丸出し),このブログにたまにAffineのことも書いていきます.(複数ブログをやるのはかったるい)

ユニット名「Affine」は,私が提案しました.ユニット名について,この一案だけ出て,他に対案が全く出なかった(主宰者からも出ないという有様)ので,無投票当選となりました.

Affine.数学や工学に詳しい人であれば馴染み深い言葉です.画像処理の基本・アフィン変換のアフィンです.しかし,古い教科書は参考書では,このAffineをアファインと読む例もあり,我々はその読み方を採用することにしました.それについて,深い理由はなく,2音節より3音節の方が良いかなと思っただけです.

Affineとは,非常に基礎的なベクトルの演算だけで幾何学を構築した空間のことです.
多くの場合,幾何学というと,あの直線の長さがどうこう,ここの角度が云々と,その空間にあるものの「形」をベースにして議論がされます.一方Affine幾何学の場合,空間にあるものの形を考えることなく,ベクトルとその操作だけで幾何学の基本的な性質を構築します.逆に言うと,そのような抽象的な幾何学で明らかになった諸性質を実際的な空間で議論し直すのが,いわゆる通常の幾何学と言えるかもしれません.(この理解は数弱の私の理解であり,非常に信憑性が薄いです

最初は,"Orthogonal" というユニット名を考えました.Orthogonalとは直交という意味です.直交とは,ある直線と別の直線が90度に交わっていること.

2つのベクトルが直交している時,その内積が0になることは数学の常識です.ある量とある量が独立して変化する時,それらの量は直交していると言えます.例えば,バスに乗っている時の心拍数と,その人の移動する速さは直交しています.バスが早く走ろうがゆっくり走ろうが,その人は座っているだけであり,運動による心拍数の上下がないからです.しかし,歩きまたは走って移動している時の心拍数と,その人の移動する速さは,直交していない場合が多いでしょう.ゆっくり歩いている時よりも早く走っている時の方が心拍数が上がると考えられ,移動する速さの上昇に応じて心拍数が上がっていきます.このような関係の場合,それらの量は直交ではありません.

直交について,図で描くと,このようになるでしょうか?


上の図は,x軸とy軸が直交している場合です.(0,2)にあった点Pがx軸に平行に移動する場合,どこまで移動してもyの値は変わりません.yの値に関係なく,xの値を変化させ雨事ができるわけです.


しかし,x軸とy軸が直交していない場合,点Pをx軸に平行に移動すると,yの値も変わっていることがわかります.(すごく微妙な図になってしまいましたね・・・

このように,互いに作用せずに変化する量を扱えるという性質が直交した座標系にはあるのです.

ちなみに,ステレオのアナログレコードは,左右チャネルの振動がそれぞれ直角になるようなVの字に刻まれており,これによって,お互いの影響を受けず,2チャネルの振動を1本の針が読み取ることができるのです.


さて,何故ユニット名を直交を意味するOrthogonalにしようと思ったかというと,ユニット開始時点のスタイルとして想像していた,互いに互いのやっていることは気にせず,即興的にパフォーマンスしていくというスタイルが,まさに直交系のイメージに重なったからです.(※最近は互いに無干渉だと表現が発展しないということが分かってきたので,徐々に互いに干渉するようにしています.)

しかし,直交はともかく,Orthogonalは言い慣れないし,変な場所にアクセントがあるので,あんまり語感が気に入らないということで,類似の良い単語は無いかと考え,Affineにしました.

ですから,私個人としては,ユニット名はOrthogonalにしたかったのであり,Affineというユニット名自体には,殆ど意味は込められていません.

今後とも当ブログ・macaroom共々Affineもよろしくお願いいたします.

どんなユニットなのか書くのを忘れていました.長くなるので書きませんが,気になる方は,Affineが企画する最初のイベントにぜひお越しください.


2018年5月2日水曜日

「はじめての<脱>音楽 やさしい現代音楽の作曲法」にて付録記事を掲載しました 〜OpenMusicの基礎 番外編〜

随分久しぶりの投稿になってしまいました.仕事がバタバタし(これは毎年のこと),音楽活動もこれまでのmacaroomに加え,新しい活動も始めました.また,他にもいくつか個人的に引き受けたこともあり,そろそろ何足ものわらじを履くのがキツくなってきました.

そんな中の1つ,この度自由現代社から発売された「はじめての<脱>音楽 やさしい現代音楽の作曲法」において,巻末の付録部分に「OpenMusicの基礎」と題してIRCAMによる作曲支援ソフトウエアOpenMusicの初歩的な使い方を掲載する部分を執筆させていただきました.




OpenMusicは,現代音楽の作曲において多く用いられていながら,日本国内においては紹介される機会も少なく,あまり武器として使っている作曲家は見かけません.しかし,現代音楽史上でも存在感のある作曲家が多く使っていることも事実で,彼らの足跡を辿る良い手がかりにもなり得るソフトウエアです.

しかし,付録として掲載したので,簡単な操作方法の説明と,私が例題として作ったプログラム例を載せるのみにとどまってしまっています.正直な話,あの記事を読んだ結果,OpenMusicの使い方がわかったとして,それを使いこなして創作を行えるかというと,かなり難しいかもしれません.そこで,本ブログで,少しずつではありますが,本付録の補填記事を掲載していきたいと思います.(本記事を読む前に,「はじめての<脱>音楽 やさしい現代音楽の作曲法」を買って読んでくださいね〜

今回は,プログラマであれば一番気になるところ「OpenMusicプログラミングにおける制御構造」です.本来,プログラミング言語や環境を紹介するときは,これを真っ先に説明しなければならないのですが,本書は作曲法を説明する本であり,プログラミングの本ではないので,省略しました.

まず,比較のために,Maxの制御構造も確認してみましょう.今回作ったのは,非常に簡単なプログラム「100に1を足して100+1=101をコンソールに表示するプログラム」です.こんな感じ.


実践的なMaxプログラミングに慣れている方は状況に応じてもっと違った作り方をするかもしれませんが,今回は,制御構造を説明しやすいように画像のように作っています.

Maxのプログラム制御で押さえておきたいのが,

・データが第1インレットに入力されたらアウトレットからデータを出力し,次のオブジェクトに入力される(これがオブジェクトの繋がっている分だけ繰り返される)
・あるオブジェクトからの出力は,右→左の順番でデータが出力される

の2点です.これらを踏まえてこのパッチを見てみると,このような順で処理が行われているということになります.


上記2点の法則に従った順番になっていることを確認してみてください.

Maxはインタラクティブ操作を前提としたイベントドリブンプログラミングになっており,そのため,入力→出力というデータの流れが視覚的にうまく表現されている,非常に優れたプログラミング環境だと思います.

さて,同様の処理をOpenMusicでやると以下のようになります.



このパッチのprintオブジェクトを右クリックして,"Eval Box"をクリックすると,OM Listenerウィンドウに計算結果が表示されるわけです.



この,Eval Boxをクリックした時に,プログラムが実行されるのですが(Maxのインタラクティブなイベントドリブンプログラミングに慣れているとここが分かりづらい),この時,次のようなことが起こります.

・あるオブジェクトがEval Boxされると,そのオブジェクトのインレットに接続されているオブジェクトにデータを要求する
・データを要求されたオブジェクトがデータを持っていればそれを出力する
・データを要求されたオブジェクトがデータを持っていなければ,さらにそのオブジェクトのインレットに接続されているオブジェクトにデータを要求する
・要求の結果,データがインレットに入力されれば,処理してアウトレットから出力
・これをEval Boxしたオブジェクトから上のオブジェクトのつながりの数だけ繰り返す

この箇条書きで分かりましたでしょうか?とても難しいですね.これも,図に処理手順を書くと下のようになります.




Maxとは違い,下から上に要求が伝わり,データが処理されていることに注意してください.

尚,上の図において③と④の順番は,左から右の順でデータが到着しており,Maxとは逆です.この点については,私も現状そこまで詳しくないので,もしかしたら逆かもしれません.しかし,他の処理での挙動を見ていると,どうやら左から右の順でデータが処理されているように思います.

ごく簡単なパッチでのご紹介になりましたが,これがOpenMusicにおけるプログラミングの制御構造になります.このような面倒なことを知らなくても,冒頭紹介した本の付録で紹介した程度のプログラムを作成することは可能です.しかし,omloopや条件分岐等,プログラミングの醍醐味と言える処理を取り入れたパッチを作成しようと思うと,こうした制御構造の理解なしでは自分の意図通りの処理を実装することはかなり困難です.

それではよいアルゴリズム作曲ライフを!!