mindboost-rnbo-test-project/assets/bandpass-processor.js

68 lines
2.1 KiB
JavaScript

class BandpassProcessor extends AudioWorkletProcessor {
process (inputs, outputs) {
const input = inputs[0]
const output = outputs[0]
// const frequency = parameters.frequency
// const Q = parameters.Q
for (let channel = 0; channel < input.length; channel++) {
const inputChannel = input[channel]
// const outputChannel = output[channel]
for (let i = 0; i < inputChannel.length; i++) {
// Apply bandpass filter to inputChannel[i] and store the result in outputChannel[i]
// using the provided frequency and Q parameters
}
}
// Calculate the RMS value of the output audio data
const rms = this.calculateRMS(output)
// Calculate the dB values
const dbValues = this.convertToDB(output)
// Calculate the 10th and 90th percentile values
const percentile10 = this.calculatePercentile(dbValues, 10)
const percentile90 = this.calculatePercentile(dbValues, 90)
// Send the processed data to the main thread
this.port.postMessage({ rms, dbValues, percentile10, percentile90 })
return true
}
calculateRMS (data) {
let sumOfSquares = 0
for (let channel = 0; channel < data.length; channel++) {
const channelData = data[channel]
for (let i = 0; i < channelData.length; i++) {
sumOfSquares += channelData[i] * channelData[i]
}
}
const meanSquare = sumOfSquares / (data.length * data[0].length)
const rms = Math.sqrt(meanSquare)
return rms
}
calculatePercentile (data, percentile) {
const sortedData = data.slice().sort((a, b) => a - b)
const index = Math.floor((percentile / 100) * sortedData.length)
return sortedData[index]
}
convertToDB (data) {
const dbValues = []
for (let channel = 0; channel < data.length; channel++) {
const channelData = data[channel]
for (let i = 0; i < channelData.length; i++) {
const amplitude = Math.abs(channelData[i])
const db = 20 * Math.log10(amplitude + this.minAmplitude)
dbValues.push(db)
}
}
return dbValues
}
}
export default registerProcessor('bandpass-processor', BandpassProcessor)