2014年2月13日木曜日

【SuperCollider】文法を学ぶ


さてさて、ちょっと音を出してみて「楽しい!」ってなっている訳だけど、ミュージシャンじゃないしいきなり音楽はつくれない、しかも正弦波しか今の所わからない。まぁ、これでもプログラマの端くれではあるので、この正弦波をならすプログラムをちょこっと改造しつつSuperColliderの文法について勉強してみることにした。

結論から火口。いや、書こう。
{
 var x = SinOsc.ar(1000,0.5);
 var y = SinOsc.ar(800,0.3);
 var z = SinOsc.ar(600,0.3);
Out.ar(0,Pan2.ar(x + y + z,0))
}.play
これが
{
 var sineChord = {
  arg col;
  do(col,{arg i;
    Out.ar(0,Pan2.ar(SinOsc.ar(i,0.5)))
    }
  )
 };
 sineChord.value([1000,800,600]).postln
}.play
こんな風になる。この二つは同じ音が出る。SuperColliderのページのLanguage - sclang には
- Single inheritance object-oriented and functional language.
- Similar to Smalltalk or Ruby with syntax similar to C or Javascript
と書いてある。オブジェクト指向と関数型言語ですよ。CかJavaScriptに似た文法をもったSmalltakもしくはRubyに似た言語だよって書いてある(っぽい。)
関数の書き方が
var  square = {arg x; x * x};  // ※1
square.value(8).postln;    // ※2
とそんな感じになる。
※1で関数を作成して、変数に代入。
※2で実行。

※1はJavaScriptっぽいし、上の例でdo(/*配列 */, /*関数*/)みたいなのはなんとなくrubyっぽい気がするぞ!

というわけで、上の二つは同じ音が出る訳ですが、普通のプログラミングとちょっと違うぞって言う面白さがある。音として出力されるのでたとえいくつかの音に分解して逐次実行しても最終的に出てくる音は現実空間で混じり合って同じになったりする。逆に逐次実行するということで時間的な意味合いも出てくる。

そういう意味でプログラミングの意味でも興味深いSuperColliderなのでした。

0 件のコメント:

コメントを投稿