vlData = {
const vlData = []
const windowSize = sampleRate / 100
let movingSum = 0
let maxValue = 0
let maxSample
for (let sample = 0; sample < 55000; sample++) {
const value = rawData[sample]
vlData.push({sample, value})
movingSum += Math.abs(value)
if (sample < windowSize) {
continue
}
movingSum -= Math.abs(vlData[sample - windowSize].value)
const avg = movingSum / windowSize
if (avg > maxValue) {
maxValue = avg
maxSample = sample - windowSize / 2
}
vlData[sample - windowSize / 2].avg = avg
if (sample % samplesPerTone == samplesPerTone - 1) {
let beatSample
for (beatSample = maxSample; beatSample > 0; beatSample--) {
if (Math.abs(vlData[beatSample].avg - maxValue) > sensitivity * maxValue) {
break
}
}
vlData[beatSample].beat = true
maxValue = 0
maxSample = null
}
}
return vlData
}