Last active
March 18, 2026 03:34
-
-
Save kn1kn1/83a963604c32bba630ce34d3563af1e1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ============================================================ | |
| // 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 | |
| ) | |
| ); | |
| ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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