関数など
関数とはこのようなものであった。
f = {arg a,b; a+b };
この「f」なる関数は「a+b」をする。引数のところは以下のように書き換え可
f = {|a,b| a+b };
二つは同じ意味である。引数に数をくれるには以下のごとく
f.(2,3);
めでたく「5」と出ます。
ただしこれだけではあまり用途がありませんので、UGenなど入れたのこしらえてみたり
a = {|freq| SinOsc.ar(freq) }; { a.(200) }.play;
複数組み合わせてみたり
a = {|in,freq,rq| BPF.ar(in,freq,rq) }; b = {|freq| LFNoise0.ar(freq) }; { a.(b.(1e3),1e3,0.1) }.play;
playの前の文章がとんでもわけわからんことになってますが(余談だが1e3は1000の指数表記)、かように関数で書いて何がうれしいかというと、同じ処理を繰り返すとか別の場所で使いまわす、といったあたりではと思われます。
次にSynthDefの中に入れ込んでみる。以下は2chぶんのディレイタイムを「t」として書いております(t!2は[t,t]の意)。
SynthDef("reverb", { var i = Impulse.ar(1); t = { 0.04.rand+0.01 }; 4.do{ i = AllpassN.ar(i,0.05,t!2,1) }; Out.ar(0, i); }).play;
さらによくわからん例。こうなるともはやSynthDefの中味は謎と言ってもよい感じである。
~res = {|in,freq=4e3| Latch.ar(in, Impulse.ar(freq)) }; ~env = { EnvGen.ar(Env.perc(0,0.5), doneAction:2) }; ~out = {|in| Out.ar(0, in!2) }; SynthDef("kick", { var o = SinOsc.ar(~env**8*250+50,0,~env**2); o = LPF.ar(LFNoise0.ar(5e3,~env**2),100,1) + ~res.(o); ~out.(o); }).play;
関数名をグローバルにしてますが、要するに複数のSynthDefで共有しようという。これが必要な場面がどのくらいあるんだか甚だ不明ではありますが、例えばこれみたいに打楽器系の音を何種類か作りたい、などという場合には使えるかもしれません(またも余談だが~resの引数freqには初期値があるので引数を省略可)。
例えばSCでクラスを書いて使おうとすると、まるごとコンパイルし直すとか何気に手間な気がしますが、こうして関数をうまいこと使うことで、よりプログラム言語ぽく(?)なるかもね、というお話でした。
Ruby
次は単なる与太ですが、最近遊びで*1Rubyというのをいじるようになりまして、実際始めてみるまで全然知らなかったが、SuperColliderとRubyてなんだか似てますね。それもそのはずで、両方とも共通の祖先にSmalltalkがいる。
まあご先祖が同じとはいえ、似ていると言えば似ている*2、あるいはそうでもない、といった具合なのですが、確かSCの最初の説明でSmalltalkが出てきたと思うのだが、古い言語ゆえか書籍もあまり見当たらないし*3、どんなものかよくわからないままであった。
ゆえにSCはOOPと言われても、うっかりC++やらJavaをイメージしてたらびびるなど笑、いまいちピンと来てなかったりしましたが*4、同じSmalltalkの「強い影響を受けている」Rubyは比較的新しい言語ですし、本もたくさん出てる。
それでSCの説明とか文法や仕様でよくわかんねーなーと思うところとか、もしやRubyをかじってみたりすると多少わかるようになるかも知れないです。と思った。などという、何ら具体例のない与太のまま逃げ切ろうとしているわけですが、これではあまりに無内容なので、一応自分が読んだ書籍など挙げてお茶を濁してみる*5。
Tokyo SuperCollider #1 - 7/10開催決定
http://tokyosupercollider.blogspot.com/
前半はビギナータイムで全くの未経験でも気軽に参加ください、とのこと。行きたい。