206 lines
4.8 KiB
Plaintext
206 lines
4.8 KiB
Plaintext
/*RUN*/
|
||
(
|
||
s.options.numInputBusChannels = 4;
|
||
s.options.numOutputBusChannels = 4;
|
||
|
||
~dataPath = "/home/rizoma/witw/data/"; // CHANGE THIS TO RELATIVE PATH
|
||
~devices = ["D7:80:BE:2C:63:BD", "F1:CC:C3:0B:7F:5C"];
|
||
|
||
s.waitForBoot{
|
||
|
||
// create 8 control busses to pass data between synths
|
||
~ctrlBus = 8.collect({arg i; Bus.control(s,1); });
|
||
|
||
// define synths
|
||
SynthDef(\sgrain, { | out=0, atk=0.01, dcy=0.01, freq=100, pan=0, amp=1|
|
||
var sig, env;
|
||
env = EnvGen.ar(Env.perc(atk, dcy), doneAction: 2);
|
||
sig = FSinOsc.ar(freq);
|
||
sig = sig * (env * amp);
|
||
sig = Pan2.ar(sig, pan);
|
||
Out.ar(out, sig);
|
||
Out.kr(~ctrlBus[0],freq);
|
||
}).add;
|
||
|
||
SynthDef(\sslew, {
|
||
| out = 0, freq=100, amp = 0.7, slewrate = 1|
|
||
var sig, z;
|
||
// add slew rate on frequency
|
||
z = Slew.kr(freq, slewrate, slewrate);
|
||
sig = BPF.ar(PinkNoise.ar(), z, 6 );
|
||
//sig = Blip.ar(z, 5, amp).dup;
|
||
Out.ar(out, sig)
|
||
}).add;
|
||
|
||
SynthDef.new(\sine, {
|
||
arg freq=440, panfreq=0.3, panphase=0.5, rel=0.5, gate=0, amp=0.0001;
|
||
var sig;
|
||
sig = SinOsc.ar(freq);
|
||
sig = sig * EnvGen.kr(Env.perc(0.04,rel), doneAction:2);
|
||
sig = Pan2.ar(sig, FSinOsc.kr(panfreq, panphase));
|
||
sig = sig * amp;
|
||
Out.ar(0, sig);
|
||
}).add;
|
||
|
||
// load and process the data source /////////////////////////////////
|
||
~csvFile=CSVFileReader.read(~dataPath ++ ~devices[0] ++ "/" ++ "sensor_data.csv",true,true);
|
||
// flatten ~data from 2D Array to regular array (per column);
|
||
~data = ( ~csvFile[0].size ).collect({ arg itt;
|
||
Array.fill( ~csvFile.size-1,{ arg i;
|
||
~csvFile.at(i+1).asArray.at(itt)}); // +1 to skip the column name
|
||
});
|
||
|
||
~data[2]; // Temperature C
|
||
~data[3]; // F
|
||
~data[10]; // wind speed MPH
|
||
~data[11]; // wind direction
|
||
~data[13]; // wind gusts MPH
|
||
~data[5]; // rain bucket capacity
|
||
~data[6]; // rain bucket tips per minute?
|
||
~data[20]; // LON
|
||
~data[21]; // LAT
|
||
|
||
// normalize data ranges //////
|
||
|
||
~date=~data[0];
|
||
~freq=~data[2].asFloat.normalize(0, 400);
|
||
~atk=~data[4].asFloat.normalize(0.02, 0.04);
|
||
~dcy=~data[2].asFloat.normalize(0.05, 0.1);
|
||
~dur=~data[2].asFloat.normalize(0.1, 0.1);
|
||
~level=~data[2].asFloat.normalize(0, 0);
|
||
|
||
//start the slewing synth /////////////////////////////
|
||
|
||
//~sslew1 = Synth(\sslew,[\out,0,\freq,220,\amp,0,\slewrate,1000]);
|
||
//~sslew1.map(\freq, ~ctrlBus[0]); // map control bus to freq parameter
|
||
//o = OSCFunc({ |msg| msg.postln }, '/tr', s.addr);
|
||
|
||
|
||
~ce = Array.new(maxSize: 20);
|
||
// perform the data sonification /////////////////////
|
||
|
||
/* ( p = Pbind(\instrument, \sgrain,
|
||
\freq, Pseq(~freq.round(30),1),
|
||
\atk, Pseq(~atk,1).poll,
|
||
\dcy, Pseq(~dcy,1),
|
||
\pan, Pseq([0,1], inf),
|
||
\dur, Pseq(~dur,1),
|
||
\amp, Pseq(~level, 1),
|
||
\date, Pseq(~date, 1 )
|
||
).collect{ arg i; i.postln; });*/
|
||
|
||
~gr = Group.new;
|
||
~pitchset = [20,40,60,80].midicps;
|
||
|
||
Pdef(\c,
|
||
Pspawner({ | sp |
|
||
8.do { | i |
|
||
sp.par(
|
||
// Pdefn (~ce[i],
|
||
Pbind( *[
|
||
\instrument, \sine,
|
||
\dur, Pseq(Array.geom(30, rrand(1,1.5), rrand(0.98,0.99)).mirror,1),
|
||
\freq, exprand(~pitchset[0],~pitchset[0]*100).round(~pitchset[0]),
|
||
\panfreq, rrand(0.1, 2.2),
|
||
\amp, 0.05,
|
||
\panphase, rrand(-1.0,1.0),
|
||
\rel, exprand(1.5,3.35),
|
||
//\gate, 0,
|
||
\group, ~gr
|
||
]);
|
||
//)
|
||
);
|
||
sp.wait(1);
|
||
};
|
||
});
|
||
).play;
|
||
|
||
|
||
|
||
//Pdefn (\c, Pbind( \freq, exprand(~pitchset[0],~pitchset[0]*100).round(~pitchset[0])))
|
||
|
||
~dur = PatternProxy.new;
|
||
~deg = PatternProxy.new;
|
||
~oct = PatternProxy.new;
|
||
~voc = PatternProxy.new;
|
||
~amp = PatternProxy.new;
|
||
~sca = PatternProxy.new;
|
||
~rel = PatternProxy.new;
|
||
|
||
~dur.source = Pseq(Array.geom(30, rrand(1,1.5), rrand(0.98,0.99)).mirror,inf);
|
||
~deg.source = Prand([0,5,7],inf);
|
||
~oct.source = Prand([2,3,4],inf);
|
||
~voc.source = 4;
|
||
~amp.source = Pwhite(0.001, 0.1,inf);
|
||
~sca.source = Scale.harmonicMinor;
|
||
~rel.source = Pexprand(1.5,3.35, inf);
|
||
|
||
Pdef(\c, Pspawner({ | sp | 8.do { | i | sp.par(
|
||
Pbind( *[
|
||
\instrument, \sine,
|
||
\dur, ~dur,
|
||
\scale, ~sca,
|
||
\degree, ~deg,
|
||
\octave, ~oct,
|
||
//\freq, exprand(~pitchset[0],~pitchset[0]*80).round(100),
|
||
\panfreq, rrand(0.1, 2.2),
|
||
\amp, ~amp,
|
||
\panphase, rrand(-1.0,1.0),
|
||
\rel, ~rel,
|
||
//\rel, exprand(1.5,3.35),
|
||
|
||
\group, ~gr
|
||
]);
|
||
);
|
||
sp.wait(1);
|
||
};
|
||
});
|
||
).play;
|
||
|
||
s.plotTreeView;
|
||
}; // closes s.waitForBoot
|
||
|
||
~dur.source = Pseq(Array.geom(30, rrand(1,1.5), rrand(0.98,0.99)).mirror,inf);
|
||
~dur.source = Pseq([1.5],inf);
|
||
|
||
//~voc.source = 1;
|
||
~oct.source = Prand([3,4],inf);
|
||
~deg.source = Prand([0,4,7,9,11],inf);
|
||
~sca.source = Scale.chromatic;
|
||
~rel.source = Pexprand(1.1,10.5, inf);
|
||
~amp.source = Pwhite(0.001, 0.00,inf);
|
||
|
||
(
|
||
r = Routine {
|
||
199.yield;
|
||
189.yield;
|
||
Routine { 100.do { |i| i.yield } }.idle(6);
|
||
199.yield;
|
||
189.yield;
|
||
};
|
||
|
||
fork {
|
||
loop {
|
||
r.value.postln;
|
||
1.wait;
|
||
}
|
||
}
|
||
);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
c.set(\amp, 0.2);*/
|
||
|
||
//~gr.set(\amp, 0.001);
|
||
//~gr.set(\freq, exprand(~pitchset[0],~pitchset[0]*100).round(~pitchset[0]));
|
||
|
||
)
|
||
|
||
|