/*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])); )