/ proof-of-concept / plate-mechanics-sim
Sign in
proof-of-concept / plate-mechanics-sim
plate-mechanics-sim / packages / core / test / wav.test.ts
39 lines · 1.4 KBBlameHistoryRaw
1import { describe, expect, it } from "vitest";
2import { encodeWav } from "../src/audio/wav";
4const str = (b: Uint8Array, off: number, n: number) =>
5 String.fromCharCode(...b.subarray(off, off + n));
7describe("encodeWav", () => {
8 it("writes a well-formed 16-bit mono PCM header", () => {
9 const b = encodeWav(new Float32Array(10), 44100);
10 const v = new DataView(b.buffer);
11 expect(b.length).toBe(44 + 20);
12 expect(str(b, 0, 4)).toBe("RIFF");
13 expect(v.getUint32(4, true)).toBe(b.length - 8);
14 expect(str(b, 8, 4)).toBe("WAVE");
15 expect(str(b, 12, 4)).toBe("fmt ");
16 expect(v.getUint16(20, true)).toBe(1);
17 expect(v.getUint16(22, true)).toBe(1);
18 expect(v.getUint32(24, true)).toBe(44100);
19 expect(v.getUint32(28, true)).toBe(88200);
20 expect(v.getUint16(32, true)).toBe(2);
21 expect(v.getUint16(34, true)).toBe(16);
22 expect(str(b, 36, 4)).toBe("data");
23 expect(v.getUint32(40, true)).toBe(20);
24 });
26 it("quantizes, clips, and silences non-finite samples", () => {
27 const b = encodeWav([0, 1, -1, 0.5, 2, -3, NaN, Infinity], 8000);
28 const v = new DataView(b.buffer);
29 const s = (i: number) => v.getInt16(44 + 2 * i, true);
30 expect(s(0)).toBe(0);
31 expect(s(1)).toBe(32767);
32 expect(s(2)).toBe(-32768);
33 expect(s(3)).toBe(16384);
34 expect(s(4)).toBe(32767);
35 expect(s(5)).toBe(-32768);
36 expect(s(6)).toBe(0);
37 expect(s(7)).toBe(0);
38 });
39});
↑↓ move↵openescclose