- 2009/02/26 02:09
- SuperCollider
SuperColliderのお勉強中。
scは関数型とは違って言語自体はオブジェクト指向言語なので、まぁわかる。
あとはリファレンスとか細かい書式に関してさえ分かればとりあえずOK。
で、も、全然それがわからなかったので、ネット徘徊してました:P
で、いいページ見つけた。
SuperColliderを始めよう – 関数とその他の機能
ホントこういうページ用意してくれる人には感謝の気持ち以外感じられない。
ありがとうございます。
そしてこちらが本家。
まず、scはオブジェクト指向型言語です、というのは既に書いた通り。
お約束のHello worldはこんな感じ。
"Hello World!".postln;
行末は;(セミコロン)で終わる。馴染み深いスタイルですね。
とりあえずscは音響合成用なので、音をならしたい。
{[SinOsc.ar(440, 0, 0.4), SinOsc.ar(442, 0, 0.4)]}.play;
これでとりあえず鳴ります。サイン波なやつが。
カーリーブレス{}で括ったら、どうやら関数になるっぽいです。
f = { "Function evaluated".postln; };
名前が必要ないのか。無名関数みたい。
っていうか厳密にはオブジェクトなのか。と思うとよりわかりやすい。
で、このオブジェクトを評価したい場合は、こう。
f.value;
そして引数を取る関数(っぽいオブジェクト)を作成するにはこう。
f = {arg a; a.value + 3};
f.value(3);
arg以下に並べたものが引数とみなされるみたいです。
複数ならこう。
f = {arg a, b; a - b;};
f.value(5, 3);
これ書いてて気になったのは引数のない場合にf.value();とするとダメなのかな、ってところ。
とりあえずテスト。
f = { "Function evaluated".postln; };
f.value();
通る。どうやら問題ないみたい。
じゃあこれはどうだろ。
"Hello world!".postln();
ぬ、いけるな。
xxx.yyyという呼び出しは、「オブジェクトに対してメッセージを送る」という行為らしい。
それを行う際、引数がない場合は()を省略できる、ってことなのかな。
全部が全部そうかはまだ定かではないけど、とりあえずpostlnとvalueは確認出来た:)
また、引数はargを使って宣言しないことも可能。
その場合は||で括って、こんな感じ。
f = {|a. b| a + b;};
f.value(1, 2);
確かに短い関数とかはこれの方がすっきりしてて良いかも。
ブロックは()で括る。
(
f = {|a, b| a + b;};
f.value(5, 3);
)
こうすると、scでここをひとまとめに実行してくれたりするらしく、何かと都合が良いっぽい。
また、変数の宣言はvarを使って行う。
var hoge = 1.0;
さっきから使ってたfは宣言してないじゃん!という話に関して、そのまま引用。
実は、文字’a’から’z’までは、インタプリタ変数とよばれています。これらの変数は、SCを起動したときに自動的に宣言され、無制限の、あるいは「グローバルな」スコープを持ちます。
つまり、英小文字1文字はグローバル変数、ということ。
じゃあこういうのはどうなる?
(
f = {|a, b| (a*a+b*b)};
)
f.value(2, 3);
いけた。
ただし、先に()の中を評価してから、じゃないとエラーが起きる。
ちなみに当方Linux。geditにプラグイン突っ込んで動かしてます:)
最後に重要なことをもう1個。
コメントアウトは//です。
// comment
これも馴染み深いですね。
とりあえず今日覚えたことは以上。
あとはその他一般的な制御構文を知りたい。分岐とかループとか。
あとはオブジェクトのリファレンス的なものがあれば理解が一気に進むかな。
でも思ったよりとっつきにくくなくて、楽しい言語かもしれません、SuperCollider。
randの文とか面白い。
f = {arg a; a.value + 3};
g = {3.0.rand;};
f.value(g);
楽しい。。
しばらくいじってみよ。
あ、いろいろ書きましたが間違ってるかも、なので、
各々上記リンクなどを頼りに、曇り無き眼で情報を見定めてください:)