From 90cae1117133dba237f08172887720935d8425a4 Mon Sep 17 00:00:00 2001 From: Leo Coogan Date: Sat, 26 Apr 2025 16:14:43 -0400 Subject: [PATCH] I can taste completion --- .../15_microsound_granular_reverb.sc | 167 ------------ neo-hasidic_brainsex/808.scd | 2 +- neo-hasidic_brainsex/TODO.wiki | 5 +- .../granulator_reverberator_compressor.scd | 187 +++++++++++++ .../13_microsound_granular_phrase_sampler.sc | 0 .../14_microsound_time_pitch_filters.sc | 0 .../old/15_microsound_granular_reverb.sc | 258 ++++++++++++++++++ .../25_microsound_granular_compressor.sc | 207 ++++++++++---- 8 files changed, 599 insertions(+), 227 deletions(-) delete mode 100644 neo-hasidic_brainsex/15_microsound_granular_reverb.sc create mode 100644 neo-hasidic_brainsex/granulator_reverberator_compressor.scd rename neo-hasidic_brainsex/{ => old}/13_microsound_granular_phrase_sampler.sc (100%) rename neo-hasidic_brainsex/{ => old}/14_microsound_time_pitch_filters.sc (100%) create mode 100644 neo-hasidic_brainsex/old/15_microsound_granular_reverb.sc rename neo-hasidic_brainsex/{ => old}/25_microsound_granular_compressor.sc (63%) diff --git a/neo-hasidic_brainsex/15_microsound_granular_reverb.sc b/neo-hasidic_brainsex/15_microsound_granular_reverb.sc deleted file mode 100644 index f01e09f..0000000 --- a/neo-hasidic_brainsex/15_microsound_granular_reverb.sc +++ /dev/null @@ -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 - ); - }; -}; -) diff --git a/neo-hasidic_brainsex/808.scd b/neo-hasidic_brainsex/808.scd index a3e9de7..3e078a6 100644 --- a/neo-hasidic_brainsex/808.scd +++ b/neo-hasidic_brainsex/808.scd @@ -52,7 +52,7 @@ MIDIdef.cc(\ccTest, { SynthDef(\sampleTrigger, { |buf, ampin = 0, outbus = 0| var sound, amp; 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; Out.ar(outbus, sound.dup); }).add; diff --git a/neo-hasidic_brainsex/TODO.wiki b/neo-hasidic_brainsex/TODO.wiki index 0076058..415deba 100644 --- a/neo-hasidic_brainsex/TODO.wiki +++ b/neo-hasidic_brainsex/TODO.wiki @@ -1,3 +1,2 @@ -Remap 808 seq -Map granular Ndefs - +Mess with sample mapping +Choose track stems diff --git a/neo-hasidic_brainsex/granulator_reverberator_compressor.scd b/neo-hasidic_brainsex/granulator_reverberator_compressor.scd new file mode 100644 index 0000000..2a12827 --- /dev/null +++ b/neo-hasidic_brainsex/granulator_reverberator_compressor.scd @@ -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; + }; + }; +}; +) + + diff --git a/neo-hasidic_brainsex/13_microsound_granular_phrase_sampler.sc b/neo-hasidic_brainsex/old/13_microsound_granular_phrase_sampler.sc similarity index 100% rename from neo-hasidic_brainsex/13_microsound_granular_phrase_sampler.sc rename to neo-hasidic_brainsex/old/13_microsound_granular_phrase_sampler.sc diff --git a/neo-hasidic_brainsex/14_microsound_time_pitch_filters.sc b/neo-hasidic_brainsex/old/14_microsound_time_pitch_filters.sc similarity index 100% rename from neo-hasidic_brainsex/14_microsound_time_pitch_filters.sc rename to neo-hasidic_brainsex/old/14_microsound_time_pitch_filters.sc diff --git a/neo-hasidic_brainsex/old/15_microsound_granular_reverb.sc b/neo-hasidic_brainsex/old/15_microsound_granular_reverb.sc new file mode 100644 index 0000000..b56c998 --- /dev/null +++ b/neo-hasidic_brainsex/old/15_microsound_granular_reverb.sc @@ -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; + }; + }; +}; +) + diff --git a/neo-hasidic_brainsex/25_microsound_granular_compressor.sc b/neo-hasidic_brainsex/old/25_microsound_granular_compressor.sc similarity index 63% rename from neo-hasidic_brainsex/25_microsound_granular_compressor.sc rename to neo-hasidic_brainsex/old/25_microsound_granular_compressor.sc index f04746d..5c6be41 100644 --- a/neo-hasidic_brainsex/25_microsound_granular_compressor.sc +++ b/neo-hasidic_brainsex/old/25_microsound_granular_compressor.sc @@ -1,31 +1,35 @@ 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"); + ( -Ndef( \compressor, { +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 = 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); @@ -34,7 +38,7 @@ Ndef( \compressor, { 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; @@ -45,16 +49,16 @@ Ndef( \compressor, { in = LeakDC.ar(in); drywet = \dry_wet.kr(1); - Mix([ + Out.ar(0, Mix([ in * drywet, DelayC.ar( dry * (1 - drywet), 0.5, lookahead.lag(0.4) ) - ]) - + ])); -} ).play; + +} ).add; -( +/*( Spec.add(\attack, [0.0000001,0.1, \exp]); Spec.add(\release, [0.0000001,0.4, \exp]); Spec.add(\threshold, [0,-120]); @@ -66,9 +70,90 @@ 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]); +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); @@ -122,26 +207,26 @@ Ndef(\analysis).ar(1); ( -Ndef(\analysis, { - +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); @@ -150,7 +235,7 @@ Ndef(\analysis, { c = c.lag( kneelag ); c = c.dbamp; - + }); @@ -166,16 +251,21 @@ Ndef( \comp).ar(2); ( -Ndef( \comp, { +SynthDef( \comp, { var dry, in, c, lookahead; var bias; 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; + + + c = Ndef(\analysis).ar; - + lookahead = \lookahead.kr(0); in = DelayC.ar( in, 0.5, lookahead); // lookahead in = in * c; @@ -185,17 +275,17 @@ Ndef( \comp, { in = Select.ar( \saturate.kr(1), [in, (in + bias).softclip - bias] ); in = LeakDC.ar(in); - Mix([ + 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); +} ).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( \lookahead, [0.0,1], @@ -240,10 +330,10 @@ Ndef('granular_comp').addSpec( -( -( -Ndef('granular_comp', {| - inAmp=1, gain=0, lookahead = 0, tFreq=20, overlap=2, rate=1, lpf=0 +( +( +SynthDef('granular_comp', {| + inAmp=1, gain=0, lookahead = 0, tFreq=20, overlap=2, rate=1, lpf=0 | @@ -259,33 +349,36 @@ Ndef('granular_comp', {| bufFrames = 2**16; buf = {LocalBuf(bufFrames).clear}!2; - bufdur = BufDur.ir(buf); + bufdur = BufDur.ir(buf); writePos = Phasor.ar( - 0, + 0, rate, - 0, - bufFrames + 0, + 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 buf.do { |b i| BufWr.ar( input[i], b, writePos) }; - + t = Impulse.ar(tFreq); readPos = Wrap.ar( - writePos - 64 - lookahead / bufFrames, - 0, + writePos - 64 - lookahead / bufFrames, + 0, 1 ); - + sc = Ndef(\analysis).ar; grained = GrainBufJ.ar( @@ -295,7 +388,7 @@ Ndef('granular_comp', {| // dur: overlap / tFreq, dur: sc * overlap / tFreq, sndbuf: buf, - rate: rate - lpf, + rate: rate - lpf, pos:readPos, interp: 4, // grainAmp: sc, @@ -303,32 +396,34 @@ Ndef('granular_comp', {| envbufnum:-1 ); - + grained = HPF.ar( grained, \hpf.kr(40) ); - + signal = Mix([ LeakDC.ar( grained ) * \wet.kr(1), - DelayC.ar( - input, - 0.5, + DelayC.ar( + input, + 0.5, (64 + lookahead / SampleRate.ir ) ) * \dry.kr(0) ]) * gain.dbamp; - - signal.tanh + + signal.tanh; + + Out.ar(0, signal); -}).play; +}).add; -Ndef('granular_comp').edit +// Ndef('granular_comp').edit )