// 16-bit PCM mono WAV encoder. export function encodeWav(samples: Float32Array, fs: number, peak = 0.99): Blob { let max = 0; for (let k = 0; k < samples.length; k++) max = Math.max(max, Math.abs(samples[k])); const gain = max > 0 ? peak / max : 0; 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, samples[k] * gain)); v.setInt16(44 + 2 * k, Math.round(s * 32767), true); } return new Blob([buf], { type: "audio/wav" }); }