50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
import type { AudioProcessor, ProcessorCategory } from './AudioProcessor';
|
|
|
|
export class TapeSpeedUp implements AudioProcessor {
|
|
getName(): string {
|
|
return 'Tape Speed Up';
|
|
}
|
|
|
|
getDescription(): string {
|
|
return 'Simulates a tape machine accelerating from slow to normal speed';
|
|
}
|
|
|
|
getCategory(): ProcessorCategory {
|
|
return 'Time';
|
|
}
|
|
|
|
process(leftIn: Float32Array, rightIn: Float32Array): [Float32Array, Float32Array] {
|
|
const length = leftIn.length;
|
|
const leftOut = new Float32Array(length);
|
|
const rightOut = new Float32Array(length);
|
|
|
|
const accelDuration = length * 0.3;
|
|
|
|
let readPos = 0;
|
|
|
|
for (let i = 0; i < length; i++) {
|
|
if (i < accelDuration) {
|
|
const t = i / accelDuration;
|
|
const curve = t * t * t;
|
|
const speed = curve;
|
|
readPos += speed;
|
|
} else {
|
|
readPos += 1.0;
|
|
}
|
|
|
|
const idx = Math.floor(readPos);
|
|
const frac = readPos - idx;
|
|
|
|
if (idx < length - 1) {
|
|
leftOut[i] = leftIn[idx] * (1.0 - frac) + leftIn[idx + 1] * frac;
|
|
rightOut[i] = rightIn[idx] * (1.0 - frac) + rightIn[idx + 1] * frac;
|
|
} else if (idx < length) {
|
|
leftOut[i] = leftIn[idx];
|
|
rightOut[i] = rightIn[idx];
|
|
}
|
|
}
|
|
|
|
return [leftOut, rightOut];
|
|
}
|
|
}
|