SuperCollider サンプル2 解析
// 60Hz Gabber Rave 1995一つ一つ見てみよう
Server.default.boot;
Server.default.quit;
(
SynthDef(\gabberkick, {
var snd, freq, high, lfo;
freq = \freq.kr(440) * (Env.perc(0.001, 0.08, curve: -1).ar * 48 * \bend.kr(1)).midiratio;
snd = Saw.ar(freq);
snd = (snd * 100).tanh + ((snd.sign - snd) * -8.dbamp);
high = HPF.ar(snd, 300);
lfo = SinOsc.ar(8, [0, 0.5pi]).range(0, 0.01);
high = high.dup(2) + (DelayC.ar(high, 0.01, lfo) * -2.dbamp);
snd = LPF.ar(snd, 100).dup(2) + high;
snd = RLPF.ar(snd, 7000, 2);
snd = BPeakEQ.ar(snd, \ffreq.kr(3000) * XLine.kr(1, 0.8, 0.3), 0.5, 15);
snd = snd * Env.asr(0.001, 1, 0.05).ar(2, \gate.kr(1));
Out.ar(\out.kr(0), snd * \amp.kr(0.1));
}).add;
SynthDef(\hoover, {
var snd, freq, bw, delay, decay;
freq = \freq.kr(440);
freq = freq * Env([-5, 6, 0], [0.1, 1.7], [\lin, -4]).kr.midiratio;
bw = 1.035;
snd = { DelayN.ar(Saw.ar(freq * ExpRand(bw, 1 / bw)) + Saw.ar(freq * 0.5 * ExpRand(bw, 1 / bw)), 0.01, Rand(0, 0.01)) }.dup(20);
snd = (Splay.ar(snd) * 3).atan;
snd = snd * Env.asr(0.01, 1.0, 1.0).kr(0, \gate.kr(1));
snd = FreeVerb2.ar(snd[0], snd[1], 0.3, 0.9);
snd = snd * Env.asr(0, 1.0, 4, 6).kr(2, \gate.kr(1));
Out.ar(\out.kr(0), snd * \amp.kr(0.1));
}).add;
)
(
var durations;
durations = [1, 1, 1, 1, 3/4, 1/4, 1/2, 3/4, 1/4, 1/2];
Ppar([
Pbind(*[
instrument: \gabberkick,
amp: -23.dbamp,
freq: 60,
legato: 0.8,
ffreq: Pseq((0..(durations.size * 4 - 1)).normalize, inf).linexp(0, 1, 100, 4000),
dur: Pseq(durations, inf),
bend: Pfuncn({ |x| if(x < (1/2), 0.4, 1) }, inf) <> Pkey(\dur),
]),
Pbind(*[
instrument: \hoover,
amp: -20.dbamp,
midinote: 74,
dur: durations.sum * 2,
sustain: 7,
])
]).play(TempoClock(210 / 60));
)
サーバー
Server.default.boot; //サーバーの起動...ここにカーソル合わせてコマンド-Return2回起動させても、
server 'localhost' already running
が出るので、サーバーは1つしか起動できないってことだね。と思ったら、
違うサーバを起動できるっぽい。defaultがlocalhostかな。
http://doc.sccode.org/Classes/Server.html
とりあえず、サーバーの終了は
Server.default.quit;
でできそうだ。
全体構造
大まかな構造を見て見る。SynthDefで、シンセを定義できるっぽい。ここでは
gabberkick,hooverの二つを定義
そして、下の方では実際のそれらを使って、音を鳴らしている。
シンセ定義部分
SynthDef(シンセ名,定義).addにて、定義をしてからそれをシンセとして追加している。
シンセ名が\gabberkickとかで定義してあって、\freq,\bend,\ffreq,\gate,\amp,\outとかは、変数に見える。再生部分でlegato, durがあるんだけど、durはbendに伝わってるけど、legatoはどうなっているんだろう。
\hooverもみてみると、\freq,\lin,\gate,\out,\ampが変数にみえるが、midinote, sustainが再生部分にある。
自分で定義できる部分と、定義済み変数とあるように見える。
再生部分
Ppar: embed event streams in parallel 平行して鳴るってことかなPbind: combine several value patterns to one event stream by binding keys to values パラメータをバインド...繋げるってことなか
Pは、Patternの略っぽい。
Patternを決めて、それを.playとかしてるっぽい。クラスPatternで.playが定義されてる。
*[] 書き方としてポインタを思い起こすが、ま、いっか。配列だと思っておこう。
コメント
コメントを投稿