You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
460 lines
8.0 KiB
Python
460 lines
8.0 KiB
Python
Ndef( \compressor).clear;
|
|
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");
|
|
|
|
(
|
|
|
|
SynthDef( \compressor, {
|
|
var local;
|
|
var attack = \attack.kr(0.01);
|
|
var release = \release.kr(0.1);
|
|
var dry, drywet, in, t, o, r, c, e, lookahead;
|
|
var kneelag;
|
|
var bias;
|
|
|
|
t = \threshold.kr(-6);
|
|
|
|
// 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;
|
|
|
|
e = in.mean;
|
|
|
|
e = HPF.ar( e, \hpf.kr(50) );
|
|
|
|
e = EnvDetect.ar(e, attack, release); // smooth abs values
|
|
|
|
// how much we are over by
|
|
o = e.ampdb.excess(t);
|
|
|
|
// scale the excess value by ratio
|
|
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) ); // lookahead
|
|
in = in * c;
|
|
in = in * \gain.kr(0).dbamp;
|
|
bias = K2A.ar(\bias.kr(0.0));
|
|
|
|
in = Select.ar( \saturate.kr(1), [in, (in + bias).softclip - bias] );
|
|
in = LeakDC.ar(in);
|
|
|
|
drywet = \dry_wet.kr(1);
|
|
Out.ar(0, Mix([
|
|
in * drywet,
|
|
DelayC.ar( dry * (1 - drywet), 0.5, lookahead.lag(0.4) )
|
|
]));
|
|
|
|
|
|
} ).add;
|
|
|
|
|
|
/*(
|
|
Spec.add(\attack, [0.0000001,0.1, \exp]);
|
|
Spec.add(\release, [0.0000001,0.4, \exp]);
|
|
Spec.add(\threshold, [0,-120]);
|
|
Spec.add(\trim, [0,60]);
|
|
Spec.add(\gain, [-40,40]);
|
|
Spec.add(\ratio, [1,20, \exp]);
|
|
Spec.add(\dry_wet, [0,1]);
|
|
Spec.add(\hpf, [10, 1000]);
|
|
Spec.add(\knee, [0.0, 10]);
|
|
Spec.add(\lookahead, [0.0,1]);
|
|
Spec.add(\saturate, \switch);
|
|
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).edit;
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//// Analysis plots --begin
|
|
|
|
({
|
|
EnvDetect.ar(SinOsc.ar, 0.01,0.01);
|
|
}.plot(1))
|
|
|
|
({
|
|
EnvDetect.ar(SinOsc.ar, 0.01,0.01).ampdb;
|
|
}.plot(1))
|
|
|
|
({
|
|
max( EnvDetect.ar(SinOsc.ar, 0.01,0.01).ampdb.excess(-10), 0);
|
|
|
|
}.plot(1))
|
|
|
|
({
|
|
var r = 2;
|
|
max( EnvDetect.ar(SinOsc.ar, 0.01,0.01).ampdb.excess(-10), 0) * (r.reciprocal - 1);
|
|
}.plot(1))
|
|
|
|
({
|
|
var r = 10;
|
|
var db = max( EnvDetect.ar(SinOsc.ar, 0.01,0.01).ampdb.excess(-10), 0) * (r.reciprocal - 1);
|
|
db.dbamp
|
|
}.plot(1))
|
|
|
|
///// Analysis plots --end
|
|
|
|
|
|
|
|
|
|
|
|
Ndef(\analysis).clear;
|
|
Ndef(\analysis).ar(1);
|
|
|
|
|
|
|
|
(
|
|
Ndef(\analysis, {
|
|
|
|
var input, in, e, thresh, c, attack, release, kneelag;
|
|
input = SoundIn.ar([0,1]);
|
|
|
|
|
|
attack = \attack.kr(0.01);
|
|
release = \release.kr(0.1);
|
|
thresh = \threshold.kr(-6);
|
|
in = input * \trim.kr(0).dbamp;
|
|
|
|
e = in.mean;
|
|
|
|
e = HPF.ar( e, \hpf.kr(50) );
|
|
|
|
e = EnvDetect.ar(e, attack, release);
|
|
|
|
// how much we are over by
|
|
o = e.ampdb.excess(thresh);
|
|
|
|
// scale the excess value by ratio
|
|
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;
|
|
|
|
|
|
});
|
|
|
|
Ndef('analysis').set('threshold', -58.6, 'release', 0.05, 'knee', 1.01);
|
|
|
|
Ndef(\analysis).edit;
|
|
)
|
|
|
|
|
|
Ndef( \comp).clear;
|
|
Ndef( \comp).ar(2);
|
|
|
|
|
|
(
|
|
|
|
SynthDef( \comp, {
|
|
var dry, in, c, lookahead;
|
|
var bias;
|
|
var gain = \gain.kr(0).dbamp;
|
|
|
|
// dry = SoundIn.ar([0,1]);
|
|
dry = PlayBuf.ar(2, b, BufRateScale.kr(b), loop: 1); // 2 = stereo
|
|
|
|
in = dry;
|
|
|
|
|
|
|
|
|
|
c = Ndef(\analysis).ar;
|
|
|
|
lookahead = \lookahead.kr(0);
|
|
in = DelayC.ar( in, 0.5, lookahead); // lookahead
|
|
in = in * c;
|
|
in = in * gain;
|
|
bias = K2A.ar(\bias.kr(0.0));
|
|
|
|
in = Select.ar( \saturate.kr(1), [in, (in + bias).softclip - bias] );
|
|
in = LeakDC.ar(in);
|
|
|
|
Out.ar(0, Mix([
|
|
in * \wet.kr(1),
|
|
DelayC.ar( dry * gain * \dry.kr(1), 0.5, lookahead )
|
|
]));
|
|
|
|
|
|
} ).play;
|
|
|
|
// Ndef('comp').set('gain', 33.0, 'lookahead', 0.015503875968992, 'dry', 0.0);
|
|
//
|
|
// Ndef( \comp).edit;
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ndef(\granular_comp).clear
|
|
Ndef(\granular_comp).ar(2)
|
|
|
|
|
|
|
|
|
|
(
|
|
Ndef('granular_comp').addSpec(
|
|
\lookahead, [0.0,1],
|
|
|
|
\saturate, \switch,
|
|
\lpf, [0.0, 0.2],
|
|
\inAmp, \inAmp,
|
|
\wet, \bipolar,
|
|
\inputAmp, [0,30],
|
|
\lookahead, [0.0,4100],
|
|
\rate, [0,1],
|
|
\tFreq, [1,22050, \exp],
|
|
\overlap, [0.01,512.0, \exp],
|
|
\hpf, \freq,
|
|
\wet, [0.0,1],
|
|
\dry, [0.0,1],
|
|
\gain, [0.0,40],
|
|
)
|
|
)
|
|
|
|
|
|
|
|
(
|
|
(
|
|
SynthDef('granular_comp', {|
|
|
inAmp=1, gain=0, lookahead = 0, tFreq=20, overlap=2, rate=1, lpf=0
|
|
|
|
|
|
|
|
|
var input;
|
|
var readPos, signal, writePos, grained, balance;
|
|
|
|
var t, bufFrames;
|
|
var buf, bufdur;
|
|
|
|
var sc;
|
|
|
|
|
|
|
|
bufFrames = 2**16;
|
|
buf = {LocalBuf(bufFrames).clear}!2;
|
|
bufdur = BufDur.ir(buf);
|
|
|
|
|
|
writePos = Phasor.ar(
|
|
0,
|
|
rate,
|
|
0,
|
|
bufFrames
|
|
);
|
|
|
|
|
|
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
|
|
buf.do { |b i| BufWr.ar( input[i], b, writePos)
|
|
};
|
|
|
|
|
|
t = Impulse.ar(tFreq);
|
|
|
|
|
|
readPos = Wrap.ar(
|
|
writePos - 64 - lookahead / bufFrames,
|
|
0,
|
|
1
|
|
);
|
|
|
|
|
|
sc = Ndef(\analysis).ar;
|
|
|
|
grained = GrainBufJ.ar(
|
|
numChannels:1,
|
|
loop: 1,
|
|
trigger:t,
|
|
// dur: overlap / tFreq,
|
|
dur: sc * overlap / tFreq,
|
|
sndbuf: buf,
|
|
rate: rate - lpf,
|
|
pos:readPos,
|
|
interp: 4,
|
|
// grainAmp: sc,
|
|
pan: 0,
|
|
envbufnum:-1
|
|
);
|
|
|
|
|
|
grained = HPF.ar( grained, \hpf.kr(40) );
|
|
|
|
|
|
signal = Mix([
|
|
LeakDC.ar( grained ) * \wet.kr(1),
|
|
DelayC.ar(
|
|
input,
|
|
0.5,
|
|
(64 + lookahead / SampleRate.ir )
|
|
) * \dry.kr(0)
|
|
]) * gain.dbamp;
|
|
|
|
|
|
|
|
signal.tanh;
|
|
|
|
Out.ar(0, signal);
|
|
|
|
|
|
|
|
}).add;
|
|
|
|
|
|
|
|
|
|
|
|
// Ndef('granular_comp').edit
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
( // using overlap
|
|
|
|
Ndef('analysis').set('threshold', -58.6, 'ratio', 4.0, 'release', 0.095152954811494, 'knee', 1.01);
|
|
|
|
Ndef('granular_comp').set('lookahead', 2288.3720930233, 'wet', 0.96124031007752, 'rate', 1.0, 'tFreq', 5054.5412673637, 'lpf', 0.024338624338624, 'inAmp', 0.7751938, 'gain', 1.0542635658915, 'overlap', 337.20506220588, 'dry', 0.0);
|
|
)
|
|
|
|
|
|
|
|
|
|
( // lofi
|
|
Ndef('granular_comp').set('lookahead', 127.13178294574, 'wet', 0.66666666666667, 'rate', 0.2, 'tFreq', 4328.5464121672, 0.7751938, 'overlap', 157.82885262499, 'gain', 1.3643410852713, 'dry', 0.0);
|
|
Ndef('analysis').set('threshold', -58.6, 'ratio', 1.7870536713698, 'release', 0.068293378346003, 'attack', 0.0055486335881451, 'knee', 1.01);
|
|
)
|
|
|
|
|
|
|
|
|