Working on processors a tiny bit
This commit is contained in:
65
src/lib/audio/processors/HighPassSweepDown.ts
Normal file
65
src/lib/audio/processors/HighPassSweepDown.ts
Normal file
@ -0,0 +1,65 @@
|
||||
import type { AudioProcessor, ProcessorCategory } from './AudioProcessor';
|
||||
|
||||
export class HighPassSweepDown implements AudioProcessor {
|
||||
getName(): string {
|
||||
return 'HP Sweep Down';
|
||||
}
|
||||
|
||||
getDescription(): string {
|
||||
return 'Sweeps a high-pass filter from thin to full';
|
||||
}
|
||||
|
||||
getCategory(): ProcessorCategory {
|
||||
return 'Filter';
|
||||
}
|
||||
|
||||
process(leftIn: Float32Array, rightIn: Float32Array): [Float32Array, Float32Array] {
|
||||
const length = leftIn.length;
|
||||
const leftOut = new Float32Array(length);
|
||||
const rightOut = new Float32Array(length);
|
||||
|
||||
const sampleRate = 44100;
|
||||
const startFreq = 8000;
|
||||
const endFreq = 20;
|
||||
const Q = 1.5;
|
||||
|
||||
let lx1 = 0, lx2 = 0, ly1 = 0, ly2 = 0;
|
||||
let rx1 = 0, rx2 = 0, ry1 = 0, ry2 = 0;
|
||||
|
||||
let b0 = 0, b1 = 0, b2 = 0, a1 = 0, a2 = 0;
|
||||
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (i % 64 === 0) {
|
||||
const t = i / length;
|
||||
const freq = startFreq * Math.pow(endFreq / startFreq, t);
|
||||
const omega = 2.0 * Math.PI * freq / sampleRate;
|
||||
const alpha = Math.sin(omega) / (2.0 * Q);
|
||||
|
||||
const a0 = 1.0 + alpha;
|
||||
b0 = ((1.0 + Math.cos(omega)) / 2.0) / a0;
|
||||
b1 = (-(1.0 + Math.cos(omega))) / a0;
|
||||
b2 = b0;
|
||||
a1 = (-2.0 * Math.cos(omega)) / a0;
|
||||
a2 = (1.0 - alpha) / a0;
|
||||
}
|
||||
|
||||
const lx0 = leftIn[i];
|
||||
const rx0 = rightIn[i];
|
||||
|
||||
leftOut[i] = b0 * lx0 + b1 * lx1 + b2 * lx2 - a1 * ly1 - a2 * ly2;
|
||||
rightOut[i] = b0 * rx0 + b1 * rx1 + b2 * rx2 - a1 * ry1 - a2 * ry2;
|
||||
|
||||
lx2 = lx1;
|
||||
lx1 = lx0;
|
||||
ly2 = ly1;
|
||||
ly1 = leftOut[i];
|
||||
|
||||
rx2 = rx1;
|
||||
rx1 = rx0;
|
||||
ry2 = ry1;
|
||||
ry1 = rightOut[i];
|
||||
}
|
||||
|
||||
return [leftOut, rightOut];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user