diff --git a/FoxDot/lib/Effects/NewEffects.py b/FoxDot/lib/Effects/NewEffects.py index 6d2a1c04..19bf0378 100644 --- a/FoxDot/lib/Effects/NewEffects.py +++ b/FoxDot/lib/Effects/NewEffects.py @@ -3,7 +3,7 @@ from ..SCLang.SCLang import * -# To be moved to SCLang later +# To be added to SCLang later EnvGen = cls("EnvGen") Env = cls("Env") @@ -31,7 +31,7 @@ def In(self): """ Returns 'osc', which is where In.ar() is stored """ return self._in - def Out(self, output): + def Out(self, output=None): """ Writes to file and loads synthdef """ print(";\n".join(self.lines)) self.lines = [] diff --git a/FoxDot/lib/SCLang/Env.py b/FoxDot/lib/SCLang/Env.py index 3e24fdf1..6db4cc38 100644 --- a/FoxDot/lib/SCLang/Env.py +++ b/FoxDot/lib/SCLang/Env.py @@ -32,6 +32,13 @@ def __init__(self, sus=None, amp=None, curve="'lin'", doneAction=0): self.attr['curve'] = curve self.doneAction = doneAction +class hold(EnvGen): + def __init__(self, duration, doneAction=0): + self.duration = duration + self.doneAction = doneAction + def __str__(self): + return "EnvGen.kr(Env.new([1, 0], [{}], \\hold), doneAction={})".format(self.duration, self.doneAction) + class perc(EnvGen): value = "Env.perc" def __init__(self, atk=0.01, sus=None, amp=None, curve=0, doneAction=0): diff --git a/FoxDot/lib/SCLang/SCLang.py b/FoxDot/lib/SCLang/SCLang.py index cae16a1b..8e6940f7 100644 --- a/FoxDot/lib/SCLang/SCLang.py +++ b/FoxDot/lib/SCLang/SCLang.py @@ -111,35 +111,37 @@ def __call__(self, *args, **kwargs): return self.__class__(value) + # UGens -SinOsc = cls("SinOsc") -SinOscFB = cls("SinOscFB") -Saw = cls("Saw") -LFSaw = cls("LFSaw") -VarSaw = cls("VarSaw") -LFTri = cls("LFTri") -LFPar = cls("LFPar") -PlayBuf = cls("PlayBuf") -LFNoise0 = cls("LFNoise0") -LFNoise1 = cls("LFNoise1") -LFNoise2 = cls("LFNoise2") -Gendy1 = cls("Gendy1") -Gendy2 = cls("Gendy2") -Gendy3 = cls("Gendy3") -Gendy4 = cls("Gendy4") -Gendy5 = cls("Gendy5") -Formant = cls("Formant") -Pulse = cls("Pulse") -LFPulse = cls("LFPulse") -PMOsc = cls("PMOsc") -Crackle = cls("Crackle") -LFCub = cls("LFCub") -PinkNoise = cls("PinkNoise") -Impulse = cls("Impulse") -Blip = cls("Blip") -Klank = cls("Klank", ref="`") -Resonz = cls("Resonz") +SinOsc = cls("SinOsc") +SinOscFB = cls("SinOscFB") +Saw = cls("Saw") +LFSaw = cls("LFSaw") +VarSaw = cls("VarSaw") +LFTri = cls("LFTri") +LFPar = cls("LFPar") +PlayBuf = cls("PlayBuf") +LFNoise0 = cls("LFNoise0") +LFNoise1 = cls("LFNoise1") +LFNoise2 = cls("LFNoise2") +Gendy1 = cls("Gendy1") +Gendy2 = cls("Gendy2") +Gendy3 = cls("Gendy3") +Gendy4 = cls("Gendy4") +Gendy5 = cls("Gendy5") +Formant = cls("Formant") +Pulse = cls("Pulse") +LFPulse = cls("LFPulse") +PMOsc = cls("PMOsc") +Crackle = cls("Crackle") +LFCub = cls("LFCub") +PinkNoise = cls("PinkNoise") +WhiteNoise = cls("WhiteNoise") +Impulse = cls("Impulse") +Blip = cls("Blip") +Klank = cls("Klank", ref="`") +Resonz = cls("Resonz") # Other diff --git a/FoxDot/lib/SCLang/SynthDef.py b/FoxDot/lib/SCLang/SynthDef.py index e343c248..ada67f0b 100644 --- a/FoxDot/lib/SCLang/SynthDef.py +++ b/FoxDot/lib/SCLang/SynthDef.py @@ -12,21 +12,24 @@ class SynthDict(dict): module = None server = None def __init__(self, **kwargs): - dict.__init__(self, kwargs) + super().__init__(kwargs) + def __str__(self): return str(list(self.keys())) + def __repr__(self): return str(list(self.keys())) + def __call__(self, name): return self[name] + def reload(self): - for key, item in self.items(): + for item in self.values(): item.load() - return + def set_server(self, serv): self.server = serv self.server.synthdefs = self - return # Create container for SynthDefs @@ -299,7 +302,7 @@ def preprocess_osc(self, osc_message): class SynthDef(SynthDefBaseClass): def __init__(self, *args, **kwargs): - SynthDefBaseClass.__init__(self, *args, **kwargs) + super().__init__(*args, **kwargs) # add vib depth? def add_base_class_behaviour(self): @@ -311,7 +314,7 @@ def add_base_class_behaviour(self): class SampleSynthDef(SynthDefBaseClass): def __init__(self, *args, **kwargs): - SynthDefBaseClass.__init__(self, *args, **kwargs) + super().__init__(*args, **kwargs) self.buf = self.new_attr_instance("buf") self.pos = self.new_attr_instance("pos") self.defaults['buf'] = 0 diff --git a/FoxDot/lib/SCLang/_SynthDefs.py b/FoxDot/lib/SCLang/_SynthDefs.py index a43563a9..7a013bd8 100644 --- a/FoxDot/lib/SCLang/_SynthDefs.py +++ b/FoxDot/lib/SCLang/_SynthDefs.py @@ -36,27 +36,24 @@ noise.osc = LFNoise0.ar(noise.freq, noise.amp) noise.env = Env.perc() -with SynthDef("dab") as synth: - a = HPF.ar(Saw.ar(synth.freq / 4, mul=synth.amp / 2), 2000) - b = VarSaw.ar(synth.freq / 4, mul=synth.amp, width=Env.perc(synth.sus / 20, synth.sus / 4, 0.5, -5, doneAction=0)) - synth.osc = a + b - synth.env = Env.env(sus=[Env.sus * 0.25, Env.sus * 1], curve="'lin'") -dab = synth -del a -del b - -with SynthDef("varsaw") as synth: - synth.freq = synth.freq * [1, 1.005] - synth.osc = VarSaw.ar(synth.freq, mul=synth.amp / 4, width=synth.rate) - synth.env = Env.env() -varsaw = synth - -with SynthDef("lazer") as synth: - synth.freq = synth.freq * [1, 1.005] - synth.amp = synth.amp * 0.1 - synth.osc = VarSaw.ar(synth.freq, width=(synth.rate-1)/4) + LFSaw.ar(LFNoise0.ar(synth.rate * 20, add=synth.freq * Pulse.ar((synth.rate-2) + 0.1, add=1), mul=0.5)) - synth.env = Env.perc(0.1) -lazer = synth +with SynthDef("dab") as dab: + a = HPF.ar(Saw.ar(dab.freq / 4, mul=dab.amp / 2), 2000) + b = VarSaw.ar(dab.freq / 4, mul=dab.amp, width=Env.perc(dab.sus / 20, dab.sus / 4, 0.5, -5, doneAction=0)) + dab.osc = a + b + dab.env = Env.env(sus=[Env.sus * 0.25, Env.sus * 1], curve="'lin'") + del a + del b + +with SynthDef("varsaw") as varsaw: + varsaw.freq = varsaw.freq * [1, 1.005] + varsaw.osc = VarSaw.ar(varsaw.freq, mul=varsaw.amp / 4, width=varsaw.rate) + varsaw.env = Env.env() + +with SynthDef("lazer") as lazer: + lazer.freq = lazer.freq * [1, 1.005] + lazer.amp = lazer.amp * 0.1 + lazer.osc = VarSaw.ar(lazer.freq, width=(lazer.rate-1)/4) + LFSaw.ar(LFNoise0.ar(lazer.rate * 20, add=lazer.freq * Pulse.ar((lazer.rate-2) + 0.1, add=1), mul=0.5)) + lazer.env = Env.perc(0.1) with SynthDef("growl") as growl: growl.sus = growl.sus * 1.5 @@ -219,140 +216,122 @@ # No context manager SynthDef creation -orient = SynthDef("orient") -orient.defaults.update(room=10, verb=0.7) -orient.osc = LFPulse.ar(orient.freq, 0.5, 0.25, 1/4) + LFPulse.ar(orient.freq, 1, 0.1, 1/4) -orient.env = Env.perc() -orient.add() - -zap = SynthDef("zap") -zap.defaults.update(room=0, verb=0) -zap.amp = zap.amp / 10 -zap.osc = Saw.ar( zap.freq * [1, 1.01] + LFNoise2.ar(50).range(-2,2) ) + VarSaw.ar( zap.freq + LFNoise2.ar(50).range(-2,2), 1 ) -zap.env = Env.perc(atk=0.025, curve=-10) -zap.add() - -marimba = SynthDef("marimba") -marimba.osc = Klank.ar([[1/2, 1, 4, 9], [1/2,1,1,1], [1,1,1,1]], PinkNoise.ar([0.007, 0.007]), marimba.freq, [0,2]) -marimba.sus = 1 -marimba.env = Env.perc(atk=0.001, curve=-6) -marimba.add() - -fuzz = SynthDef("fuzz") -fuzz.freq = fuzz.freq / 2 -fuzz.amp = fuzz.amp / 6 -fuzz.osc = LFSaw.ar(LFSaw.kr(fuzz.freq,0,fuzz.freq,fuzz.freq * 2)) -fuzz.env = Env.ramp(amp=[1,1,0.01], sus=[fuzz.sus * 0.8, 0.01]) -fuzz.add() - -bug = SynthDef("bug") -bug.defaults.update(rate=1) -bug.amp = bug.amp / 5 -bug.freq = bug.freq * [1, 1.0001] -bug.osc = Pulse.ar(bug.freq, width=[0.09,0.16,0.25]) * SinOsc.ar(bug.rate * 4) -bug.env = Env.perc(bug.sus * 1.5) -bug.add() - -pulse = SynthDef("pulse") -pulse.amp = pulse.amp / 8 -pulse.osc = Pulse.ar(pulse.freq) -pulse.osc = pulse.osc * pulse.amp -pulse.env = Env.mask() -pulse.add() - -saw = SynthDef("saw") -saw.amp = saw.amp / 8 -saw.osc = Saw.ar(saw.freq) -saw.osc = saw.osc * saw.amp -saw.env = Env.mask() -saw.add() - -snick = SynthDef("snick") -snick.osc = LFPar.ar(snick.freq, mul=1) * Blip.ar(((snick.rate+1) * 4)) -snick.env = Env.perc() -snick.add() - -twang = SynthDef("twang") -twang.freq = twang.freq / 8 -twang.freq = twang.freq + [0, 2] -twang.osc = LPF.ar(Impulse.ar(twang.freq, 0.1), 4000) -twang.osc = Env.perc() * CombL.ar(twang.osc, delaytime=twang.rate/(twang.freq * 8), maxdelaytime=0.25); -twang.add() - -karp = SynthDef("karp") -karp.amp = karp.amp * 0.75 -karp.osc = LFNoise0.ar(400 + (400 * karp.rate), karp.amp) -karp.osc = karp.osc * XLine.ar(1, 0.000001, karp.sus * 0.1) -karp.freq = (265 / (karp.freq * 0.666)) * 0.005 -karp.osc = CombL.ar(karp.osc, delaytime=karp.freq, maxdelaytime=2) -karp.env = Env.ramp() -karp.add() - -arpy = SynthDef("arpy") -arpy.freq = arpy.freq / 2 -arpy.amp = arpy.amp * 2 -arpy.freq = arpy.freq + [0,0.5] -arpy.osc = LPF.ar(Impulse.ar(arpy.freq), 3000) -arpy.env = Env.perc(sus=arpy.sus * 0.25) -arpy.add() - -nylon = SynthDef("nylon") -nylon.osc = LFPulse.ar(nylon.freq, 0.5, 0.33 * nylon.rate, 0.25) + LFPar.ar(nylon.freq + 0.5, 1, 0.1, 0.25) -nylon.env = Env.perc(curve=-4, atk=0.000125, sus=Env.sus * 3) -nylon.add() - -donk = SynthDef("donk") -donk.freq = (donk.freq / 2) + [0,2] -donk.amp = donk.amp / 1.25 -donk.osc = Ringz.ar(Impulse.ar(0, phase=donk.rate) / (donk.rate+1), donk.freq, donk.sus, donk.amp) -donk.add() - -squish = SynthDef("squish") -squish.freq = squish.freq / 4 -squish.osc = Ringz.ar(Pulse.ar(4 * squish.rate), squish.freq, squish.sus, squish.amp) -squish.osc = squish.osc * XLine.ar(1/2, 0.000001, squish.sus, doneAction=2) -squish.osc = squish.osc.cos -squish.amp = squish.amp * 4 -squish.add() - -swell = SynthDef("swell") -swell.defaults.update(rate=1) -swell.amp = swell.amp / 4 -swell.freq = swell.freq + [0,1] -swell.freq = swell.freq * [1, 0.5] -swell.osc = VarSaw.ar(swell.freq, width=SinOsc.ar(swell.rate / (2 * swell.sus / 1.25), add=0.5, mul=[0.5,0.5]), mul=[1,0.5]) -swell.env = Env.perc() -swell.add() +with SynthDef("orient") as orient: + orient.defaults.update(room=10, verb=0.7) + orient.osc = LFPulse.ar(orient.freq, 0.5, 0.25, 1/4) + LFPulse.ar(orient.freq, 1, 0.1, 1/4) + orient.env = Env.perc() + +with SynthDef("zap") as zap: + zap.defaults.update(room=0, verb=0) + zap.amp = zap.amp / 10 + zap.osc = Saw.ar( zap.freq * [1, 1.01] + LFNoise2.ar(50).range(-2,2) ) + VarSaw.ar( zap.freq + LFNoise2.ar(50).range(-2,2), 1 ) + zap.env = Env.perc(atk=0.025, curve=-10) + +with SynthDef("marimba") as marimba: + marimba.osc = Klank.ar([[1/2, 1, 4, 9], [1/2,1,1,1], [1,1,1,1]], PinkNoise.ar([0.007, 0.007]), marimba.freq, [0,2]) + marimba.sus = 1 + marimba.env = Env.perc(atk=0.001, curve=-6) + +with SynthDef("fuzz") as fuzz: + fuzz.freq = fuzz.freq / 2 + fuzz.amp = fuzz.amp / 6 + fuzz.osc = LFSaw.ar(LFSaw.kr(fuzz.freq,0,fuzz.freq,fuzz.freq * 2)) + fuzz.env = Env.ramp(amp=[1,1,0.01], sus=[fuzz.sus * 0.8, 0.01]) + +with SynthDef("bug") as bug: + bug.defaults.update(rate=1) + bug.amp = bug.amp / 5 + bug.freq = bug.freq * [1, 1.0001] + bug.osc = Pulse.ar(bug.freq, width=[0.09,0.16,0.25]) * SinOsc.ar(bug.rate * 4) + bug.env = Env.perc(bug.sus * 1.5) + +with SynthDef("pulse") as pulse: + pulse.amp = pulse.amp / 8 + pulse.osc = Pulse.ar(pulse.freq) + pulse.osc = pulse.osc * pulse.amp + pulse.env = Env.mask() + +with SynthDef("saw") as saw: + saw.amp = saw.amp / 8 + saw.osc = Saw.ar(saw.freq) + saw.osc = saw.osc * saw.amp + saw.env = Env.mask() + +with SynthDef("snick") as snick: + snick.osc = LFPar.ar(snick.freq, mul=1) * Blip.ar(((snick.rate+1) * 4)) + snick.env = Env.perc() + +with SynthDef("twang") as twang: + twang.freq = twang.freq / 8 + twang.freq = twang.freq + [0, 2] + twang.osc = LPF.ar(Impulse.ar(twang.freq, 0.1), 4000) + twang.osc = Env.perc() * CombL.ar(twang.osc, delaytime=twang.rate/(twang.freq * 8), maxdelaytime=0.25) + +with SynthDef("karp") as karp: + karp.amp = karp.amp * 0.75 + karp.osc = LFNoise0.ar(400 + (400 * karp.rate), karp.amp) + karp.osc = karp.osc * XLine.ar(1, 0.000001, karp.sus * 0.1) + karp.freq = (265 / (karp.freq * 0.666)) * 0.005 + karp.osc = CombL.ar(karp.osc, delaytime=karp.freq, maxdelaytime=2) + karp.env = Env.ramp() + +with SynthDef("arpy") as arpy: + arpy.freq = arpy.freq / 2 + arpy.amp = arpy.amp * 2 + arpy.freq = arpy.freq + [0,0.5] + arpy.osc = LPF.ar(Impulse.ar(arpy.freq), 3000) + arpy.env = Env.perc(sus=arpy.sus * 0.25) + +with SynthDef("nylon") as nylon: + nylon.osc = LFPulse.ar(nylon.freq, 0.5, 0.33 * nylon.rate, 0.25) + LFPar.ar(nylon.freq + 0.5, 1, 0.1, 0.25) + nylon.env = Env.perc(curve=-4, atk=0.000125, sus=Env.sus * 3) + +with SynthDef("donk") as donk: + donk.freq = (donk.freq / 2) + [0,2] + donk.amp = donk.amp / 1.25 + donk.osc = Ringz.ar(Impulse.ar(0, phase=donk.rate) / (donk.rate+1), donk.freq, donk.sus, donk.amp) + +with SynthDef("squish") as squish: + squish.freq = squish.freq / 4 + squish.osc = Ringz.ar(Pulse.ar(4 * squish.rate), squish.freq, squish.sus, squish.amp) + squish.osc = squish.osc * XLine.ar(1/2, 0.000001, squish.sus, doneAction=2) + squish.osc = squish.osc.cos + squish.amp = squish.amp * 4 + +with SynthDef("swell") as swell: + swell.defaults.update(rate=1) + swell.amp = swell.amp / 4 + swell.freq = swell.freq + [0,1] + swell.freq = swell.freq * [1, 0.5] + swell.osc = VarSaw.ar(swell.freq, width=SinOsc.ar(swell.rate / (2 * swell.sus / 1.25), add=0.5, mul=[0.5,0.5]), mul=[1,0.5]) + swell.env = Env.perc() # Credit to Thor Magnusson for brass -razz = SynthDef("razz") -razz.defaults.update(rate=0.3) -razz.freq = razz.freq + [0,1] -razz.rate = Lag.ar(K2A.ar(razz.freq), razz.rate) -razz.osc = Saw.ar(razz.rate * [1,1/2], [1,1/3]) + Saw.ar(razz.rate+LFNoise2.ar(4).range(0.5, 2.5), 1) -razz.osc = BPF.ar(razz.osc, razz.freq * 2.5, 0.3) -razz.osc = RLPF.ar(razz.osc, 1300, 0.78) -razz.env = Env.perc(atk=0.125) -razz.add() - -sitar = SynthDef("sitar") -sitar.amp = sitar.amp * 0.75 -sitar.sus = sitar.sus * 4 -sitar.osc = LFNoise0.ar([8400, 8500], sitar.amp) -sitar.osc = sitar.osc * XLine.ar(1, 0.000001, sitar.sus * 0.1) -sitar.freq = (265 / (sitar.freq * [0.666, 0.669])) * 0.005 -sitar.osc = CombL.ar(sitar.osc, delaytime=sitar.freq, maxdelaytime=2) -sitar.env = Env.ramp() -sitar.add() - -with SynthDef("star") as synth: +with SynthDef("razz") as razz: + razz.defaults.update(rate=0.3) + razz.freq = razz.freq + [0,1] + razz.rate = Lag.ar(K2A.ar(razz.freq), razz.rate) + razz.osc = Saw.ar(razz.rate * [1,1/2], [1,1/3]) + Saw.ar(razz.rate+LFNoise2.ar(4).range(0.5, 2.5), 1) + razz.osc = BPF.ar(razz.osc, razz.freq * 2.5, 0.3) + razz.osc = RLPF.ar(razz.osc, 1300, 0.78) + razz.env = Env.perc(atk=0.125) + +with SynthDef("sitar") as sitar: + sitar.amp = sitar.amp * 0.75 + sitar.sus = sitar.sus * 4 + sitar.osc = LFNoise0.ar([8400, 8500], sitar.amp) + sitar.osc = sitar.osc * XLine.ar(1, 0.000001, sitar.sus * 0.1) + sitar.freq = (265 / (sitar.freq * [0.666, 0.669])) * 0.005 + sitar.osc = CombL.ar(sitar.osc, delaytime=sitar.freq, maxdelaytime=2) + sitar.env = Env.ramp() + +with SynthDef("star") as star: freq = instance('freq') - synth.amp = (synth.amp * 2)+ 0.00001 - synth.freq = synth.freq / 2 - synth.osc = LFSaw.ar(freq * 1.002, iphase=VarSaw.kr(freq, width=Line.kr(1,0.2,synth.sus))) * 0.3 + LFSaw.ar(freq + LFNoise2.ar(50).range(-2,2) + 2, iphase=VarSaw.kr(freq + 2, width=Line.kr(1,0.2,synth.sus))) * 0.3 - synth.osc = synth.osc * XLine.ar(synth.amp, synth.amp/10000, synth.sus * 3, doneAction=2) * Line.ar(0.01, 0.5, 0.07) -star = synth + star.amp = (star.amp * 2)+ 0.00001 + star.freq = star.freq / 2 + star.osc = LFSaw.ar(freq * 1.002, iphase=VarSaw.kr(freq, width=Line.kr(1,0.2,star.sus))) * 0.3 + LFSaw.ar(freq + LFNoise2.ar(50).range(-2,2) + 2, iphase=VarSaw.kr(freq + 2, width=Line.kr(1,0.2,star.sus))) * 0.3 + star.osc = star.osc * XLine.ar(star.amp, star.amp/10000, star.sus * 3, doneAction=2) * Line.ar(0.01, 0.5, 0.07) with SynthDef("jbass") as jbass: jbass.freq = jbass.freq / 4 @@ -360,6 +339,10 @@ jbass.osc = LFTri.ar(jbass.freq, mul=jbass.amp) jbass.adsr(atk=0.01, decay=0.01, rel=0.01) +with SynthDef("whitenoise") as whitenoise: + whitenoise.env = Env.hold(whitenoise.sus, doneAction=2) + whitenoise.osc = BPF.ar(WhiteNoise.ar(whitenoise.amp), whitenoise.freq) + # Possible future syntax? # ----------------------- # @SynthDef @@ -403,7 +386,3 @@ sinepad = FileSynthDef("sinepad") sinepad.add() - -# Get rid of the variable synth - -del synth diff --git a/FoxDot/osc/scsyndef/whitenoise.scd b/FoxDot/osc/scsyndef/whitenoise.scd new file mode 100644 index 00000000..c26f91d8 --- /dev/null +++ b/FoxDot/osc/scsyndef/whitenoise.scd @@ -0,0 +1,12 @@ +SynthDef.new(\whitenoise, +{|amp=1, sus=1, pan=0, freq=0, vib=0, fmod=0, rate=0, bus=0, blur=1, beat_dur=1, atk=0.01, decay=0.01, rel=0.01, peak=1, level=0.8| +var osc, env; +sus = sus * blur; +freq = In.kr(bus, 1); +freq = [freq, freq+fmod]; +env=EnvGen.kr(Env.new([1, 0], [sus], \hold), doneAction=2); +osc=BPF.ar(WhiteNoise.ar(amp), freq); +osc=(osc * env); +osc = Mix(osc) * 0.5; +osc = Pan2.ar(osc, pan); + ReplaceOut.ar(bus, osc)}).add; diff --git a/changelog b/changelog index 14524f39..844e4bfc 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,10 @@ +### In development + +- Added `whitenoise` synth: +```python +wn >> whitenoise([0, 10, 20], sus=1/2) +``` + ### 0.8.* - Added `stretch` synth for timestretching samples, similar to `loop` but better and only plays the whole file. Stretches the audio's duration to the `sus` attribute without affecting pitch and does not require the tempo to be known.