I can taste completion

master
Leo Coogan 8 months ago
parent 63afb09e12
commit 90cae11171
Signed by: lcoogan
SSH Key Fingerprint: SHA256:vnrR5ilHkdr6L4t2yOMUMINFPpxEh+53N3nMel66mCw

@ -1,167 +0,0 @@
// =====================================================================
// SuperCollider Workspace
// =====================================================================
b = Buffer.readChannel(s, "non-oneshot-sample-path", channels:[0]);
b = Buffer.readChannel(s, "one-shot-sample-path", channels:[0]);
b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-Cantor_Samual_Malavsky_Shomea_Kol_Bichios.wav");
b = Buffer.readChannel(s, "/home/lcoogan/snd/samples/harmonica-steenberge/09 Rip Van Winkle.wav", channels:[0]);
b.free;
b.play
Ndef(\granulator).clear;
Ndef(\granulator).ar(2);
Ndef(\granulator).set(\bufnum, b.bufnum);
( // one-shot reverb
SynthDef(\granulator, { |bufnum, tFreq=20, overlap=2, rate=1, tFreqMF=0, tFreqMD=0,
rateMF=0, rateMD=0, posRateMD=0, posRateMF=0, granDur=4|
var samplePhasor, phasor, gran, env, bufrd;
var bufFrames = BufFrames.ir(bufnum);
var t;
var tFreqMod = {
SinOsc.ar(tFreqMF, Rand(0.0,2pi)) * tFreqMD;
};
var rateMod = {
SinOsc.ar(rateMF, Rand(0.0,2pi)) * rateMD;
};
var posRateMod = {
SinOsc.ar(posRateMF, Rand(0.0,2pi)) * posRateMD;
};
var playTrig = Impulse.ar(\playTrFr.kr(0.5));
tFreq = tFreq + tFreqMod.dup;
rate = rate + rateMod.dup;
t = Impulse.ar(tFreq);
// t = In.ar(somebus);
samplePhasor = EnvGen.ar(Env([0, 0, bufFrames], [0, bufFrames / SampleRate.ir], curve: 0), gate: playTrig);
phasor = EnvGen.ar(Env([0, 0, 1], [0, granDur], curve: 0), gate: playTrig);
bufrd = BufRd.ar(
numChannels: 1,
bufnum: bufnum,
phase: samplePhasor,
interpolation: 4
);
bufrd = LeakDC.ar(bufrd);
gran = GrainBufJ.ar(
numChannels: 1,
trigger: t,
dur: tFreq.reciprocal * overlap,
sndbuf: bufnum,
rate: rate,
// pos: phasor + WhiteNoise.ar(posRateMD!2),
pos: phasor + posRateMod.dup,
interp: 2,
pan: 0,
envbufnum: -1,
maxGrains: 512,
loop: 0
) * EnvGen.ar(Env.perc(0.001, granDur * \grainGate.kr(1), curve: \granCurve.kr(-4)), gate: playTrig);
Out.ar(0, Mix([
bufrd * \dry.kr(1.0),
gran * \wet.kr(0.5)
]););
// DetectSilence.ar(gran, doneAction: 2); // in case we lauch it without trigger Ugens (with Synth etc)
// Out.ar(0,);
}).add;
)
x = Synth(\granulator, [\bufnum, b]);
//
// Ndef(\granulator).addSpec(
// \overlap, [0.001, 40, \exp],
// \rate, [-2, 2],
// \posRate, [0, 4],
// \tFreq, \widefreq,
// \tFreqMF, [0.0,80],
// \tFreqMD, [0.0,20],
// \rateMF, [0.0,80],
// \rateMD, [0.0,2],
// \posRateMF, [0.0,80],
// \posRateMD, [0.0,2],
// \dry, [0.0,1],
// \wet, [0.0,1],
// \playTrFr, [0.0,1],
// \granDur, [0.0,8],
// \granCurve, [-10,10],
// \grainGate, [0,1],
// ).edit;
// \overlap, [0.001, 40, \exp],
// \rate, [-2, 2],
// \posRate, [0, 4],
// \tFreq, \widefreq,
// \tFreqMF, [0.0,80],
// \tFreqMD, [0.0,20],
// \rateMF, [0.0,80],
// \rateMD, [0.0,2],
// \posRateMF, [0.0,80],
// \posRateMD, [0.0,2],
// \playTrFr, [0.0,1],
// \granDur, [0.0,8],
// \granCurve, [-10,10],
// \grainGate, [0,1],
MIDIClient.init;
MIDIIn.connectAll;
(
MIDIIn.control = { |src, chan, num, val|
if (chan == 2) {
switch(num,
0, { x.set(\dry, val / 127) },
1, { x.set(\wet, val / 127) },
2, { x.set(\rate, val.linlin(0, 127, -2, 2)) },
3, { x.set(\posRate, val.linlin(0, 127, 0, 4)) },
4, { x.set(\tFreq, val.linlin(0, 127, 0, 80)) },
5, { x.set(\tFreqMF, val.linlin(0, 127, 0, 80)) },
6, { x.set(\tFreqMD, val.linlin(0, 127, 0, 20)) },
7, { x.set(\rateMF, val.linlin(0, 127, 0, 80)) },
8, { x.set(\rateMD, val.linlin(0, 127, 0, 2)) },
9, { x.set(\posRateMF, val.linlin(0, 127, 0, 80)) },
10, { x.set(\posRateMD, val.linlin(0, 127, 0, 2)) },
11, { x.set(\playTrFr, val.linlin(0, 127, 0, 1)) },
12, { x.set(\granDur, val.linlin(0, 127, 0, 8)) },
13, { x.set(\granCurve, val.linlin(0, 127, -10, 10)) },
14, { x.set(\grainGate, val.linlin(0, 127, 0, 1)) },
15, { x.set(\overlap, val.exprand(0.001, 40)) }, // Exponential scaling for overlap
// Add more cases if needed
);
};
};
)

@ -52,7 +52,7 @@ MIDIdef.cc(\ccTest, {
SynthDef(\sampleTrigger, { |buf, ampin = 0, outbus = 0| SynthDef(\sampleTrigger, { |buf, ampin = 0, outbus = 0|
var sound, amp; var sound, amp;
amp = In.kr(ampin, 1); amp = In.kr(ampin, 1);
sound = PlayBuf.ar(1, buf, BufRateScale.ir(buf), doneAction: 2); sound = PlayBuf.ar(2, buf, BufRateScale.ir(buf), doneAction: 2);
sound = sound * amp; sound = sound * amp;
Out.ar(outbus, sound.dup); Out.ar(outbus, sound.dup);
}).add; }).add;

@ -1,3 +1,2 @@
Remap 808 seq Mess with sample mapping
Map granular Ndefs Choose track stems

@ -0,0 +1,187 @@
MIDIClient.init;
MIDIIn.connectAll;
(
// b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-Acheinu_Kol_Beit_Israel.wav");
b = Buffer.readChannel(s, "/home/lcoogan/snd/ardour/hebrewian_rue/export/hebrewian_rue_r1_lead.wav", channels:[0], bufnum: 0);
b = Buffer.readChannel(s, "/home/lcoogan/snd/ardour/hebrewian_rue/export/hebrewian_rue_r1_harm.wav", channels:[0], bufnum: 1);
b = Buffer.readChannel(s, "/home/lcoogan/snd/ardour/hebrewian_rue/export/hebrewian_rue_r1_drums.wav", channels:[0], bufnum: 2);
)
(
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/lead.wav", channels:[0], bufnum: 0);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/perc mel solo.wav", channels:[0], bufnum: 1);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/bass.wav", channels:[0], bufnum: 2);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/drums.wav", channels:[0], bufnum: 3);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/break.wav", channels:[0], bufnum: 4);
)
(
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-Cantor_Samual_Malavsky_Shomea_Kol_Bichios.wav", channels:[0], bufnum: 0);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/02-Cantor_Mordechai_Hershman_Baruch_Hashem_Bayom.wav", channels:[0], bufnum: 1);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/03-Acheinu_Kol_Beit_Israel.wav", channels:[0], bufnum: 2);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/04-Cantor_Samuel_Malavsky_Zechor.wav", channels:[0], bufnum: 3);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/05-Cantor_Zavel_Kwartin_Ribono_Shel_Olam.wav", channels:[0], bufnum: 4);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/06-Cantor_Zevulun_Zavel_Kwartin_sings_Tiher.wav", channels:[0], bufnum: 5);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/07-Izak_Algazi_Efendi_Kamti_Be_ashmoret.wav", channels:0, bufnum: 6);
)
(
SynthDef(\granulator_compressor, { |bufnum, tFreq=20, overlap=2, rate=1, tFreqMF=0, tFreqMD=0,
rateMF=0, rateMD=0, posRateMD=0, posRateMF=0, granDur=4|
var dry, gran, env, bufFrames, tFreqMod, rateMod, posRateMod, playTrig;
var t, samplePhasor, phasor, bufrd;
var in, e, o, r, c, bias, lookahead, kneelag, drywet, compressed;
var attack = \attack.kr(0.01);
var release = \release.kr(0.1);
// === GRANULATOR SECTION ===
bufFrames = BufFrames.ir(bufnum);
tFreqMod = SinOsc.ar(tFreqMF, Rand(0.0, 2pi)) * tFreqMD;
rateMod = SinOsc.ar(rateMF, Rand(0.0, 2pi)) * rateMD;
posRateMod = SinOsc.ar(posRateMF, Rand(0.0, 2pi)) * posRateMD;
playTrig = Impulse.ar(\playTrFr.kr(0.5));
tFreq = tFreq + tFreqMod.dup;
rate = rate + rateMod.dup;
t = Impulse.ar(tFreq);
samplePhasor = EnvGen.ar(Env([0, 0, bufFrames], [0, bufFrames / SampleRate.ir], curve: 0), gate: playTrig);
phasor = EnvGen.ar(Env([0, 0, 1], [0, granDur], curve: 0), gate: playTrig);
bufrd = BufRd.ar(
numChannels: 1,
bufnum: bufnum,
phase: samplePhasor,
interpolation: 4
);
bufrd = LeakDC.ar(bufrd);
gran = GrainBufJ.ar(
numChannels: 1,
trigger: t,
dur: tFreq.reciprocal * overlap,
sndbuf: bufnum,
rate: rate,
pos: phasor + posRateMod.dup,
interp: 2,
pan: 0,
envbufnum: -1,
maxGrains: 512,
loop: 0
) * EnvGen.ar(Env.perc(0.001, granDur * \grainGate.kr(1), curve: \granCurve.kr(-4)), gate: playTrig);
dry = bufrd * \dry.kr(1.0) + gran * \wet.kr(0.5); // summed dry + wet
dry = LeakDC.ar(dry);
// === COMPRESSOR SECTION ===
in = dry * \trim.kr(0).dbamp; // input to compressor
e = in.mean;
e = HPF.ar(e, \hpf.kr(50));
e = EnvDetect.ar(e, attack, release);
o = e.ampdb.excess(\threshold.kr(-6));
r = \ratio.kr(4);
c = (max(o, 0.0)) * (r.reciprocal - 1);
kneelag = attack * \knee.kr(0.0);
c = c.lag(kneelag);
c = c.dbamp;
lookahead = \lookahead.kr(0);
in = DelayC.ar(in, 0.5, lookahead.lag(0.4));
compressed = in * c;
compressed = compressed * \gain.kr(0).dbamp;
bias = K2A.ar(\bias.kr(0.0));
compressed = Select.ar(\saturate.kr(1), [compressed, (compressed + bias).softclip - bias]);
compressed = LeakDC.ar(compressed);
drywet = \dry_wet.kr(1);
compressed = Mix([
compressed * drywet,
DelayC.ar(dry * (1 - drywet), 0.5, lookahead.lag(0.4))
]);
Out.ar(0, compressed);
}).add;
)
x = Synth(\granulator_compressor, [\bufnum, b]);
x.free;
(
var paramMap = (
0: [\wet, 0, 1],
1: [\bufnum, 0, 4],
2: [\rate, -2, 2],
3: [\posRate, 0, 4],
4: [\tFreq, 0, 80],
5: [\tFreqMF, 0, 80],
6: [\tFreqMD, 0, 20],
7: [\rateMF, 0, 80],
8: [\rateMD, 0, 2],
9: [\posRateMF, 0, 80],
10: [\posRateMD, 0, 2],
11: [\playTrFr, 0, 1],
12: [\granDur, 0, 8],
13: [\granCurve, -10, 10],
14: [\grainGate, 0, 1],
15: [\overlap, 0.001, 40, \exp],
16: [\attack, 0.0000001, 0.1, \exp],
17: [\release, 0.0000001, 0.4, \exp],
18: [\threshold, -120, 0], // flipped key/value to array
19: [\trim, 0, 60],
20: [\gain, -40, 40],
21: [\ratio, 1, 20, \exp],
22: [\dry_wet, 0, 1],
23: [\hpf, 10, 1000], // fixed missing bracket
24: [\knee, 0.0, 10], // fixed missing bracket
25: [\lookahead, 0.0, 1], // fixed missing bracket
26: [\saturate, \switch], // you may want to define how to handle \switch
27: [\bias, 0.0, 1.0]
);
MIDIIn.control = { |src, chan, num, val|
if (chan == 2) {
var mapping = paramMap[num];
if (mapping.notNil) {
var param = mapping[0];
var min = mapping[1];
var max = mapping[2];
var scaleType = mapping[3] ?? \lin; // default to lin if not specified
var mappedVal = (scaleType == \exp)
.if { val.linexp(0, 127, min, max) }
{ val.linlin(0, 127, min, max) };
x.set(param, mappedVal);
("Setting " ++ param ++ " to " ++ mappedVal).postln;
};
};
};
)

@ -0,0 +1,258 @@
// =====================================================================
// SuperCollider Workspace
// =====================================================================
b = Buffer.readChannel(s, "non-oneshot-sample-path", channels:[0]);
b = Buffer.readChannel(s, "one-shot-sample-path", channels:[0]);
b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-Cantor_Samual_Malavsky_Shomea_Kol_Bichios.wav", [\bufnum: 0]);
b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/06-Cantor_Zevulun_Zavel_Kwartin_sings_Tiher.wav", [\bufnum: 1]);
b = Buffer.readChannel(s, "/home/lcoogan/snd/samples/harmonica-steenberge/09 Rip Van Winkle.wav", channels:[0]); //, [\bufnum: 0]);
b = Buffer.readChannel(s, "/home/lcoogan/Music/Musicians/My Bloody Valentine/Loveless/01 Only Shallow.opus", [\bufnum: 0]);
(
// b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-Acheinu_Kol_Beit_Israel.wav");
b = Buffer.readChannel(s, "/home/lcoogan/snd/ardour/hebrewian_rue/export/hebrewian_rue_r1_lead.wav", channels:[0], bufnum: 0);
b = Buffer.readChannel(s, "/home/lcoogan/snd/ardour/hebrewian_rue/export/hebrewian_rue_r1_harm.wav", channels:[0], bufnum: 1);
b = Buffer.readChannel(s, "/home/lcoogan/snd/ardour/hebrewian_rue/export/hebrewian_rue_r1_drums.wav", channels:[0], bufnum: 2);
)
(
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/lead.wav", channels:[0], bufnum: 0);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/perc mel solo.wav", channels:[0], bufnum: 1);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/bass.wav", channels:[0], bufnum: 2);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/drums.wav", channels:[0], bufnum: 3);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/crawling-stems/break.wav", channels:[0], bufnum: 4);
)
(
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-Cantor_Samual_Malavsky_Shomea_Kol_Bichios.wav", channels:[0], bufnum: 0);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/02-Cantor_Mordechai_Hershman_Baruch_Hashem_Bayom.wav", channels:[0], bufnum: 1);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/03-Acheinu_Kol_Beit_Israel.wav", channels:[0], bufnum: 2);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/04-Cantor_Samuel_Malavsky_Zechor.wav", channels:[0], bufnum: 3);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/05-Cantor_Zavel_Kwartin_Ribono_Shel_Olam.wav", channels:[0], bufnum: 4);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/06-Cantor_Zevulun_Zavel_Kwartin_sings_Tiher.wav", channels:[0], bufnum: 5);
Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/07-Izak_Algazi_Efendi_Kamti_Be_ashmoret.wav", channels:0, bufnum: 6);
)
Synth(\granulator).clear;
b.free;
b.play;
Ndef(\granulator).clear;
Ndef(\granulator).ar(2);
Ndef(\granulator).set(\bufnum, b.bufnum);
~granBus = Bus.audio(s, 2); // stereo bus
( // one-shot reverb
SynthDef(\granulator, { |bufnum, tFreq=20, overlap=2, rate=1, tFreqMF=0, tFreqMD=0,
rateMF=0, rateMD=0, posRateMD=0, posRateMF=0, granDur=4|
var samplePhasor, phasor, gran, env, bufrd;
var bufFrames = BufFrames.ir(bufnum);
var t;
var tFreqMod = {
SinOsc.ar(tFreqMF, Rand(0.0,2pi)) * tFreqMD;
};
var rateMod = {
SinOsc.ar(rateMF, Rand(0.0,2pi)) * rateMD;
};
var posRateMod = {
SinOsc.ar(posRateMF, Rand(0.0,2pi)) * posRateMD;
};
var playTrig = Impulse.ar(\playTrFr.kr(0.5));
tFreq = tFreq + tFreqMod.dup;
rate = rate + rateMod.dup;
t = Impulse.ar(tFreq);
// t = In.ar(somebus);
samplePhasor = EnvGen.ar(Env([0, 0, bufFrames], [0, bufFrames / SampleRate.ir], curve: 0), gate: playTrig);
phasor = EnvGen.ar(Env([0, 0, 1], [0, granDur], curve: 0), gate: playTrig);
bufrd = BufRd.ar(
numChannels: 1,
bufnum: bufnum,
phase: samplePhasor,
interpolation: 4
);
bufrd = LeakDC.ar(bufrd);
gran = GrainBufJ.ar(
numChannels: 1,
trigger: t,
dur: tFreq.reciprocal * overlap,
sndbuf: bufnum,
rate: rate,
// pos: phasor + WhiteNoise.ar(posRateMD!2),
pos: phasor + posRateMod.dup,
interp: 2,
pan: 0,
envbufnum: -1,
maxGrains: 512,
loop: 0
) * EnvGen.ar(Env.perc(0.001, granDur * \grainGate.kr(1), curve: \granCurve.kr(-4)), gate: playTrig);
Out.ar(0, Mix([
bufrd * \dry.kr(1.0),
gran * \wet.kr(0.5)
]););
// DetectSilence.ar(gran, doneAction: 2); // in case we lauch it without trigger Ugens (with Synth etc)
// Out.ar(0,);
}).add;
)
x = Synth(\compressor_granulator, [\bufnum, b]);
x.free;
//
// Ndef(\granulator).addSpec(
// \overlap, [0.001, 40, \exp],
// \rate, [-2, 2],
// \posRate, [0, 4],
// \tFreq, \widefreq,
// \tFreqMF, [0.0,80],
// \tFreqMD, [0.0,20],
// \rateMF, [0.0,80],
// \rateMD, [0.0,2],
// \posRateMF, [0.0,80],
// \posRateMD, [0.0,2],
// \dry, [0.0,1],
// \wet, [0.0,1],
// \playTrFr, [0.0,1],
// \granDur, [0.0,8],
// \granCurve, [-10,10],
// \grainGate, [0,1],
// ).edit;
// \overlap, [0.001, 40, \exp],
// \rate, [-2, 2],
// \posRate, [0, 4],
// \tFreq, \widefreq,
// \tFreqMF, [0.0,80],
// \tFreqMD, [0.0,20],
// \rateMF, [0.0,80],
// \rateMD, [0.0,2],
// \posRateMF, [0.0,80],
// \posRateMD, [0.0,2],
// \playTrFr, [0.0,1],
// \granDur, [0.0,8],
// \granCurve, [-10,10],
// \grainGate, [0,1],
MIDIClient.init;
MIDIIn.connectAll;
(
MIDIIn.control = { |src, chan, num, val|
if (chan == 2) {
switch(num,
0, { x.set(\wet, val.linlin(0, 127, 0, 1)); },
1, { x.set(\bufnum, val.linlin(0, 127, 0, 2))},
2, { x.set(\rate, val.linlin(0, 127, -2, 2)) },
3, { x.set(\posRate, val.linlin(0, 127, 0, 4)) },
4, { x.set(\tFreq, val.linlin(0, 127, 0, 80)) },
5, { x.set(\tFreqMF, val.linlin(0, 127, 0, 80)) },
6, { x.set(\tFreqMD, val.linlin(0, 127, 0, 20)) },
7, { x.set(\rateMF, val.linlin(0, 127, 0, 80)) },
8, { x.set(\rateMD, val.linlin(0, 127, 0, 2)) },
9, { x.set(\posRateMF, val.linlin(0, 127, 0, 80)) },
10, { x.set(\posRateMD, val.linlin(0, 127, 0, 2)) },
11, { x.set(\playTrFr, val.linlin(0, 127, 0, 1)) },
12, { x.set(\granDur, val.linlin(0, 127, 0, 8)) },
13, { x.set(\granCurve, val.linlin(0, 127, -10, 10)) },
14, { x.set(\grainGate, val.linlin(0, 127, 0, 1)) },
15, { x.set(\overlap, val.exprand(0.001, 40)) }, // Exponential scaling for overlap
// Add more cases if needed
);
};
};
)
(
var paramMap = (
0: [\wet, 0, 1],
1: [\bufnum, 0, 4],
2: [\rate, -2, 2],
3: [\posRate, 0, 4],
4: [\tFreq, 0, 80],
5: [\tFreqMF, 0, 80],
6: [\tFreqMD, 0, 20],
7: [\rateMF, 0, 80],
8: [\rateMD, 0, 2],
9: [\posRateMF, 0, 80],
10: [\posRateMD, 0, 2],
11: [\playTrFr, 0, 1],
12: [\granDur, 0, 8],
13: [\granCurve, -10, 10],
14: [\grainGate, 0, 1],
15: [\overlap, 0.001, 40, \exp],
16: [\attack, 0.0000001, 0.1, \exp],
17: [\release, 0.0000001, 0.4, \exp],
18: [\threshold, -120, 0], // flipped key/value to array
19: [\trim, 0, 60],
20: [\gain, -40, 40],
21: [\ratio, 1, 20, \exp],
22: [\dry_wet, 0, 1],
23: [\hpf, 10, 1000], // fixed missing bracket
24: [\knee, 0.0, 10], // fixed missing bracket
25: [\lookahead, 0.0, 1], // fixed missing bracket
26: [\saturate, \switch], // you may want to define how to handle \switch
27: [\bias, 0.0, 1.0]
);
MIDIIn.control = { |src, chan, num, val|
if (chan == 2) {
var mapping = paramMap[num];
if (mapping.notNil) {
var param = mapping[0];
var min = mapping[1];
var max = mapping[2];
var scaleType = mapping[3] ?? \lin; // default to lin if not specified
var mappedVal = (scaleType == \exp)
.if { val.linexp(0, 127, min, max) }
{ val.linlin(0, 127, min, max) };
x.set(param, mappedVal);
("Setting " ++ param ++ " to " ++ mappedVal).postln;
};
};
};
)

@ -1,31 +1,35 @@
Ndef( \compressor).clear; Ndef( \compressor).clear;
Ndef( \compressor).ar(2); Ndef( \compressor).ar(2);
b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/stereo/Acheinu Kol Beit Israel [28iaQrr3X8g].wav");
( (
Ndef( \compressor, { SynthDef( \compressor, {
var local; var local;
var attack = \attack.kr(0.01); var attack = \attack.kr(0.01);
var release = \release.kr(0.1); var release = \release.kr(0.1);
var dry, drywet, in, t, o, r, c, e, lookahead; var dry, drywet, in, t, o, r, c, e, lookahead;
var kneelag; var kneelag;
var bias; var bias;
t = \threshold.kr(-6); t = \threshold.kr(-6);
dry = SoundIn.ar([0,1]); // dry = SoundIn.ar([0,1]);
dry = PlayBuf.ar(2, b, BufRateScale.kr(b), loop: 1); // 2 = stereo
// dry = b;
in = dry * \trim.kr(0).dbamp; in = dry * \trim.kr(0).dbamp;
e = in.mean; e = in.mean;
e = HPF.ar( e, \hpf.kr(50) ); e = HPF.ar( e, \hpf.kr(50) );
e = EnvDetect.ar(e, attack, release); // smooth abs values e = EnvDetect.ar(e, attack, release); // smooth abs values
// how much we are over by // how much we are over by
o = e.ampdb.excess(t); o = e.ampdb.excess(t);
// scale the excess value by ratio // scale the excess value by ratio
r = \ratio.kr(4); r = \ratio.kr(4);
c = ( max(o, 0.0) ) * (r.reciprocal - 1); c = ( max(o, 0.0) ) * (r.reciprocal - 1);
@ -34,7 +38,7 @@ Ndef( \compressor, {
c = c.lag( kneelag ); c = c.lag( kneelag );
c = c.dbamp; c = c.dbamp;
lookahead = \lookahead.kr(0); lookahead = \lookahead.kr(0);
in = DelayC.ar( in, 0.5, lookahead.lag(0.4) ); // lookahead in = DelayC.ar( in, 0.5, lookahead.lag(0.4) ); // lookahead
in = in * c; in = in * c;
@ -45,16 +49,16 @@ Ndef( \compressor, {
in = LeakDC.ar(in); in = LeakDC.ar(in);
drywet = \dry_wet.kr(1); drywet = \dry_wet.kr(1);
Mix([ Out.ar(0, Mix([
in * drywet, in * drywet,
DelayC.ar( dry * (1 - drywet), 0.5, lookahead.lag(0.4) ) DelayC.ar( dry * (1 - drywet), 0.5, lookahead.lag(0.4) )
]) ]));
} ).play;
} ).add;
( /*(
Spec.add(\attack, [0.0000001,0.1, \exp]); Spec.add(\attack, [0.0000001,0.1, \exp]);
Spec.add(\release, [0.0000001,0.4, \exp]); Spec.add(\release, [0.0000001,0.4, \exp]);
Spec.add(\threshold, [0,-120]); Spec.add(\threshold, [0,-120]);
@ -66,9 +70,90 @@ Spec.add(\hpf, [10, 1000]);
Spec.add(\knee, [0.0, 10]); Spec.add(\knee, [0.0, 10]);
Spec.add(\lookahead, [0.0,1]); Spec.add(\lookahead, [0.0,1]);
Spec.add(\saturate, \switch); Spec.add(\saturate, \switch);
Spec.add(\bias, [0.0, 1.0]); Spec.add(\bias, [0.0, 1.0]);*/
);
x = Synth(\compressor, [\bufnum, 0]);
x = Synth(\comp, [\bufnum, 0]);
x = Synth(\granular_comp, [\bufnum, 0]);
inAmp=1, gain=0, lookahead = 0, tFreq=20, overlap=2, rate=1, lpf=0
(
var paramMap = (
0: [\inAmp, 0, 2],
1: [\gain, -40, 40],
2: [\lookahead, 0.0, 1.0],
3: [\tFreq, 0, 80],
4: [\overlap, 0.001, 40, \exp],
5: [\rate, -2, 2],
6: [\lpf, 20, 20000, \exp]
);
MIDIIn.control = { |src, chan, num, val|
if (chan == 3) {
var mapping = paramMap[num];
if (mapping.notNil) {
var param = mapping[0];
var min = mapping[1];
var max = mapping[2];
var scaleType = mapping[3] ?? \lin; // default to lin if not specified
var mappedVal = (scaleType == \exp)
.if { val.linexp(0, 127, min, max) }
{ val.linlin(0, 127, min, max) };
x.set(param, mappedVal);
("Setting " ++ param ++ " to " ++ mappedVal).postln;
};
};
};
)
(
var paramMap = (
0: [\attack, 0.0000001, 0.1, \exp],
1: [\release, 0.0000001, 0.4, \exp],
2: [\threshold, 0, -120],
3: [\trim, 0, 60],
4: [\gain, -40, 40],
5: [\ratio, 1, 20, \exp],
6: [\dry_wet, 0, 1],
7: [\hpf, 10, 1000],
8: [\knee, 0.0, 10],
9: [\lookahead, 0.0, 1],
10: [\saturate, 0, 1], // since \switch is not numeric, using 0 or 1 (off/on)
11: [\bias, 0.0, 1.0]
); );
MIDIIn.control = { |src, chan, num, val|
if (chan == 3) {
var mapping = paramMap[num];
if (mapping.notNil) {
var param = mapping[0];
var min = mapping[1];
var max = mapping[2];
var scaleType = mapping[3] ?? \lin; // default to lin if not specified
var mappedVal = (scaleType == \exp)
.if { val.linexp(0, 127, min, max) }
{ val.linlin(0, 127, min, max) };
x.set(param, mappedVal);
("Setting " ++ param ++ " to " ++ mappedVal).postln;
};
};
};
)
Ndef('compressor').set('threshold', -58.604651162791, 'saturate', 0.0, 'lookahead', 0.037037037037037, 'gain', 34.448135843484, 'release', 0.053953680737862, 'bias', 0.0, 'dry_wet', 1.0, 'knee', 1.0077519379845); Ndef('compressor').set('threshold', -58.604651162791, 'saturate', 0.0, 'lookahead', 0.037037037037037, 'gain', 34.448135843484, 'release', 0.053953680737862, 'bias', 0.0, 'dry_wet', 1.0, 'knee', 1.0077519379845);
@ -122,26 +207,26 @@ Ndef(\analysis).ar(1);
( (
Ndef(\analysis, { Ndef(\analysis, {
var input, in, e, thresh, c, attack, release, kneelag; var input, in, e, thresh, c, attack, release, kneelag;
input = SoundIn.ar([0,1]); input = SoundIn.ar([0,1]);
attack = \attack.kr(0.01); attack = \attack.kr(0.01);
release = \release.kr(0.1); release = \release.kr(0.1);
thresh = \threshold.kr(-6); thresh = \threshold.kr(-6);
in = input * \trim.kr(0).dbamp; in = input * \trim.kr(0).dbamp;
e = in.mean; e = in.mean;
e = HPF.ar( e, \hpf.kr(50) ); e = HPF.ar( e, \hpf.kr(50) );
e = EnvDetect.ar(e, attack, release); e = EnvDetect.ar(e, attack, release);
// how much we are over by // how much we are over by
o = e.ampdb.excess(thresh); o = e.ampdb.excess(thresh);
// scale the excess value by ratio // scale the excess value by ratio
r = \ratio.kr(4); r = \ratio.kr(4);
c = ( max(o, 0.0) ) * (r.reciprocal - 1); c = ( max(o, 0.0) ) * (r.reciprocal - 1);
@ -150,7 +235,7 @@ Ndef(\analysis, {
c = c.lag( kneelag ); c = c.lag( kneelag );
c = c.dbamp; c = c.dbamp;
}); });
@ -166,16 +251,21 @@ Ndef( \comp).ar(2);
( (
Ndef( \comp, { SynthDef( \comp, {
var dry, in, c, lookahead; var dry, in, c, lookahead;
var bias; var bias;
var gain = \gain.kr(0).dbamp; var gain = \gain.kr(0).dbamp;
dry = SoundIn.ar([0,1]);
// dry = SoundIn.ar([0,1]);
dry = PlayBuf.ar(2, b, BufRateScale.kr(b), loop: 1); // 2 = stereo
in = dry; in = dry;
c = Ndef(\analysis).ar; c = Ndef(\analysis).ar;
lookahead = \lookahead.kr(0); lookahead = \lookahead.kr(0);
in = DelayC.ar( in, 0.5, lookahead); // lookahead in = DelayC.ar( in, 0.5, lookahead); // lookahead
in = in * c; in = in * c;
@ -185,17 +275,17 @@ Ndef( \comp, {
in = Select.ar( \saturate.kr(1), [in, (in + bias).softclip - bias] ); in = Select.ar( \saturate.kr(1), [in, (in + bias).softclip - bias] );
in = LeakDC.ar(in); in = LeakDC.ar(in);
Mix([ Out.ar(0, Mix([
in * \wet.kr(1), in * \wet.kr(1),
DelayC.ar( dry * gain * \dry.kr(1), 0.5, lookahead ) DelayC.ar( dry * gain * \dry.kr(1), 0.5, lookahead )
]) ]));
} ).play;
Ndef('comp').set('gain', 33.0, 'lookahead', 0.015503875968992, 'dry', 0.0); } ).play;
Ndef( \comp).edit; // Ndef('comp').set('gain', 33.0, 'lookahead', 0.015503875968992, 'dry', 0.0);
//
// Ndef( \comp).edit;
) )
@ -218,7 +308,7 @@ Ndef(\granular_comp).ar(2)
( (
Ndef('granular_comp').addSpec( Ndef('granular_comp').addSpec(
\lookahead, [0.0,1], \lookahead, [0.0,1],
@ -240,10 +330,10 @@ Ndef('granular_comp').addSpec(
( (
( (
Ndef('granular_comp', {| SynthDef('granular_comp', {|
inAmp=1, gain=0, lookahead = 0, tFreq=20, overlap=2, rate=1, lpf=0 inAmp=1, gain=0, lookahead = 0, tFreq=20, overlap=2, rate=1, lpf=0
| |
@ -259,33 +349,36 @@ Ndef('granular_comp', {|
bufFrames = 2**16; bufFrames = 2**16;
buf = {LocalBuf(bufFrames).clear}!2; buf = {LocalBuf(bufFrames).clear}!2;
bufdur = BufDur.ir(buf); bufdur = BufDur.ir(buf);
writePos = Phasor.ar( writePos = Phasor.ar(
0, 0,
rate, rate,
0, 0,
bufFrames bufFrames
); );
input = SoundIn.ar([0,1]) * inAmp; input = PlayBuf.ar(2, b, BufRateScale.kr(b), loop: 1) * inAmp; // 2 = stereo
// input = SoundIn.ar([0,1]) * inAmp;
// input = b;
// writing input to grain buffer // writing input to grain buffer
buf.do { |b i| BufWr.ar( input[i], b, writePos) buf.do { |b i| BufWr.ar( input[i], b, writePos)
}; };
t = Impulse.ar(tFreq); t = Impulse.ar(tFreq);
readPos = Wrap.ar( readPos = Wrap.ar(
writePos - 64 - lookahead / bufFrames, writePos - 64 - lookahead / bufFrames,
0, 0,
1 1
); );
sc = Ndef(\analysis).ar; sc = Ndef(\analysis).ar;
grained = GrainBufJ.ar( grained = GrainBufJ.ar(
@ -295,7 +388,7 @@ Ndef('granular_comp', {|
// dur: overlap / tFreq, // dur: overlap / tFreq,
dur: sc * overlap / tFreq, dur: sc * overlap / tFreq,
sndbuf: buf, sndbuf: buf,
rate: rate - lpf, rate: rate - lpf,
pos:readPos, pos:readPos,
interp: 4, interp: 4,
// grainAmp: sc, // grainAmp: sc,
@ -303,32 +396,34 @@ Ndef('granular_comp', {|
envbufnum:-1 envbufnum:-1
); );
grained = HPF.ar( grained, \hpf.kr(40) ); grained = HPF.ar( grained, \hpf.kr(40) );
signal = Mix([ signal = Mix([
LeakDC.ar( grained ) * \wet.kr(1), LeakDC.ar( grained ) * \wet.kr(1),
DelayC.ar( DelayC.ar(
input, input,
0.5, 0.5,
(64 + lookahead / SampleRate.ir ) (64 + lookahead / SampleRate.ir )
) * \dry.kr(0) ) * \dry.kr(0)
]) * gain.dbamp; ]) * gain.dbamp;
signal.tanh
signal.tanh;
Out.ar(0, signal);
}).play; }).add;
Ndef('granular_comp').edit // Ndef('granular_comp').edit
) )
Loading…
Cancel
Save