new synthesis
This commit is contained in:
parent
eccdb21264
commit
11a906f725
17
synthesis/index.html
Normal file
17
synthesis/index.html
Normal file
@ -0,0 +1,17 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>http micro tempo</title>
|
||||
<script src="https://code.jquery.com/jquery-1.8.2.js"></script>
|
||||
<script src="https://jquery-csv.googlecode.com/git/src/jquery.csv.js"></script>
|
||||
<script src="https://raw.githubusercontent.com/mbostock/d3/master/d3.min.js"></script>
|
||||
<script src="lib/ssss.js"></script> <!-- data -->
|
||||
<script src="lib/yyyy.js"></script> <!-- audio -->
|
||||
<script src="lib/nnnn.js"></script> <!-- svg -->
|
||||
<script src="lib/tttt.js"></script> <!-- main -->
|
||||
<script src="lib/hhhh.js"></script> <!-- synth defs -->
|
||||
</head>
|
||||
<body>
|
||||
<svg id="track"></svg>
|
||||
</body>
|
||||
</html>
|
||||
55
synthesis/lib/hhhh.js
Normal file
55
synthesis/lib/hhhh.js
Normal file
@ -0,0 +1,55 @@
|
||||
|
||||
var modfactor = 750.0;
|
||||
var modfactor_gain = 10750.0;
|
||||
|
||||
function create_none_synth() {
|
||||
var s = new FMSynth('triangle', 100, 'saw', 2, 300);
|
||||
s.add_filter(new LowPassFilter());
|
||||
s.update = function(val) {
|
||||
this.modulator_freq(val / modfactor);
|
||||
};
|
||||
return s;
|
||||
}
|
||||
|
||||
function create_ad_synth() {
|
||||
var s = new SimpleOscillator('square', 100);
|
||||
s.add_filter(new NoiseConvolver());
|
||||
s.update = function(val) {
|
||||
this.modulator_freq(val / 25);
|
||||
};
|
||||
return s;
|
||||
}
|
||||
|
||||
function create_tracker_synth() {
|
||||
var s = new PinkNoiseGenerator();
|
||||
//s.add_filter(new NoiseConvolver());
|
||||
s.update = function(val) {
|
||||
this.modulator_gain(val / modfactor_gain);
|
||||
};
|
||||
return s;
|
||||
}
|
||||
|
||||
function create_analytics_synth() {
|
||||
var s = new WhiteNoiseGenerator();
|
||||
//s.add_filter(new DistortionShaper(55));
|
||||
s.update = function(val) {
|
||||
this.modulator_gain(val / modfactor_gain);
|
||||
};
|
||||
return s;
|
||||
}
|
||||
|
||||
function create_widget_synth() {
|
||||
var s = new PinkNoiseGenerator();
|
||||
s.update = function(val) {
|
||||
this.modulator_gain(val / modfactor_gain);
|
||||
};
|
||||
return s;
|
||||
}
|
||||
|
||||
function create_privacy_synth() {
|
||||
var s = new WhiteNoiseGenerator();
|
||||
s.update = function(val) {
|
||||
this.modulator_gain(val / modfactor_gain);
|
||||
};
|
||||
return s;
|
||||
}
|
||||
60
synthesis/lib/nnnn.js
Normal file
60
synthesis/lib/nnnn.js
Normal file
@ -0,0 +1,60 @@
|
||||
var refresh_rate_ms = 4;
|
||||
var bb;
|
||||
|
||||
function draw(url) {
|
||||
|
||||
if(/csv$/.test(url)) {
|
||||
url = url + '.svg';
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
d3.xml(url, function(xml) {
|
||||
svg_node = document.importNode(xml.documentElement, true);
|
||||
svg = d3.select('#track');
|
||||
svg.style('width', svg_node.width.baseVal.value);
|
||||
svg.style('height', svg_node.height.baseVal.value);
|
||||
svg.node().appendChild(svg_node);
|
||||
|
||||
d3.select(svg_node)
|
||||
.attr('id', 'svg_track');
|
||||
|
||||
// <input type="button" value="wwwwwwaaavves" onclick="start('wpt_05_[NY Times]_[Amsterdam]_object__filtered.csv')">
|
||||
var g = d3.select(svg_node).append('g');
|
||||
var b = g.append('foreignObject')
|
||||
.attr('x', '85')
|
||||
.attr('y', '350')
|
||||
.attr('width', '100')
|
||||
.attr('height', '100')
|
||||
.append('xhtml:body');
|
||||
bb = b.append('input')
|
||||
.attr('type', 'button')
|
||||
.attr('value', 'synthesise')
|
||||
.attr('onclick', 'go()');
|
||||
|
||||
var line = svg.append('svg:line')
|
||||
.attr('x1', 0)
|
||||
.attr('y1', 0)
|
||||
.attr('x2', 0)
|
||||
.attr('y1', svg_node.height.baseVal.value)
|
||||
.style('stroke', 'rgb(255,0,0)')
|
||||
.style('stroke-width', 1);
|
||||
|
||||
window.setInterval( function() {
|
||||
line.attr('x1', tick_cnt); //var tick_cnt = 0; // from ssss.js
|
||||
line.attr('x2', tick_cnt);
|
||||
}, refresh_rate_ms);
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function go() {
|
||||
if(bb.attr('value') == 'pause') {
|
||||
bb.attr('value', 'synthesise');
|
||||
stop_all_synths();
|
||||
} else {
|
||||
bb.attr('value', 'pause');
|
||||
start_all_synths();
|
||||
}
|
||||
}
|
||||
|
||||
193
synthesis/lib/ssss.js
Normal file
193
synthesis/lib/ssss.js
Normal file
@ -0,0 +1,193 @@
|
||||
var data = [];
|
||||
var start_times_dict = {};
|
||||
var end_times_dict = {};
|
||||
var start_times = [];
|
||||
var end_times = [];
|
||||
|
||||
var next_start = 0;
|
||||
var next_end = 0;
|
||||
|
||||
var processing_data = [];
|
||||
|
||||
// timer parameters
|
||||
var tick_cnt = 0; /// this is passed to the drawing
|
||||
var time_incr_ms = 2;
|
||||
var time_end = 0;
|
||||
var interval_id = 0;
|
||||
|
||||
var p = true;
|
||||
|
||||
var params = {
|
||||
"-" : {'bytes': 0, 'synth': null, 'active': 0},
|
||||
"ad" : {'bytes': 0, 'synth': null, 'active': 0},
|
||||
"tracker" : {'bytes': 0, 'synth': null, 'active': 0},
|
||||
"analytics" : {'bytes': 0, 'synth': null, 'active': 0},
|
||||
"widget" : {'bytes': 0, 'synth': null, 'active': 0},
|
||||
"privacy" : {'bytes': 0, 'synth': null, 'active': 0}
|
||||
};
|
||||
|
||||
function synthesise(csv_input_file_url) {
|
||||
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: csv_input_file_url,
|
||||
dataType: 'text',
|
||||
success: function(resp) {
|
||||
data = $.csv.toObjects(resp);
|
||||
start_times = {};
|
||||
end_times = {};
|
||||
|
||||
for(var i = 0; i < data.length; i++) {
|
||||
|
||||
var start = +data[i]['Start Time (ms)'];
|
||||
var end = +data[i]['End Time (ms)'];
|
||||
var size = +data[i]['Object Size'];
|
||||
|
||||
if(!(start in start_times_dict)) {
|
||||
start_times_dict[start] = [];
|
||||
}
|
||||
start_times_dict[start].push(i);
|
||||
|
||||
if(!(end in end_times_dict)) {
|
||||
end_times_dict[end] = [];
|
||||
}
|
||||
end_times_dict[end].push(i);
|
||||
|
||||
data[i].incr = linear_increment(start, end, size);
|
||||
data[i].incr_tick = 0;
|
||||
|
||||
if(end > time_end) time_end = end;
|
||||
}
|
||||
|
||||
$('#end').html(time_end);
|
||||
|
||||
start_times = Object.keys(start_times_dict);
|
||||
end_times = Object.keys(end_times_dict);
|
||||
|
||||
start_times.sort(function(a, b){
|
||||
return a - b;
|
||||
});
|
||||
end_times.sort(function(a, b) {
|
||||
return a - b;
|
||||
});
|
||||
|
||||
// create synths
|
||||
|
||||
params['-'].synth = create_none_synth();
|
||||
params['ad'].synth = create_ad_synth();
|
||||
params['tracker'].synth = create_tracker_synth();
|
||||
params['analytics'].synth = create_analytics_synth();
|
||||
params['widget'].synth = create_widget_synth();
|
||||
params['privacy'].synth = create_privacy_synth();
|
||||
|
||||
stop_all_synths();
|
||||
|
||||
interval_id = window.setInterval(tick, time_incr_ms);
|
||||
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.log("error loading -- " + csv_input_file);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function linear_increment(start_ms, end_ms, size_bytes) {
|
||||
return size_bytes / (end_ms - start_ms);
|
||||
}
|
||||
|
||||
function start_all_synths() {
|
||||
p = false;
|
||||
params['-'].synth.start();
|
||||
params['ad'].synth.start();
|
||||
params['tracker'].synth.start();
|
||||
params['analytics'].synth.start();
|
||||
params['widget'].synth.start();
|
||||
params['privacy'].synth.start();
|
||||
}
|
||||
|
||||
function stop_all_synths() {
|
||||
p = true;
|
||||
params['-'].synth.stop();
|
||||
params['ad'].synth.stop();
|
||||
params['tracker'].synth.stop();
|
||||
params['analytics'].synth.stop();
|
||||
params['widget'].synth.stop();
|
||||
params['privacy'].synth.stop();
|
||||
}
|
||||
|
||||
|
||||
function tick() {
|
||||
|
||||
if(p) return;
|
||||
|
||||
$('#time').html(tick_cnt);
|
||||
if(tick_cnt >= time_end + 1) {
|
||||
window.clearInterval(interval_id);
|
||||
stop_all_synths();
|
||||
} else if(tick_cnt == 0) {
|
||||
start_all_synths();
|
||||
}
|
||||
|
||||
if(start_times[next_start] == tick_cnt) {
|
||||
var start_indices = start_times_dict[tick_cnt];
|
||||
processing_data = processing_data.concat(start_indices)
|
||||
for(var i = 0; i < start_indices.length; i++) {
|
||||
var d = data[start_indices[i]]
|
||||
params[d.bug_type].active = params[d.bug_type].active + 1;
|
||||
}
|
||||
next_start++;
|
||||
}
|
||||
if(end_times[next_end] == tick_cnt) {
|
||||
|
||||
var end_indices = end_times_dict[tick_cnt];
|
||||
for(var i = 0; i < end_indices.length; i++) {
|
||||
var processing_indx = processing_data.indexOf(end_indices[i]);
|
||||
if(processing_indx != -1) {
|
||||
var d = data[end_indices[i]]
|
||||
processing_data.splice(processing_indx, 1);
|
||||
params[d.bug_type].bytes -= parseInt(d['Object Size']);
|
||||
params[d.bug_type].active = params[d.bug_type].active - 1;
|
||||
} else {
|
||||
console.log('not proccesed -- ' + end_indices[i]);
|
||||
}
|
||||
}
|
||||
|
||||
next_end++;
|
||||
}
|
||||
|
||||
for(var i = 0; i < processing_data.length; i++) {
|
||||
var d = data[processing_data[i]];
|
||||
params[d.bug_type].bytes += d.incr;
|
||||
d.incr_tick = d.incr_tick + 1;
|
||||
}
|
||||
|
||||
params['-'].synth.update(params['-'].bytes);
|
||||
params['ad'].synth.update(params['ad'].bytes);
|
||||
params['tracker'].synth.update(params['tracker'].bytes);
|
||||
params['analytics'].synth.update(params['analytics'].bytes);
|
||||
params['widget'].synth.update(params['widget'].bytes);
|
||||
params['privacy'].synth.update(params['privacy'].bytes);
|
||||
|
||||
// $('#none').html(params['-'].active);
|
||||
// $('#none_bytes').html(Math.ceil(params['-'].bytes));
|
||||
|
||||
// $('#ad').html(params['ad'].active);
|
||||
// $('#ad_bytes').html(Math.ceil(params['ad'].bytes));
|
||||
|
||||
// $('#tracker').html(params['tracker'].active);
|
||||
// $('#tracker_bytes').html(Math.ceil(params['tracker'].bytes));
|
||||
|
||||
// $('#analytics').html(params['analytics'].active);
|
||||
// $('#analytics_bytes').html(Math.ceil(params['analytics'].bytes));
|
||||
|
||||
// $('#widget').html(params['widget'].active);
|
||||
// $('#widget_bytes').html(Math.ceil(params['widget'].bytes));
|
||||
|
||||
// $('#privacy').html(params['privacy'].active);
|
||||
// $('#privacy_bytes').html(Math.ceil(params['privacy'].bytes));
|
||||
|
||||
|
||||
tick_cnt++;
|
||||
|
||||
}
|
||||
|
||||
20
synthesis/lib/tttt.js
Normal file
20
synthesis/lib/tttt.js
Normal file
@ -0,0 +1,20 @@
|
||||
|
||||
var svg_repo_url = "http://gauthiier.github.io/www-micro-temporalities/img/scores/";
|
||||
var csv_repo_url = "https://raw.githubusercontent.com/gauthiier/www-micro-temporalities/master/webpagetest/filtered/";
|
||||
|
||||
var data_ref = get_param('ref');
|
||||
|
||||
if(data_ref === "") {
|
||||
console.log('no ref aborting...');
|
||||
} else {
|
||||
console.log('ref: ' + data_ref);
|
||||
draw(svg_repo_url + data_ref);
|
||||
synthesise(csv_repo_url + data_ref);
|
||||
}
|
||||
|
||||
function get_param(name) {
|
||||
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
|
||||
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
|
||||
results = regex.exec(location.search);
|
||||
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
|
||||
}
|
||||
302
synthesis/lib/yyyy.js
Normal file
302
synthesis/lib/yyyy.js
Normal file
@ -0,0 +1,302 @@
|
||||
////////////
|
||||
////////////////////////////
|
||||
////////////
|
||||
|
||||
var AudioContext = window.AudioContext || window.webkitAudioContext;
|
||||
|
||||
var audioCtx = new AudioContext();
|
||||
|
||||
function Modulator(waveform, freq, gain) {
|
||||
// actual modulating freq
|
||||
this.osc = audioCtx.createOscillator();
|
||||
this.osc.type = waveform;
|
||||
this.osc.frequency.value = freq;
|
||||
// not sure about this -- but the gain is what modulates
|
||||
this.gain = audioCtx.createGain();
|
||||
this.gain.gain.value = gain;
|
||||
// connect
|
||||
this.osc.connect(this.gain);
|
||||
}
|
||||
|
||||
function Carrier(waveform, freq) {
|
||||
this.osc = audioCtx.createOscillator();
|
||||
this.osc.type = waveform;
|
||||
this.osc.frequency.value = freq;
|
||||
this.gain = audioCtx.createGain();
|
||||
this.osc.connect(this.gain);
|
||||
}
|
||||
|
||||
function FMSynth(waveform_c, freq_c, waveform_m, freq_m, gain_m) {
|
||||
|
||||
this.carrier = new Carrier(waveform_c, freq_c);
|
||||
this.modulator = new Modulator(waveform_m, freq_m, gain_m);
|
||||
|
||||
this.bitcrusher_filter = new BitCrusherFilter();
|
||||
|
||||
this.modulator.gain.connect(this.carrier.osc.frequency);
|
||||
this.carrier.gain.connect(audioCtx.destination);
|
||||
|
||||
this.started = false;
|
||||
|
||||
this.start = function() {
|
||||
if(!this.started) {
|
||||
this.carrier.osc.start();
|
||||
this.modulator.osc.start();
|
||||
this.started = true;
|
||||
} else {
|
||||
this.carrier.gain.gain.value = 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
this.stop = function() {
|
||||
this.carrier.gain.gain.value = 0.0;
|
||||
}
|
||||
|
||||
this.modulator_freq_incr = function(incr) {
|
||||
this.modulator.osc.frequency.value = this.modulator.osc.frequency.value + incr;
|
||||
}
|
||||
|
||||
this.modulator_freq = function(freq) {
|
||||
this.modulator.osc.frequency.value = freq;
|
||||
}
|
||||
|
||||
this.add_filter = function (filter) {
|
||||
this.filter = filter;
|
||||
this.carrier.osc.disconnect(this.carrier.gain);
|
||||
this.carrier.osc.connect(this.filter);
|
||||
this.filter.connect(this.carrier.gain);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function SimpleOscillator(waveform, freq) {
|
||||
|
||||
this.oscillator = new Carrier(waveform, freq);
|
||||
this.oscillator.gain.connect(audioCtx.destination);
|
||||
|
||||
this.started = false;
|
||||
|
||||
this.start = function() {
|
||||
if(!this.started) {
|
||||
this.oscillator.osc.start();
|
||||
this.started = true;
|
||||
} else {
|
||||
this.oscillator.gain.gain.value = 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
this.stop = function() {
|
||||
this.oscillator.gain.gain.value = 0.0;
|
||||
}
|
||||
|
||||
this.modulator_freq_incr = function(incr) {
|
||||
this.oscillator.osc.frequency.value = this.modulator.osc.frequency.value + incr;
|
||||
}
|
||||
|
||||
this.modulator_freq = function(freq) {
|
||||
this.oscillator.osc.frequency.value = freq;
|
||||
}
|
||||
|
||||
this.add_filter = function (filter) {
|
||||
this.filter = filter;
|
||||
this.oscillator.osc.disconnect(this.oscillator.gain);
|
||||
this.oscillator.osc.connect(this.filter);
|
||||
this.filter.connect(this.oscillator.gain);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
function WhiteNoiseGenerator() {
|
||||
|
||||
// generates 2 sec noise buffer
|
||||
var bufferSize = audioCtx.sampleRate * 2;
|
||||
var noiseBuffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate);
|
||||
var out = noiseBuffer.getChannelData(0);
|
||||
for(var i = 0; i < bufferSize; i++) {
|
||||
out[i] = Math.random() * 2 - 1;
|
||||
}
|
||||
|
||||
this.whitenoise = audioCtx.createBufferSource();
|
||||
this.whitenoise.buffer = noiseBuffer;
|
||||
this.whitenoise.loop = true;
|
||||
|
||||
this.gain = audioCtx.createGain();
|
||||
this.whitenoise.connect(this.gain);
|
||||
this.gain.connect(audioCtx.destination);
|
||||
|
||||
this.started = false;
|
||||
|
||||
this.start = function() {
|
||||
if(!this.started)
|
||||
this.whitenoise.start(0);
|
||||
this.started = true;
|
||||
}
|
||||
|
||||
this.stop = function() {
|
||||
this.gain.gain.value = 0.0;
|
||||
this.started = false;
|
||||
}
|
||||
|
||||
this.modulator_gain_incr = function(incr) {
|
||||
this.gain.gain.value = this.gain.gain.value + incr;
|
||||
}
|
||||
|
||||
this.modulator_gain = function(gain) {
|
||||
this.gain.gain.value = gain;
|
||||
}
|
||||
|
||||
this.add_filter = function(filter) {
|
||||
this.filter = filter;
|
||||
this.whitenoise.disconnect(this.gain);
|
||||
this.whitenoise.connect(this.filter);
|
||||
this.filter.connect(this.gain);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function PinkNoiseGenerator() {
|
||||
|
||||
var bufferSize = 4096;
|
||||
this.pinknoise = audioCtx.createScriptProcessor(bufferSize, 1, 1);
|
||||
var b0, b1, b2, b3, b4, b5, b6;
|
||||
b0 = b1 = b2 = b3 = b4 = b5 = b6 = 0.0;
|
||||
this.pinknoise.onaudioprocess = function(e) {
|
||||
var out = e.outputBuffer.getChannelData(0);
|
||||
for(var i = 0; i < bufferSize; i++) {
|
||||
var white = Math.random() * 2 - 1;
|
||||
b0 = 0.99886 * b0 + white * 0.0555179;
|
||||
b1 = 0.99332 * b1 + white * 0.0750759;
|
||||
b2 = 0.96900 * b2 + white * 0.1538520;
|
||||
b3 = 0.86650 * b3 + white * 0.3104856;
|
||||
b4 = 0.55000 * b4 + white * 0.5329522;
|
||||
b5 = -0.7616 * b5 - white * 0.0168980;
|
||||
out[i] = b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362;
|
||||
out[i] *= 0.11; // (roughly) compensate for gain
|
||||
b6 = white * 0.115926;
|
||||
}
|
||||
};
|
||||
|
||||
this.gain = audioCtx.createGain();
|
||||
this.pinknoise.connect(this.gain);
|
||||
this.gain.connect(audioCtx.destination);
|
||||
|
||||
this.started = false;
|
||||
|
||||
this.start = function() {
|
||||
}
|
||||
|
||||
this.stop = function() {
|
||||
this.gain.gain.value = 0.0;
|
||||
this.started = false;
|
||||
}
|
||||
|
||||
this.modulator_gain_incr = function(incr) {
|
||||
this.gain.gain.value = this.gain.gain.value + incr;
|
||||
}
|
||||
|
||||
this.modulator_gain = function(gain) {
|
||||
this.gain.gain.value = gain;
|
||||
}
|
||||
|
||||
this.add_filter = function(filter) {
|
||||
this.filter = filter;
|
||||
this.pinknoise.disconnect(this.gain);
|
||||
this.pinknoise.connect(this.filter);
|
||||
this.filter.connect(this.gain);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//////////// Filters
|
||||
|
||||
function BitCrusherFilter() {
|
||||
var bufferSize = 4096;
|
||||
var node = audioCtx.createScriptProcessor(bufferSize, 1, 1);
|
||||
node.bits = 14; // between 1 and 16
|
||||
node.normfreq = 0.1; // between 0.0 and 1.0
|
||||
var step = Math.pow(1/2, node.bits);
|
||||
var phaser = 0;
|
||||
var last = 0;
|
||||
node.onaudioprocess = function(e) {
|
||||
var input = e.inputBuffer.getChannelData(0);
|
||||
var output = e.outputBuffer.getChannelData(0);
|
||||
for (var i = 0; i < bufferSize; i++) {
|
||||
phaser += node.normfreq;
|
||||
if (phaser >= 1.0) {
|
||||
phaser -= 1.0;
|
||||
last = step * Math.floor(input[i] / step + 0.5);
|
||||
}
|
||||
output[i] = last;
|
||||
}
|
||||
};
|
||||
return node;
|
||||
}
|
||||
|
||||
function LowPassFilter() {
|
||||
var bufferSize = 4096;
|
||||
var node = audioCtx.createScriptProcessor(bufferSize, 1, 1);
|
||||
var prev = 0;
|
||||
node.onaudioprocess = function(e) {
|
||||
var input = e.inputBuffer.getChannelData(0);
|
||||
var out = e.outputBuffer.getChannelData(0);
|
||||
for (var i = 0; i < bufferSize; i++) {
|
||||
out[i] = (input[i] + prev) / 2.0;
|
||||
prev = out[i];
|
||||
}
|
||||
};
|
||||
return node;
|
||||
}
|
||||
|
||||
//////////// Convolvers
|
||||
|
||||
function NoiseConvolver() {
|
||||
var convolver = audioCtx.createConvolver();
|
||||
var noiseBuffer = audioCtx.createBuffer(2, 0.5 * audioCtx.sampleRate, audioCtx.sampleRate);
|
||||
var left = noiseBuffer.getChannelData(0);
|
||||
var rigth = noiseBuffer.getChannelData(1);
|
||||
for(var i = 0; i < noiseBuffer.length; i++) {
|
||||
left[i] = Math.random() * 2 - 1;
|
||||
rigth[i] = Math.random() * 2 - 1;
|
||||
}
|
||||
convolver.buffer = noiseBuffer;
|
||||
return convolver;
|
||||
}
|
||||
|
||||
//////////// WaveShapers
|
||||
|
||||
function DistortionShaper(distortion_val) {
|
||||
this.waveshaper = audioCtx.createWaveShaper();
|
||||
|
||||
this.makeDistortionCurve = function(amount) {
|
||||
var k = typeof amount === 'number' ? amount : 50,
|
||||
n_samples = 44100,
|
||||
curve = new Float32Array(n_samples),
|
||||
deg = Math.PI / 180,
|
||||
i = 0,
|
||||
x;
|
||||
for ( ; i < n_samples; ++i ) {
|
||||
x = i * 2 / n_samples - 1;
|
||||
curve[i] = ( 3 + k ) * x * 20 * deg / ( Math.PI + k * Math.abs(x) );
|
||||
}
|
||||
return curve;
|
||||
}
|
||||
|
||||
this.distortion = function(amount) {
|
||||
this.waveshaper.curve = this.makeDistortionCurve(amount);
|
||||
}
|
||||
|
||||
this.waveshaper.curve = this.makeDistortionCurve(distortion_val);
|
||||
|
||||
return this.waveshaper;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user