JSFiddle - React, Tailwind, and code Playground
HTML
<div id="container">
<div class="bar" id="mono">
<div class="fill" id="monoFill"></div>
</div>
</div>
<audio src="sound.mp3" id="sound" controls></audio>
<input type="file" id="open-file" accept="audio/*" />
CSS
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: gainsboro;
}
#container {
height: 340px;
}
.bar {
width: 50px;
height: 100%;
position: relative;
float: left;
margin: 20px;
height: calc(100% - 40px);
}
.fill {
background: LawnGreen;
height: 20px;
width: 100%;
box-shadow: 0 0 3px rgba(0,0,0,.25),
inset 1px 1px 1px rgba(255,255,255,.75),
inset -1px -1px 1px rgba(0,0,0,.4);
position: absolute;
bottom: 0;
padding: 5px;
color: rgba(0,0,0,.75);
}
input {
margin: 20px;
}
JavaScript
var volumeBars = {
mono : document.getElementById("monoFill")
};
document.getElementById("open-file").onchange = function (evt) {
var file = evt.target.files[0];
var reader = new FileReader();
reader.onload = function(e) {
playSound(e.target.result);
}
reader.readAsArrayBuffer(file);
}
var context = new AudioContext();
function playSound(arraybuffer) {
context.close();
context = new AudioContext();
var source = context.createBufferSource();
context.decodeAudioData(arraybuffer, function (buffer) {
source.buffer = buffer;
});
var analyser = context.createAnalyser();
analyser.smoothingTimeConstant = 0.3;
analyser.fftSize = 1024;
jsNode = context.createScriptProcessor(2048, 1, 1);
jsNode.onaudioprocess = function() {
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
volumeBars.mono.style.height = Math.average(array) * 2 + "px";
volumeBars.mono.innerHTML = Math.floor(Math.average(array));
}
source.connect(analyser);
source.connect(context.destination);
jsNode.connect(context.destination);
analyser.connect(jsNode);
source.start();
}
Math.average = function(arguments) {
var numbers;
if (arguments[0] instanceof Array) {
numbers = arguments[0];
}
else if (typeof arguments[0] == "number") {
numbers = arguments;
}
var sum = 0;
var average = 0;
for (var i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
average = sum / numbers.length;
return average;
}