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);