前回までにClock(TempoClock)によってトリガーを発生させ、そのタイミングでコマンドをシンセサイザノードに送信することによって演奏を行うことが可能だと言うことを見てきた。

ただ、その操作はローレベル過ぎて、確かに可能なのだけど、毎回このような基礎の部分から行わないといけないとなると面倒だ。おそらく、プログラムをかける人なら必ずなんらかの手間の簡略化(クラス化なり)を行うだろう。そしてSuperColliderにもそういった上位のラッパークラスが用意されていて、演奏をさせたいのに、それまでのことに煩わせらるといったことがないようになっている。

今回見ていくのはPatternクラスだ。Patternクラスは豊富な派生クラスが存在していて、名前が示すとおりパターンとして登録しておけばそれを演奏してくれるというものだ。必ずしも最初に決められたものだけではなく、ジェネレーティブなものもある、そしてそれらを複雑に組み合わせることも出来る。

パターンクラスを使うと、例えばこんなコードで演奏をさせることが出来る。

Pbind(\degree, Pseq(#[0,1,2],2)).play

さて、これを見ていると、ふと疑問がわいてくる。魔法というものが存在しないように、前々回見たような処理を誰かが行ってくれているわけだ。それは誰がどのようにして行っているのだろうか。どうやってコマンドは手元からシンセサイザノードに届くのだろうか。

その点に注目してPatternクラスを見ていこう。

前回は実際にサウンドの生成を行っているサーバscsynthを離れて、クライアントであるsclang側でのシンセサイザコントロールのさわりの部分を見てみた。

SuperColliderにはClockというクラスがあり、その機能はトリガーをかけて欲しい時間を登録しておき、トリガーのタイミングで行いたい処理を実行すれば良いという仕組みになっていた。トリガーは一度かかると解除されるので、繰り返し行いたい場合は処理の終了時に再度トリガーを登録しておく必要がある。

そのClockクラスの主要な派生クラスの一つがTempoClockであり、名前の通りテンポによる時間管理を行うクラスになっている。主要というのは、このクラスにはdefaultというクラス変数があり、クラスがロードされたときに暗黙にそこにインスタンスが生成される。そして、いろんな演奏に関するクラスがClockに関するパラメータのデフォルト引数(引数が明示的に指定された無かった場合も)としてTempoClock.defaultを使用しているからだ。

TempoClockにはプロパティtempoがあるのだけど、ではこのtempoのパラメータの単位はなんだろうか。メトロノームと同じくBPMでいいのか、はたまた違うのか。初期的に設定されているテンポはどれぐらいの速さなのだろうか。

今回はTempoClockに注目してみようと思う。

Animating UIViewのエントリーでUIViewにラッパーされたCoreAnimationを使ってみたのだけど、今回はもう一歩CoreAnimationの世界に踏み込んでみる。とはいっても、アニメーションさせようっていうわけでなく、CoreAnimationで用意されている機能を使ってちょっとおいしいところをつまんでみようかということなのだ。

CoreAnimationはOSXではLeopardで追加された機能の一つなのだけど、iPhoneOS(おっとiOS)では最初から使える機能だ。ただ、CocoaとCocoa touchの類似性を保つためなのか、そのViewとの関係性は同じように実装されている(何となく後付け的な感じがうかがえる)。

UIViewに対応してそのCoreAnimationレイヤーであるのがCALayerクラスだ。layerプロパティがUIViewに用意されている。ちょっとわかりにくいのが、UIViewとしてもヒエラルキーを組めるのだけど、それとは別にCALayer側でも親子構造が組めるということだ。

今回扱うのはこのCALayerクラスだ。いくつかプロパティを持っているのだけど、注目するのは形状に関するプロパティだ。

前回までのところで、シンセサイザを作り(SynthDef、Synth)、そのラッパクラス(Synth)を使いクライアント(sclang)からサーバ(scsynth)を操作できるというところまでたどり着いた。

SynthDefのコンストラクタの2つめの引数ugenGraphFuncで渡される関数オブジェクトの引数が、すなわちそのシンセサイザのコントローラとなり、Synthクラスのsetメソッドを使って値をセットすることが出来る。

とりあえず演奏すべきシンセサイザを作るところまでは来たので、次はそれを演奏させたい。手動で値をセットするのも良いのだけど、ある程度は自動演奏させたい。

SuperColliderには演奏させるための仕組みが色々と用意されている。今回ピックアップしたのはRoutineクラスだ。流れ的には、必要なコントロールパラメータを設定し、必要なだけスリープする(次のタイミングを待つ)、その繰り返しが単純明快なので、サーバ側でのUGenの時のようにクライアント側のSuperCollider探求のとっかかりとして最適なのではないかと思ったのだ。

話の舞台はサーバからクライアントに移る。

OSXのLeopardからCoreAnimationというフレームワークが追加された。それによってCoverFlowなんかを実現している。それまでは空間的な管理しか行わなかったGUIシステムにおいて、時間の管理もOSが面倒を見てくれるようになったというのが、CoreAnimationのキモなのではないかと思う。

そして、OSX系の流れをくむiPhoneOSにもCoreAnimationは含まれている。iPhoneOSはOSXの紆余曲折のまだ後の方に出たということもあり、構造的にはモバイルOSにしてはかなりモダンな、OSXの成功も失敗も踏まえた上で設計されていると感じることがある。

さて、iPhoneのCoreAnimationだけど、かなりお手軽に使う方法が用意されている。ダイアログをビヨヨンとだしたり、スライドしてカットインさせたり、はたまた二つのViewをクロスディゾルブさせたり。UIViewControllerのトランジション効果なんかにもプリセットのアニメーションパターンが用意されているのだけど、簡単なお約束でアニメーションさせることが出来るので使わない手はない。

今回デモ用にEscapeButtonというジョークソフトを軽く組んでみた(ほんとに数行しか書いてない)。名前からして出落ちな感もあるけど、実装を見つつご紹介しようと思う。

前回、前々回でUGenという出口から始まり、ようやくクライアント側からサーバ側への橋がみつかった。いままでの道のりを図示すると左図のようになるだろうか。

今回見ていくのはもう一つの橋、Synthクラスだ。

前回はUGenを中心としてSuperColliderの世界への探求を試みてみた。今回はその上位構造となるSynthDefを見ていこうと思う。

SuperColliderはクライアントサーバ型アーキテクチャであることは既出のことなのだけど、SynthDef、そしてSynthがこの二つの間にかかった橋だと言えるだろう。UGenは確実に向こう側の世界だ。

お約束だけど、まだSuperColliderへの冒険の道半ばなので、間違っていることが含まれているかもしれないということは注記しておこうと思う。

もうすでにAppStoreにならんでるのだけど、とある方面からのリクエストにより、ほとんどの方にはいまいち使い道がないのではないかと思われるアプリを実装した。どういったツールなのかというと、同時に複数ターゲット(最大16)に対してPingのステータスをとり続けられるというツールなのだ。

ネットワークの回線を生業とするプロの方々が使うツールらしい。

例えばネットワーク回線が集中するようなイベント会場などでどのルートがどれぐらい負荷がかかってるかなどをチェックして、対策を打つなんて事に使うようだ。

実装はICMPのEchoプロトコルを使って実装している。つまり、普通のPingなんだけど、iPhone OSではネイティブソケットでICMPタイプを作らせてくれないので、そのあたりの実装が一工夫必要だった。しかし、それもなんとか解決できた。

他にも同時にPingを投げるにあたって、構造上別ターゲットのものに影響をうけないように、といったことにはかなり気を配って実装してある。見た目は地味だけどプロの方がつかえるツールとして仕上がってるのではないかと思う。

そして、このエントリのアプリケーションイメージを作るのにiPhone Screentakerというソフトを使用したのだけど、スクリーンショット画面をごらんの通り、iPhoneの画像にはめ込んでくれる。他にも何通りか用意されていて、なかなか良い感じになる。おすすめです。

PingmaniaはRusty-raven社よりAppStoreで発売中です。

12音技法での対位法の扱いを調べている時にWikipediaに載っていた、

現在の代表的な自動作曲ソフトウェアとして、フランス国立音響音楽研究所IRCAMが開発したOpenMusicが挙げられる。このソフトウェアの説明書に付属するチュートリアルの初歩段階に、十二音技法の音列各種を自動生成する練習課題がある。
自動作曲 十二音技法(Wikipedia)
という記述になんとなく興味を引かれて、OpenMusic というのがどういったものなのかを見てみようかという気になった。

OpenMusicはMaxやPdなどで有名なIRCAMのプロジェクトで、Max等とは違って、どちらかというとアルゴリズミックコンポジションの方にフォーカスしているようだ。いかにして波形を作るかというより、いかにして音符を作るか。そう言い換えることが出来るだろうか。

音列に対して逆行、反行、反逆行などはもちろん、時間的な変形を行うことが出来るのはもちろん、限定されたランダムネスのなかから音列を作ったり、音列の生成変形に関してその機能は網羅されている。らしい。

らしいというのは、わたし自身がまだ全然機能を試せていないため、何が出来るということを把握していないためだ。

OpenMusicのソースコードはLGPLで公開されているので、誰でも試すことが出来る。出来るのだけど、実はLISPで書かれているので簡単には動かなかった。色々試してみた結果、なんとか動くようになったので、手順を書き留めておこうと思う。

少々前よりSuperColliderをいじっている。SuperColliderというのは、あえて説明することもないぐらいの有名どころなのだけど、主に音楽・音響記述に長けたプログラミング言語環境だ。音響系といってもDSPなどのストリームプロセスを書くというよりは、むしろ、ノードの接続を記述してシンセサイザーをつくり、それをコントロールするロジックを記述して動かすというのがコアな部分のようだ(もちろんそれ以外が出来ないというわけではない)。

Maxなどともコンセプトでは似ているところもあるのだけど、決定的に違うのはそれがビジュアルプログラムではなくテキストコーディングで行うものという点ではないかと思う。

わたしがSuperColliderに興味を持ったそもそものきっかけは、SC140というTwitterに書けるだけの分量でSuperColliderで音楽を作ろうという試みがあるということを知ったときだった。そのミニマムな魅力にくらくらっときて自分でもやってみたいと思ったのだった。

SuperColliderは少々取っつきにくいところがあるのだけど、コミュニティのパワーが補って余る。わたしもとても助けられている。特に、@umbrellaprocess氏(on twitter)にはわたしの初歩の初歩な質問にもきちんとレスポンスをいただき、大変感謝している。

SuperColliderのTutorialは、公式のIntroductory Tutorialがよくまとまっていると思う。今見返してみると、よく読めばちゃんと書いてあるということも多い・・・。

わたしはSuperColliderを学ぶ上でまずターゲットに決めたのはUGenというクラスだった。その部分がSuperColliderでシンセサイザ(音響処理も含む)を扱うクラスの基底クラスだったというのがその理由だった。

今回、とりあえず今までに分かったことをまとめてみた。しかし、まだSuperColliderへの冒険の道半ばなので、間違っていることが含まれているかもしれないということは注記しておこうと思う。