//Demoes on the perception of rhythm



//s.bind and OffsetOut will be used in these demoes to get accurate timing of events; see the 'Precise Timing in SC' tutorial


SynthDef(\beep,{arg freq=440,amp=0.1, pan=0.0, dur=0.1; OffsetOut.ar(0,Pan2.ar(SinOsc.ar(freq,0,amp)*Line.kr(1,0,dur, doneAction:2),pan))}).add


//test 

Synth(\beep,[\freq, 440, \amp,1])




Example of timing sensitivity in spatialization


//An event is sent at equal volume to both ears but arrives at the right ear 1 millisecond ahead of the left. You will hear it coming from the right

//(demo works best over headphones)

(

{


s.bind{Synth(\beep,[\freq, 440,\amp,0.1,\pan,1])};


0.001.wait;


s.bind{Synth(\beep,[\freq, 440,\amp,0.1,\pan,-1])};


}.fork

)



//which came first? 30 msec difference between two tones (try different values)

(

{

s.bind{Synth(\beep,[\freq,440,\amp,0.1,\pan,0,\dur,0.1+0.03])};


0.03.wait;


s.bind{Synth(\beep,[\freq,560,\amp,0.1,\pan,0,\dur,0.1])};


}.fork

)





//how many events in these tuplets? (you may need to get someone else to test you, or add a randomising function like rrand(3,9) ) 

(

var n, delay;


n=4; //start increasing by 1


delay=0.4/n;


{


n.do {

s.bind{Synth(\beep,[\freq, 440,\amp,0.1,\pan,0])};


delay.wait;

}


}.fork

)





//how many duration categories?

(

var categories, n;


n=7;


categories=[0.25,0.33,0.4,0.5,0.6,0.67,0.75,0.8,1,1.25,1.5,1.75];


n = min(n,categories.size);


{


inf.do {

s.bind{Synth(\beep,[\freq, 440,\amp,0.1,\pan,0])};


(categories.wrapAt(n.rand)).wait;

}


}.fork

)





//limits of tempo

(

var tempo;


tempo=0.5; //bps 0.5 (2 second period), 4 (0.25 second period)


{

inf.do {

s.bind{Synth(\beep,[\freq, 440,\amp,0.1,\pan,0])};

1.wait;

}

}.fork(TempoClock(tempo))

)









//tempo discrimination test


t = TempoClock(2); 


(

{

inf.do {

s.bind{Synth(\beep,[\freq, 440,\amp,0.1,\pan,0])};

1.wait;

}

}.fork(t)

)


t.tempo= 2*(1.01); //try different values like 1.01, 1.04, 1.1 for the multiplier in brackets









//swing


w = 0.1; //variable to hold amount of swing in seconds


(

{

inf.do {|i|

s.bind{Synth(\beep,[\freq, 440,\amp,0.1,\pan,0])};

([1,-1]@@(i)*w + 0.25).wait; //@@ is wrapAt

}

}.fork(TempoClock(2))

)


w = 0.08; //try 0.0, 0.2

















//metric modulation 

//quintuplets become new pulsation level as tempo increases by 5/4

( 

var clock = TempoClock(1);  

 

{ 

 

 

5.do{|i| 

("iteration"+i).postln; 

 

{ 

 

//pulse beats 

8.do{ 

Synth(\beep,[\freq, 100, \amp,0.5]); 

1.0.wait;

}; 

 

}.fork(clock);  

 

 

{ 

 

(4*6).do{ 

Synth(\beep,[\freq, 100, \amp,0.5]); 

 

0.25.wait; 

}; 

 

(5*2).do{ 

Synth(\beep,[\freq, 100, \amp,0.5]); 

 

0.2.wait; 

}; 

 

 

}.fork(clock);  

 

8.wait;  

 

clock.tempo = clock.tempo*(5/4);  

 

}; 

 

}.fork(clock);  

 

)