-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjsbeater.js
72 lines (57 loc) · 1.96 KB
/
jsbeater.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
* JS-Beater
* Interact with audio file or microphone from your browser
*
* https://github.com/alexzava/js-beater
*/
function jsbFile(songFile, callback, t = 240) {
const audioCtx = new AudioContext()
const audioEle = new Audio()
var audioSourceNode
var analyserNode
var bufferLength
var dataArray
var threshold = t
audioEle.src = songFile
audioEle.autoplay = true
audioEle.preload = 'auto'
audioEle.loop = true
audioSourceNode = audioCtx.createMediaElementSource(audioEle)
analyserNode = audioCtx.createAnalyser()
analyserNode.fftSize = 256
bufferLength = analyserNode.frequencyBinCount
dataArray = new Float32Array(bufferLength)
audioSourceNode.connect(analyserNode)
analyserNode.connect(audioCtx.destination)
processBeats(analyserNode, dataArray, bufferLength, threshold, callback)
}
function jsbMic(callback, t = 180) {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia
navigator.getUserMedia({video:false, audio:true}, (stream) => { micStream(stream, callback, t) }, console.log)
}
function micStream(stream, callback, t) {
var audioCtx = new AudioContext()
var analyserNode
var bufferLength
var dataArray
var threshold = t
micStream = audioCtx.createMediaStreamSource(stream)
analyserNode = audioCtx.createAnalyser()
analyserNode.fftSize = 256
bufferLength = analyserNode.frequencyBinCount
dataArray = new Float32Array(bufferLength)
micStream.connect(analyserNode)
analyserNode.connect(audioCtx.destination)
processBeats(analyserNode, dataArray, bufferLength, threshold, callback)
}
function processBeats(analyserNode, dataArray, bufferLength, threshold, callback) {
requestAnimationFrame(() => { processBeats(analyserNode, dataArray, bufferLength, threshold, callback) })
analyserNode.getFloatFrequencyData(dataArray)
for (let i = 0; i < bufferLength; i++) {
// Magic formula
const barHeight = (dataArray[i] + 140) * 2
if(barHeight > threshold) {
callback(barHeight)
}
}
}