📄 audioSelector.ts
import { CurveRenderer } from "./CurveRenderer";

let source: AudioBufferSourceNode | null = null;

const input = document.querySelector("#input input") as HTMLInputElement;
input?.addEventListener("input", async () => {
    if (input.files?.length !== 1) {
        return;
    }

    const file = input.files.item(0);
    if (file == null) {
        return;
    }
    const audioContext = new AudioContext();
    const audioBuffer = await audioContext.decodeAudioData(await file?.arrayBuffer());

    source?.stop();
    source = audioContext.createBufferSource();
    source.buffer = audioBuffer;
    source.loop = true;
    source.connect(audioContext.destination);

    const analyserNode = audioContext.createAnalyser();
    analyserNode.fftSize = 128;

    source.connect(analyserNode);
    analyserNode.connect(audioContext.destination);

    CurveRenderer.audioAnalyser = analyserNode;
    source.start();
});