Ocean Granulator

Running The SuperCollider Program

The data produces a spectrum that is focused on low frequencies. In order to remove the direct current, a High Pass Filter at 30 Hertz needed to be applied. The resulting sound suggests a sound mass composition. With the granulator running, I have begun experimenting with different alterations to create an interesting composition. Here are some observations and alterations that I have explored. 


1.   Layering of multiple years giving each a unique playback rate generates a unique evolving mass

2.   The adjustment of the Mouse X position seems akin to adjusting the sails to the current conditions, where multidimensional data is being effected by how the boat/trigger rate is positioned.

3.   The addition of interpolation between values makes for a more fluid sound.

4.   Modulation of the audio file by the control signal produces interesting results.

5.   Changing the amount of divisions of the each trigger makes for a more less pointelisitc sound mass.

6. Placing this in an Ambisonic quadraphonic setting is far more interesting than a stereo space. 

 

SuperCollider Code

(
s = Server.internal;
Server.default = s;
s.boot;
)

(
//2005 files
s.sendMsg(\b_allocRead, 10, "sounds/240Project/2005E_2_32bit.wav"); //continuous wind data file  -->this is the file that is fgranulated
s.sendMsg(\b_allocRead, 11, "sounds/240Project/2005E_APD.wav"); //Average Period of Wave Data ---> map 2 min of dur (which is white noise)
s.sendMsg(\b_allocRead, 12, "sounds/240Project/2005E_DPD.wav");  //Dominant Wave Period  -->map 2 max of dur (which is white noise)
s.sendMsg(\b_allocRead, 13, "sounds/240Project/2005E_WVHT.wav");  //Wave Hight  -->mapt 2 AMP
s.sendMsg(\b_allocRead, 14, "sounds/240Project/2005E_WDIR.wav");  //Wind Direction  -->map 2 Pan
//2006 files
s.sendMsg(\b_allocRead, 20, "sounds/240Project/2006E_2_32bit.wav");
s.sendMsg(\b_allocRead, 21, "sounds/240Project/2006E_APD.wav");
s.sendMsg(\b_allocRead, 22, "sounds/240Project/2006E_DPD.wav");
s.sendMsg(\b_allocRead, 23, "sounds/240Project/2006E_WVHT.wav");
s.sendMsg(\b_allocRead, 24, "sounds/240Project/2006E_WDIR.wav");
//2007 files
s.sendMsg(\b_allocRead, 30, "sounds/240Project/2007E_2_32bit.wav");
s.sendMsg(\b_allocRead, 31, "sounds/240Project/2007E_APD.wav");
s.sendMsg(\b_allocRead, 32, "sounds/240Project/2007E_DPD.wav");
s.sendMsg(\b_allocRead, 33, "sounds/240Project/2007E_WVHT.wav");
s.sendMsg(\b_allocRead, 34, "sounds/240Project/2007E_WDIR.wav");
//2008 files
s.sendMsg(\b_allocRead, 40, "sounds/240Project/2008E_2_32bit.wav");
s.sendMsg(\b_allocRead, 41, "sounds/240Project/2008E_APD.wav");
s.sendMsg(\b_allocRead, 42, "sounds/240Project/2008E_DPD.wav");
s.sendMsg(\b_allocRead, 43, "sounds/240Project/2008E_WVHT.wav");
s.sendMsg(\b_allocRead, 44, "sounds/240Project/2008E_WDIR.wav");
//2009 files
s.sendMsg(\b_allocRead, 50, "sounds/240Project/2009E_2_32bit.wav");
s.sendMsg(\b_allocRead, 51, "sounds/240Project/2009E_APD.wav");
s.sendMsg(\b_allocRead, 52, "sounds/240Project/2009E_DPD.wav");
s.sendMsg(\b_allocRead, 53, "sounds/240Project/2009E_WVHT.wav");
s.sendMsg(\b_allocRead, 54, "sounds/240Project/2009E_WDIR.wav");
)
(   SynthDef(\syno,
 {
 arg 
bufSet = 10,//possible buffsets-10,20,30,40,50 for 2005,2006,2007,2008,2009
ctLngth = 8000 ,//size of control bufs generallyl 8691 samples
trateMul =1.0,
rateOffSet = 0,
durDiv = 28;

var trate, dur, trig, indexPtrn, a, l, h, amp, rate, startPos, durN, pan, snd;
//trate = EnvGen.kr(Env.new([10, 200, 200, 40, 20, 500], [0.8, 2, 0.01, 0.8, 2]));
 trate = MouseX.kr(0, MouseY.kr(100,850), 0, 0.1)*trateMul;
trig = Impulse.kr(trate); //trig that goes through file 
indexPtrn = Dseq([Dseries(0, 1, ctLngth)], inf);

rate = 1+rateOffSet;//Demand.kr(trig, 0, Dbufrd(2+bufSet,indexPtrn))+rateOffSet; // can be a constant of Dominant Wave period
amp = Demand.kr(trig, 0, Dbufrd((3+bufSet),indexPtrn)*0.1); //Wave hight is mapped to Amplitude
startPos = (Stepper.kr(trig, 0,  0, 8001, 1) * ( BufDur.ir(0+bufSet) / 8001.0));  //read head position.  -- use .poll here to see where you are

l = Demand.kr(trig, 0, Dbufrd((1+bufSet),indexPtrn));
h = Demand.kr(trig, 0, Dbufrd((2+bufSet),indexPtrn));
durN = (Dwhite(l,h,inf)*durDiv)/trate; //Dominanat and Average wave period mapped to limits of GRAIN DURATION which is choosen randomly  

w = Demand.kr(trig, 0, Dbufrd((4+bufSet),indexPtrn));
pan = (w * 2) - 1;  //wind direction mapped to PANNING

snd = TGrains.ar(2, trig, bufSet, rate*BufRateScale.ir(bufSet), startPos + (durN/2), durN, pan, amp, 4 );
Out.ar(0,HPF.ar(snd, 30));
}).send;
)

(
a = Synth(\syno);
b = Synth(\syno, [\trateMul, 1.01, \rateOffSet, 1, \bufSet, 20]);  //\durDiv, 68
c = Synth(\syno, [\trateMul, 1.01, \rateOffSet, 2, \bufSet, 30]);
d = Synth(\syno, [\trateMul, 1.01, \rateOffset, 3, \bufSet, 40]);
e = Synth(\syno, [\trateMul, 1.01, \rateOffSet, 4, \bufSet, 50]);
f = Synth(\syno, [\trateMul, 1.01, \rateOffSet, 5.1, \bufSet, 10]);

g = Synth(\syno, [\trateMul, 1.01, \rateOffSet, -0.01, \bufSet, 20, \durDiv, 68]);  //\durDiv, 68
h = Synth(\syno, [\trateMul, 1.01, \rateOffSet, -0.22, \bufSet, 30, \durDiv, 10]);
i = Synth(\syno, [\trateMul, 1.01, \rateOffset, 2, \bufSet, 40, \durDiv, 27]);
j = Synth(\syno, [\trateMul, 1.01, \rateOffSet, 36.06, \bufSet, 50, \durDiv, 122]);
k = Synth(\syno, [\trateMul, 1.01, \rateOffSet, 47.1, \bufSet, 10, \durDiv, 168]);

l = Synth.after(b,"syno", ["out",0]);  //this will replace b when it has stopped
)

a.free;
b.free;
c.free;
d.free;
e.free;
f.free;
g.free;
h.free;
i.free;
j.free;
k.free;

Sound Examples

Example One

Example Two

Example Three

Example Four

Example Five





Composition Example : OceanDropsV1 :