Tuesday, June 8, 2010

Final Post #2: voice processing

head voice -
http://soundcloud.com/credit/hvline11-proc

(
var score=CtkScore.new, note, gamp, fftbuf, centbuf;
var doc, crossbuf, warpbuf, chain3buf;

doc = CtkBuffer("/Users/bion/Desktop/Transitions_In-Humanity/HeadVoice/RawHeadLines/HVLine14_Raw.wav").addTo(score);
fftbuf = CtkBuffer.buffer(2**12).addTo(score);
centbuf = CtkBuffer.buffer(2**12).addTo(score);
crossbuf = CtkBuffer.buffer(2**12).addTo(score);
chain3buf = CtkBuffer.buffer(2**12).addTo(score);

gamp = 20.dbamp;
note = CtkSynthDef(\voicetastic, {
    var chain, env, outS, pdoc, pray, cent, width, yi, er, san, avg, adj, centchain;
    var cross, chain2, waste, res, chain3, env2;
    env = EnvGen.kr(Env([0,1,1,0], [0.05, 1, 0.01].normalizeSum, \sin), timeScale: doc.duration);
   
    pdoc = PlayBuf.ar(1, doc, BufRateScale.kr(doc));
   
    chain = FFT(fftbuf, pdoc);
    chain3 = PV_Copy(chain, chain3buf);
   
    centchain = PV_Copy(chain, centbuf);
    centchain = PV_MagAbove(centchain, 0.1);

    chain2 = PV_Copy(centchain, crossbuf);
   
    cent = SpecCentroid.kr(centchain);
    er = DelayC.kr(cent, 0.08, 0.08);
    san = DelayC.kr(cent, 0.04, 0.04);
    avg = (cent+er+san)/3;
    avg = avg.min(800);
    avg = avg.max(20);
    adj = LinLin.kr(avg, 20, 700, 0.5, 0);
//   the parameters in this line of code were changed often to suite the needs of individual lines
    env2 = EnvGen.kr(Env([0.01,0.01,1,0.01], [doc.duration*0.4, doc.duration*0.1, doc.duration*0.3], \step));
   adj = adj*env2;
    chain = PV_MagSmear(chain, 100);
    chain = PV_Morph(chain, chain2, adj);

    chain = PV_MagShift(chain, 0.6);

    chain = IFFT(chain)*10.dbamp;
    chain2 = IFFT(chain2)*0.dbamp;
    chain3 = IFFT(chain3)*4.dbamp;
   
    width = (1-(adj+0.01));
    avg = avg*1.3;

    res = Mix.ar(BPF.ar(chain, avg*[0.5,0.75], (width*[20, 50])/avg*[0.5,0.75]))*3.dbamp;
    outS = res+chain+chain3;
    outS = outS*gamp*env;
    outS = Limiter.ar(outS, 0.dbamp);
    outS = Compander.ar(outS, outS, -4.dbamp, 1, 0.5, clampTime: 0.01, relaxTime: 0.01);
    outS = LPF.ar(outS, 3400);
    Out.ar([0,1], outS);
});

score.add(note.new(0.5, doc.duration));
//score.play;
score.write("/Users/bion/Desktop/Transitions_In-Humanity/HeadVoice/ProcHeadLines/HVLine14_Proc.wav",
    options: ServerOptions.new.numOutputBusChannels_(1))
)

doctor's voice -
http://soundcloud.com/credit/doctor-ex

(
var score=CtkScore.new, note, gamp, fftbuf, centbuf;
var doc, crossbuf, warpbuf, chain3buf;

doc = CtkBuffer("/Users/bion/Desktop/Transitions_In-Humanity/DocVoice/MONO-016.wav").addTo(score);
fftbuf = CtkBuffer.buffer(2**12).addTo(score);
centbuf = CtkBuffer.buffer(2**12).addTo(score);
crossbuf = CtkBuffer.buffer(2**12).addTo(score);
chain3buf = CtkBuffer.buffer(2**12).addTo(score);

gamp = 6.dbamp;
note = CtkSynthDef(\docvoicing, {
    var chain, env, outS, pdoc, pray, cent, width, yi, er, san, avg, adj, centchain;
    var cross, chain2, waste, res, chain3;
    env = EnvGen.kr(Env([0,1,1,0], [0.01, 1, 0.01].normalizeSum, [-10, 10]), timeScale: doc.duration);
   
    pdoc = PlayBuf.ar(1, doc, BufRateScale.kr(doc));
   
    chain = FFT(fftbuf, pdoc);
    chain3 = PV_Copy(chain, chain3buf);
    centchain = PV_Copy(chain, centbuf);
   
    centchain = PV_MagAbove(centchain, 4);
    chain2 = PV_Copy(centchain, crossbuf);
    cent = SpecCentroid.kr(centchain).poll;
    er = DelayC.kr(cent, 0.08, 0.08);
    san = DelayC.kr(cent, 0.04, 0.04);
    avg = (cent+er+san)/3;
    avg = avg.min(800);
    avg = avg.max(60);
    adj = LinLin.kr(avg, 60, 1000, 0.3, 0);

    chain = PV_MagSmear(chain, 120);
    chain = PV_Morph(chain, chain2, adj);

    chain = IFFT(chain)*12.dbamp;
    chain2 = IFFT(chain2)*3.dbamp;
    chain3 = IFFT(chain3)*4.dbamp;
   
    width = (1-(adj+0.01));
    avg = avg*1.3;
    res = Mix.ar(BPF.ar(chain2, avg*[2,3,4], (width*[200, 500, 1000])/avg*[2,3,4]))*3.dbamp;
    outS = res+chain+chain3;
    outS = outS*gamp*env;
    outS = Limiter.ar(outS, 0.dbamp);
    outS = Compander.ar(outS, outS, -4.dbamp, 1, 0.5, clampTime: 0.01, relaxTime: 0.01);
    Out.ar(0, outS);
});

score.add(note.new(0.5, doc.duration));
score.write("/Users/bion/Desktop/DocLines/DocMonologue.wav",
    options: ServerOptions.new.numOutputBusChannels_(1))
)

the live voice processing algorithm is in the last Final Post with the ProcMod code.

No comments:

Post a Comment