(
var score=CtkScore.new, note, gamp, fftbuf, centbuf;
var doc, ray, convbuf;
doc = CtkBuffer("/Users/bion/Desktop/Transitions_In-Humanity/Doc1.wav").addTo(score);
ray = CtkBuffer("/Users/bion/Desktop/Transitions_In-Humanity/raysamp1.wav").addTo(score);
fftbuf = CtkBuffer.buffer(2**12).addTo(score);
centbuf = CtkBuffer.buffer(2**12).addTo(score);
convbuf = CtkBuffer.buffer(2**12).addTo(score);
gamp = -30.dbamp;
note = CtkSynthDef(\docvoicing, {
var chain, env, outS, pdoc, pray, cent, width, yi, er, san, avg, adj, centchain;
var conv, convchain, resAdj, res, res2, res3, waste;
env = EnvGen.kr(Env([0,1,1,0], [0.01, 1, 0.01].normalizeSum, [-10, 10]), timeScale: doc.duration);
pray = PlayBuf.ar(1, ray, BufRateScale.kr(ray));
pdoc = PlayBuf.ar(1, doc, BufRateScale.kr(doc));
#pdoc, waste = GVerb.ar(pdoc, 15, 0.14);
pdoc = Compander.ar(pdoc, pdoc, -3.dbamp, 1, -12.dbamp);
chain = FFT(fftbuf, pdoc);
centchain = PV_Copy(chain, centbuf);
centchain = PV_MagAbove(centchain, 30);
cent = SpecCentroid.kr(centchain);
er = DelayC.kr(cent, 0.10, 0.10);
san = DelayC.kr(cent, 0.06, 0.06);
avg = (cent+er+san)/3;
avg = avg.min(1800);
avg = avg.max(100);
adj = LinLin.kr(avg, 100, 1300, -48.dbamp, -14.dbamp);
conv = Convolution.ar(pdoc, pray, 2**12)*2;
convchain = FFT(convbuf, conv);
chain = PV_Morph(chain, convchain, adj);
chain = IFFT(chain);
resAdj = LinLin.kr(adj, -33.dbamp, 0.5, 0.6, 0.0001);
res = Mix.ar(Resonz.ar(chain, [1200, 1400, 1800], resAdj*[200/1200, 200/1600, 600/1800]));
outS = chain+(res*6.dbamp);
outS = outS*gamp*env*10;
outS = Limiter.ar(outS, 0.dbamp);
Out.ar(0, outS);
});
score.add(note.new(0.5, doc.duration/3));
score.play;
//score.write("~/Desktop/docvoice.wav".standardizePath,
// options: ServerOptions.new.numOutputBusChannels_(1))
)
improvements in final version
- eliminate need for Limiter
- find more appropriate Resonz parameters
- improve clarity of non-convoluted portions
- improve consonant distortion
- hold vowels for emphasis in specific phrases
- vary pacing
- vary volume
No comments:
Post a Comment