Simple Audio Visualizer

by Niklas Knaack

HTML

<a id="btStartAudioVisualization" class="bt">Start Audio Visualization</a>

CSS

html, body, div {
  margin: 0;
  padding: 0;
  border: 0;
}
body {
  overflow: hidden;
  background-color:#000;
}
.bt {
	-moz-box-shadow:inset 0px 1px 0px 0px #54a3f7;
	-webkit-box-shadow:inset 0px 1px 0px 0px #54a3f7;
	box-shadow:inset 0px 1px 0px 0px #54a3f7;
	background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #007dc1), color-stop(1, #0061a7));
	background:-moz-linear-gradient(top, #007dc1 5%, #0061a7 100%);
	background:-webkit-linear-gradient(top, #007dc1 5%, #0061a7 100%);
	background:-o-linear-gradient(top, #007dc1 5%, #0061a7 100%);
	background:-ms-linear-gradient(top, #007dc1 5%, #0061a7 100%);
	background:linear-gradient(to bottom, #007dc1 5%, #0061a7 100%);
	background-color:#007dc1;
	-moz-border-radius:3px;
	-webkit-border-radius:3px;
	border-radius:3px;
	border:1px solid #124d77;
	display:inline-block;
	cursor:pointer;
	color:#ffffff;
	font-family:Arial;
	font-size:13px;
	padding:6px 24px;
	text-decoration:none;
	text-shadow:0px 1px 0px #154682;
}
.bt:hover {
	background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #0061a7), color-stop(1, #007dc1));
	background:-moz-linear-gradient(top, #0061a7 5%, #007dc1 100%);
	background:-webkit-linear-gradient(top, #0061a7 5%, #007dc1 100%);
	background:-o-linear-gradient(top, #0061a7 5%, #007dc1 100%);
	background:-ms-linear-gradient(top, #0061a7 5%, #007dc1 100%);
	background:linear-gradient(to bottom, #0061a7 5%, #007dc1 100%);
	background-color:#0061a7;
}
.bt:active {
	position:relative;
	top:1px;
}
#btStartAudioVisualization {
  position: absolute;
  top: 10px;
  left: 10px;
}
}

JavaScript

/*
Atlantis by Audionautix (http://audionautix.com) is part of the YouTube Audio Library (https://www.youtube.com/audiolibrary/music) and it's licensed under a Creative Commons license (https://creativecommons.org/licenses/by/3.0/deed.en_US).
*/
//---

var audio, audioContext, audioSrc;
var analyser, analyserBufferLength;

//---

var w;
var h;

var center2D;

var btStart;
var canvas;
var context;

var imageData;
var data;

var circleSegments = 512;
var circleHolder = [
	
  { radius:100, segments:circleSegments, points:[], color:{ r:237, g:254, b:255, a:255 }, thetaStart:0, thetaLength:Math.PI * 2, frequencyFactor: 1.00 },
	{ radius:95,  segments:circleSegments, points:[], color:{ r:217, g:254, b:255, a:255 }, thetaStart:0, thetaLength:Math.PI * 2, frequencyFactor: 2.00 },
  { radius:90,  segments:circleSegments, points:[], color:{ r:118, g:164, b:179, a:255 }, thetaStart:0, thetaLength:Math.PI * 2, frequencyFactor: 4.00 },
  { radius:85,  segments:circleSegments, points:[], color:{ r:58, g:105, b:121, a:255 },  thetaStart:0, thetaLength:Math.PI * 2, frequencyFactor: 8.00 },
  { radius:80,  segments:circleSegments, points:[], color:{ r:41, g:79, b:90, a:255 },    thetaStart:0, thetaLength:Math.PI * 2, frequencyFactor: 10.00 },
  { radius:75,  segments:circleSegments, points:[], color:{ r:24, g:50, b:63, a:255 },    thetaStart:0, thetaLength:Math.PI * 2, frequencyFactor: 12.00 },
  { radius:70,  segments:circleSegments, points:[], color:{ r:12, g:25, b:31, a:255 },    thetaStart:0, thetaLength:Math.PI * 2, frequencyFactor: 14.00 }
  
];

//---

function init() {

  canvas = document.createElement( 'canvas' );
  canvas.addEventListener( 'mousedown', mouseDownHandler, false );

  document.body.appendChild( canvas );

  context = canvas.getContext( '2d' );

	window.addEventListener( 'resize', onResize );
  onResize();
  
  for ( var i = 0, l = circleHolder.length; i < l; i++ ) {
  
    drawCircle( center2D, circleHolder[ i ] );
  
  }
  
  context.putImageData(...