feat: pipeline runner with oracle modes
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
co-authored by
Claude Sonnet 5.5
parent
bf93a4a32e
commit
604d1a67af
@@ -0,0 +1,52 @@
|
||||
import { test, expect, beforeAll } from "bun:test";
|
||||
import { join } from "node:path";
|
||||
import { buildSong, loadSongDir } from "../../src/bench/dataset.ts";
|
||||
import { createPipeline } from "../../src/pipeline/run.ts";
|
||||
import { truthFromGp } from "../../src/score/gp.ts";
|
||||
import { scoreSong } from "../../src/eval/score.ts";
|
||||
|
||||
const SLOW = 600_000;
|
||||
const root = join(import.meta.dir, "../..");
|
||||
let run: Awaited<ReturnType<typeof createPipeline>>;
|
||||
|
||||
beforeAll(async () => {
|
||||
const bytes = async (p: string) => new Uint8Array(await Bun.file(join(root, p)).arrayBuffer());
|
||||
run = await createPipeline({ demucs: await bytes("models/demucs/htdemucs_6s.onnx"), basicPitch: await bytes("models/basic-pitch/nmp.onnx") });
|
||||
await buildSong("t1a", 1);
|
||||
await buildSong("t1c", 1);
|
||||
}, SLOW);
|
||||
|
||||
test("t1a/1 oracle stems+tempo: guitar track, GP re-imports", async () => {
|
||||
const d = await loadSongDir(join(root, "data/t1a/1"));
|
||||
const flags = { oracleStems: true, oracleTempo: true, oracleNotes: false };
|
||||
const t0 = performance.now();
|
||||
const { output, gp } = await run({ mix: d.mix, oracle: { stems: d.stems, truth: d.truth } }, flags);
|
||||
const s = scoreSong(d.truth, output, flags);
|
||||
console.log(`t1a oracleNotes=false ${(performance.now() - t0).toFixed(0)}ms F1=${s.guitarMerged.f1} str=${s.stringAgreement}`);
|
||||
const g = output.tracks.filter((t) => t.role === "guitar");
|
||||
expect(g.length).toBe(1);
|
||||
expect(g[0]!.notes.length).toBeGreaterThan(0);
|
||||
expect(truthFromGp(gp).tracks.some((t) => t.role === "guitar")).toBe(true);
|
||||
}, SLOW);
|
||||
|
||||
test("t1a/1 oracle notes: merged guitar F1 === 1, stringAgreement is a number", async () => {
|
||||
const d = await loadSongDir(join(root, "data/t1a/1"));
|
||||
const flags = { oracleStems: true, oracleTempo: true, oracleNotes: true };
|
||||
const { output } = await run({ mix: d.mix, oracle: { stems: d.stems, truth: d.truth } }, flags);
|
||||
const s = scoreSong(d.truth, output, flags);
|
||||
console.log(`t1a oracleNotes=true F1=${s.guitarMerged.f1} str=${s.stringAgreement}`);
|
||||
expect(s.guitarMerged.f1).toBe(1);
|
||||
expect(typeof s.stringAgreement).toBe("number");
|
||||
}, SLOW);
|
||||
|
||||
test("t1c/1 full pipeline yields all roles", async () => {
|
||||
const d = await loadSongDir(join(root, "data/t1c/1"));
|
||||
const flags = { oracleStems: false, oracleTempo: false, oracleNotes: false };
|
||||
const t0 = performance.now();
|
||||
const { output, gp, warnings } = await run({ mix: d.mix }, flags);
|
||||
const s = scoreSong(d.truth, output, flags);
|
||||
console.log(`t1c full ${(performance.now() - t0).toFixed(0)}ms bpm=${output.grid.bpm} (true ${d.truth.bpm}) F1=${s.guitarMerged.f1} warnings=${JSON.stringify(warnings)} rhythm=${JSON.stringify(s.rhythm)}`);
|
||||
const roles = new Set(output.tracks.map((t) => t.role));
|
||||
for (const r of ["guitar", "bass", "keys", "vocals", "drums"]) expect(roles.has(r as never)).toBe(true);
|
||||
expect(gp.length).toBeGreaterThan(0);
|
||||
}, SLOW);
|
||||
Reference in New Issue
Block a user