//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