2004981Plate dynamics lab 2: a hammer on a hung plate by Rayleigh-Ritz and by Mindlin-Reissner finite elementsJeremy Magland 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 24-bit mono PCM header by default", () => {
9 const b = encodeWav(new Float32Array(10), 96000);
10 const v = new DataView(b.buffer);
11 expect(b.length).toBe(44 + 30);
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(96000);
19 expect(v.getUint32(28, true)).toBe(288000);
20 expect(v.getUint16(32, true)).toBe(3);
21 expect(v.getUint16(34, true)).toBe(24);
22 expect(str(b, 36, 4)).toBe("data");
23 expect(v.getUint32(40, true)).toBe(30);
24 });
26 it("quantizes 24-bit samples as the reference simulator does, little-endian two's complement", () => {
27 const b = encodeWav([0, 1, -1, 0.5, 2, NaN], 8000, 24);
28 const s = (i: number) => {
29 const off = 44 + 3 * i;
30 let x = b[off] | (b[off + 1] << 8) | (b[off + 2] << 16);
31 if (x >= 1 << 23) x -= 1 << 24;
32 return x;
33 };
34 expect(s(0)).toBe(0);
35 expect(s(1)).toBe(8388607);
36 expect(s(2)).toBe(-8388607);
37 expect(s(3)).toBe(4194304);
38 expect(s(4)).toBe(8388607);
39 expect(s(5)).toBe(0);
40 });
42 it("still writes 16-bit files when asked", () => {
43 const b = encodeWav([0, 1, -1, 0.5, 2, -3, NaN, Infinity], 8000, 16);
44 const v = new DataView(b.buffer);
45 expect(v.getUint16(34, true)).toBe(16);
46 const s = (i: number) => v.getInt16(44 + 2 * i, true);
47 expect(s(0)).toBe(0);
48 expect(s(1)).toBe(32767);
49 expect(s(2)).toBe(-32767);
50 expect(s(3)).toBe(16384);
51 expect(s(4)).toBe(32767);
52 expect(s(5)).toBe(-32767);
53 expect(s(6)).toBe(0);
54 expect(s(7)).toBe(0);
55 });
56});