//practical sound analysis - fredrik olofsson
//organized by lullcec 28-30oct 2011, hangar, barcelona
//--session #03
//--fft
//--beat tracking
//autocorrelation beat tracking - click and hold mouse down to lock beat
(
SynthDef(\beat, {|buffer|
var src, chain, buf;
var trackb, trackh, trackq, tempo;
buf= LocalBuf(1024); //don't change if 44100
src= PlayBuf.ar(2, buffer, BufRateScale.ir(buffer), loop: 1);
//src= SoundIn.ar;
chain= FFT(buf, Mix(src));
#trackb, trackh, trackq, tempo= BeatTrack.kr(chain, MouseButton.kr).poll;
Out.ar(0, DelayN.ar(src, 0.08, 0.08)+SinOsc.ar(400, 0, Decay.kr(trackb, 0.1)));
}).add;
)
d= Buffer.read(s, "sounds/pop3.aiff")
a= Synth(\beat, [\buffer, d])
a.free
d.free
//test filtering the src[0]
//test delaying the output src 0.05 sec
//see BeatTrack and BeatTrack2 helpfile
key <12 major
key >=12 minor
2 dmaj
12+2= 14 dmin
0-23
14-12
//--key tracking
b= Buffer.alloc(s, 4096, 1); //don't change if 44100
(
SynthDef(\key, {|buffer|
var src, chain;
var key, root, chord;
src= PlayBuf.ar(2, buffer, BufRateScale.ir(buffer), loop: 1);
//src= SoundIn.ar;
chain= FFT(b, Mix(src));
key= KeyTrack.kr(chain, 2, 0.5).poll;
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(0, src+Splay.ar(SinOsc.ar((root+chord).midicps, 0, 0.1)));
}).add;
)
d= Buffer.read(s, "sounds/pop3.aiff")
a= Synth(\key, [\buffer, d])
a.free
d.free
b.free
//just a simple test playing a chord for comparison
a= {Splay.ar(LFSaw.ar(([0, 3, 7, 10]+2+60).midicps, 0, 0.1))}.play
a.free
//--exercise - chord tracking
//build a selfplaying arpeggiator
//see PracticalSoundAnalysis03examples.html
//--advanced topics, other low / high-level descriptors
//introduce chromagram
http://web.media.mit.edu/~tristan/phd/dissertation/chapter3.html
//--the phase vocoder
//--tracking harmonic partials
//--low-level feature extraction vs high-level descriptors
//--exercise - feedback
//use one of the previous exercises and let it analyze its own output (with a variable delay)
//or work on free choice / own project