nice fucking patch

master
Leo Coogan 9 months ago
parent 0aed7d5205
commit c63e565483
Signed by: lcoogan
SSH Key Fingerprint: SHA256:vnrR5ilHkdr6L4t2yOMUMINFPpxEh+53N3nMel66mCw

@ -0,0 +1,13 @@
DRC
1 OSC Square Wave dropped one octave
2 OSC same volume, same octave, square wave, fine detuning (right),
1 EG slowish attack, normal ds, raise release a little bit
2 EG increase modulation a little bit
2 EG raise attack to half, bring decay to maximum, sustain to half, raise release a little bit
chorus: low rate, norma depth, no feedback
lpf: 800, subtle resonance
reverb: loads of decay and a nice amount

@ -0,0 +1,92 @@
(
SynthDef(\boc_pad, {
arg freq = 210, amp = 0.1, att = 2, dec = 3, sus = 0.1, rel = 0, detune = -8,
lpfFreq = 800, rq = 0.3, revMix = 0.5, revSize = 20, revDamping = 0.5,
tremRate = 10, tremDepth = 0.8; // Tremolo parameters
var osc1, osc2, env, sig, filt, chorus, reverb, tremolo;
osc1 = SinOsc.ar(freq, 0.5);
osc2 = Saw.ar(freq * (1 + detune), 0.5);
sig = Mix([osc1, osc2]) * 0.5;
env = EnvGen.kr(Env.adsr(att, dec, sus, rel), doneAction: 2);
filt = RLPF.ar(sig, lpfFreq, rq);
chorus = CombL.ar(filt, 0.01, LFDNoise3.kr(2).range(0.005, 0.01), 0.3);
// Reverb
reverb = GVerb.ar(chorus, revSize, revDamping, mul: revMix);
// Tremolo (amplitude modulation)
tremolo = SinOsc.kr(tremRate).range(1 - tremDepth, 1);
Out.ar(0, reverb * tremolo * env * amp);
}).add;
)
(
Pbind(
\instrument, \boc_pad,
\freq, Pseq([
[60, 64, 67].midicps, // C major
[62, 65, 69].midicps, // D minor
[57, 60, 64].midicps, // A minor
[55, 59, 62].midicps // G major
], inf), // Infinite loop
\dur, 1, // Each chord lasts 2 beats
\amp, 0.1
).play;
)
(
Pbind(
\instrument, \boc_pad,
\freq, Pseq([
[40, 50, 59].midicps,
[62, 65, 67].midicps,
[50, 58, 64].midicps
], inf), // Infinite loop
\dur, 2, // Each chord lasts 2 beats
\amp, 0.008
).play;
)
(
SynthDef(\boc_pad, {
arg freq = 210, amp = 0.1, att = 0.3, dec = 0.3, sus = 0.1, rel = 0, detune = 0.1,
lpfFreq = 2000, rq = 2, revMix = 0.5, revSize = 20, revDamping = 0.5,
tremRate = 3, tremDepth = 0.1; // Tremolo parameters
var osc1, osc2, env, sig, filt, chorus, tremolo, panLeft, panRight;
// Generate two oscillators
osc1 = Pulse.ar(freq, 0.5);
osc2 = Pulse.ar(freq * (1 + detune), 0.5);
sig = Mix([osc1, osc2]) * 0.5;
env = EnvGen.kr(Env.adsr(att, dec, sus, rel), doneAction: 2);
// Lowpass filter
filt = LPF.ar(sig, lpfFreq, rq);
// Apply a chorus to create stereo width
chorus = CombL.ar(filt, 0.01, LFDNoise3.kr(1).range(0.008, 0.1), 0.3);
// Apply tremolo for amplitude modulation
tremolo = SinOsc.kr(tremRate).range(1 - tremDepth, 1);
// Split the signal into two channels and pan them
panLeft = chorus * tremolo * env * amp * 0.5; // Left channel
panRight = chorus * tremolo * env * amp * 0.5; // Right channel
// Slightly pan the signals to create a stereo image
Out.ar(0, [panLeft, panRight]); // Send to both left and right channels
}).add;
)

@ -30,15 +30,34 @@ SynthDef(\cantorial_tremolo, { |out, pan = 0, dur = 0.1, atk=0.3, dec=0.4, sus=0
maxGrains: 512 maxGrains: 512
); );
sig = sig * env * amp;
filter = MoogVCF.ar(sig, crf, 0.3); filter = MoogVCF.ar(sig, crf, 0.3);
Out.ar(out, filter); sig = sig * env * amp * filter;
}).play;
Out.ar(out, sig);
}).add;
) )
) )
(
Ppar([
Pbind(
\instrument, \cantorial_trill,
\dur, 1, // Adjust as needed
\amp, 1, // Amplitude (adjust as needed)
\pan, 0, // Pan position
),
Pbind(
\instrument, \cantorial_tremolo,
\dur, 0.2, // Adjust as needed
\amp, 1, // Amplitude (adjust as needed)
\pan, 0, // Pan position for the second synth (can be changed)
)
]).play;
)
( (
// Becoming satisfactory granular synth // Becoming satisfactory granular synth
@ -58,14 +77,12 @@ SynthDef(\cantorial_trill, { |out, pan = 0, dur = 0.5, atk=0.3, dec=0.4, sus=0.1
doneAction: 2 doneAction: 2
); );
rate = (note.midicps / 60.midicps);
sig = GrainBuf.ar( sig = GrainBuf.ar(
numChannels: 2, numChannels: 2,
trigger: Impulse.kr(grainRate), trigger: Impulse.kr(grainRate),
dur: dur, dur: dur,
sndbuf: b, sndbuf: b,
rate: rate, rate: 1,
pos: 0.01, pos: 0.01,
interp: 2, interp: 2,
pan: pan, pan: pan,
@ -91,7 +108,7 @@ b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granula
( (
SynthDef(\cantorial_reed , SynthDef(\cantorial_reed ,
{ {
arg amp = 0.3, pan = 0; arg amp = 0.3, pan = 0, pos = 0;
var sig; var sig;
sig = GrainBuf.ar( sig = GrainBuf.ar(
numChannels: 2, numChannels: 2,
@ -99,7 +116,7 @@ SynthDef(\cantorial_reed ,
dur: 0.8, dur: 0.8,
sndbuf: b, sndbuf: b,
rate: 1, rate: 1,
pos: 1.25, // 1.25, 1.20 pos: 0.25, //.20
interp: 2, interp: 2,
pan: pan, pan: pan,
envbufnum: -1, envbufnum: -1,
@ -110,4 +127,96 @@ SynthDef(\cantorial_reed ,
Out.ar(0, sig); Out.ar(0, sig);
}).play; }).play;
) )
) )
Synth(\cantorial_reed);
b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Acheinu_Kol_Beit_Israel.wav");
c = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Cantor_Samuel_Malavsky_Zechor.wav");
SynthDef(\cantorial_reed,
{
arg amp = 0.3, pan = 0, pos = 0, bufSwitch = 0;
var sig, buf;
// Choose buffer based on bufSwitch (0 or 1)
buf = Select.kr(bufSwitch, [b, c]);
sig = GrainBuf.ar(
numChannels: 2,
trigger: Dust.ar(40),
dur: 0.8,
sndbuf: buf, // Dynamically selected buffer
rate: 1,
pos: 0.25,
interp: 2,
pan: pan,
envbufnum: -1,
maxGrains: 512
);
sig = sig * amp;
Out.ar(0, sig);
}).add;
// Example: Play the synth and switch between buffers
x = Synth(\cantorial_reed, [\bufSwitch, 0]); // Starts with b1
x.set(\bufSwitch, 1); // Switches to b2
(
b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Acheinu_Kol_Beit_Israel.wav");
c = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Cantor_Samuel_Malavsky_Zechor.wav");
SynthDef(\cantorial_reed,
{
arg amp = 0.3, pan = 0, pos = 0, xfade = 0; // 'xfade' controls blending (0 = only b, 1 = only c)
var sig1, sig2, sig;
sig1 = GrainBuf.ar(
numChannels: 2,
trigger: Dust.ar(40),
dur: 0.8,
sndbuf: b,
rate: 1,
pos: 0.25,
interp: 2,
pan: pan,
envbufnum: -1,
maxGrains: 512
);
sig2 = GrainBuf.ar(
numChannels: 2,
trigger: Dust.ar(40),
dur: 0.8,
sndbuf: c,
rate: 1,
pos: 0.25,
interp: 2,
pan: pan,
envbufnum: -1,
maxGrains: 512
);
// Crossfade between the two signals
sig = XFade2.ar(sig1, sig2, (xfade * 2) - 1); // -1 = sig1, 1 = sig2
sig = sig * amp;
Out.ar(0, sig);
}).add;
)
// Play and smoothly fade between buffers
x = Synth(\cantorial_reed, [\xfade, 0]); // Start with buffer b
x.set(\xfade, 0.5); // Midpoint mix
x.set(\xfade, 0); // Fully buffer c
x.free;

@ -44,7 +44,6 @@ MIDIdef.cc(\ccTest, {
~samples.class ~samples.class
~samples[39].class ~samples[39].class
~samples[39].
( (
~sampleDir = PathName("/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-borrowed flesh/seq/808"); ~sampleDir = PathName("/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-borrowed flesh/seq/808");
@ -74,8 +73,7 @@ SynthDef(\sampleTrigger, { |buf, ampin = 0|
( (
s.newBusAllocators; s.newBusAllocators;
~bdampbus = Bus.control(s, 1); ~bdampbus = Bus.control(s, 1); // adding .value(0.5) sets an initial of 0.5
// ~bdampbus.value = 0.8;
~sdampbus = Bus.control(s, 1); ~sdampbus = Bus.control(s, 1);
~ltampbus = Bus.control(s, 1); ~ltampbus = Bus.control(s, 1);
~mtampbus = Bus.control(s, 1); ~mtampbus = Bus.control(s, 1);
@ -139,7 +137,7 @@ MIDIdef.noteOn('808trig', { |vel, nn|
{75} { {75} {
Synth(\sampleTrigger, [buf: ~sample.cl, ampin: ~clampbus]); Synth(\sampleTrigger, [buf: ~sample.cl, ampin: ~clampbus]);
} }
}, noteNum: [36, 38, 39, 42, 46, 49], chan: [9]); }, noteNum: [36, 38, 39, 42, 46, 49], chan: [0]);
MIDIdef.cc('808amp', { |val, num| MIDIdef.cc('808amp', { |val, num|
switch(num) switch(num)
@ -155,6 +153,6 @@ MIDIdef.cc('808amp', { |val, num|
{85} {~cyampbus.value = val / 127} {85} {~cyampbus.value = val / 127}
{88} {~cbampbus.value = val / 127}; {88} {~cbampbus.value = val / 127};
}, ccNum: [24, 29, 48, 51, 54, 57, 60, 63, 82, 85, 88], chan: [9]); }, ccNum: [24, 29, 48, 51, 54, 57, 60, 63, 82, 85, 88], chan: [0]);
) )
MIDIFunc.trace(false) MIDIFunc.trace(true)

@ -0,0 +1,98 @@
(
SynthDef(\mellotronFlute, {
arg freq = 440, amp = 0.8, gate = 1, pan = 0, vibratoRate = 1, vibratoDepth = 0.15,
noiseLevel = 0.2, ringModFreq = 3, lpfFreq = 2000, res = 0.8, lpfLfoRate = 1, lpfLfoDepth = 100,
detune = 0.005; // Detune amount (in ratio)
var sig, osc1, osc2, vibrato, noise, env, lpfMod, freq1, freq2;
// Natural vibrato (LFO)
vibrato = SinOsc.kr(vibratoRate, 0, vibratoDepth).range(0.98, 1.02);
// Detuned frequencies (slight offsets)
freq1 = freq * (0.99); // Slightly sharp
freq2 = freq * (1.01); // Slightly flat
// 1st Oscillator: Triangle waves with vibrato
osc1 = Mix([
LFTri.ar(freq1 * vibrato),
LFTri.ar(freq2 * vibrato)
]) * 0.5; // Mix detuned voices
// Pink noise mixed into the first oscillator for breathiness
noise = WhiteNoise.ar(noiseLevel);
osc1 = Mix([osc1, noise * 0.5]); // Blend noise into osc1
// 2nd Oscillator: Detuned ring modulation for a natural tone
osc2 = Mix([
Saw.ar(freq1 * ringModFreq),
SinOscFB.ar(freq2 * ringModFreq)
]) * 0.5 * osc1; // Ring-modulated with detuned pair
// Mix oscillators together
sig = Mix([ osc1, osc2 * 0.5]);
// LFO for filter frequency modulation
lpfMod = SinOsc.kr(lpfLfoRate).range(lpfFreq - lpfLfoDepth, lpfFreq + lpfLfoDepth);
// Low-pass filter with LFO modulation and slight resonance
sig = RLPF.ar(sig, lpfMod, res);
// Envelope (slow attack for a natural swell)
env = EnvGen.kr(Env.adsr(0.2, 3, 1, 2), gate, doneAction: 2);
// Apply envelope and amp
sig = sig * env * amp;
sig = sig.tanh(8);
sig = BLowShelf.ar(sig, 200, 0.5, 9);
// sig = sig.blend(GVerb.ar(sig, 200, 4), 0.15);
// sig = sig.blend(BPF.ar(sig, 800, 0.5), 0.9);
// Output with panning
Out.ar(0, Pan2.ar(sig, pan));
}).add;
)
// Play the flute synth
x = Synth(\mellotronFlute, [\freq, 53.midicps, \detune, 0.1]); // Slight detune for a richer sound
(
Pbind(
\instrument, \mellotronFlute, // Use your SynthDef
\freq, Pseq([[48, 20, 53], [10, 58, 60], [55, 72, 74], [10, 63, 70]].midicps, inf), // Sequence of MIDI notes converted to Hz
// \freq, Pseq([[50, 65], [55, 72], [72, 74], [48, 20]].midicps, inf), // Sequence of MIDI notes converted to Hz
\detune, Pseq([0.2], inf), // Varying detune values
\dur, Pseq([2], inf), // Duration per note
\amp, 0.08
;
).play;
)
(
Pbind(
\instrument, \mellotronFlute, // Use your SynthDef
// \freq, Pseq([[53]].midicps, inf), // Sequence of MIDI notes converted to Hz
\freq, Pseq([[50, 65], [55, 72], [72, 74], [48, 20]].midicps, inf), // Sequence of MIDI notes converted to Hz
\detune, 1.01, // Varying detune values
\dur, Pseq([0.8], inf), // Duration per note
\amp, 0.1;
).play;
)
Loading…
Cancel
Save