// class: envelope generator class EnvGen { 20.0 => float _rampTime; //smoothing Step _s => Envelope _e => blackhole; _rampTime::ms => _e.duration; fun void setRampTime(float rampTime) { rampTime => _rampTime; _rampTime::ms => _e.duration; } fun void target(float val) { _e.target(val); } fun float getSample() { return _e.last(); } } //class: effects class Effects { //fades in and then out volume/amplitude linearly fun float getVolume(DataReader dr){ float ampvol; 0.95 * Std.fabs(dr.getLength()/2 - dr.getCurrentPosition()) / (dr.getLength()/2) => ampvol; return (1.0 - ampvol); } //adds frequency adjustment for Doppler Effect fun float getDopplerFactor(DataReader dr){ float dopplerfactor; 0.5 * dr.getCurrentPosition() / dr.getLength() => dopplerfactor; return (0.5 + dopplerfactor); } } // class: sound player class Player { // TriOsc gives interesting tone // Pan2 p; // 1 => p.pan; // fun void setPan(){ // p.pan() * -0.5. => p.pan; } TriOsc _s => NRev _rev => dac; _rev.mix(0.05); EnvGen _amp, _freq; fun void setAmp(float amp) { _amp.target(amp); } fun void setFreq(float freq) { _freq.target(freq); } fun void setRampTime(float rampTime) { _amp.setRampTime(rampTime); _freq.setRampTime(rampTime); } fun void _run() { while(true) { _amp.getSample() => _s.gain; _freq.getSample() => _s.freq; 1::samp => now; } } spork ~ _run(); // run immediately } // ----------------------------------------------------- //Datasets for average monthly temperatures from 1944-2011 at Antarctic stations "bellinghausen.csv" => string HighAsteroid; "amundsen-scott south pole station.csv" => string MidAsteroid; "scott base.csv" => string LowAsteroid; DataReader dr1; DataReader dr2; DataReader dr3; Player ply1; Player ply2; Player ply3; Effects fx1; Effects fx2; Effects fx3; dr1.load(HighAsteroid); if (!dr1.isValid()) me.exit(); dr2.load(MidAsteroid); if (!dr2.isValid()) me.exit(); dr3.load(LowAsteroid); if (!dr3.isValid()) me.exit(); // players 100.0 => float rampTime; ply1.setRampTime(rampTime); ply2.setRampTime(rampTime); ply3.setRampTime(rampTime); while(dr2.next()) { //while(dr1.next()){ //while(dr2.next()){ //dr1.getNormalized() => float w; dr2.getNormalized() => float x; //dr3.getNormalized() => float y; // ply1.setAmp(fx1.getVolume(dr1)); ply2.setAmp(fx2.getVolume(dr2)); // ply3.setAmp(fx3.getVolume(dr3)); // ply1.setFreq(Std.mtof(80.0 + w * 10.0) * fx1.getDopplerFactor(dr1)); ply2.setFreq(Std.mtof(50.0 + x * 5.0) * fx2.getDopplerFactor(dr2)); //ply3.setFreq(Std.mtof(48.0 + y * 20.0) * fx3.getDopplerFactor(dr3)); //ply2.setPan(); rampTime::ms => now; }