// 16-bit PCM mono WAV encoder. import { normalize, type LevelMode } from "./level.ts"; export function encodeWav(samples: Float32Array, fs: number, mode: LevelMode = "peak"): Blob { const scaled = normalize(samples, fs, mode, 0.99); const buf = new ArrayBuffer(44 + samples.length * 2); const v = new DataView(buf); const str = (o: number, s: string) => { for (let k = 0; k < s.length; k++) v.setUint8(o + k, s.charCodeAt(k)); }; str(0, "RIFF"); v.setUint32(4, 36 + samples.length * 2, true); str(8, "WAVE"); str(12, "fmt "); v.setUint32(16, 16, true); v.setUint16(20, 1, true); v.setUint16(22, 1, true); v.setUint32(24, fs, true); v.setUint32(28, fs * 2, true); v.setUint16(32, 2, true); v.setUint16(34, 16, true); str(36, "data"); v.setUint32(40, samples.length * 2, true); for (let k = 0; k < samples.length; k++) { const s = Math.max(-1, Math.min(1, scaled[k])); v.setInt16(44 + 2 * k, Math.round(s * 32767), true); } return new Blob([buf], { type: "audio/wav" }); }