(
SynthDef(\warmPad, { |out=0, freq=440, amp=0.4, pan=0, atk=1.5, rel=4.0, detune=0.2, cutoff=2500, room=0.7, lfoRate=0.1, lfoDepth=0.02|
var sig, env, det, osc1, osc2, osc3, mix, lfo, filt;
// ゆるやかに変化するLFO(ピッチの揺れ)
lfo = SinOsc.kr(lfoRate, 0, lfoDepth, 1);
// デチューンされた3つのサイン波で厚みを作る
det = freq * [1 - detune, 1, 1 + detune];
osc1 = SinOsc.ar(det[0] * lfo);
osc2 = SinOsc.ar(det[1] * (lfo + 0.001));
osc3 = SinOsc.ar(det[2] * (lfo - 0.001));
mix = (osc1 + osc2 + osc3) / 3;
// 滑らかなエンベロープ
env = EnvGen.kr(Env.linen(atk, rel, rel, curve: -4), doneAction:2);
// フィルターで温かさを調整
filt = RLPF.ar(mix, cutoff, 0.4);
// 軽くアナログ感を出すためのわずかなサチュレーション
sig = tanh(filt * 1.5);
// 空間の広がり
sig = FreeVerb.ar(sig, mix: room, room: room, damp: 0.4);
// 出力
Out.ar(out, Pan2.ar(sig * env * amp, pan));
}).add;
)
