SC3 こーどりーでぃんぐ1

とりあえずキック部分のメモ書きです。snare,clapもほぼ同様かな。hatは結構複雑。
短いコードの中にも多くの学ぶべきことが詰まっています。supercolliderにおいては人によって書き方が全然違いますが、基本的な部分さえ押さえておけばある程度は読めるはずです。さらに、自分なりの書き方に落とし込めばコーディング力向上間違い無しです!

08091500Acid309 by_otophiliaより

SynthDef("kick", {	
	arg outBus=0;
	var env0, env1, env1m, out;
	
	env0 =  EnvGen.ar(Env.new([0.5, 1, 0.5, 0], [0.005, 0.06, 0.26], [-4, -2, -4]), doneAction:2);
	env1 = EnvGen.ar(Env.new([110, 59, 29], [0.005, 0.29], [-4, -5]));
	env1m = env1.midicps;
		
	out = LFPulse.ar(env1m, 0, 0.5, 1, -0.5);
	out = out + WhiteNoise.ar(1);
	out = LPF.ar(out, env1m*1.5, env0);
	out = out + SinOsc.ar(env1m, 0.5, env0);
		
	out = out * 1.2;
	out = out.clip2(1);
		
	Out.ar(outBus, out.dup);
}).send(s);

読む

env0 =  EnvGen.ar(Env.new([0.5, 1, 0.5, 0], [0.005, 0.06, 0.26], [-4, -2, -4]), doneAction:2);

なんてことないenv定義。ただし、こいつは波形のmulとして使用される。そのため、このenvが終了した時点でシンセを解放してやればいい。という理由でdoneAction:2を加えている。

env1 = EnvGen.ar(Env.new([110, 59, 29], [0.005, 0.29], [-4, -5]));
env1m = env1.midicps;

こちらも同じくnewで定義しているなんてことないenv。次の行にてenv1をmidi値へ変換しているが、波形のfreqとして使用されるため。

out = LFPulse.ar(env1m, 0, 0.5, 1, -0.5);

freqとして、先ほどのenv1をmidi値にしたものを使用。バスドラムなど破裂音の周波数は高から低へ瞬間的に遷移するという、正しい理解に基づいた音作り。これは凄い!

out = out + WhiteNoise.ar(1);

ここでホワイトノイズをうっすらと加える。ちょっと汚したい時によくやる手法であり覚えておきたい。フィルターで余計な部分をカットしないとダメなので、忘れないように。

out = LPF.ar(out, env1m*1.5, env0);

ローパス。カットオフ周波数にenv1をmidi値にしたもの*1.5を使用している。このようにして、ノイズの余計な部分をカットする。さらに、mulにenv0を使用して、もとのLFPulseとそろえている。元の音から外れた余計なノイズが混じらないようにだろう。

out = out + SinOsc.ar(env1m, 0.5, env0);

厚みを増すためにサイン波を加えている。ここでも周波数にenv1m、mulにenv0を使用しそろえることで余計な音がかぶらないようにしている。位相をずらしているがなぜだろう?

out = out * 1.2;
out = out.clip2(1);

ここも面白い。出力を*1.2と無理矢理あげておいてからclip2(1)で出力を1に押さえることで歪ませている。これは使いたい手法。

Out.ar(outBus, out.dup);

dupは配列を返す。デフォ値が2であり、ステレオ出力させたい時によく使う。SC140において有用。

こんな感じでテンプレ化

シンセ定義した場合はすぐに音が確認できるように。パラメータの数はあまり増やさないように注意。

(
	SynthDef("sc3read_otophilia_kick",{
		arg pan = 0, outBus = 0, clip_amp = 1.0, white_amp=0.0, filter_freq=1.0,sin_phase=0.0;
		var env_mul, env_freq, signal, outSend;

		env_mul = Env.new([0.5, 1, 0.5, 0], [0.005, 0.06, 0.26], [-4, -2, -4]);
		//env_mul.plot;
		env_mul = EnvGen.ar(env_mul ,doneAction:2);
		env_freq = Env.new([110, 59, 29], [0.005, 0.29], [-4, -5]);
		//env_freq.plot;
		env_freq = EnvGen.ar(env_freq).midicps;
		
		//メイン波形。これに色々加えていったり削ったりする。
		signal = SinOsc.ar(env_freq, 0, env_mul);
		//ノイズをどの程度加えると良いか確認してみましょう
		signal = signal + PinkNoise.ar(white_amp);
		//cutoff周波数もいじってみましょう
		signal = LPF.ar(signal, env_freq*filter_freq, env_mul);
		//厚みを増したい場合には別波形を足す。ノイズ系でもいいかも。位相もいじってみましょう!
		signal = signal + SinOsc.ar(env_freq,sin_phase,env_mul);
		
		//どの程度クリップさせると良いか確認してみましょう
		outSend = signal * clip_amp;
		outSend.clip2(1).scope;

		Out.ar(outBus,
			Pan2.ar(outSend, pan)
		);
	},metadata: (specs: (clip_amp: [0, 2, \lin],white_amp: [0, 3, \lin], filter_freq: [0, 4, \lin], sin_phase: [0, 1, \lin]))
	).store;
SynthDescLib.global[\sc3read_otophilia_kick].makeWindow;
)

いじょう

メモだけど、アウトプット、アウトプット。