diff --git a/spectral_generative.scd b/spectral_generative.scd new file mode 100644 index 0000000..d32e0c1 --- /dev/null +++ b/spectral_generative.scd @@ -0,0 +1,264 @@ +// Load buffer first +b = Buffer.read(s, "/Users/lcoogan/snd/samples/scarlett/listen to my voice.wav"); +b = Buffer.read(s, "/Users/lcoogan/snd/samples/scarlett/vocal backing.wav"); +b = Buffer.read(s, "/Users/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/acheinu.wav"); + +b = Buffer.read(s, "/Users/lcoogan/Music/Musicians/My Bloody Valentine/Loveless/05 When You Sleep.opus"); + + +b = Buffer.read(s,"/Users/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/lead.const.wav"); + +b = Buffer.read(s, "/Users/lcoogan/snd/releases/desolation-mountain/demos/boc.mp3"); +b = Buffer.read(s, "/Users/lcoogan/snd/releases/desolation-mountain/demos/room-02.wav"); +b.free; + +// ============================ +// SynthDefs (Generative / Self-contained) +// ============================ + +( +// PV_BrickWall + PV_RectComb +SynthDef(\pv_brickwall, { |amp = 0.5| + var sig = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1); + var chain = FFT(LocalBuf(2048), sig); + + var mod1 = LFNoise1.kr(0.05).range(5, 40); + var mod2 = LFNoise1.kr(0.1).range(0.01, 0.3); + var mod3 = LFNoise1.kr(0.07).range(1, 10); + var mod4 = LFNoise1.kr(0.05).range(0.1, 0.8); + var mod5 = LFNoise1.kr(0.03).range(0.01, 0.4); + + chain = PV_BrickWall(chain, SinOsc.ar(mod1) + SinOsc.kr(mod2)); + chain = PV_RectComb(chain, mod3, mod4, mod5); + sig = IFFT(chain.dup); + Out.ar(0, sig * amp); +}).add; + +// PV_RectComb only +SynthDef(\pv_rectcomb, { |amp = 0.5| + var sig = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1); + var chain = FFT(LocalBuf(2048), sig); + + var mod1 = LFNoise1.kr(0.08).range(2, 12); + var mod2 = LFNoise1.kr(0.07).range(0.05, 0.6); + var mod3 = LFNoise1.kr(0.05).range(0.1, 0.5); + + chain = PV_RectComb(chain, mod1, mod2, mod3); + Out.ar(0, IFFT(chain).dup * amp); +}).add; + +// PV_MagSmear only +SynthDef(\pv_magsmear, { |amp = 0.5| + var sig = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1); + var chain = FFT(LocalBuf(1024), sig); + var smearAmt = LFNoise2.kr(0.1).range(5, 50); + + chain = PV_MagSmear(chain, smearAmt); + Out.ar(0, IFFT(chain).dup * amp); +}).add; + +// PV_Freeze +SynthDef(\pv_freeze, { |amp = 0.5| + var sig = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1); + var chain = FFT(LocalBuf(1024), sig); + var freezeTrig = LFNoise0.kr(0.05).range(0.05, 1.0); + + chain = PV_Freeze(chain, SinOsc.kr(freezeTrig) > 0.5); + Out.ar(0, IFFT(chain).dup * amp); +}).add; + +// PV_MagGate + PV_MagShift +SynthDef(\pv_maggate, { |amp = 0.5| + var sig = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1); + var chain = FFT(LocalBuf(1024), sig); + + var thresh = LFNoise1.kr(0.09).range(20, 80); + var floor = LFNoise1.kr(0.07).range(0.2, 1.0); + var shift = LFNoise1.kr(0.04).range(-0.4, 0.4); + + chain = PV_MagGate(chain, thresh, floor); + chain = PV_MagShift(chain, 1, shift); + + Out.ar(0, IFFT(chain).dup * amp); +}).add; +) + +// ============================ +// Spawn Generative Instances +// ============================ + +( +Synth(\pv_brickwall); +Synth(\pv_rectcomb); +// Synth(\pv_magsmear); +// Synth(\pv_freeze); +) + + + +// ============================ +// Generative Patterns for Parameters +// ============================ + +// Pattern for randomly varying synth parameters over time +( +Pbind( + \instrument, \pv_brickwall, // Choose SynthDef + \amp, Pwhite(0.2, 0.8, inf), // Random amplitude (0.2 to 0.8) + \mod1, Pwhite(5, 40, inf), // Random mod1 value (5 to 40) + \mod2, Pwhite(0.01, 0.3, inf), // Random mod2 value (0.01 to 0.3) + \mod3, Pwhite(1, 10, inf), // Random mod3 value (1 to 10) + \mod4, Pwhite(0.1, 0.8, inf), // Random mod4 value (0.1 to 0.8) + \mod5, Pwhite(0.01, 0.4, inf), // Random mod5 value (0.01 to 0.4) + \dur, Pseq([2, 4, 1, 3], inf) // Sequence of durations +).play; +) + +// You can create a similar pattern for other synths: + +// Pattern for PV_RectComb +( +Pbind( + \instrument, \pv_rectcomb, + \amp, Pwhite(0.3, 0.7, inf), + \mod1, Pwhite(2, 12, inf), + \mod2, Pwhite(0.05, 0.6, inf), + \mod3, Pwhite(0.1, 0.5, inf), + \dur, Pseq([3, 1, 2], inf) +).play; +) + +// Pattern for PV_MagSmear +( +Pbind( + \instrument, \pv_magsmear, + \amp, Pwhite(0.2, 0.5, inf), + \mod1, Pwhite(5, 50, inf), + \dur, Pseq([4, 6, 2], inf) +).play; +) + + +( +Routine({ + loop { + // Random parameter values + var mod1 = Pwhite(5, 40).next; // Random mod1 value (5 to 40) + var mod2 = Pwhite(0.01, 0.3).next; // Random mod2 value (0.01 to 0.3) + var mod3 = Pwhite(1, 10).next; // Random mod3 value (1 to 10) + var mod4 = Pwhite(0.1, 0.8).next; // Random mod4 value (0.1 to 0.8) + var mod5 = Pwhite(0.01, 0.4).next; // Random mod5 value (0.01 to 0.4) + var dur = Pseq([2, 4, 1, 3], inf).next; // Duration pattern + + // Create synth + Synth(\pv_rectcomb, [ + \amp, 0.5, + \mod1, mod1, + \mod2, mod2, + \mod3, mod3, + \mod4, mod4, + \mod5, mod5 + ]); + + // Wait for the duration + 1.wait; // Wait 1 second before the next iteration + } +}).play; +) + +( +SynthDef(\pv_brickwall, { |amp = 0.5| + var sig = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1); + var chain = FFT(LocalBuf(2048), sig); + chain = PV_BrickWall(chain, SinOsc.ar(5) + SinOsc.kr(0.1)); + sig = IFFT(chain.dup); + Out.ar(0, sig * amp); +}).add; +) + + + +( +SynthDef(\pv_distorted_bass, { |amp = 0.5| + var sig = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1); + var chain = FFT(LocalBuf(2048), sig); + chain = PV_BrickWall(chain, SinOsc.ar(5) + SinOsc.kr(0.1)); + chain = PV_Mul(chain, SinOsc.kr(0.5, 0, 0.1)); // Adding more randomness + chain = PV_BrickWall(chain, SinOsc.kr(0.3, 0, 0.2)); // Distortion Layer + sig = IFFT(chain.dup); + Out.ar(0, sig * amp); +}).add; +) + +( +// PV_BrickWall + PV_RectComb with evolving complexity +SynthDef(\pv_brickwall, { |amp = 0.5| + var sig = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1); + var chain = FFT(LocalBuf(2048), sig); + + // Modulation sources for evolving behavior + var mod1 = LFNoise1.kr(0.05).range(5, 40); + var mod2 = LFNoise1.kr(0.1).range(0.01, 0.3); + var mod3 = LFNoise1.kr(0.07).range(1, 10); + var mod4 = LFNoise1.kr(0.05).range(0.1, 0.8); + var mod5 = LFNoise1.kr(0.03).range(0.01, 0.4); + + var randomMod; + + // Applying PV effects with evolving modulations + chain = PV_BrickWall(chain, SinOsc.ar(mod1) + SinOsc.kr(mod2)); + chain = PV_RectComb(chain, mod3, mod4, mod5); + + // Adding some additional time-varying effects or randomization + randomMod = LFNoise1.kr(0.02).range(0.1, 1); + chain = PV_BrickWall(chain, SinOsc.ar(mod1 + randomMod) + SinOsc.kr(mod2 + randomMod)); + + sig = IFFT(chain.dup); + Out.ar(0, sig * amp); +}).add; +) + +( +// PV_BrickWall + PV_RectComb + PV_MagShift + PV_Freeze +SynthDef(\pv_complex_fx, { |amp = 0.5, freeze = 0, shiftAmt = 0.2| + var sig = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1); + var chain = FFT(LocalBuf(2048), sig); + + // Modulation sources + var mod1 = LFNoise1.kr(0.05).range(5, 40); + var mod2 = LFNoise1.kr(0.1).range(0.01, 0.3); + var mod3 = LFNoise1.kr(0.07).range(1, 10); + var mod4 = LFNoise1.kr(0.05).range(0.1, 0.8); + var mod5 = LFNoise1.kr(0.03).range(0.01, 0.4); + var randomMod = LFNoise1.kr(0.02).range(0.1, 1); + + // Apply effects + chain = PV_BrickWall(chain, SinOsc.ar(mod1) + SinOsc.kr(mod2)); + chain = PV_RectComb(chain, mod3, mod4, mod5); + chain = PV_BrickWall(chain, SinOsc.ar(mod1 + randomMod) + SinOsc.kr(mod2 + randomMod)); + chain = PV_MagShift(chain, shiftAmt); // pitch shifting + chain = PV_Freeze(chain, freeze); // freeze toggle + + sig = IFFT(chain.dup); + Out.ar(0, sig * amp); +}).add; +) + + + + +( +Routine({ + var amp = 0.5; // Start with a moderate amplitude + Synth(\pv_brickwall, [\amp, amp]); + 0.5.wait; + amp = amp * 0.8; // Decrease amplitude gradually + // Synth(\pv_distorted_bass, [\amp, amp]); + 1.wait; + amp = amp * 1.5; // Increase amplitude + Synth(\pv_brickwall, [\amp, amp]); + 0.1.wait; + Synth(\pv_complex_fx, [\amp, amp * 0.3]); // Lower volume for variation +}).play; +) + diff --git a/vocal_obfuscation.scd b/vocal_obfuscation.scd new file mode 100644 index 0000000..97abfbb --- /dev/null +++ b/vocal_obfuscation.scd @@ -0,0 +1,22 @@ +b = Buffer.read(s, "/Users/lcoogan/snd/installation/zeitlin-six_lines.wav"); + +( +SynthDef(\voiceObscured, { + arg out=0, bufnum, rate=1, shift=0, cutoff=1200, amp = 40; + var sig; + sig = PlayBuf.ar(1, bufnum, BufRateScale.kr(bufnum) * rate, doneAction: 2); + sig = NoiseRepellent.ar(sig, learner:NRAverage(\isLearning.kr(0))); + + sig = PitchShift.ar(sig, 0.2, 2.pow(shift / 12), 0.01, 0.01); + sig = LPF.ar(sig, cutoff); // soften sibilance + // sig = BPF.ar(sig, 60, 0.001).neg + sig; // cancels 60Hz hum + // sig = BPF.ar(sig, 120, 0.001).neg + sig; // cancels 2nd harmonic + + sig = sig * amp ; + Out.ar(out, sig.dup); +}).add; +) + +Synth(\voiceObscured, [\bufnum, b, \shift, -7, \cutoff, 1000, \amp, 40]); +Synth(\voiceObscured, [\isLearning, 1]); // capture some noise +Synth(\voiceObscured, [\isLearning, 0]); // start the script \ No newline at end of file