From: Eugene Petkevich Date: Sat, 6 Jan 2024 20:28:34 +0000 (+0100) Subject: refactor synths into several files X-Git-Url: https://git.zuelum.org/?a=commitdiff_plain;h=ec2b1b79986c5d59bebd53a4ea0e3be03fa2ec29;p=scprojects.git refactor synths into several files --- diff --git a/library/effects.scd b/library/effects.scd new file mode 100644 index 0000000..32a4686 --- /dev/null +++ b/library/effects.scd @@ -0,0 +1,21 @@ +// reverbs + +// JPverb with all parameters and mix +SynthDef(\qahe, {|in, out=0, mix=0, t60=1.0, damp=0.0, size=1.0, earlyDiff=0.707, modDepth=0.1, modFreq=2.0, low=1.0, + mid=1.0, high=1.0, lowcut=500.0, highcut=2000.0| + var sig, rev; + sig = In.ar(in, 2); + rev = JPverb.ar(sig, + t60: t60, + damp: damp, + size: size, + earlyDiff: earlyDiff, + modDepth: modDepth, + modFreq: modFreq, + low: low, + mid: mid, + high: high, + lowcut: lowcut, + highcut: highcut); + Out.ar(out, sig + (mix * rev)); +}).add; \ No newline at end of file diff --git a/library/instruments.scd b/library/instruments.scd new file mode 100644 index 0000000..5664d39 --- /dev/null +++ b/library/instruments.scd @@ -0,0 +1,254 @@ +// This file contains synthesisers + +// change default synthdef +// https://github.com/supercollider/supercollider/blob/23ec13a5a2610b0af3755f053611142c7faea875/SCClassLibrary/Common/Collections/Event.sc#L164 +/* +s.doWhenBooted{ + SynthDef(\default, { arg + out=0, + freq=440, + amp=0.1, + pan=0, + gate=1; + var z; + z = LPF.ar( + Mix.new(VarSaw.ar(freq + [0, Rand(-0.4,0.0), Rand(0.0,0.4)], 0, 0.3, 0.3)), + XLine.kr(Rand(4000,5000), Rand(2500,3200), 1) + ) * Linen.kr(gate, 0.01, 0.7, 0.3, 2); + OffsetOut.ar(out, Pan2.ar(z, pan, amp)); + }, [\ir]).add; +}; +*/ + +// instruments + +// fm synth +SynthDef(\bino, {| + out=0, gate=1, freq=440, modFreq=440, amp=1, release=1.0, maxIndex=1 + | + var sig, modIndex, env; + env = EnvGen.ar(Env.asr(releaseTime: release), gate, doneAction: 2); + modIndex = (1 - env) * maxIndex; + sig = PMOsc.ar(freq, modFreq, modIndex, mul: amp); + sig = sig * env; + sig = Pan2.ar(sig, Rand(-0.3, 0.3)); + Out.ar(out, sig * amp); +}).add; + +// snare drum 808 continuous +SynthDef(\buti, {|out=0, amp=1, pan=0, t_trig=0, accent=0.1, freq=200, tone=0.5, decay=0.5, snappy=0.5| + var sig; + sig = AnalogSnareDrum.ar( + t_trig, + infsustain: 0.0, + accent: accent, + freq: freq, + tone: tone, + decay: decay, + snappy: snappy, + ) * amp; + sig = Pan2.ar(sig, pan); + Out.ar(out, sig); +}).add; + +// fm-synth pulse +SynthDef(\dire, { |amp=1, out=0, freq=440, gate=1| + var sig, modFreq, env; + modFreq = SinOsc.ar(3000, mul: freq/4, add: freq); + sig = Pulse.ar(modFreq); + env = EnvGen.ar(Env.adsr(), gate, doneAction: 2); + sig = sig * env; + sig = Pan2.ar(sig, Rand(-0.5, 0.5)); + Out.ar(out, sig * amp); +}).add; + +// Subtract synth pad +SynthDef(\dyti, { + | out=0, gate=1, freq=440, amp=1, pan=0, doneAction=2, cut=800, rez=0.8, + modFreqMin=7, modFreqMax=12, modAmp=0.01, release=1.0 | + var sig = 0; + var panDelay = 0.005; + var modFreq = SinOsc.kr(Rand(modFreqMin, modFreqMax), 0, modAmp, 1); + sig = sig + Pulse.ar(freq * modFreq); + sig = RLPF.ar(sig, cut, rez); + sig = sig * EnvGen.ar(Env.asr(releaseTime: release), gate, doneAction: doneAction); + sig = Pan2.ar(sig, pan); + sig = [DelayN.ar(sig[0], panDelay, (panDelay*pan).clip(0, 1)), DelayN.ar(sig[1], panDelay, (panDelay.neg*pan).clip(0, 1))]; + Out.ar(out, sig * amp); +}).add; + +// additive sin synth, sounds like metal +SynthDef(\leto, { |freq = 440, sustain = 1, amp=1, out=0| + var sig = 0; + var num = 26; + var partial = 0; + num.do({ + var pfact = ExpRand(1, 16); + partial = SinOsc.ar(freq * pfact, Rand(0, 2pi)) / num / pfact; + partial = partial * EnvGen.kr(Env.perc(0.03, Rand(sustain/5, sustain))); + partial = Pan2.ar(partial, Rand(-0.5, 0.5)); + sig = sig + partial; + }); + sig = sig * Line.kr(1, 1, sustain+0.1, doneAction: 2); + Out.ar(out, sig*amp); +}).add; + +// round membrane drum continuous +SynthDef(\liwe, {|out=0, amp=1, pan=0, t_trig=0, tension=0.05, loss=0.99999, impact=0.1| + var sig, excitation; + excitation = EnvGen.kr(Env.perc, t_trig, timeScale: impact, doneAction: 0); + excitation = excitation * PinkNoise.ar(); + sig = MembraneCircle.ar(excitation, tension, loss, mul: amp); + sig = Pan2.ar(sig, pan); + Out.ar(out, sig); +}).add; + +// Subtract synth drum +SynthDef(\naje, { + | out=0, sustain=0.5, freq=440, amp=1, cut=800, rez=0.8, + modFreqMin=7, modFreqMax=12, modAmp=0.01 | + var sig = 0; + var modFreq = SinOsc.kr(Rand(modFreqMin, modFreqMax), 0, modAmp, 1); + sig = sig + Pulse.ar(freq * modFreq); + sig = RLPF.ar(sig, cut.lag(0.01), rez.lag(0.01)); + sig = sig * EnvGen.ar(Env.perc(0.005, releaseTime: sustain), doneAction: 2); + sig = Pan2.ar(sig, Rand(-0.3, 0.3)); + Out.ar(out, sig * amp); +}).add; + +// fibonacci organ +SynthDef.new(\neta, { arg freq = 440, amp = 1.0, gate = 1, out = 0; + var shape = Env.adsr(0.1, 0.2, 0.7, 0.5, 1.0, -4.0, 0); + var fb = 1.0; + var ss = SinOscFB.ar(freq, fb, amp) + + SinOscFB.ar(freq*2, fb, amp/2) + + SinOscFB.ar(freq*3, fb, amp/3) + + SinOscFB.ar(freq*5, fb, amp/5) + + SinOscFB.ar(freq*8, fb, amp/8) + + SinOscFB.ar(freq*13, fb, amp/13) + + SinOscFB.ar(freq*21, fb, amp/21) + + SinOscFB.ar(freq*34, fb, amp/34) + + SinOscFB.ar(freq*55, fb, amp/55) + ; + ss = [ss, DelayC.ar(ss, 0.005, 0.005)]; + ss = ss * 0.7; + ss = BLowPass4.ar(ss, Rand(1060, 1260)); + Out.ar(out, EnvGen.kr(shape, gate, doneAction: 2) * ss); +}).add; + +// additive pulse synth +SynthDef(\pope, {|out=0, gate=1, freq=440, release=1.8, amp=1, pan=0, doneAction=2| + var sig = 0; + var num = 30; + var panDelay = 0.005; + num.do({ + sig = sig + (LFPulse.ar(freq, Rand(0, 0.01), SinOsc.kr(SinOsc.kr(Rand(2, 8), 0, 2, 2), Rand(0, 2pi), 0.5, 0.5)) / num); + }); + sig = sig * EnvGen.kr(Env.asr(0.03, 0.3, release), gate, doneAction: doneAction); + sig = Pan2.ar(sig, pan, amp); + sig = [DelayN.ar(sig[0], panDelay, (panDelay*pan).clip(0, 1)), DelayN.ar(sig[1], panDelay, (panDelay.neg*pan).clip(0, 1))]; + Out.ar(out, sig); +}).add; + +// bass drum 808 continuous +SynthDef(\qoba, {|out=0, amp=1, pan=0, t_trig=0, accent=0.5, freq=50, tone=0.5, decay=0.5, attackfm=0.5, selffm=0.25| + var sig; + sig = AnalogBassDrum.ar( + t_trig, + infsustain: 0.0, + accent: accent, + freq: freq, + tone: tone, + decay: decay, + attackfm: attackfm, + selffm: selffm, + ) * amp; + // make click in the beginning almost absent + sig = sig * Line.ar(dur: 0.01); + sig = Pan2.ar(sig, pan); + Out.ar(out, sig); +}).add; + +// bass drum single-use +SynthDef(\ruse, { | gate = 1, freq = 55, amp=1, out=0 | + var sig = AnalogBassDrum.ar( + gate, + infsustain: 1, + accent: 0.9, + freq: freq, + tone: 0.6, + decay: 0.15, + attackfm: 0.31, + selffm: 0.15, + ); + sig = sig * EnvGen.ar(Env.adsr(0.01, 0.2, 0.9, 0.25), gate, doneAction: 2); + sig = Pan2.ar(sig, 0); + Out.ar(out, sig * amp); +}).add; + +// generators + +( +~arraySynthGen = {|n=1, prefix=\testsynth, ugenFunc| + var synthNames = Array(n); + n.do{|i| + var synthName = (prefix ++ i).asSymbol; + synthNames = synthNames.add(synthName); + SynthDef(synthName, ugenFunc).add; + }; + synthNames; +}; + +// marimba-glockenspiel like synth gen +~fokyxiqaGen = {| + n=1, + prefix=\fokyxiqa, + numHarm = 13, + lowHarm = 2, + highHarm = 41, + harmMul = 1.3, + harmLen = 1.0 + | + var synthNames = Array(n); + n.do{|i| + var synthName = (prefix ++ i.asString).asSymbol; + synthNames = synthNames.add(synthName); + SynthDef(synthName, {| + freq = 440, + attack = 0.01, + release = 1.0, + distort = 0.0, + detuneMax=0.15 + amp = 1, + pan = 0, + out = 0 + | + var sig; + var partial, detune, distortMul, ampEnv; + detune = Rand(detuneMax.neg, detuneMax).midiratio; + sig = SinOsc.ar(freq * detune, 2pi.rand); + ampEnv = EnvGen.kr(Env.perc(attack, release), doneAction: 2); + sig = sig * ampEnv; + numHarm.do({ + var pfact = lowHarm.rand2(highHarm); + detune = Rand(detuneMax.neg, detuneMax).midiratio; + partial = SinOsc.ar(freq * detune * pfact, 2pi.rand); + partial = partial * EnvGen.kr( + Env.perc(attack, release), + levelScale: pfact.reciprocal * harmMul.rand, + timeScale: harmLen.rand * pfact.reciprocal, + ); + sig = sig + partial; + }); + distortMul = 1 + (distort * ampEnv); + sig = (sig * distortMul).clip(-2, 2); + sig = HPF.ar(sig, 20); + sig = LPF.ar(sig, 16000); + sig = Pan2.ar(sig, pan, amp); + Out.ar(out, sig); + }).add; + }; + synthNames; +}; + +) \ No newline at end of file diff --git a/library/midi.scd b/library/midi.scd index d2acc39..64366d4 100644 --- a/library/midi.scd +++ b/library/midi.scd @@ -1,40 +1,38 @@ ~midiup = { MIDIClient.init; MIDIIn.connectAll; -}; - -~midiup.value; -Platform.case( - \osx, { - try { - ~moutArdour1 = MIDIOut.newByName("IAC Driver", "Bus 1").latency_(s.latency); - ~moutArdour2 = MIDIOut.newByName("IAC Driver", "Bus 2").latency_(s.latency); - ~moutArdour3 = MIDIOut.newByName("IAC Driver", "Bus 3").latency_(s.latency); - ~moutArdour4 = MIDIOut.newByName("IAC Driver", "Bus 4").latency_(s.latency); - ~moutFl = MIDIOut.newByName("IAC Driver", "Bus 5").latency_(s.latency); - ~moutAbleton = MIDIOut.newByName("IAC Driver", "Bus 6").latency_(s.latency); - ~moutHydrogen = MIDIOut.newByName("IAC Driver", "Bus 7").latency_(s.latency); - ~mout8 = MIDIOut.newByName("IAC Driver", "Bus 8").latency_(s.latency); - } {|error| - "Cannot connect to macbook midi out".postln; - error.throw; - }; - }, - \linux, { }, - \windows, { } -); + Platform.case( + \osx, { + try { + ~moutArdour1 = MIDIOut.newByName("IAC Driver", "Bus 1").latency_(s.latency); + ~moutArdour2 = MIDIOut.newByName("IAC Driver", "Bus 2").latency_(s.latency); + ~moutArdour3 = MIDIOut.newByName("IAC Driver", "Bus 3").latency_(s.latency); + ~moutArdour4 = MIDIOut.newByName("IAC Driver", "Bus 4").latency_(s.latency); + ~moutFl = MIDIOut.newByName("IAC Driver", "Bus 5").latency_(s.latency); + ~moutAbleton = MIDIOut.newByName("IAC Driver", "Bus 6").latency_(s.latency); + ~moutHydrogen = MIDIOut.newByName("IAC Driver", "Bus 7").latency_(s.latency); + ~mout8 = MIDIOut.newByName("IAC Driver", "Bus 8").latency_(s.latency); + } {|error| + "Cannot connect to macbook midi out".postln; + error.throw; + }; + }, + \linux, { }, + \windows, { } + ); -m = ( - arout1: ~moutArdour1, - arout2: ~moutArdour2, - arout3: ~moutArdour3, - arout4: ~moutArdour4, - about: ~moutAbleton, - flout: ~moutFl, - hyout: ~moutHydrogen, - out8: ~mout8 -); + m = ( + arout1: ~moutArdour1, + arout2: ~moutArdour2, + arout3: ~moutArdour3, + arout4: ~moutArdour4, + about: ~moutAbleton, + flout: ~moutFl, + hyout: ~moutHydrogen, + out8: ~mout8 + ); +}; // hydrogen drum machine constants b = ( diff --git a/library/mixer.scd b/library/mixer.scd new file mode 100644 index 0000000..0f5277c --- /dev/null +++ b/library/mixer.scd @@ -0,0 +1,19 @@ +// routing and mastering + +/* masterer +~masterer = Synth(\masterer, ( + in: ~mainBus, + out: a.h, + amp: 1.0, + lookAheadTime: 0.05, +).asPairs, ~masterGroup); +*/ +SynthDef(\masterer, {arg in, out, + amp=1.0, + lookAheadTime=0.05 + ; + var sig; + sig = In.ar(in, 2) * amp; + sig = Limiter.ar(sig, level: 1.0, dur: lookAheadTime); + Out.ar(out, sig); +}).add; \ No newline at end of file diff --git a/library/synths.scd b/library/synths.scd deleted file mode 100644 index 6038aa2..0000000 --- a/library/synths.scd +++ /dev/null @@ -1,296 +0,0 @@ -// This file contains synthesisers - -// change default synthdef -// https://github.com/supercollider/supercollider/blob/23ec13a5a2610b0af3755f053611142c7faea875/SCClassLibrary/Common/Collections/Event.sc#L164 -/* -s.doWhenBooted{ - SynthDef(\default, { arg - out=0, - freq=440, - amp=0.1, - pan=0, - gate=1; - var z; - z = LPF.ar( - Mix.new(VarSaw.ar(freq + [0, Rand(-0.4,0.0), Rand(0.0,0.4)], 0, 0.3, 0.3)), - XLine.kr(Rand(4000,5000), Rand(2500,3200), 1) - ) * Linen.kr(gate, 0.01, 0.7, 0.3, 2); - OffsetOut.ar(out, Pan2.ar(z, pan, amp)); - }, [\ir]).add; -}; -*/ - -// routing and mastering - -/* masterer -~masterer = Synth(\masterer, ( - in: ~mainBus, - out: a.h, - amp: 1.0, - lookAheadTime: 0.05, -).asPairs, ~masterGroup); -*/ -SynthDef(\masterer, {arg in, out, - amp=1.0, - lookAheadTime=0.05 - ; - var sig; - sig = In.ar(in, 2) * amp; - sig = Limiter.ar(sig, level: 1.0, dur: lookAheadTime); - Out.ar(out, sig); -}).add; - -// instruments - -// fm synth -SynthDef(\bino, {| - out=0, gate=1, freq=440, modFreq=440, amp=1, release=1.0, maxIndex=1 - | - var sig, modIndex, env; - env = EnvGen.ar(Env.asr(releaseTime: release), gate, doneAction: 2); - modIndex = (1 - env) * maxIndex; - sig = PMOsc.ar(freq, modFreq, modIndex, mul: amp); - sig = sig * env; - sig = Pan2.ar(sig, Rand(-0.3, 0.3)); - Out.ar(out, sig * amp); -}).add; - -// snare drum 808 continuous -SynthDef(\buti, {|out=0, amp=1, pan=0, t_trig=0, accent=0.1, freq=200, tone=0.5, decay=0.5, snappy=0.5| - var sig; - sig = AnalogSnareDrum.ar( - t_trig, - infsustain: 0.0, - accent: accent, - freq: freq, - tone: tone, - decay: decay, - snappy: snappy, - ) * amp; - sig = Pan2.ar(sig, pan); - Out.ar(out, sig); -}).add; - -// fm-synth pulse -SynthDef(\dire, { |amp=1, out=0, freq=440, gate=1| - var sig, modFreq, env; - modFreq = SinOsc.ar(3000, mul: freq/4, add: freq); - sig = Pulse.ar(modFreq); - env = EnvGen.ar(Env.adsr(), gate, doneAction: 2); - sig = sig * env; - sig = Pan2.ar(sig, Rand(-0.5, 0.5)); - Out.ar(out, sig * amp); -}).add; - -// Subtract synth pad -SynthDef(\dyti, { - | out=0, gate=1, freq=440, amp=1, pan=0, doneAction=2, cut=800, rez=0.8, - modFreqMin=7, modFreqMax=12, modAmp=0.01, release=1.0 | - var sig = 0; - var panDelay = 0.005; - var modFreq = SinOsc.kr(Rand(modFreqMin, modFreqMax), 0, modAmp, 1); - sig = sig + Pulse.ar(freq * modFreq); - sig = RLPF.ar(sig, cut, rez); - sig = sig * EnvGen.ar(Env.asr(releaseTime: release), gate, doneAction: doneAction); - sig = Pan2.ar(sig, pan); - sig = [DelayN.ar(sig[0], panDelay, (panDelay*pan).clip(0, 1)), DelayN.ar(sig[1], panDelay, (panDelay.neg*pan).clip(0, 1))]; - Out.ar(out, sig * amp); -}).add; - -// additive sin synth, sounds like metal -SynthDef(\leto, { |freq = 440, sustain = 1, amp=1, out=0| - var sig = 0; - var num = 26; - var partial = 0; - num.do({ - var pfact = ExpRand(1, 16); - partial = SinOsc.ar(freq * pfact, Rand(0, 2pi)) / num / pfact; - partial = partial * EnvGen.kr(Env.perc(0.03, Rand(sustain/5, sustain))); - partial = Pan2.ar(partial, Rand(-0.5, 0.5)); - sig = sig + partial; - }); - sig = sig * Line.kr(1, 1, sustain+0.1, doneAction: 2); - Out.ar(out, sig*amp); -}).add; - -// round membrane drum continuous -SynthDef(\liwe, {|out=0, amp=1, pan=0, t_trig=0, tension=0.05, loss=0.99999, impact=0.1| - var sig, excitation; - excitation = EnvGen.kr(Env.perc, t_trig, timeScale: impact, doneAction: 0); - excitation = excitation * PinkNoise.ar(); - sig = MembraneCircle.ar(excitation, tension, loss, mul: amp); - sig = Pan2.ar(sig, pan); - Out.ar(out, sig); -}).add; - -// Subtract synth drum -SynthDef(\naje, { - | out=0, sustain=0.5, freq=440, amp=1, cut=800, rez=0.8, - modFreqMin=7, modFreqMax=12, modAmp=0.01 | - var sig = 0; - var modFreq = SinOsc.kr(Rand(modFreqMin, modFreqMax), 0, modAmp, 1); - sig = sig + Pulse.ar(freq * modFreq); - sig = RLPF.ar(sig, cut.lag(0.01), rez.lag(0.01)); - sig = sig * EnvGen.ar(Env.perc(0.005, releaseTime: sustain), doneAction: 2); - sig = Pan2.ar(sig, Rand(-0.3, 0.3)); - Out.ar(out, sig * amp); -}).add; - -// fibonacci organ -SynthDef.new(\neta, { arg freq = 440, amp = 1.0, gate = 1, out = 0; - var shape = Env.adsr(0.1, 0.2, 0.7, 0.5, 1.0, -4.0, 0); - var fb = 1.0; - var ss = SinOscFB.ar(freq, fb, amp) - + SinOscFB.ar(freq*2, fb, amp/2) - + SinOscFB.ar(freq*3, fb, amp/3) - + SinOscFB.ar(freq*5, fb, amp/5) - + SinOscFB.ar(freq*8, fb, amp/8) - + SinOscFB.ar(freq*13, fb, amp/13) - + SinOscFB.ar(freq*21, fb, amp/21) - + SinOscFB.ar(freq*34, fb, amp/34) - + SinOscFB.ar(freq*55, fb, amp/55) - ; - ss = [ss, DelayC.ar(ss, 0.005, 0.005)]; - ss = ss * 0.7; - ss = BLowPass4.ar(ss, Rand(1060, 1260)); - Out.ar(out, EnvGen.kr(shape, gate, doneAction: 2) * ss); -}).add; - -// additive pulse synth -SynthDef(\pope, {|out=0, gate=1, freq=440, release=1.8, amp=1, pan=0, doneAction=2| - var sig = 0; - var num = 30; - var panDelay = 0.005; - num.do({ - sig = sig + (LFPulse.ar(freq, Rand(0, 0.01), SinOsc.kr(SinOsc.kr(Rand(2, 8), 0, 2, 2), Rand(0, 2pi), 0.5, 0.5)) / num); - }); - sig = sig * EnvGen.kr(Env.asr(0.03, 0.3, release), gate, doneAction: doneAction); - sig = Pan2.ar(sig, pan, amp); - sig = [DelayN.ar(sig[0], panDelay, (panDelay*pan).clip(0, 1)), DelayN.ar(sig[1], panDelay, (panDelay.neg*pan).clip(0, 1))]; - Out.ar(out, sig); -}).add; - -// bass drum 808 continuous -SynthDef(\qoba, {|out=0, amp=1, pan=0, t_trig=0, accent=0.5, freq=50, tone=0.5, decay=0.5, attackfm=0.5, selffm=0.25| - var sig; - sig = AnalogBassDrum.ar( - t_trig, - infsustain: 0.0, - accent: accent, - freq: freq, - tone: tone, - decay: decay, - attackfm: attackfm, - selffm: selffm, - ) * amp; - // make click in the beginning almost absent - sig = sig * Line.ar(dur: 0.01); - sig = Pan2.ar(sig, pan); - Out.ar(out, sig); -}).add; - -// bass drum single-use -SynthDef(\ruse, { | gate = 1, freq = 55, amp=1, out=0 | - var sig = AnalogBassDrum.ar( - gate, - infsustain: 1, - accent: 0.9, - freq: freq, - tone: 0.6, - decay: 0.15, - attackfm: 0.31, - selffm: 0.15, - ); - sig = sig * EnvGen.ar(Env.adsr(0.01, 0.2, 0.9, 0.25), gate, doneAction: 2); - sig = Pan2.ar(sig, 0); - Out.ar(out, sig * amp); -}).add; - -// reverbs - -// JPverb with all parameters and mix -SynthDef(\qahe, {|in, out=0, mix=0, t60=1.0, damp=0.0, size=1.0, earlyDiff=0.707, modDepth=0.1, modFreq=2.0, low=1.0, - mid=1.0, high=1.0, lowcut=500.0, highcut=2000.0| - var sig, rev; - sig = In.ar(in, 2); - rev = JPverb.ar(sig, - t60: t60, - damp: damp, - size: size, - earlyDiff: earlyDiff, - modDepth: modDepth, - modFreq: modFreq, - low: low, - mid: mid, - high: high, - lowcut: lowcut, - highcut: highcut); - Out.ar(out, sig + (mix * rev)); -}).add; - -// generators - -( -~arraySynthGen = {|n=1, prefix=\testsynth, ugenFunc| - var synthNames = Array(n); - n.do{|i| - var synthName = (prefix ++ i).asSymbol; - synthNames = synthNames.add(synthName); - SynthDef(synthName, ugenFunc).add; - }; - synthNames; -}; - -// marimba-glockenspiel like synth gen -~fokyxiqaGen = {| - n=1, - prefix=\fokyxiqa, - numHarm = 13, - lowHarm = 2, - highHarm = 41, - harmMul = 1.3, - harmLen = 1.0 - | - var synthNames = Array(n); - n.do{|i| - var synthName = (prefix ++ i.asString).asSymbol; - synthNames = synthNames.add(synthName); - SynthDef(synthName, {| - freq = 440, - attack = 0.01, - release = 1.0, - distort = 0.0, - detuneMax=0.15 - amp = 1, - pan = 0, - out = 0 - | - var sig; - var partial, detune, distortMul, ampEnv; - detune = Rand(detuneMax.neg, detuneMax).midiratio; - sig = SinOsc.ar(freq * detune, 2pi.rand); - ampEnv = EnvGen.kr(Env.perc(attack, release), doneAction: 2); - sig = sig * ampEnv; - numHarm.do({ - var pfact = lowHarm.rand2(highHarm); - detune = Rand(detuneMax.neg, detuneMax).midiratio; - partial = SinOsc.ar(freq * detune * pfact, 2pi.rand); - partial = partial * EnvGen.kr( - Env.perc(attack, release), - levelScale: pfact.reciprocal * harmMul.rand, - timeScale: harmLen.rand * pfact.reciprocal, - ); - sig = sig + partial; - }); - distortMul = 1 + (distort * ampEnv); - sig = (sig * distortMul).clip(-2, 2); - sig = HPF.ar(sig, 20); - sig = LPF.ar(sig, 16000); - sig = Pan2.ar(sig, pan, amp); - Out.ar(out, sig); - }).add; - }; - synthNames; -}; - -) \ No newline at end of file diff --git a/startup.scd b/startup.scd index 7552f31..aa898d1 100644 --- a/startup.scd +++ b/startup.scd @@ -31,7 +31,9 @@ c = ( "./library/superclean.scd".loadRelative; // synths -"./library/synths.scd".loadRelative; +"./library/mixer.scd".loadRelative; +"./library/instruments.scd".loadRelative; +"./library/effects.scd".loadRelative; // recording