Я хочу применить эффект гребенчатого фильтра к существующему файлу wav. Вот код, который у меня есть:
public combFilter = async (delay, decay, filepath, wavDest) => {
const arraybuffer = fs.readFileSync(wavFile, null).buffer
const array = new Uint8Array(arraybuffer)
const header = array.slice(0, 44)
const samples = array.slice(44)
const {sampleRate} = this.getWavInfo(header)
const delayedSamples = Math.floor(delay * (sampleRate/1000))
const combSamples = samples.slice()
for (let i = 0; i < samples.length - delayedSamples; i++) {
combSamples[i + delayedSamples] += combSamples[i] * decay
}
const combArray = [...header, ...combSamples]
fs.writeFileSync(wavDest, Buffer.from(new Uint8Array(combArray)))
return wavDest
}
Я ничего не знаю о dsp, но, насколько я понимаю, вы создаете копию аудиосэмплов и задерживаете их на определенную величину. Однако конечным результатом является крайне искаженная и обрезанная версия исходного файла, где значение задержки равно 70
, затуханию равно 0.5
, а sampleRate равно 44100
. Другой метод, используемый здесь, прекрасно работает, но здесь он для справки.
public getWavInfo = (header) => {
function int32ToDec(bin) {
const binArr = bin.split("-")
let binDigits = ""
for (let i = 0; i < binArr.length; i++) {
binDigits += ("00000000"+Number(binArr[i]).toString(2)).slice(-8)
}
const num = parseInt(binDigits, 2)
return num
}
let littleEndian = false
let bitDepth = 0
let sampleRate = 0
let channels = 0
let topCode = ""
for (let i = 0; i < 4; i++) {
topCode += String.fromCharCode(header[i])
}
if (topCode === "RIFF") {
littleEndian = true
}
if (littleEndian) {
bitDepth = Number(`${header[35]}${header[34]}`)
sampleRate = Number(int32ToDec(`${(header[27])}-${(header[26])}-${(header[25])}-${(header[24])}`))
channels = Number(`${header[23]}${header[22]}`)
} else {
bitDepth = Number(`${header[34]}${header[35]}`)
sampleRate = Number(int32ToDec(`${header[24]}-${(header[25])}-${(header[26])}-${(header[27])}`))
channels = Number(`${header[22]}${header[23]}`)
}
const byteDepth = (bitDepth) / 8
return {byteDepth, bitDepth, sampleRate, channels}
}