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.

163 lines
3.3 KiB
Plaintext

~klezmer = "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Acheinu_Kol_Beit_Israel.wav"
~klezmer = "/home/lcoogan/snd/releases/cantorial-resynthesis/wav/Cantor Mordechai Hershman Baruch Hashem Bayom [L3VASTL4irk].wav";
b = Buffer(s, "/home/lcoogan/snd/releases/cantorial-resynthesis/wav/Cantor Mordechai Hershman Baruch Hashem Bayom [L3VASTL4irk].wav");
(
{
var sig;
sig = GrainBuf.ar(
1,
Impulse.ar(2),
1,
b,
1,
1.2,
1,
0,
-1,
512
);
sig = sig!2;
}.play;
)
(
{
var sig;
sig = GrainBuf.ar(
1,
Dust.ar(40),
0.8,
~klezmer,
1,
1.25,
2,
0,
-1,
512
);
sig = sig!2;
}.play;
)
~organ = Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Cantor_Samuel_Malavsky_Zechor.wav");
(
{
var sig;
sig = TGrains2
})
~klezmer = Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Acheinu_Kol_Beit_Israel.wav", channels:[0]);
~klezmer = Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Cantor_Samuel_Malavsky_Zechor.wav", channels:[0]);
~klezmer = Buffer.readChannel(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/yiddish_chuasdel.wav", channels:[0]);
(
SynthDef(\granular, {
arg freq = 410, amp = 4, pan = 0, gate = 1, baseFreq = 600, lpfFreq = 8000, rq = 0.3, drive = 1, pitchRatio = 1;
var sig, env, trig, waveshapedSig, filteredSig, shiftedSig;
trig = Impulse.kr(10, 0.5, 1.0, 0.0) + Dust.kr(1); // Regular grain trigger
env = EnvGen.kr(Env.adsr(0, 0.2, 0.4, 1), gate, doneAction: 2);
// Random panning for each grain
pan = 0;
// Granular synthesis without internal rate control (rate = 1)
sig = GrainBuf.ar(
1,
trig,
0.8,
~klezmer,
1,
1.25,
2,
0,
-1,
512
) * env;
// Apply pitch shifting externally
shiftedSig = PitchShift.ar(sig, 0.2, 580 / baseFreq); // Shifting the pitch after the grain is generated
// Apply waveshaper: Tanh saturation (soft clipping)
waveshapedSig = (shiftedSig * drive).tanh;
// Apply a resonant low-pass filter
filteredSig = SVF.ar(waveshapedSig, lpfFreq, rq);
// Apply panning and amplitude
filteredSig = Pan2.ar(filteredSig, pan) * amp;
// Output the final signal
Out.ar(0, filteredSig);
}).play;
)
(
SynthDef(\granular, {
arg freq = 400, amp = 1, pan = 8, gate = 1, baseFreq = 600;
var sig, env, trig, rate;
trig = Impulse.kr(10); // Regular grain trigger
env = EnvGen.kr(Env.adsr(0, 0.4, 0.8, 1), gate, doneAction: 2);
// Rate scales playback relative to a known base frequency of the buffer
rate = freq / baseFreq;
// Random panning for each grain
pan = LFNoise1.kr(8);
sig = GrainBuf.ar(
1,
trig,
0.8,
~klezmer,
rate, // Control pitch via rate
1.25,
2,
0,
-1,
512
) * amp * env;
sig = Pan2.ar(sig, pan);
Out.ar(0, sig);
}).play;
)
(
// MIDI sequencing by MIDI file
var m1, m2, x1, x2;
// Read each MIDI file separately
m1 = SimpleMIDIFile.read("/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-borrowed flesh/midi/fuzzy gameboy.mid");
m2 = SimpleMIDIFile.read("/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/trax/01-borrowed flesh/midi/pad organ.mid");
// Play both MIDI sequences simultaneously
x1 = m1.p(\granular).play;
x2 = m2.p(\granular).play;
// Store them in a global variable so you can stop them later
~midiPlayers = [x1, x2];
)