Numbers Station
by Soviut
HTML
<h1>Numbers Station</h1>
<p>A never ending stream of random numbers read aloud.</p>
CSS
* {
font-family: arial, helvetica, san-serif;
}
JavaScript
let delay = 5000;
let min = 0;
let max = 1000;
let speak = function() {
let num = Math.floor(Math.random() * (max - min)) + min
window.speechSynthesis.speak(new SpeechSynthesisUtterance('' + num))
setTimeout(speak, delay)
}
speak()
// DRONE
var context = new AudioContext();
//connect gain
var gain = context.createGain();
gain.gain.value = 0.25;
gain.connect(context.destination);
var noiseNodes = [];
var bufferLen = 4096;
function createNoiseGen(freq) {
var panner = context.createPanner();
var max = 20;
var min = -20;
var x = rand(min, max);
var y = rand(min, max);
var z = rand(min, max);
panner.setPosition(x, y, z);
panner.connect(gain);
var filter = context.createBiquadFilter();
filter.type = filter.BANDPASS;
filter.frequency.value = freq;
filter.Q.value = 50;
filter.connect(panner);
var noiseSource = context.createScriptProcessor(bufferLen, 1, 2);
noiseSource.onaudioprocess = function (e) {
var outBufferL = e.outputBuffer.getChannelData(0);
var outBufferR = e.outputBuffer.getChannelData(1);
for (var i = 0; i < bufferLen; i++) {
outBufferL[i] = outBufferR[i] = Math.random() * 2 - 1;
}
};
noiseSource.connect(filter);
noiseNodes.push(noiseSource);
setInterval(function () {
x = x + rand(-0.1, 0.1);
y = y + rand(-0.1, 0.1);
z = z + rand(-0.1, 0.1);
panner.setPosition(x, y, z);
}, 500);
}
var scale = [0.0, 2.0, 4.0, 6.0, 7.0, 9.0, 11.0, 12.0, 14.0];
function generate(base_note, num_osc){
for (var i = 0; i < num_osc; i++) {
var degree = Math.floor(Math.random() * scale.length);
var freq = mtof(base_note + scale[degree]);
freq += Math.random() * 4 - 2;
createNoiseGen(freq);
}
}
function mtof(m) {
return Math.pow(2, (m - 69) / 12) * 440;
}
function rand(min, max) {
return Math.random() * (max - min) + min;
}
function reset(){
while (noiseNodes.length){
noiseNodes.pop().disconnect();
}
generate();
}
generate(51, 16);