(function () { var audio = document.querySelector('#player') var canvas = document.querySelector('#visualizer') var playbar = document.querySelector('.playing-bar') var ctx = canvas.getContext('2d') var context var src var analyser var bufferLength var dataArray var barHeight var x = 0 function start () { context = new AudioContext() src = context.createMediaElementSource(audio) analyser = context.createAnalyser() src.connect(analyser) analyser.connect(context.destination) analyser.fftSize = 256 bufferLength = analyser.frequencyBinCount dataArray = new Uint8Array(bufferLength) if (!analyser.getByteFrequencyData) { console.error('This browser sucks. No visualizer for you :(') return } renderFrame() } var WIDTH = canvas.width var HEIGHT = canvas.height var barWidth function convenientSizer () { canvas.width = playbar.clientWidth canvas.height = 40 WIDTH = canvas.width HEIGHT = canvas.height } function renderFrame () { requestAnimationFrame(renderFrame) barWidth = (WIDTH / bufferLength) * 2.5 x = 0 analyser.getByteFrequencyData(dataArray) ctx.clearRect(0, 0, WIDTH, HEIGHT) for (var i = 0; i < bufferLength; i++) { barHeight = dataArray[i] var r = 50 var g = barHeight + (i / bufferLength) var b = 250 * (i / bufferLength) const realAdjusted = barHeight * (HEIGHT / analyser.fftSize) ctx.fillStyle = 'rgb(' + r + ',' + g + ',' + b + ')' ctx.fillRect(x, HEIGHT - realAdjusted, barWidth, realAdjusted) x += barWidth + 1 } } window.addEventListener('resize', convenientSizer) window.resumeAnalyzer = function () { if (!context) start() return context } convenientSizer() })()