import { assertEquals } from "@std/assert"; import { voiceTrack } from "../project/harmony.ts"; import { newChordTrack, newProject, placeChord, projectKey } from "../project/model.ts"; import { projectMidi } from "./export.ts"; import { parseMidi } from "./smf.ts"; Deno.test("a chord track with its bass off leaves each chord's lowest note out", () => { const p = newProject(); const chords = newChordTrack(); for (const [start, symbol] of [ [0, "C/E"], [4, "F"], [8, "G7"], ] as const) { placeChord(chords, { id: symbol, start, dur: 4, symbol }); } p.tracks = [chords]; const voiced = voiceTrack(chords, projectKey(p)).map(v => [...v.notes].sort((a, b) => a - b)); const exported = () => { const [part] = parseMidi(projectMidi(p)); return [0, 4, 8].map(beat => part.notes .filter(n => n.start === beat) .map(n => n.pitch) .sort((a, b) => a - b), ); }; assertEquals(exported(), voiced); chords.bass = false; assertEquals( exported(), voiced.map(notes => notes.slice(1)), ); });