jam-buddy / apps /web /__tests__ /player.test.ts
salgadev's picture
Sync from GitHub 6feaf31d
b2e4883 verified
Raw
History Blame Contribute Delete
1.15 kB
import { describe, expect, it } from "vitest";
import { midiToFreq, parseMidi, isPercussion, type ParsedNote } from "@/lib/jambuddy/player";
describe("midiToFreq", () => {
it("maps A4 (69) to 440 Hz", () => {
expect(midiToFreq(69)).toBeCloseTo(440, 3);
});
it("maps C4 (60) to ~261.6 Hz", () => {
expect(midiToFreq(60)).toBeCloseTo(261.63, 1);
});
it("is an octave up 12 semitones", () => {
expect(midiToFreq(81)).toBeCloseTo(midiToFreq(69) * 2, 3);
});
});
describe("parseMidi", () => {
it("throws a readable error for non-MIDI bytes", () => {
expect(() => parseMidi(new Uint8Array([1, 2, 3]).buffer)).toThrow();
});
});
describe("isPercussion", () => {
it("flags GM channel 9 as percussion", () => {
const drum: ParsedNote = {
time: 0,
midi: 36,
duration: 0.1,
velocity: 0.9,
channel: 9,
};
expect(isPercussion(drum)).toBe(true);
});
it("does not flag a normal channel", () => {
const bass: ParsedNote = {
time: 0,
midi: 40,
duration: 0.2,
velocity: 0.8,
channel: 0,
};
expect(isPercussion(bass)).toBe(false);
});
});