From 6f90b4d1cf94e25a1ad1f94dc6c4265e8deb5616 Mon Sep 17 00:00:00 2001 From: adminoo Date: Sat, 14 Jun 2025 16:41:54 +0200 Subject: [PATCH] feat: load synthef on startup --- amplitude_regulation.scd | 9 ++++ examples/bandoo.scd | 32 +++++++++++++ bitcrushing.scd => examples/bitcrushing.scd | 0 examples/bpf_brown.scd | 14 ++++++ examples/choir.scd | 34 +++++++++++++ chorus.scd => examples/chorus.scd | 0 flanger.scd => examples/flanger.scd | 0 fx_chain1.scd => examples/fx_chain1.scd | 0 .../master_fx_bus.scd | 0 examples/pad_chords.scd | 26 ++++++++++ extensions/SynthUtils/classes/utils.sc | 11 +++++ hihat_simple.scd | 15 ------ main_routine.scd | 8 ---- midi_in_gate.scd | 21 +++++--- pad.scd | 48 ------------------- startup.scd | 14 ++++++ choir.scd => synthdefs/formoo.scd | 48 ++----------------- granulator.scd => synthdefs/granulator.scd | 6 +-- hatgen.scd => synthdefs/hatgen.scd | 6 +-- kickgen.scd => synthdefs/kickgen.scd | 8 +--- synthdefs/padoo.scd | 31 ++++++++++++ random_lfo.scd => synthdefs/random_lfo.scd | 8 ++-- synthdefs/rangz.scd | 12 +++++ .../snare_physical_mod.scd | 5 +- supersaw.scd => synthdefs/supersaw.scd | 4 +- tom_simple.scd => synthdefs/tom_simple.scd | 6 +-- 26 files changed, 214 insertions(+), 152 deletions(-) create mode 100644 amplitude_regulation.scd create mode 100644 examples/bandoo.scd rename bitcrushing.scd => examples/bitcrushing.scd (100%) create mode 100644 examples/bpf_brown.scd create mode 100644 examples/choir.scd rename chorus.scd => examples/chorus.scd (100%) rename flanger.scd => examples/flanger.scd (100%) rename fx_chain1.scd => examples/fx_chain1.scd (100%) rename master_fx_bus.scd => examples/master_fx_bus.scd (100%) create mode 100644 examples/pad_chords.scd create mode 100644 extensions/SynthUtils/classes/utils.sc delete mode 100644 hihat_simple.scd delete mode 100644 main_routine.scd delete mode 100644 pad.scd create mode 100644 startup.scd rename choir.scd => synthdefs/formoo.scd (57%) rename granulator.scd => synthdefs/granulator.scd (92%) rename hatgen.scd => synthdefs/hatgen.scd (86%) rename kickgen.scd => synthdefs/kickgen.scd (84%) create mode 100644 synthdefs/padoo.scd rename random_lfo.scd => synthdefs/random_lfo.scd (84%) create mode 100644 synthdefs/rangz.scd rename snare_physical_mod.scd => synthdefs/snare_physical_mod.scd (98%) rename supersaw.scd => synthdefs/supersaw.scd (98%) rename tom_simple.scd => synthdefs/tom_simple.scd (92%) diff --git a/amplitude_regulation.scd b/amplitude_regulation.scd new file mode 100644 index 0000000..8d67656 --- /dev/null +++ b/amplitude_regulation.scd @@ -0,0 +1,9 @@ +( +// analyse amplitude +compressor = Amplitude.kr(sig, 2, 5); + +regulation = Select.kr(compressor > thresh, [ + 1.0, + \ratio.kr(0.8) * (thresh / compressor) +]).lag(\lagTime.kr(0.1)); +) \ No newline at end of file diff --git a/examples/bandoo.scd b/examples/bandoo.scd new file mode 100644 index 0000000..5cf3121 --- /dev/null +++ b/examples/bandoo.scd @@ -0,0 +1,32 @@ +( +SynthDef(\bandoo, { + var sig; + // base osc + sig = Pulse.ar( + \freq.kr(120) * [1.05, 1.1, 0.8, 1.5], + LFNoise1.ar(0.04).linlin(-1, 1, 0.3, 1) + ); + sig = Splay.ar(sig); + + // low pass filter with random range and resonance + sig = RLPF.ar( + sig, + LFNoise2.ar(0.08).linlin(-1, 1, 450, 1600), + LFNoise2.ar(0.1).linlin(-1, 1, 0.25, 0.6) + ); + + // random pitch shifting and amplitude for each voices + sig = [ + sig * LFNoise2.ar(0.02).linlin(-1, 1, 0.1, 1), + PitchShift.ar(sig, 0.05, LFNoise2.ar(0.14).linlin(-1, 1, 0.5, 2), 0.4) * LFNoise2.ar(0.01).linlin(-1, 1, 0.1, 1), + PitchShift.ar(sig, 0.02, LFNoise2.ar(0.09).linlin(-1, 1, 0.25, 1.1), 0.1) * LFNoise2.ar(0.04).linlin(-1, 1, 0.1, 1) + ]; + sig = LPF.ar(sig, 490 * LFNoise2.ar(0.19).linlin(-1, 1, 0.25, 3), 0.3); + sig = Splay.ar(sig, 0.1); + sig = sig * \amp.kr(1); + sig = Limiter.ar(sig); + Out.ar(\out.kr(0), sig); +}).add; +) + +Synth(\bandoo, [freq: 220]); \ No newline at end of file diff --git a/bitcrushing.scd b/examples/bitcrushing.scd similarity index 100% rename from bitcrushing.scd rename to examples/bitcrushing.scd diff --git a/examples/bpf_brown.scd b/examples/bpf_brown.scd new file mode 100644 index 0000000..ea8c61c --- /dev/null +++ b/examples/bpf_brown.scd @@ -0,0 +1,14 @@ +( +SynthDef(\bpf_brown, { + var sig, env, rq = 0.005; + env = Env([0, 1, 0], [\attack.kr(0.02), \release.kr(2)], [1, -2]).kr(2); + sig = BrownNoise.ar(0.8); + sig = BPF.ar(sig, \freq.kr(800), rq, 1 / rq.sqrt); + sig = Pan2.ar(sig, \pan.kr(0), \amp.kr(1)) * env; + sig = Limiter.ar(sig); + Out.ar(\out.kr(0), sig); +}).add; + +) + +(instrument: \bpf_brown, freq: [430, 500, 625].choose, attack: 0, release: 3, amp: 0.6).play; \ No newline at end of file diff --git a/examples/choir.scd b/examples/choir.scd new file mode 100644 index 0000000..551a956 --- /dev/null +++ b/examples/choir.scd @@ -0,0 +1,34 @@ +// create a choir from two formants +( + +// https://en.wikipedia.org/wiki/Formant#cite_note-7 +var formants = [ + [360, 640], // o + [235, 2100], // y + [390, 2300], // e + [585, 1710], // æ + [850, 1610], // a + [750, 940], // ɑ + [820, 1530], // ɶ + [600, 1170], // ʌ + [250, 595], // u + [240, 2400], // i +]; + +r { + [38 + 3, 38 +5, 38 + 12].do{ + |freq| + Synth(\formoo, + [ + amp: 0.15, + attack: 2, + decay: 5, + freq: freq.midicps, + formants: [850, 1610], + ff: rrand(550, 2660), + qr: 0.5 + ] + ); + } +}.play; +) \ No newline at end of file diff --git a/chorus.scd b/examples/chorus.scd similarity index 100% rename from chorus.scd rename to examples/chorus.scd diff --git a/flanger.scd b/examples/flanger.scd similarity index 100% rename from flanger.scd rename to examples/flanger.scd diff --git a/fx_chain1.scd b/examples/fx_chain1.scd similarity index 100% rename from fx_chain1.scd rename to examples/fx_chain1.scd diff --git a/master_fx_bus.scd b/examples/master_fx_bus.scd similarity index 100% rename from master_fx_bus.scd rename to examples/master_fx_bus.scd diff --git a/examples/pad_chords.scd b/examples/pad_chords.scd new file mode 100644 index 0000000..7c824aa --- /dev/null +++ b/examples/pad_chords.scd @@ -0,0 +1,26 @@ +( +var rel = 2; + +// degrees, whatever +var chords = [ + [0, 3, 5], + [0, 3, 5] + 3, + [0, 2, 5] + 5, + [0, 3, 5] + 2, +]; + +r { + loop { + chords.do({ + |deg| + SynthUtils.playChordGated( + \padoo, + rel, + (40 + deg).midicps, + [ff: 2200, attack: rel, decay: 1, release: rel, vibrato: 0.2, amp: 0.3, gate: 1] + ); + (rrand(0.25, 1) + rel).wait; + }); + }.play; +}.play; +) diff --git a/extensions/SynthUtils/classes/utils.sc b/extensions/SynthUtils/classes/utils.sc new file mode 100644 index 0000000..8bdc834 --- /dev/null +++ b/extensions/SynthUtils/classes/utils.sc @@ -0,0 +1,11 @@ +SynthUtils { + *playChordGated { + |synth, time, freqs=#[], args=#[]| + r{ + var synths = Array.fill(127, nil); + freqs.do({|freq, i| synths[i] = Synth(synth, args ++ [freq: freq] ++ [release: time])}); + time.wait; + synths.do({|item, i| synths[i].set(\gate, 0)}); + }.play; + } +} \ No newline at end of file diff --git a/hihat_simple.scd b/hihat_simple.scd deleted file mode 100644 index d597dc5..0000000 --- a/hihat_simple.scd +++ /dev/null @@ -1,15 +0,0 @@ -( -SynthDef(\hat, { - var sig; - sig = Pulse.ar(Array.fill(6, {|index| 120 * (index + {Rand(1.05, 1.15)})})); - sig = Splay.ar(sig, 0.1); - sig = BPF.ar(sig, 10000, 0.1); - sig = RHPF.ar(sig, 7000, 0.1); - sig = HPF.ar(sig, 5000) * 10.dbamp; - sig = Fold.ar(sig); - sig = sig * Env.perc(0.001, \decay.kr(0.1), curve: -8).ar(Done.freeSelf); - sig = sig * \amp.kr(0.8); - sig = Limiter.ar(sig); - Out.ar(0, sig); -}).add; -) \ No newline at end of file diff --git a/main_routine.scd b/main_routine.scd deleted file mode 100644 index ba78f07..0000000 --- a/main_routine.scd +++ /dev/null @@ -1,8 +0,0 @@ -r{ - loop { - s.bind { - // synth goes here - } - } - exprand(0.1, 1).wait; -}; \ No newline at end of file diff --git a/midi_in_gate.scd b/midi_in_gate.scd index 76b43df..f870c9b 100644 --- a/midi_in_gate.scd +++ b/midi_in_gate.scd @@ -1,3 +1,4 @@ +// connect all midi devices ( MIDIClient.init; MIDIIn.connectAll; @@ -5,23 +6,31 @@ MIDIIn.connectAll; MIDIFunc.trace(true); ) +// on and off notes are tracked using an array +// the synth need to be using a gated envelope. ( ~synths = Array.fill(127, nil); MIDIdef.noteOn(\on, { arg val, num, chan,src; - if(~synths[num] == nil, { // To be absolutely save - ~synths[num] = Synth(\supersaw, [ + // To be absolutely safe + if(~synths[num] == nil, { + ~synths[num] = Synth(\pad, [ \amp, 0.1, \freq, num.midicps, - \harm, exprand(4,20)]); + \harm, exprand(4,20), + \gate, 1]); }); }); MIDIdef.noteOff(\off, { arg val, num, chan,src; - if(~synths[num] != nil, { // To be absolutely safe + // To be absolutely safe + if(~synths[num] != nil, { ~synths[num].set(\gate, 0); - ~synths[num] = nil; // Remove the reference + // Remove the reference + ~synths[num] = nil; }); }); -) \ No newline at end of file +) + +Synth(\pad) \ No newline at end of file diff --git a/pad.scd b/pad.scd deleted file mode 100644 index 7e8509b..0000000 --- a/pad.scd +++ /dev/null @@ -1,48 +0,0 @@ -2.midiratio -( -SynthDef(\pad, { - arg freq = 440, gate = 1; - var env, rel, sig, sig2, detuner1, detuner2; - rel = \rel.kr(1); - env = EnvGen.ar(Env.asr(1.2, 0.5, 3), gate, doneAction: Done.freeSelf); - // this is the key part: several oscillators in UNISON, here using a noise ugen - sig = LFSaw.ar((-5..5).collect({|i| freq + i}), LFTri.kr(0.05).range(1, 2)); - sig = Splay.ar(sig, 0.1); - sig = RLPF.ar(sig, [3000, 2000, 1250, 600] * LFNoise2.kr(1).range(0.5, 1.2), 0.4); - sig = Splay.ar(sig, 0.1); - sig = HPF.ar(sig, 150); - sig = sig * env; - sig = sig * \amp.kr(1); - Out.ar(\out.kr(0), Limiter.ar(sig)); -}).add; -) - -( -MIDIClient.init; -MIDIIn.connectAll; - -MIDIFunc.trace(true); -) - -( -~synths = Array.fill(127, nil); -MIDIdef.noteOn(\on, { - arg val, num, chan,src; - if(~synths[num] == nil, { // To be absolutely save - ~synths[num] = Synth(\pad, [ - \amp, 0.5, - \freq, num.midicps, - \harm, exprand(4,20)]); - }); -}); - -MIDIdef.noteOff(\off, { - arg val, num, chan,src; - if(~synths[num] != nil, { // To be absolutely safe - ~synths[num].set(\gate, 0); - ~synths[num] = nil; // Remove the reference - }); -}); -) - -(-10..10) \ No newline at end of file diff --git a/startup.scd b/startup.scd new file mode 100644 index 0000000..3671d0f --- /dev/null +++ b/startup.scd @@ -0,0 +1,14 @@ +s.options.numWireBufs = (8192*12000); +s.options.memSize = 1048576; +thisProcess.platform.recordingsDir = "~/Production/SuperCollider/recordings".standardizePath; + +// load common synthdefs +~synths = PathName( + Platform.userHomeDir ++ "/Production/SuperCollider/scoobidules/synthdefs" +).entries; + +~synths.do({|item| item.fullPath.load}); + +"giddy up, bucko".postln; + +s.boot; \ No newline at end of file diff --git a/choir.scd b/synthdefs/formoo.scd similarity index 57% rename from choir.scd rename to synthdefs/formoo.scd index c7fa5a8..687f10e 100644 --- a/choir.scd +++ b/synthdefs/formoo.scd @@ -1,20 +1,3 @@ -// create a choir from two formants -( - -// https://en.wikipedia.org/wiki/Formant#cite_note-7 -var formants = [ - [360, 640], // o - [235, 2100], // y - [390, 2300], // e - [585, 1710], // æ - [850, 1610], // a - [750, 940], // ɑ - [820, 1530], // ɶ - [600, 1170], // ʌ - [250, 595], // u - [240, 2400], // i -]; - SynthDef(\formoo, { arg formants = #[850, 1610]; var sig, env; @@ -27,7 +10,7 @@ SynthDef(\formoo, { // formant * detuning; very high resonance voice = RLPF.ar( voice, - formants * + formants * formants.size.collect{ LFNoise2.kr(3).linlin(-1, 1, 0.98, 1.05) }, 0.05).sum; @@ -39,34 +22,13 @@ SynthDef(\formoo, { sig = Splay.ar(sig); // narrowing the spectrum a little more sig = RLPF.ar( - sig, - \ff.kr(4700) * - LFNoise2.kr(1).linlin(-1, 1, 0.95, 1.05), + sig, + \ff.kr(4700) * + LFNoise2.kr(1).linlin(-1, 1, 0.95, 1.05), \qr.kr(0.9) ); sig = sig * env; sig = sig * \amp.kr(0.25); sig = Limiter.ar(sig); Out.ar(\out.kr(0), sig); -}).add; -) - -// example -( -r { - [38 + 3, 38 +5, 38 + 12].do{ - |freq| - Synth(\formoo, - [ - amp: 0.15, - attack: 2, - decay: 5, - freq: freq.midicps, - formants: [850, 1610], - ff: rrand(550, 2660), - qr: 0.5 - ] - ); - } -}.play; -) \ No newline at end of file +}).add; \ No newline at end of file diff --git a/granulator.scd b/synthdefs/granulator.scd similarity index 92% rename from granulator.scd rename to synthdefs/granulator.scd index b1adda5..84faa32 100644 --- a/granulator.scd +++ b/synthdefs/granulator.scd @@ -1,10 +1,9 @@ /* Generic modulable buffer granulator */ -( SynthDef(\grainoo, { |buf| var sig; sig = GrainBuf.ar( - numChannels: 2, + numChannels: 2, trigger: Impulse.ar(\trig_rate.kr(20)), dur: \gdur.kr(0.5), sndbuf: buf, @@ -16,5 +15,4 @@ SynthDef(\grainoo, { sig = sig * \amp.kr(1); sig = Limiter.ar(sig); Out.ar(\out.kr(0), sig); -}).add; -) \ No newline at end of file +}).add; \ No newline at end of file diff --git a/hatgen.scd b/synthdefs/hatgen.scd similarity index 86% rename from hatgen.scd rename to synthdefs/hatgen.scd index 21fd083..1064dbb 100644 --- a/hatgen.scd +++ b/synthdefs/hatgen.scd @@ -1,4 +1,3 @@ -( SynthDef(\hhgen, { var sig; sig = Pulse.ar(Array.fill(6, {arg i; \freq.kr(20) * (i + {Rand(1.02, 1.03)})})); @@ -10,7 +9,4 @@ SynthDef(\hhgen, { sig = sig * Env.perc(0.001, \decay.kr(0.1), curve: \curve.kr(-4)).ar(Done.freeSelf); sig = Pan2.ar(sig, \pan.kr(0)); Out.ar(\out.kr(0), sig!2); -}).add; -) - -// Synth(\hhgen, [freq: 60, decay: 0.1, ff: 6000]); \ No newline at end of file +}).add; \ No newline at end of file diff --git a/kickgen.scd b/synthdefs/kickgen.scd similarity index 84% rename from kickgen.scd rename to synthdefs/kickgen.scd index 4ad1f73..389559c 100644 --- a/kickgen.scd +++ b/synthdefs/kickgen.scd @@ -1,5 +1,4 @@ -( -SynthDef(\kickgen, { +SynthDef(\kickgen, { var curve, sig, envAmp, envPitch, noise, decay; decay = \decay.kr(0.3); curve = \curve.kr(-8); @@ -16,7 +15,4 @@ SynthDef(\kickgen, { sig = Pan2.ar(sig, \pan.kr(0)); Out.ar(\out.kr(0), sig); } -).add; -) - -// Synth(\kickgen, [freq: 50, decay: 4, curve:-8, ff: 9800, envmul: 8, amp:1]); \ No newline at end of file +).add; \ No newline at end of file diff --git a/synthdefs/padoo.scd b/synthdefs/padoo.scd new file mode 100644 index 0000000..99de60b --- /dev/null +++ b/synthdefs/padoo.scd @@ -0,0 +1,31 @@ +SynthDef(\padoo, + { + |gate=0| + var sig, env,freq; + freq = \freq.kr(120); + // three notes. root note, 7th, octave. vibrato + sig = Saw.ar( + [freq, (freq.cpsmidi + 7).midicps, (freq.cpsmidi + 12).midicps] + + SinOsc.ar(\vibrato.kr(6)).linlin(-1, 0.5, 0, Rand(3, 5)) + ); + // sig = Saw.ar(freq + SinOsc.ar(\vibrato.kr(6)).linlin(-1, 1, 0, Rand(3, 5))); + // detuning through slight pitch shifting + sig = 6.collect({|item| PitchShift.ar(sig, 0.05, Rand(0.98, 1.02))}).sum / 6; + sig = Splay.ar(sig, 0.2); + + sig = 8.collect({ + var mod = LFTri.kr(ExpRand(0.2, 0.3), Rand(0.0, 2.0)).range(0.001, 0.02); + DelayL.ar(sig, 0.02, mod); + }); + sig = Splay.ar(sig, 0.2); + + // env = Env.perc(\attack.kr(1), \decay.kr(3)).ar(Done.freeSelf); + env = EnvGen.ar(Env.asr(\attack.kr(1), \decay.kr(3), \release.kr(1)), gate, doneAction: Done.freeSelf); + sig = sig * env; + + sig = RLPF.ar(sig, Env([500, 700, \ff.kr(1500)], [0.5, 1, 0.5]).ar, 0.9); + sig = sig * \amp.kr(0.2); + sig = Limiter.ar(sig); + Out.ar(\out.kr(0), sig); + } +).add; \ No newline at end of file diff --git a/random_lfo.scd b/synthdefs/random_lfo.scd similarity index 84% rename from random_lfo.scd rename to synthdefs/random_lfo.scd index d557590..dba3a85 100644 --- a/random_lfo.scd +++ b/synthdefs/random_lfo.scd @@ -1,12 +1,10 @@ -( SynthDef(\randlfo, { var sig; sig = LFNoise0.ar(\rate.kr(1)).linlin( - -1, - 1, + -1, + 1, \min.kr(0), \max.kr(1), ); Out.ar(\out.kr(0), sig); -}).add; -) \ No newline at end of file +}).add; \ No newline at end of file diff --git a/synthdefs/rangz.scd b/synthdefs/rangz.scd new file mode 100644 index 0000000..b924d0e --- /dev/null +++ b/synthdefs/rangz.scd @@ -0,0 +1,12 @@ +SynthDef(\rangz, { + var exc, amps, freqs, rqs, sig, envPitch, cond, pitchoo, nb = 20; + freqs = Array.fill(nb, {ExpRand(65, \freq.kr(1000)) * ExpRand(0.5, 1.5)}); + rqs = Array.fill(nb, {LFNoise2.kr(2).linexp(-1, 1, 0.001, 0.009)}); + amps = rqs.collect({|item, i| 0.05 + (1 / item.sqrt) * ExpRand(0.05, 1.2)}); + exc = BrownNoise.ar(1); // risky + sig = Resonz.ar(exc, freqs, rqs) * amps; + sig = Splay.ar(sig); + sig = (sig) * \amp.kr(1); + sig = Limiter.ar(sig); + Out.ar(\out.kr(0), sig); +}).add; \ No newline at end of file diff --git a/snare_physical_mod.scd b/synthdefs/snare_physical_mod.scd similarity index 98% rename from snare_physical_mod.scd rename to synthdefs/snare_physical_mod.scd index 9ccd552..28c1d97 100644 --- a/snare_physical_mod.scd +++ b/synthdefs/snare_physical_mod.scd @@ -1,6 +1,4 @@ // https://bzoennchen.github.io/supercollider-book/chapters/sounddesign/physical-modeling.html - -( SynthDef(\snare, { var sig, exciter, local; local = LocalIn.ar(2); @@ -18,5 +16,4 @@ SynthDef(\snare, { DetectSilence.ar(sig, doneAction: Done.freeSelf); sig = Limiter.ar(sig); Out.ar(0, sig); -}).add; -) \ No newline at end of file +}).add; \ No newline at end of file diff --git a/supersaw.scd b/synthdefs/supersaw.scd similarity index 98% rename from supersaw.scd rename to synthdefs/supersaw.scd index abaaa2a..f1a275a 100644 --- a/supersaw.scd +++ b/synthdefs/supersaw.scd @@ -1,4 +1,3 @@ -( SynthDef(\supersaw, { arg gate = 0; var sig, env, freq, sub, noise, saw, rel; @@ -14,5 +13,4 @@ SynthDef(\supersaw, { sig = sig * \amp.kr(0.3); sig = sig * env; Out.ar(\out.kr(0), Limiter.ar(sig)); -}).add; -) \ No newline at end of file +}).add; \ No newline at end of file diff --git a/tom_simple.scd b/synthdefs/tom_simple.scd similarity index 92% rename from tom_simple.scd rename to synthdefs/tom_simple.scd index e580c53..1fe9e6c 100644 --- a/tom_simple.scd +++ b/synthdefs/tom_simple.scd @@ -1,4 +1,3 @@ -( SynthDef(\tom, { var freq, decay, mod, sig, base, noise, vibrato, pitchEnv, ampEnv, filterEnv; freq = \freq.kr(120); @@ -13,7 +12,4 @@ SynthDef(\tom, { // sig = Fold.ar(sig, -0.6, 0.8); sig = sig + GVerb.ar(sig, 22, 1, 0.8) * -16.dbamp; Out.ar(\out.kr(0), sig * \amp.kr(1)); -}).add; -) - -Synth(\tom, [freq: 90, decay: 2]); \ No newline at end of file +}).add; \ No newline at end of file