Skip to content

Instantly share code, notes, and snippets.

@kn1kn1
Last active March 18, 2026 03:34
Show Gist options
  • Select an option

  • Save kn1kn1/83a963604c32bba630ce34d3563af1e1 to your computer and use it in GitHub Desktop.

Select an option

Save kn1kn1/83a963604c32bba630ce34d3563af1e1 to your computer and use it in GitHub Desktop.
// ============================================================
// Autechre風スケッチ
// ============================================================
// ============================================================
// Section 0: Server Boot
// ============================================================
(
s.options.numOutputBusChannels = 2;
s.options.memSize = 8192 * 16;
s.boot;
)
// ============================================================
// Section 1: SynthDefs
// ============================================================
(
// --- Percussion ---
// 808風キック: SinOsc + ピッチスウィープ
SynthDef(\atek_kick, { |out=0, amp=0.8, pan=0, freq=60, sweep=200, dec=0.4|
var env = EnvGen.kr(Env.perc(0.001, dec, amp, -4), doneAction: 2);
var pitch = XLine.kr(freq + sweep, freq, 0.05);
var click = WhiteNoise.ar * 0.05 * EnvGen.kr(Env.perc(0.001, 0.02, 1, -4));
var sig = SinOsc.ar(pitch) * env + click;
Out.ar(out, Pan2.ar(sig, pan));
}).add;
// スネア: トーン + バンドパスノイズ
SynthDef(\atek_snare, { |out=0, amp=0.5, pan=0, freq=200, dec=0.15|
var env = EnvGen.kr(Env.perc(0.001, dec, amp, -3), doneAction: 2);
var tone = LPF.ar(Pulse.ar(freq), freq * 2);
var noise = BPF.ar(HPF.ar(WhiteNoise.ar, 300), 1500, 1.5);
var sig = (tone * 0.3 + (noise * 0.7)) * env;
Out.ar(out, Pan2.ar(sig, pan));
}).add;
// メタリックハイハット: HPF ノイズ + BPF
SynthDef(\atek_hat, { |out=0, amp=0.3, pan=0, freq=8000, dec=0.05|
var env = EnvGen.kr(Env.perc(0.001, dec, amp, -5), doneAction: 2);
var sig = BPF.ar(HPF.ar(WhiteNoise.ar, freq), freq * 1.5, 0.5) * env;
Out.ar(out, Pan2.ar(sig, pan));
}).add;
// 金属的パーカッション: Klank 共鳴
SynthDef(\atek_metal, { |out=0, amp=0.4, pan=0, freq=400, dec=0.3|
var env = EnvGen.kr(Env.perc(0.001, dec, amp, -4), doneAction: 2);
var freqs = freq * [1, 2.756, 4.093, 5.168, 6.021, 8.432];
var times = [1.0, 0.6, 0.4, 0.3, 0.2, 0.1] * dec;
var sig = Klank.ar(`[freqs, nil, times], Impulse.ar(0));
Out.ar(out, Pan2.ar(sig * env * 0.3, pan));
}).add;
// --- Tonal ---
// FMベース: PMOsc + モジュレーションエンベロープ
SynthDef(\atek_fm_bass, { |out=0, amp=0.5, pan=0, freq=80, modRatio=2.5, modIdx=3,
atk=0.01, rel=0.4|
var env = EnvGen.kr(Env.perc(atk, rel, amp, -3), doneAction: 2);
var modEnv = EnvGen.kr(Env.perc(0.01, rel, modIdx));
var mod = SinOsc.ar(freq * modRatio, 0, freq * modEnv);
var sig = LPF.ar(SinOsc.ar(freq + mod) * env, freq * 8);
Out.ar(out, Pan2.ar(sig, pan));
}).add;
// FMリード: 2段変調 + LFO ゆらぎ
SynthDef(\atek_fm_lead, { |out=0, amp=0.3, pan=0, freq=440, modRatio=1.414, modIdx=5,
atk=0.02, rel=0.3|
var env = EnvGen.kr(Env.perc(atk, rel, amp, -2), doneAction: 2);
var modEnv = EnvGen.kr(Env.perc(0.01, rel * 0.5, modIdx));
var lfo = SinOsc.kr(3, 0, 0.01, 1);
var mod = SinOsc.ar(freq * modRatio * lfo, 0, freq * modEnv);
var mod2 = SinOsc.ar(freq * modRatio * 2, 0, freq * modEnv * 0.5);
var sig = SinOsc.ar(freq + mod + mod2) * env;
Out.ar(out, Pan2.ar(sig, pan));
}).add;
// グラニュラーテクスチャ: GrainSin クラウド
// sustain はSC eventシステムが \dur * \legato から自動計算して渡す
SynthDef(\atek_grain, { |out=0, amp=0.2, sustain=2.0, freq=500, density=20|
var env = EnvGen.kr(Env.linen(0.1, (sustain - 0.2).max(0.01), 0.1, amp), doneAction: 2);
var sig = GrainSin.ar(
numChannels: 2,
trigger: Impulse.ar(density),
dur: density.reciprocal * 2,
freq: freq * LFNoise1.kr(10).range(0.95, 1.05),
pan: LFNoise1.kr(5)
) * env;
Out.ar(out, sig);
}).add;
// 進化するパッド: 複数 SinOsc + LFO変調
SynthDef(\atek_pad, { |out=0, amp=0.15, pan=0, freq=220, rel=4|
var env = EnvGen.kr(Env.perc(0.5, rel, amp, -2), doneAction: 2);
var lfo1 = SinOsc.kr(0.13, 0, 0.015, 1);
var lfo2 = SinOsc.kr(0.07, 0.5pi, 0.010, 1);
var sig = Mix.ar([
SinOsc.ar(freq * lfo1),
SinOsc.ar(freq * 2.001 * lfo2) * 0.50,
SinOsc.ar(freq * 3.007 * lfo1) * 0.25,
SinOsc.ar(freq * 0.500 * lfo2) * 0.35
]) * env;
Out.ar(out, Pan2.ar(sig, pan));
}).add;
"SynthDefs loaded.".postln;
)
// ============================================================
// Section 2: Effects Bus
// ============================================================
(
~fxBus = Bus.audio(s, 2);
SynthDef(\atek_reverb, { |in, out=0, mix=0.35, room=0.85, damp=0.4|
var sig = In.ar(in, 2);
var wet = FreeVerb2.ar(sig[0], sig[1], mix, room, damp);
Out.ar(out, wet);
}).add;
SynthDef(\atek_delay, { |in, out=0, dtimeL=0.375, dtimeR=0.5, decaytime=2.5, mix=0.3|
var sig = In.ar(in, 2);
var wetL = CombC.ar(sig[0], 2.0, dtimeL, decaytime);
var wetR = CombC.ar(sig[1], 2.0, dtimeR, decaytime);
Out.ar(out, sig + ([wetL, wetR] * mix));
}).add;
// ビットクラッシュ + tanh 歪み
SynthDef(\atek_dist, { |in, out=0, drive=2.0, bits=6, mix=0.5|
var sig = In.ar(in, 2);
var crushed = round(sig * (2 ** bits)) / (2 ** bits);
var distorted = tanh(crushed * drive) * 0.7;
Out.ar(out, SelectX.ar(mix, [sig, distorted]));
}).add;
s.waitForBoot {
~reverbSynth = Synth(\atek_reverb, [\in, ~fxBus, \out, 0], addAction: \addToTail);
~delaySynth = Synth(\atek_delay, [\in, ~fxBus, \out, 0], addAction: \addToTail);
"Effects Bus loaded.".postln;
};
)
// ============================================================
// Section 3: Pdef パターン
// ============================================================
(
// --- Euclidean rhythm arrays (16 steps = 1 bar) ---
var eKick = [1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0];
var eSnare = [0,0,0,0, 1,0,0,0, 0,0,0,1, 0,0,1,0];
var eHat = [1,0,1,1, 0,1,0,1, 1,0,1,0, 1,0,1,1];
var eMetal = [0,0,1,0, 0,0,0,1, 0,1,0,0, 0,0,0,1];
// hit配列 → 各ステップ 1/4拍ずつの dur/amp 配列に変換
var toDurs = { |hits, step=0.25| hits.collect { step } };
var toAmps = { |hits, base=0.5| hits.collect { |h| h * base } };
// Dマイナーペンタトニック系音階
var bassNotes = [38, 40, 41, 45, 48, 50, 53].midicps;
var leadNotes = [62, 64, 65, 69, 72, 74].midicps;
var grainNotes = [50, 53, 57, 60].midicps;
var padNotes = [38, 45, 50].midicps;
TempoClock.default.tempo = 138 / 60;
// --- Rhythm ---
Pdef(\kick,
Pbind(
\instrument, \atek_kick,
\dur, Pseq(toDurs.(eKick), inf),
\amp, Pseq(toAmps.(eKick, 0.85), inf),
\freq, Prand([55, 58, 60], inf),
\sweep, Prand([180, 220, 260], inf),
\dec, Prand([0.35, 0.4, 0.45], inf),
\out, 0
)
);
Pdef(\snare,
Pbind(
\instrument, \atek_snare,
\dur, Pseq(toDurs.(eSnare), inf),
\amp, Pseq(toAmps.(eSnare, 0.55), inf),
\freq, Prand([180, 200, 220], inf),
\pan, Prand([-0.1, 0, 0.1], inf),
\out, 0
)
);
Pdef(\hat,
Pbind(
\instrument, \atek_hat,
\dur, Pseq(toDurs.(eHat), inf),
\amp, Pseq(toAmps.(eHat, 0.30), inf),
\dec, Prand([0.03, 0.05, 0.08, 0.12], inf),
\pan, Prand([-0.4, -0.2, 0.2, 0.4], inf),
\out, 0
)
);
Pdef(\metal,
Pbind(
\instrument, \atek_metal,
\dur, Pseq(toDurs.(eMetal), inf),
\amp, Pseq(toAmps.(eMetal, 0.45), inf),
\freq, Prand([300, 400, 600, 800], inf),
\dec, Prand([0.2, 0.3, 0.5], inf),
\pan, Prand([-0.5, 0.5], inf),
\out, 0
)
);
// --- Melody / Texture ---
Pdef(\bass,
Pbind(
\instrument, \atek_fm_bass,
\dur, Prand([0.5, 0.5, 1.0, 1.5, 0.25, 0.75], inf),
\amp, Prand([0.4, 0.5, 0.55], inf),
\freq, Prand(bassNotes, inf),
\modRatio, Prand([1.0, 1.5, 2.0, 2.5, 3.0], inf),
\modIdx, Prand([2, 3, 4, 6], inf),
\rel, Prand([0.3, 0.5, 0.8], inf),
\pan, Prand([-0.2, 0, 0.2], inf),
\out, 0
)
);
Pdef(\lead,
Pbind(
\instrument, \atek_fm_lead,
\dur, Prand([0.5, 1.0, 1.5, 2.0, 0.25, Rest(1.0), Rest(2.0)], inf),
\amp, Prand([0.2, 0.25, 0.3], inf),
\freq, Prand(leadNotes, inf),
\modRatio, Prand([1.414, 1.732, 2.0, 2.5], inf),
\modIdx, Prand([3, 5, 7, 9], inf),
\rel, Prand([0.2, 0.3, 0.5], inf),
\pan, Prand([-0.6, -0.3, 0.3, 0.6], inf),
\out, 0
)
);
Pdef(\grain,
Pbind(
\instrument, \atek_grain,
\dur, Prand([2.0, 3.0, 4.0], inf),
\legato, 0.95,
\amp, Prand([0.15, 0.2, 0.25], inf),
\freq, Prand(grainNotes, inf),
\density, Prand([15, 20, 30], inf),
\out, 0
)
);
Pdef(\pad,
Pbind(
\instrument, \atek_pad,
\dur, Prand([4.0, 6.0, 8.0, Rest(4.0)], inf),
\amp, Prand([0.10, 0.12, 0.15], inf),
\freq, Prand(padNotes, inf),
\rel, Prand([3.0, 4.0, 5.0], inf),
\pan, Prand([-0.5, 0, 0.5], inf),
\out, 0
)
);
"Patterns loaded.".postln;
)
// ============================================================
// Section 4: 全体起動 / 停止
// ============================================================
// 全パターン起動
(
Pdef(\kick).play;
Pdef(\snare).play;
Pdef(\hat).play;
Pdef(\metal).play;
Pdef(\bass).play;
Pdef(\lead).play;
// Pdef(\grain).play;
Pdef(\pad).play;
"Playing.".postln;
)
// 全停止
// Pdef.all.do(_.stop);
Pdef(\metal).stop;
Pdef(\bass).stop;
Pdef(\lead).stop;
Pdef(\grain).stop;
Pdef(\pad).stop;
// ============================================================
// Section 5: ライブ操作例 (実行中に評価して差し替え)
// ============================================================
// ハットを16分・密パターンに変える
(
Pdef(\hat,
Pbind(
\instrument, \atek_hat,
\dur, Prand([1/8, 1/8, 1/4, 1/4], inf),
\amp, Prand([0.25, 0.3, 0.35, 0], inf),
\dec, Prand([0.03, 0.05, 0.10], inf),
\pan, Prand([-0.6, -0.3, 0.3, 0.6], inf),
\out, 0
)
);
)
// キックを不規則パターンに変える
(
Pdef(\kick,
Pbind(
\instrument, \atek_kick,
\dur, Prand([0.5, 0.5, 1.0, 0.25, 0.75], inf),
\amp, Prand([0.7, 0.85, 0.9, 0], inf),
\freq, Prand([48, 52, 55, 60, 65], inf),
\sweep, Prand([100, 200, 350], inf),
\dec, Prand([0.3, 0.45, 0.6], inf),
\out, 0
)
);
)
// ベースをアグレッシブに (高 modIdx)
(
Pdef(\bass,
Pbind(
\instrument, \atek_fm_bass,
\dur, Prand([0.25, 0.25, 0.5, 1.0], inf),
\amp, Prand([0.45, 0.55, 0.6], inf),
\freq, Prand([38, 40, 41, 45].midicps, inf),
\modRatio, Prand([2.0, 3.0, 4.0, 7.0], inf),
\modIdx, Prand([5, 8, 12], inf),
\rel, Prand([0.1, 0.2, 0.3], inf),
\pan, Prand([-0.3, 0, 0.3], inf),
\out, 0
)
);
)
SuperColliderを使ってAuteche風の音楽を作りたい。
参考にするサイトは以下のとおり。
https://doc.sccode.org/
https://github.com/tado/sc-book-examples
https://codeberg.org/musikinformatik/SuperDirt/src/branch/develop/library/default-synths-extra.scd
https://codeberg.org/musikinformatik/SuperDirt/src/branch/develop/library/default-effects-extra.scd
https://github.com/SCLOrkHub/SCLOrkSynths/tree/master/SynthDefs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment