// class: envelope generator class EnvGen { 200.0 => float _rampTime; Step _s => Envelope _e => blackhole; _rampTime::ms => _e.duration; fun void setRampTime(float rampTime) { rampTime => _rampTime; } fun void target(float val) { _e.target(val); } fun float getSample() { return _e.last(); } } // class: sound player class Player { SinOsc _s => NRev _rev => Modulate _mod => PitShift _pit => dac; _rev.mix(0.05); _pit.mix(0.1); _pit.shift(10); _mod.vibratoRate(50); _mod.vibratoGain(0.5); EnvGen _amp, _freq; fun void setVibrato (float rate, float gain) { _mod.vibratoRate(rate); _mod.vibratoGain(gain); } fun void setShift(float mix, float shift) { _pit.mix(mix); _pit.shift(shift); } 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 } // ----------------------------------------------------- "E:/Google Drive/Stanford/Senior Year/Music220A/HW1/" => string dataDir; spork ~ go("data-champagne.txt", "data-cars.txt", "data-milk.txt", "data-ibm.txt"); fun void go(string file1, string file2, string file3, string file4) { DataReader dr1; dr1.load(dataDir + file1); if (!dr1.isValid()) me.exit(); DataReader dr2; dr2.load(dataDir + file2); if (!dr2.isValid()) me.exit(); DataReader dr3; dr3.load(dataDir + file3); if (!dr3.isValid()) me.exit(); DataReader dr4; dr4.load(dataDir + file4); if (!dr4.isValid()) me.exit(); Player ply; 400.0 => float rampTime; ply.setRampTime(rampTime); while(dr1.next() | dr2.next() | dr3.next() | dr4.next()) { dr1.getNormalized() => float w1; dr2.getNormalized() => float w2; dr3.getNormalized() => float w3; dr4.getNormalized() => float w4; ply.setAmp(0.5 * Math.pow(w4, 2.0)); ply.setFreq(Std.mtof(80.0 + w3 * 20.0)); ply.setVibrato(100.0 + w1 * 400.0, 0.2); ply.setShift(Math.pow(w2, 3.0), w2 * 20); rampTime::ms => now; } } 1::day => now;