//practical sound analysis - fredrik olofsson

//organized by lullcec 28-30oct 2011, hangar, barcelona



//--selfplaying feedback chord player

b= Buffer.alloc(s, 4096, 1); //don't change if 44100

(

SynthDef(\selfplaying, {|in= 0, out= 0, add= 1, decay= 2, leak= 0.5|

var src, chain;

var key, chord, root;

src= Mix(InFeedback.ar(in, 2)); //mix input to mono

chain= FFT(b, src);

key= KeyTrack.kr(chain, decay, leak)+add;

key= Median.kr(11, key);

chord= if(key<12, #[0, 4, 7], #[0, 3, 7]);

root= if(key<12, key, key-12)+60;

Out.ar(out, Splay.ar(SinOsc.ar((root+chord).midicps, 0, 0.3)));

}).add;

SynthDef(\delay, {|in= 0, out= 0, time= 1|

var src= InFeedback.ar(in, 2);

src= DelayN.ar(src, 4, time.clip(0, 4));

Out.ar(out, src);

Out.ar(0, src+InFeedback.ar(in, 2)); //also send to speaker out

}).add;

)


a= Synth(\selfplaying, [\in, 10, \out, 12])

c= Synth(\delay, [\in, 12, \out, 10])


a.set(\add, 0)

c.set(\time, 0.2)

c.set(\time, 4)

a.set(\add, 0.5)

a.set(\add, -3)

c.set(\time, 1)

a.set(\decay, 0.1)

a.set(\leak, 0.1)

a.set(\decay, 3)

a.set(\add, 4)

a.set(\add, 5)


a.free

c.free

b.free



//reminder: upload with src mixed in




//--arpeggiator


b= Buffer.alloc(s, 4096, 1); //don't change if 44100

d= Buffer.read(s, "sounds/pop1.aiff");

(

SynthDef(\arp, {|in= 0, decay= 2, leak= 0.5, fftBuf, smpBuf|

var src, chain, key, step;

var trackb, trackh, trackq, tempo;

src= PlayBuf.ar(2, smpBuf, BufRateScale.ir(smpBuf), loop:1);

chain= FFT(fftBuf, Mix(src)); //mix input to mono

#trackb, trackh, trackq, tempo= BeatTrack.kr(chain);

key= KeyTrack.kr(chain, decay, leak);

step= Demand.kr(trackq, HPZ1.kr(key).abs>0, Dswitch1([Dseq([0, 4, 7, 4], inf), Dseq([0, 3, 7, 3], inf)], key>12));

Out.ar(0, Mix(src));

Out.ar(1, SinOsc.ar((if(key<12, key, key-12)+60+step).midicps, 0, 0.3));

}).add;

)

a= Synth(\arp, [\fftBuf, b, \smpBuf, d]);

a.set(\leak, 0.1)

a.set(\leak, 0.7)

a.set(\decay, 0.5)

a.free

b.free

d.free




//--vocoder (part of sc3-plugins)

(

{

var src= SoundIn.ar;

var exciter= LFSaw.ar(MouseX.kr(100, 400, 'exponential'));

Vocoder.ar(exciter, src, 20);

}.play(outbus:0)

)


(

{

var src= SoundIn.ar;

var pch= Pitch.kr(src, clar:1);

var vowel= LFSaw.ar(MouseX.kr(100, 400, 'exponential'));

var conso= WhiteNoise.ar;

var exciter= XFade2.ar(conso, vowel, pch[1].clip(0, 1).poll*2-1);

Vocoder.ar(exciter, src, 20);

}.play(outbus:0)

)



//--fft vocoder

(

SynthDef(\voco, {|out= 0, cons= 1, amp= 0.1|

var src, exc, chainA0, chainA1, chainB, x, freq;

src= SoundIn.ar([0, 1]);

freq= MouseX.kr(60, 2000, 'exponential');

x= (1-Pitch.kr(Mix(src), clar:1)[1])*cons;

exc= SelectX.ar(x, [LFSaw.ar(freq), WhiteNoise.ar]);

chainA0= FFT(LocalBuf(2048), src[0]);

chainA1= FFT(LocalBuf(2048), src[1]);

chainB= FFT(LocalBuf(2048), exc);

Out.ar(out, IFFT([PV_MagMul(chainA0, chainB), PV_MagMul(chainA1, chainB)])*0.5*amp);

}).add;

)

a= Synth(\voco)

a.free



//--or manual with bandpass filters and amplitude trackers

(

SynthDef(\voc2, {|out= 0, harm= #[654, 999, 1500], q= 0.1, atk= 0.01, rel= 0.1|

var src, exc, analyse, resynth, freq;

src= SoundIn.ar;

freq= MouseX.kr(60, 2000, 'exponential');

//exc= LFSaw.ar(freq);

//exc= LFPulse.ar(freq);

exc= Blip.ar(freq, MouseY.kr(2, 200, 'exponential'));

analyse= Amplitude.ar(BPF.ar(src, harm++freq, q), atk, rel, 10);

resynth= BPF.ar(exc, harm, q, analyse);

Out.ar(out, Mix(resynth)!2);

}).add;

)

a= Synth(\voc2)

a.set(\harm, [400, 500, 600])

a.set(\harm, [500, 1000, 1500])

a.set(\harm, [200, 250, 400])

a.free