MusicVision / js /player.js
admin
2 en
5daada1
raw
history blame
5.25 kB
function clearInputFiles(inputId) {
var inputElement = document.getElementById(inputId);
if (inputElement.files && inputElement.files.length > 0) {
var reader = new FileReader();
reader.readAsArrayBuffer(inputElement.files[0]);
reader.onload = function () {
inputElement.value = '';
};
}
}
function recover_bg() {
$(".bg").css("background-image", "url(./src/bg.jpg)");
clearInputFiles("bgFile");
}
window.onload = function () {
wrap.width = window.innerWidth - 1;
wrap.height = window.innerHeight - 1;
let canvasCtx = wrap.getContext("2d");
let AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext;
let audioContext = new AudioContext();
canvasCtx.shadowColor = "white";
canvasCtx.shadowBlur = 10;
$('#bgFile').change(function () {
if (this.files.length <= 0) return;
if (this.files[0].size > 5242880) {
console.log('File size larger than 5M');
alert('Too large!');
return;
}
let file = this.files[0];
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function () {
$('.bg').css('background-image', 'url(' + reader.result + ')');
};
});
$('#musicFile').change(function () {
if (audioContext.state == 'running') {
audioContext.close();
audioContext = new AudioContext();
}
if (this.files.length == 0) return;
let file = $('#musicFile')[0].files[0];
let fileReader = new FileReader();
fileReader.readAsArrayBuffer(file);
fileReader.onload = function (e) {
let count = 0;
$('#tip').text('Start decoding')
let timer = setInterval(function () {
count++;
$('#tip').text('In decoding, already used ' + count + ' s')
}, 1000)
audioContext.decodeAudioData(e.target.result, function (buffer) {
clearInterval(timer)
$('#tip').text('Decoded successfully, total time: ' + count + ' s');
let audioBufferSourceNode = audioContext.createBufferSource();
let analyser = audioContext.createAnalyser();
audioBufferSourceNode.connect(analyser);
analyser.connect(audioContext.destination);
audioBufferSourceNode.buffer = buffer;
audioBufferSourceNode.start();
startStop.onclick = function () {
if (audioContext.state === 'running') {
audioContext.suspend().then(function () {
$("#startStop").val('Play');
});
} else if (audioContext.state === 'suspended') {
audioContext.resume().then(function () {
$("#startStop").val('Pause');
});
}
}
let oW = wrap.width;
let oH = wrap.height;
let color1 = canvasCtx.createLinearGradient(oW / 2, oH / 2 - 10, oW / 2, oH / 2 - 150);
color1.addColorStop(0, '#1E90FF');
color1.addColorStop(.25, '#FF7F50');
color1.addColorStop(.5, '#8A2BE2');
color1.addColorStop(.75, '#4169E1');
color1.addColorStop(1, '#00FFFF');
let color2 = canvasCtx.createLinearGradient(0, 0, oW, oH);
color2.addColorStop(0, '#1E90FF');
color2.addColorStop(.25, '#FFD700');
color2.addColorStop(.5, '#8A2BE2');
color2.addColorStop(.75, '#4169E1');
color2.addColorStop(1, '#FF0000');
let output = new Uint8Array(180);
let du = 2;
let R = 200;
let W = 2;
(function drawSpectrum() {
analyser.getByteFrequencyData(output);
canvasCtx.clearRect(0, 0, wrap.width, wrap.height);
for (let i = 0; i < 360; i++) {
let value = output[i] / 10;
canvasCtx.beginPath();
canvasCtx.lineWidth = W;
Rv1 = (R - value);
Rv2 = (R + value);
canvasCtx.moveTo((Math.sin((i * du) / 180 * Math.PI) * Rv1 + oW / 2), -Math.cos((i * du) / 180 * Math.PI) * Rv1 + oH / 2);
canvasCtx.lineTo((Math.sin((i * du) / 180 * Math.PI) * Rv2 + oW / 2), -Math.cos((i * du) / 180 * Math.PI) * Rv2 + oH / 2);
canvasCtx.strokeStyle = color1;
canvasCtx.stroke();
}
canvasCtx.font = "italic bold 20px Microsoft Yahei";
canvasCtx.fillStyle = color2;
canvasCtx.textAlign = "center";
canvasCtx.textBaseline = "middle";
canvasCtx.fillText(file.name.split('.mp3')[0], oW / 2, oH / 2);
requestAnimationFrame(drawSpectrum);
})();
})
}
})
}