add AudioVirtualizer -> IndexInterface
parent
9bb5b85487
commit
298dfa6d41
|
|
@ -0,0 +1,2 @@
|
||||||
|
sudo sysctl fs.inotify.max_user_watches=524288
|
||||||
|
gatsby develop
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,22 +1,96 @@
|
||||||
import React, {useState} from 'react'
|
import React, { useState, useEffect } from 'react'
|
||||||
|
|
||||||
import '../styles/general.scss'
|
import '../styles/general.scss'
|
||||||
|
|
||||||
const indexConsole = ({ }) => {
|
const IndexConsole = () => {
|
||||||
|
|
||||||
|
useEffect( () => { loadingDivs() } )
|
||||||
|
|
||||||
|
const sleep = (ms) => {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms))
|
||||||
|
}
|
||||||
|
|
||||||
|
const displayNone = {
|
||||||
|
display: 'none'
|
||||||
|
}
|
||||||
|
|
||||||
|
let iterationDivs = 0
|
||||||
|
const loadingDivs = async() => {
|
||||||
|
if (window.innerWidth < 900) {
|
||||||
|
document.body.style.fontSize = '8px'
|
||||||
|
document.getElementById('Poland').style.width = '180px'
|
||||||
|
document.getElementById('Russia').style.width = '310px'
|
||||||
|
document.getElementById('connect').style.width = '390px'
|
||||||
|
document.getElementById('connect').style.marginTop = '170px'
|
||||||
|
document.getElementById('connect').style.marginLeft = '-100px'
|
||||||
|
}
|
||||||
|
if (iterationDivs === 0)
|
||||||
|
while (iterationDivs < 7) {
|
||||||
|
document.getElementById(iterationDivs).style = 'display: block'
|
||||||
|
if (iterationDivs === 2)
|
||||||
|
await loadingLocation()
|
||||||
|
if (iterationDivs === 3)
|
||||||
|
await loadingConnect()
|
||||||
|
if (iterationDivs === 6)
|
||||||
|
await loadingBar()
|
||||||
|
iterationDivs++
|
||||||
|
await sleep(300)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadingLocation = async () => {
|
||||||
|
const response = await fetch('https://ipapi.co/json/')
|
||||||
|
let json = await response.json()
|
||||||
|
document.getElementById('2').innerHTML = json.ip
|
||||||
|
+ ' ( '
|
||||||
|
+ json.city
|
||||||
|
+ ' ) >> Петропавловск-Камчатский'
|
||||||
|
}
|
||||||
|
|
||||||
|
let connectASCII = '$--a-sd--К-=;-/.=--=.-=а-=-=-;м-==-.=ч-=--'
|
||||||
|
+ ';=-а-=-;=т-=;=-;=-с-=;-к-=-=-=и-=-=,.,/.//,/;--=-й-=-=;-=,.'
|
||||||
|
+ ',..v,||=-;;=--__+-=-=-='
|
||||||
|
let iterationASCII= 0
|
||||||
|
const loadingConnect = async() => {
|
||||||
|
let popChars = ''
|
||||||
|
while (iterationASCII < connectASCII.length) {
|
||||||
|
popChars = connectASCII.substring(0, iterationASCII)
|
||||||
|
document.getElementById('connect').innerHTML = popChars
|
||||||
|
await sleep(3)
|
||||||
|
iterationASCII++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let procentage = 0
|
||||||
|
const loadingBar = async() => {
|
||||||
|
let loadingBar = document.getElementById('6').innerHTML
|
||||||
|
let lastProcentage = procentage
|
||||||
|
for (let i = 0; i < loadingBar.length; i++) {
|
||||||
|
loadingBar = document.getElementById('6').innerHTML
|
||||||
|
lastProcentage = procentage
|
||||||
|
if (loadingBar[i] === '_') {
|
||||||
|
procentage += 4
|
||||||
|
document.getElementById('6').innerHTML = loadingBar
|
||||||
|
.replace('_','#')
|
||||||
|
.replace(lastProcentage, procentage)
|
||||||
|
await sleep(30)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<div id='consoleDiv'>
|
||||||
<div>
|
<div id='0' style={displayNone}>
|
||||||
<div>
|
загрузка контента с функциональностью сайта
|
||||||
Ładowanie funkcjonalności / загрузка контента с функциональностью сайта
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div id='1' style={displayNone}>
|
||||||
Łączenie z serwerem / подключение к серверу
|
подключение к серверу
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div id='2' style={displayNone}>
|
||||||
Arłamów ============================ Петропавловск-Камчатский
|
>> >> Петропавловск-Камчатский
|
||||||
</div>
|
</div>
|
||||||
<div className='ASCIIview'>
|
<br />
|
||||||
|
<div className='ASCIIview' id='3' style={displayNone}>
|
||||||
<div className='ASCIIchars' id='Poland'>
|
<div className='ASCIIchars' id='Poland'>
|
||||||
=-¬¬ TF▄ <br />
|
=-¬¬ TF▄ <br />
|
||||||
.⌐ , .., <br />
|
.⌐ , .., <br />
|
||||||
|
|
@ -41,6 +115,9 @@ const indexConsole = ({ }) => {
|
||||||
` ∩ ─.-^ -, ▐ <br />
|
` ∩ ─.-^ -, ▐ <br />
|
||||||
` `'¬.[¬ <br />
|
` `'¬.[¬ <br />
|
||||||
` <br />
|
` <br />
|
||||||
|
</div>
|
||||||
|
<div className='ASCIIchars' id='connect'>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div className='ASCIIchars' id='Russia'>
|
<div className='ASCIIchars' id='Russia'>
|
||||||
╓ⁿ`1 <br />
|
╓ⁿ`1 <br />
|
||||||
|
|
@ -93,8 +170,15 @@ const indexConsole = ({ }) => {
|
||||||
╙w,.═"``"^%,,,..^ ╢ <br />
|
╙w,.═"``"^%,,,..^ ╢ <br />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<br />
|
||||||
Wczytywanie zasobów [###___________________________]
|
<div id='4' style={displayNone}>
|
||||||
|
Подключен!
|
||||||
|
</div>
|
||||||
|
<div id='5' style={displayNone}>
|
||||||
|
загрузка ресурсов
|
||||||
|
</div>
|
||||||
|
<div id='6' style={displayNone}>
|
||||||
|
[_________________________] 0%
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -102,4 +186,4 @@ const indexConsole = ({ }) => {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default indexConsole
|
export default IndexConsole
|
||||||
|
|
@ -0,0 +1,195 @@
|
||||||
|
import React, { useState, useEffect } from 'react'
|
||||||
|
|
||||||
|
import '../styles/audioVisualizer.scss'
|
||||||
|
import audioTest from '../images/audioTest.mp3'
|
||||||
|
|
||||||
|
const IndexInterface = () => {
|
||||||
|
|
||||||
|
const [play, setPlay] = useState(false)
|
||||||
|
const [pause, setPause] = useState(false)
|
||||||
|
|
||||||
|
const sleep = (ms) => {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms))
|
||||||
|
}
|
||||||
|
|
||||||
|
const controlAudio = () => {
|
||||||
|
if (play === false) {
|
||||||
|
setPlay(!play)
|
||||||
|
playAudio()
|
||||||
|
}
|
||||||
|
else if (play === true && pause === false) {
|
||||||
|
setPause(!pause)
|
||||||
|
pauseAudio()
|
||||||
|
}
|
||||||
|
else if (play === true && pause === true) {
|
||||||
|
setPause(!pause)
|
||||||
|
resumeAudio()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const pauseAudio = () => {
|
||||||
|
let audio = document.getElementById("audio");
|
||||||
|
audio.pause()
|
||||||
|
}
|
||||||
|
|
||||||
|
const resumeAudio = () => {
|
||||||
|
let audio = document.getElementById("audio");
|
||||||
|
audio.play()
|
||||||
|
}
|
||||||
|
|
||||||
|
const playAudio = () => {
|
||||||
|
|
||||||
|
let audio = document.getElementById("audio");
|
||||||
|
audio.src = audioTest;
|
||||||
|
audio.load();
|
||||||
|
audio.play();
|
||||||
|
let context = new AudioContext();
|
||||||
|
let src = context.createMediaElementSource(audio);
|
||||||
|
let analyser = context.createAnalyser();
|
||||||
|
|
||||||
|
let canvas = document.getElementById("canvas");
|
||||||
|
canvas.width = window.innerWidth;
|
||||||
|
canvas.height = window.innerHeight;
|
||||||
|
let ctx = canvas.getContext("2d");
|
||||||
|
|
||||||
|
src.connect(analyser);
|
||||||
|
analyser.connect(context.destination);
|
||||||
|
|
||||||
|
analyser.fftSize = 256;
|
||||||
|
|
||||||
|
let bufferLength = analyser.frequencyBinCount;
|
||||||
|
console.log(bufferLength);
|
||||||
|
|
||||||
|
let dataArray = new Uint8Array(bufferLength);
|
||||||
|
|
||||||
|
let WIDTH = canvas.width;
|
||||||
|
let HEIGHT = canvas.height;
|
||||||
|
|
||||||
|
let barWidth = (WIDTH / bufferLength) * 2.5;
|
||||||
|
let barHeight;
|
||||||
|
let x = 0;
|
||||||
|
|
||||||
|
let frameString = '==================================================='
|
||||||
|
|
||||||
|
let frameStrings = [] // 52 chars in row
|
||||||
|
|
||||||
|
for (let i = 0; i <= 200; i++) {
|
||||||
|
frameStrings[i] = Math.random().toString(36)
|
||||||
|
+ ""
|
||||||
|
+ Math.random().toString(36)
|
||||||
|
+ ""
|
||||||
|
+ Math.random().toString(36)
|
||||||
|
+ ""
|
||||||
|
+ Math.random().toString(36);
|
||||||
|
}
|
||||||
|
|
||||||
|
let frame
|
||||||
|
|
||||||
|
const renderFrame = () => {
|
||||||
|
requestAnimationFrame(renderFrame);
|
||||||
|
|
||||||
|
x = 0;
|
||||||
|
|
||||||
|
analyser.getByteFrequencyData(dataArray);
|
||||||
|
|
||||||
|
ctx.fillStyle = "#000";
|
||||||
|
ctx.fillRect(0, 0, WIDTH, HEIGHT);
|
||||||
|
|
||||||
|
timerAudio(audio)
|
||||||
|
|
||||||
|
for (let i = 0; i < bufferLength; i++) {
|
||||||
|
|
||||||
|
barHeight = dataArray[i];
|
||||||
|
|
||||||
|
let r = barHeight + (25 * (i / bufferLength));
|
||||||
|
let g = 36; //250 * ( i / bufferLength);
|
||||||
|
let b = 36;
|
||||||
|
|
||||||
|
ctx.fillStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
|
||||||
|
ctx.font = '15px Ubuntu'
|
||||||
|
frame = frameString.slice(0, barHeight / 10) + '='
|
||||||
|
ctx.fillText(frame, 0, x);
|
||||||
|
|
||||||
|
x += barWidth - 27;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const timerAudio = (audio) => {
|
||||||
|
let maxMinutes = parseInt(audio.duration / 60)
|
||||||
|
let maxSeconds = parseInt(audio.duration - (60 * maxMinutes))
|
||||||
|
|
||||||
|
let seconds = parseInt(audio.currentTime);
|
||||||
|
let minutes = parseInt(seconds / 60);
|
||||||
|
if (minutes > 0) {
|
||||||
|
seconds = parseInt(seconds - (60 * minutes))
|
||||||
|
}
|
||||||
|
document.getElementById('audioCurrentTime').innerHTML = minutes
|
||||||
|
+ ':'
|
||||||
|
+ seconds
|
||||||
|
document.getElementById('audioTime').innerHTML = maxMinutes
|
||||||
|
+ ':'
|
||||||
|
+ maxSeconds
|
||||||
|
}
|
||||||
|
const progressBarAudio = (audio) => {
|
||||||
|
let maxProgress = audio.duration
|
||||||
|
let onePercent = maxProgress / 100
|
||||||
|
let progress = 1;
|
||||||
|
for(let i = 0; i <= 100; i++) {
|
||||||
|
let bar = document.getElementById('audioProgressBar').innerHTML
|
||||||
|
document.getElementById('audioProgressBar').innerHTML = bar.replace('|', '#')
|
||||||
|
console.log(i)
|
||||||
|
sleep(parseInt((onePercent * 1000) * 5))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
audio.play();
|
||||||
|
renderFrame();
|
||||||
|
progressBarAudio(audio)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div id='audioVisualizerDiv'>
|
||||||
|
<div id='audioMenu'>
|
||||||
|
<div onClick={controlAudio}>
|
||||||
|
{play === false || pause === true ? '>' : '||'}
|
||||||
|
</div>
|
||||||
|
<div id='audioCurrentTime' >
|
||||||
|
0:0
|
||||||
|
</div>
|
||||||
|
<div>===</div>
|
||||||
|
<div id='audioProgressBar'>
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
| <br />
|
||||||
|
</div>
|
||||||
|
<div>===</div>
|
||||||
|
<div id='audioTime'>
|
||||||
|
0:0
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<canvas id='canvas'>
|
||||||
|
</canvas>
|
||||||
|
<audio id='audio' controls>
|
||||||
|
</audio>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
export default IndexInterface
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
#audioVisualizerDiv {
|
||||||
|
width: 100%;
|
||||||
|
height: 20%;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
#audioMenu {
|
||||||
|
height: 500px;
|
||||||
|
width: 50px;
|
||||||
|
left: 230px;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
position: fixed;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
div {
|
||||||
|
padding-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#canvas {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#audio {
|
||||||
|
top: 90%;
|
||||||
|
left: 300px;
|
||||||
|
position: fixed;
|
||||||
|
width: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,10 +4,12 @@ body {
|
||||||
font-family: Ubuntu;
|
font-family: Ubuntu;
|
||||||
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
margin: 0 auto;
|
||||||
margin: 50px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#consoleDiv {
|
||||||
|
margin: 50px;
|
||||||
|
|
||||||
.ASCIIview {
|
.ASCIIview {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 70%;
|
height: 70%;
|
||||||
|
|
@ -31,4 +33,14 @@ body {
|
||||||
#Russia {
|
#Russia {
|
||||||
width: 600px;
|
width: 600px;
|
||||||
}
|
}
|
||||||
|
#connect {
|
||||||
|
width: 630px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-align: left;
|
||||||
|
position: absolute;
|
||||||
|
margin-top: 290px;
|
||||||
|
margin-left: -120px;
|
||||||
|
transform: rotate(-14deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue