musicxml-io 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/accessors/index.d.mts +82 -0
- package/dist/accessors/index.d.ts +82 -0
- package/dist/accessors/index.js +239 -0
- package/dist/accessors/index.js.map +1 -0
- package/dist/accessors/index.mjs +198 -0
- package/dist/accessors/index.mjs.map +1 -0
- package/dist/index.d.mts +285 -0
- package/dist/index.d.ts +285 -0
- package/dist/index.js +6033 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5932 -0
- package/dist/index.mjs.map +1 -0
- package/dist/operations/index.d.mts +92 -0
- package/dist/operations/index.d.ts +92 -0
- package/dist/operations/index.js +352 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/operations/index.mjs +315 -0
- package/dist/operations/index.mjs.map +1 -0
- package/dist/query/index.d.mts +103 -0
- package/dist/query/index.d.ts +103 -0
- package/dist/query/index.js +272 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/index.mjs +232 -0
- package/dist/query/index.mjs.map +1 -0
- package/dist/types-DC_TnJu_.d.mts +797 -0
- package/dist/types-DC_TnJu_.d.ts +797 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/importers/musicxml.ts","../src/importers/musicxml-compressed.ts","../src/validator/index.ts","../src/exporters/musicxml.ts","../src/exporters/musicxml-compressed.ts","../src/exporters/midi.ts","../src/utils/index.ts","../src/accessors/index.ts","../src/query/index.ts","../src/operations/index.ts","../src/file.ts"],"sourcesContent":["// Core types\nexport type {\n Score,\n ScoreMetadata,\n PartInfo,\n PartGroup,\n PartListEntry,\n Part,\n Measure,\n MeasureAttributes,\n MeasureEntry,\n NoteEntry,\n BackupEntry,\n ForwardEntry,\n DirectionEntry,\n Pitch,\n NoteType,\n Accidental,\n AccidentalInfo,\n TieInfo,\n BeamInfo,\n Notation,\n DirectionType,\n DynamicsValue,\n Lyric,\n TimeSignature,\n KeySignature,\n Clef,\n Transpose,\n Barline,\n VoiceGroup,\n StaffGroup,\n NoteWithPosition,\n Chord,\n NoteIteratorItem,\n Print,\n Defaults,\n Credit,\n} from './types';\n\n// Importers\nexport { parse, parseCompressed, isCompressed, parseAuto } from './importers';\n\n// Exporters\nexport { serialize, serializeCompressed, exportMidi } from './exporters';\nexport type { SerializeOptions, MidiExportOptions } from './exporters';\n\n// Accessors (re-export for convenience)\nexport {\n getNotesForVoice,\n getNotesForStaff,\n groupByVoice,\n groupByStaff,\n getAbsolutePosition,\n withAbsolutePositions,\n getChords,\n iterateNotes,\n getAllNotes,\n getVoices,\n getStaves,\n hasNotes,\n isRestMeasure,\n getNormalizedPosition,\n getNormalizedDuration,\n} from './accessors';\nexport type { VoiceFilter, NormalizedPositionOptions } from './accessors';\n\n// Query (re-export for convenience)\nexport {\n getMeasure,\n getMeasureByIndex,\n getMeasureCount,\n getDivisions,\n getAttributesAtMeasure,\n findNotes,\n getDuration,\n getPartById,\n getPartIndex,\n hasMultipleStaves,\n getStaveCount,\n measureRoundtrip,\n countNotes,\n scoresEqual,\n} from './query';\nexport type { PitchRange, FindNotesFilter, RoundtripMetrics } from './query';\n\n// Operations (re-export for convenience)\nexport {\n transpose,\n addNote,\n deleteNote,\n changeKey,\n changeTime,\n insertMeasure,\n deleteMeasure,\n setDivisions,\n addChordNote,\n modifyNotePitch,\n modifyNoteDuration,\n} from './operations';\nexport type { AddNoteOptions } from './operations';\n\n// File operations\nexport { parseFile, serializeToFile, decodeBuffer } from './file';\n\n// Utils (shared pitch and position utilities)\nexport {\n STEPS,\n STEP_SEMITONES,\n pitchToSemitone,\n getMeasureEndPosition,\n} from './utils';\n\n// Validator\nexport {\n validate,\n isValid,\n assertValid,\n validateDivisions,\n validateMeasureDuration,\n validateBackupForward,\n validateTies,\n validateBeams,\n validateSlurs,\n validateTuplets,\n validatePartReferences,\n validatePartStructure,\n validateStaffStructure,\n validateVoiceStaff,\n validateTiesAcrossMeasures,\n validateSlursAcrossMeasures,\n formatLocation,\n ValidationException,\n // Local validation for operations\n validateMeasureLocal,\n getMeasureContext,\n assertMeasureValid,\n} from './validator';\nexport type {\n ValidationError,\n ValidationResult,\n ValidationLocation,\n ValidationErrorCode,\n ValidationLevel,\n ValidateOptions,\n // Local validation types\n MeasureValidationContext,\n LocalValidateOptions,\n} from './validator';\n","import { XMLParser } from 'fast-xml-parser';\nimport type {\n Score,\n ScoreMetadata,\n PartListEntry,\n PartInfo,\n PartGroup,\n ScoreInstrument,\n MidiInstrument,\n Part,\n Measure,\n MeasureAttributes,\n NoteEntry,\n BackupEntry,\n ForwardEntry,\n DirectionEntry,\n DirectionType,\n Pitch,\n NoteType,\n Accidental,\n AccidentalInfo,\n BeamInfo,\n Notation,\n Lyric,\n LyricTextElement,\n TimeSignature,\n KeySignature,\n KeyOctave,\n Clef,\n Transpose,\n Barline,\n DynamicsValue,\n Print,\n Defaults,\n Credit,\n CreditWords,\n RestInfo,\n NoteheadInfo,\n NoteheadValue,\n Support,\n Encoding,\n SystemLayout,\n PageLayout,\n PageMargins,\n StaffDetails,\n StaffTuning,\n MeasureStyle,\n HarmonyEntry,\n HarmonyDegree,\n HarmonyFrame,\n FrameNote,\n FiguredBassEntry,\n Figure,\n TupletNotation,\n TiedNotation,\n SoundEntry,\n Swing,\n TechnicalNotation,\n DisplayText,\n MeasureNumbering,\n AttributesEntry,\n OrnamentNotation,\n ArticulationNotation,\n DynamicsNotation,\n} from '../types';\n\n// Parser with preserveOrder to maintain element order\nconst xmlParser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '@_',\n textNodeName: '#text',\n parseAttributeValue: false,\n parseTagValue: false,\n trimValues: true,\n preserveOrder: true,\n});\n\ninterface OrderedElement {\n [key: string]: unknown;\n ':@'?: Record<string, unknown>;\n}\n\nexport function parse(xmlString: string): Score {\n const parsed = xmlParser.parse(xmlString) as OrderedElement[];\n\n // Find score-partwise in the ordered result\n const scorePartwise = findElement(parsed, 'score-partwise');\n if (!scorePartwise) {\n throw new Error('Unsupported MusicXML format: only score-partwise is supported');\n }\n\n return parseScorePartwise(scorePartwise);\n}\n\nfunction findElement(elements: OrderedElement[], tagName: string): OrderedElement[] | undefined {\n for (const el of elements) {\n if (el[tagName]) {\n return el[tagName] as OrderedElement[];\n }\n }\n return undefined;\n}\n\nfunction getElementContent(elements: OrderedElement[], tagName: string): OrderedElement[] | undefined {\n return findElement(elements, tagName);\n}\n\n/** Extract text content from an element array */\nfunction extractText(elements: OrderedElement[]): string {\n for (const item of elements) {\n if (item['#text'] !== undefined) return String(item['#text']);\n }\n return '';\n}\n\nfunction getElementText(elements: OrderedElement[], tagName: string): string | undefined {\n const content = findElement(elements, tagName);\n if (!content) return undefined;\n const text = extractText(content);\n return text || '';\n}\n\n/**\n * Get element text as integer with optional default value\n */\nfunction getElementTextAsInt(elements: OrderedElement[], tagName: string, defaultValue?: number): number | undefined {\n const text = getElementText(elements, tagName);\n if (text === undefined || text === '') return defaultValue;\n const value = parseInt(text, 10);\n return isNaN(value) ? defaultValue : value;\n}\n\nfunction getAttributes(element: OrderedElement): Record<string, string> {\n const attrs: Record<string, string> = {};\n const rawAttrs = element[':@'];\n if (rawAttrs) {\n for (const [key, value] of Object.entries(rawAttrs)) {\n if (key.startsWith('@_')) {\n attrs[key.slice(2)] = String(value);\n }\n }\n }\n return attrs;\n}\n\n/**\n * Collect and parse all elements of a given tag name\n */\nfunction collectElements<T>(\n elements: OrderedElement[],\n tagName: string,\n parser: (content: OrderedElement[], attrs: Record<string, string>) => T\n): T[] {\n const results: T[] = [];\n for (const el of elements) {\n if (el[tagName]) {\n results.push(parser(el[tagName] as OrderedElement[], getAttributes(el)));\n }\n }\n return results;\n}\n\n/**\n * Find first element with tag and parse it\n */\nfunction parseFirstElement<T>(\n elements: OrderedElement[],\n tagName: string,\n parser: (content: OrderedElement[], attrs: Record<string, string>) => T\n): T | undefined {\n for (const el of elements) {\n if (el[tagName]) {\n return parser(el[tagName] as OrderedElement[], getAttributes(el));\n }\n }\n return undefined;\n}\n\n/**\n * Check if an element with the given tag name exists\n */\nfunction hasElement(elements: OrderedElement[], tagName: string): boolean {\n return elements.some(el => el[tagName] !== undefined);\n}\n\nfunction parseScorePartwise(elements: OrderedElement[]): Score {\n const metadata = parseMetadata(elements);\n const partListContent = getElementContent(elements, 'part-list');\n const partList = partListContent ? parsePartList(partListContent) : [];\n const parts = parseParts(elements);\n const defaults = parseDefaults(elements);\n const credits = parseCredits(elements);\n\n return {\n metadata,\n partList,\n parts,\n defaults,\n credits,\n };\n}\n\nfunction parseMetadata(elements: OrderedElement[]): ScoreMetadata {\n const metadata: ScoreMetadata = {};\n\n // Work info\n const work = getElementContent(elements, 'work');\n if (work) {\n metadata.workTitle = getElementText(work, 'work-title');\n metadata.workNumber = getElementText(work, 'work-number');\n }\n\n // Movement info\n metadata.movementTitle = getElementText(elements, 'movement-title');\n metadata.movementNumber = getElementText(elements, 'movement-number');\n\n // Identification\n const identification = getElementContent(elements, 'identification');\n if (identification) {\n // Creators\n const creators = collectElements(identification, 'creator', (content, attrs) =>\n ({ type: attrs['type'], value: extractText(content) }));\n if (creators.length > 0) metadata.creators = creators;\n\n // Rights\n const rights = collectElements(identification, 'rights', (content) => extractText(content));\n if (rights.length > 0) metadata.rights = rights;\n\n // Source\n metadata.source = getElementText(identification, 'source');\n\n // Encoding\n const encoding = getElementContent(identification, 'encoding');\n if (encoding) {\n metadata.encoding = parseEncoding(encoding);\n }\n\n // Miscellaneous\n const miscellaneous = getElementContent(identification, 'miscellaneous');\n if (miscellaneous) {\n const fields = collectElements(miscellaneous, 'miscellaneous-field', (content, attrs) =>\n ({ name: attrs['name'] || '', value: extractText(content) }));\n if (fields.length > 0) metadata.miscellaneous = fields;\n }\n }\n\n return metadata;\n}\n\nfunction parseEncoding(elements: OrderedElement[]): Encoding {\n const encoding: Encoding = {};\n\n const software = collectElements(elements, 'software', (c) => extractText(c));\n const encoder = collectElements(elements, 'encoder', (c) => extractText(c));\n const supports = collectElements(elements, 'supports', (_, attrs) => {\n const support: Support = { element: attrs['element'] || '', type: attrs['type'] === 'no' ? 'no' : 'yes' };\n if (attrs['attribute']) support.attribute = attrs['attribute'];\n if (attrs['value']) support.value = attrs['value'];\n return support;\n });\n\n encoding.encodingDate = getElementText(elements, 'encoding-date');\n encoding.encodingDescription = getElementText(elements, 'encoding-description');\n if (software.length > 0) encoding.software = software;\n if (encoder.length > 0) encoding.encoder = encoder;\n if (supports.length > 0) encoding.supports = supports;\n\n return encoding;\n}\n\nfunction parseDefaults(elements: OrderedElement[]): Defaults | undefined {\n const defaultsContent = getElementContent(elements, 'defaults');\n if (!defaultsContent) return undefined;\n\n const defaults: Defaults = {};\n\n // Scaling\n const scaling = getElementContent(defaultsContent, 'scaling');\n if (scaling) {\n const mm = getElementText(scaling, 'millimeters');\n const tenths = getElementText(scaling, 'tenths');\n if (mm && tenths) {\n defaults.scaling = {\n millimeters: parseFloat(mm),\n tenths: parseFloat(tenths),\n };\n }\n }\n\n // Page layout\n const pageLayout = getElementContent(defaultsContent, 'page-layout');\n if (pageLayout) {\n defaults.pageLayout = parsePageLayout(pageLayout);\n }\n\n // System layout\n const systemLayout = getElementContent(defaultsContent, 'system-layout');\n if (systemLayout) {\n defaults.systemLayout = parseSystemLayout(systemLayout);\n }\n\n // Staff layout\n const staffLayouts: { number?: number; staffDistance?: number }[] = [];\n for (const el of defaultsContent) {\n if (el['staff-layout']) {\n const attrs = getAttributes(el);\n const content = el['staff-layout'] as OrderedElement[];\n const layout: { number?: number; staffDistance?: number } = {};\n if (attrs['number']) layout.number = parseInt(attrs['number'], 10);\n const dist = getElementText(content, 'staff-distance');\n if (dist) layout.staffDistance = parseFloat(dist);\n staffLayouts.push(layout);\n }\n }\n if (staffLayouts.length > 0) defaults.staffLayout = staffLayouts;\n\n // Music font\n for (const el of defaultsContent) {\n if (el['music-font']) {\n const attrs = getAttributes(el);\n defaults.musicFont = {\n fontFamily: attrs['font-family'],\n fontSize: attrs['font-size'],\n fontStyle: attrs['font-style'],\n fontWeight: attrs['font-weight'],\n };\n break;\n }\n }\n\n // Word font\n for (const el of defaultsContent) {\n if (el['word-font']) {\n const attrs = getAttributes(el);\n defaults.wordFont = {\n fontFamily: attrs['font-family'],\n fontSize: attrs['font-size'],\n fontStyle: attrs['font-style'],\n fontWeight: attrs['font-weight'],\n };\n break;\n }\n }\n\n // Lyric fonts\n const lyricFonts: import('../types').LyricFontInfo[] = [];\n for (const el of defaultsContent) {\n if (el['lyric-font']) {\n const attrs = getAttributes(el);\n const lf: import('../types').LyricFontInfo = {\n fontFamily: attrs['font-family'],\n fontSize: attrs['font-size'],\n fontStyle: attrs['font-style'],\n fontWeight: attrs['font-weight'],\n };\n if (attrs['number']) lf.number = parseInt(attrs['number'], 10);\n if (attrs['name']) lf.name = attrs['name'];\n lyricFonts.push(lf);\n }\n }\n if (lyricFonts.length > 0) defaults.lyricFont = lyricFonts;\n\n // Lyric languages\n const lyricLanguages: import('../types').LyricLanguageInfo[] = [];\n for (const el of defaultsContent) {\n if (el['lyric-language']) {\n const attrs = getAttributes(el);\n const ll: import('../types').LyricLanguageInfo = {\n xmlLang: attrs['xml:lang'] || '',\n };\n if (attrs['number']) ll.number = parseInt(attrs['number'], 10);\n if (attrs['name']) ll.name = attrs['name'];\n lyricLanguages.push(ll);\n }\n }\n if (lyricLanguages.length > 0) defaults.lyricLanguage = lyricLanguages;\n\n // Appearance (store as raw key-value pairs)\n const appResult = parseFirstElement(defaultsContent, 'appearance', (appContent) => {\n const appearance: Record<string, unknown> = {};\n const lineWidths = collectElements(appContent, 'line-width', (c, a) =>\n ({ type: a['type'] || '', value: parseFloat(extractText(c)) || 0 }));\n const noteSizes = collectElements(appContent, 'note-size', (c, a) =>\n ({ type: a['type'] || '', value: parseFloat(extractText(c)) || 0 }));\n const distances = collectElements(appContent, 'distance', (c, a) =>\n ({ type: a['type'] || '', value: parseFloat(extractText(c)) || 0 }));\n if (lineWidths.length > 0) appearance['line-widths'] = lineWidths;\n if (noteSizes.length > 0) appearance['note-sizes'] = noteSizes;\n if (distances.length > 0) appearance['distances'] = distances;\n return Object.keys(appearance).length > 0 ? appearance : undefined;\n });\n if (appResult) defaults.appearance = appResult;\n\n return defaults;\n}\n\nfunction parsePageLayout(elements: OrderedElement[]): PageLayout {\n const layout: PageLayout = {};\n\n const height = getElementText(elements, 'page-height');\n if (height) layout.pageHeight = parseFloat(height);\n\n const width = getElementText(elements, 'page-width');\n if (width) layout.pageWidth = parseFloat(width);\n\n const margins: PageMargins[] = [];\n for (const el of elements) {\n if (el['page-margins']) {\n const attrs = getAttributes(el);\n const content = el['page-margins'] as OrderedElement[];\n const m: PageMargins = {};\n if (attrs['type'] === 'odd' || attrs['type'] === 'even' || attrs['type'] === 'both') {\n m.type = attrs['type'];\n }\n const left = getElementText(content, 'left-margin');\n if (left) m.leftMargin = parseFloat(left);\n const right = getElementText(content, 'right-margin');\n if (right) m.rightMargin = parseFloat(right);\n const top = getElementText(content, 'top-margin');\n if (top) m.topMargin = parseFloat(top);\n const bottom = getElementText(content, 'bottom-margin');\n if (bottom) m.bottomMargin = parseFloat(bottom);\n margins.push(m);\n }\n }\n if (margins.length > 0) layout.pageMargins = margins;\n\n return layout;\n}\n\nfunction parseSystemLayout(elements: OrderedElement[]): SystemLayout {\n const layout: SystemLayout = {};\n\n const margins = getElementContent(elements, 'system-margins');\n if (margins) {\n layout.systemMargins = {};\n const left = getElementText(margins, 'left-margin');\n if (left) layout.systemMargins.leftMargin = parseFloat(left);\n const right = getElementText(margins, 'right-margin');\n if (right) layout.systemMargins.rightMargin = parseFloat(right);\n }\n\n const dist = getElementText(elements, 'system-distance');\n if (dist) layout.systemDistance = parseFloat(dist);\n\n const topDist = getElementText(elements, 'top-system-distance');\n if (topDist) layout.topSystemDistance = parseFloat(topDist);\n\n return layout;\n}\n\nfunction parseCredits(elements: OrderedElement[]): Credit[] | undefined {\n const credits = collectElements(elements, 'credit', (content, attrs) => {\n const credit: Credit = {};\n if (attrs['page']) credit.page = parseInt(attrs['page'], 10);\n const types = collectElements(content, 'credit-type', (c) => extractText(c));\n const words = collectElements(content, 'credit-words', (c, a) => {\n const cw: CreditWords = { text: extractText(c) };\n if (a['default-x']) cw.defaultX = parseFloat(a['default-x']);\n if (a['default-y']) cw.defaultY = parseFloat(a['default-y']);\n if (a['font-size']) cw.fontSize = a['font-size'];\n if (a['font-weight']) cw.fontWeight = a['font-weight'];\n if (a['font-style']) cw.fontStyle = a['font-style'];\n if (a['justify']) cw.justify = a['justify'];\n if (a['halign']) cw.halign = a['halign'];\n if (a['valign']) cw.valign = a['valign'];\n if (a['letter-spacing']) cw.letterSpacing = a['letter-spacing'];\n if (a['xml:lang']) cw.xmlLang = a['xml:lang'];\n if (a['xml:space']) cw.xmlSpace = a['xml:space'];\n return cw;\n });\n if (types.length > 0) credit.creditType = types;\n if (words.length > 0) credit.creditWords = words;\n return credit;\n });\n return credits.length > 0 ? credits : undefined;\n}\n\nfunction parseDisplayTexts(elements: OrderedElement[]): DisplayText[] {\n return collectElements(elements, 'display-text', (c, a) => {\n const dt: DisplayText = { text: extractText(c) };\n if (a['font-family']) dt.fontFamily = a['font-family'];\n if (a['font-size']) dt.fontSize = a['font-size'];\n if (a['font-style']) dt.fontStyle = a['font-style'];\n if (a['font-weight']) dt.fontWeight = a['font-weight'];\n if (a['xml:space']) dt.xmlSpace = a['xml:space'];\n return dt;\n });\n}\n\nfunction parsePartList(elements: OrderedElement[]): PartListEntry[] {\n const partList: PartListEntry[] = [];\n\n for (const el of elements) {\n if (el['score-part']) {\n const attrs = getAttributes(el);\n const content = el['score-part'] as OrderedElement[];\n\n const partInfo: PartInfo = {\n type: 'score-part',\n id: attrs['id'] || '',\n };\n\n // Check if part-name element exists (even if empty)\n for (const child of content) {\n if (child['part-name'] !== undefined) {\n const pnAttrs = getAttributes(child);\n partInfo.name = getElementText(content, 'part-name') ?? '';\n if (pnAttrs['print-object'] === 'no') {\n partInfo.namePrintObject = false;\n }\n break;\n }\n }\n\n // part-name-display\n for (const child of content) {\n if (child['part-name-display']) {\n partInfo.partNameDisplay = parseDisplayTexts(child['part-name-display'] as OrderedElement[]);\n break;\n }\n }\n\n // part-abbreviation\n for (const child of content) {\n if (child['part-abbreviation'] !== undefined) {\n const paAttrs = getAttributes(child);\n partInfo.abbreviation = getElementText(content, 'part-abbreviation') ?? '';\n if (paAttrs['print-object'] === 'no') {\n partInfo.abbreviationPrintObject = false;\n }\n break;\n }\n }\n\n // part-abbreviation-display\n for (const child of content) {\n if (child['part-abbreviation-display']) {\n partInfo.partAbbreviationDisplay = parseDisplayTexts(child['part-abbreviation-display'] as OrderedElement[]);\n break;\n }\n }\n\n // Score instruments\n const instruments: ScoreInstrument[] = [];\n for (const child of content) {\n if (child['score-instrument']) {\n const instAttrs = getAttributes(child);\n const instContent = child['score-instrument'] as OrderedElement[];\n const inst: ScoreInstrument = {\n id: instAttrs['id'] || '',\n name: getElementText(instContent, 'instrument-name') || '',\n };\n const abbr = getElementText(instContent, 'instrument-abbreviation');\n if (abbr) inst.abbreviation = abbr;\n const sound = getElementText(instContent, 'instrument-sound');\n if (sound) inst.sound = sound;\n // Check for solo/ensemble\n if (hasElement(instContent, 'solo')) inst.solo = true;\n const ens = getElementText(instContent, 'ensemble');\n if (ens) inst.ensemble = parseInt(ens, 10);\n instruments.push(inst);\n }\n }\n if (instruments.length > 0) partInfo.scoreInstruments = instruments;\n\n // Group elements (after MIDI instruments in score-part)\n const groups = collectElements(content, 'group', (c) => extractText(c));\n if (groups.length > 0) partInfo.groups = groups;\n\n // MIDI instruments\n const midiInstruments: MidiInstrument[] = [];\n for (const child of content) {\n if (child['midi-instrument']) {\n const midiAttrs = getAttributes(child);\n const midiContent = child['midi-instrument'] as OrderedElement[];\n const midi: MidiInstrument = {\n id: midiAttrs['id'] || '',\n };\n const channel = getElementText(midiContent, 'midi-channel');\n if (channel) midi.channel = parseInt(channel, 10);\n const name = getElementText(midiContent, 'midi-name');\n if (name) midi.name = name;\n const bank = getElementText(midiContent, 'midi-bank');\n if (bank) midi.bank = parseInt(bank, 10);\n const program = getElementText(midiContent, 'midi-program');\n if (program) midi.program = parseInt(program, 10);\n const unpitched = getElementText(midiContent, 'midi-unpitched');\n if (unpitched) midi.unpitched = parseInt(unpitched, 10);\n const volume = getElementText(midiContent, 'volume');\n if (volume) midi.volume = parseFloat(volume);\n const pan = getElementText(midiContent, 'pan');\n if (pan) midi.pan = parseFloat(pan);\n const elevation = getElementText(midiContent, 'elevation');\n if (elevation) midi.elevation = parseFloat(elevation);\n midiInstruments.push(midi);\n }\n }\n if (midiInstruments.length > 0) partInfo.midiInstruments = midiInstruments;\n\n partList.push(partInfo);\n } else if (el['part-group']) {\n const attrs = getAttributes(el);\n const content = el['part-group'] as OrderedElement[];\n\n const group: PartGroup = {\n type: 'part-group',\n groupType: attrs['type'] === 'stop' ? 'stop' : 'start',\n };\n if (attrs['number']) group.number = parseInt(attrs['number'], 10);\n\n const name = getElementText(content, 'group-name');\n if (name) group.groupName = name;\n const gnd = parseFirstElement(content, 'group-name-display', (c) => parseDisplayTexts(c));\n if (gnd) group.groupNameDisplay = gnd;\n\n const abbr = getElementText(content, 'group-abbreviation');\n if (abbr) group.groupAbbreviation = abbr;\n const gad = parseFirstElement(content, 'group-abbreviation-display', (c) => parseDisplayTexts(c));\n if (gad) group.groupAbbreviationDisplay = gad;\n\n // Parse group-symbol with default-x attribute\n parseFirstElement(content, 'group-symbol', (c, a) => {\n const symbol = extractText(c);\n if (['none', 'brace', 'line', 'bracket', 'square'].includes(symbol)) {\n group.groupSymbol = symbol as PartGroup['groupSymbol'];\n }\n if (a['default-x']) group.groupSymbolDefaultX = parseFloat(a['default-x']);\n });\n\n const barline = getElementText(content, 'group-barline');\n if (barline && ['yes', 'no', 'Mensurstrich'].includes(barline)) {\n group.groupBarline = barline as PartGroup['groupBarline'];\n }\n\n partList.push(group);\n }\n }\n\n return partList;\n}\n\nfunction parseParts(elements: OrderedElement[]): Part[] {\n const parts: Part[] = [];\n\n for (const el of elements) {\n if (el['part']) {\n const attrs = getAttributes(el);\n const content = el['part'] as OrderedElement[];\n\n const part: Part = {\n id: attrs['id'] || '',\n measures: [],\n };\n\n for (const measureEl of content) {\n if (measureEl['measure']) {\n const measureAttrs = getAttributes(measureEl);\n const measureContent = measureEl['measure'] as OrderedElement[];\n part.measures.push(parseMeasure(measureContent, measureAttrs));\n }\n }\n\n parts.push(part);\n }\n }\n\n return parts;\n}\n\nfunction parseMeasure(elements: OrderedElement[], attrs: Record<string, string>): Measure {\n const measure: Measure = {\n number: attrs['number'] || '0', // Keep as string per MusicXML spec (token type)\n entries: [],\n };\n\n if (attrs['width']) measure.width = parseFloat(attrs['width']);\n if (attrs['implicit'] === 'yes') measure.implicit = true;\n\n const barlines: Barline[] = [];\n let isFirstAttributes = true;\n\n // Process elements in order - this is the key to maintaining order!\n for (const el of elements) {\n if (el['attributes']) {\n const parsedAttrs = parseAttributes(el['attributes'] as OrderedElement[]);\n if (isFirstAttributes) {\n measure.attributes = parsedAttrs;\n isFirstAttributes = false;\n } else {\n // Mid-measure attributes go into entries\n const attrEntry: AttributesEntry = {\n type: 'attributes',\n attributes: parsedAttrs,\n };\n measure.entries.push(attrEntry);\n }\n } else if (el['note']) {\n measure.entries.push(parseNote(el['note'] as OrderedElement[], getAttributes(el)));\n } else if (el['backup']) {\n measure.entries.push(parseBackup(el['backup'] as OrderedElement[]));\n } else if (el['forward']) {\n measure.entries.push(parseForward(el['forward'] as OrderedElement[]));\n } else if (el['direction']) {\n measure.entries.push(parseDirection(el['direction'] as OrderedElement[], getAttributes(el)));\n } else if (el['barline']) {\n barlines.push(parseBarline(el['barline'] as OrderedElement[], getAttributes(el)));\n } else if (el['print']) {\n measure.print = parsePrint(el['print'] as OrderedElement[], getAttributes(el));\n } else if (el['harmony']) {\n measure.entries.push(parseHarmony(el['harmony'] as OrderedElement[], getAttributes(el)));\n } else if (el['figured-bass']) {\n measure.entries.push(parseFiguredBass(el['figured-bass'] as OrderedElement[], getAttributes(el)));\n } else if (el['sound']) {\n measure.entries.push(parseSound(el['sound'] as OrderedElement[], getAttributes(el)));\n }\n }\n\n if (barlines.length > 0) measure.barlines = barlines;\n\n return measure;\n}\n\nfunction parsePrint(elements: OrderedElement[], attrs: Record<string, string>): Print {\n const print: Print = {};\n\n if (attrs['new-system'] === 'yes') print.newSystem = true;\n if (attrs['new-page'] === 'yes') print.newPage = true;\n if (attrs['blank-page']) print.blankPage = parseInt(attrs['blank-page'], 10);\n if (attrs['page-number']) print.pageNumber = attrs['page-number'];\n\n const sysLayout = getElementContent(elements, 'system-layout');\n if (sysLayout) print.systemLayout = parseSystemLayout(sysLayout);\n\n const pageLayout = getElementContent(elements, 'page-layout');\n if (pageLayout) print.pageLayout = parsePageLayout(pageLayout);\n\n const staffLayouts: { number?: number; staffDistance?: number }[] = [];\n for (const el of elements) {\n if (el['staff-layout']) {\n const layoutAttrs = getAttributes(el);\n const content = el['staff-layout'] as OrderedElement[];\n const layout: { number?: number; staffDistance?: number } = {};\n if (layoutAttrs['number']) layout.number = parseInt(layoutAttrs['number'], 10);\n const dist = getElementText(content, 'staff-distance');\n if (dist) layout.staffDistance = parseFloat(dist);\n staffLayouts.push(layout);\n }\n }\n if (staffLayouts.length > 0) print.staffLayouts = staffLayouts;\n\n const measureLayout = getElementContent(elements, 'measure-layout');\n if (measureLayout) {\n const dist = getElementText(measureLayout, 'measure-distance');\n if (dist) print.measureLayout = { measureDistance: parseFloat(dist) };\n }\n\n // measure-numbering with attributes\n parseFirstElement(elements, 'measure-numbering', (c, a) => {\n const measureNumbering: MeasureNumbering = { value: extractText(c) };\n if (a['system'] && ['only-top', 'only-bottom', 'all-system-parts', 'none'].includes(a['system'])) {\n measureNumbering.system = a['system'] as MeasureNumbering['system'];\n }\n print.measureNumbering = measureNumbering;\n });\n\n const pnd = parseFirstElement(elements, 'part-name-display', (c) => parseDisplayTexts(c));\n if (pnd) print.partNameDisplay = pnd;\n const pad = parseFirstElement(elements, 'part-abbreviation-display', (c) => parseDisplayTexts(c));\n if (pad) print.partAbbreviationDisplay = pad;\n\n return print;\n}\n\nfunction parseAttributes(elements: OrderedElement[]): MeasureAttributes {\n const attrs: MeasureAttributes = {};\n\n const divisions = getElementTextAsInt(elements, 'divisions');\n if (divisions !== undefined) attrs.divisions = divisions;\n\n const staves = getElementTextAsInt(elements, 'staves');\n if (staves !== undefined) attrs.staves = staves;\n\n // Time signature\n const time = getElementContent(elements, 'time');\n if (time) {\n attrs.time = parseTimeSignature(time, elements);\n }\n\n // Key signature(s) - can be multiple for multi-staff\n const keys: KeySignature[] = [];\n for (const el of elements) {\n if (el['key']) {\n const keyAttrs = getAttributes(el);\n const keyContent = el['key'] as OrderedElement[];\n const key = parseKeySignature(keyContent);\n if (keyAttrs['number']) key.number = parseInt(keyAttrs['number'], 10);\n if (keyAttrs['print-object'] === 'no') key.printObject = false;\n keys.push(key);\n }\n }\n if (keys.length === 1) {\n attrs.key = keys[0];\n } else if (keys.length > 1) {\n // Store as array in a separate property\n attrs.keys = keys;\n }\n\n // Clef(s)\n const clefs: Clef[] = [];\n for (const el of elements) {\n if (el['clef']) {\n const clefAttrs = getAttributes(el);\n clefs.push(parseClef(el['clef'] as OrderedElement[], clefAttrs));\n }\n }\n if (clefs.length > 0) attrs.clef = clefs;\n\n // Transpose\n const transpose = getElementContent(elements, 'transpose');\n if (transpose) {\n attrs.transpose = parseTranspose(transpose);\n }\n\n // Staff details\n const staffDetailsList: StaffDetails[] = [];\n for (const el of elements) {\n if (el['staff-details']) {\n const sdAttrs = getAttributes(el);\n const content = el['staff-details'] as OrderedElement[];\n staffDetailsList.push(parseStaffDetails(content, sdAttrs));\n }\n }\n if (staffDetailsList.length > 0) attrs.staffDetails = staffDetailsList;\n\n // Measure style\n const measureStyleList: MeasureStyle[] = [];\n for (const el of elements) {\n if (el['measure-style']) {\n const msAttrs = getAttributes(el);\n const content = el['measure-style'] as OrderedElement[];\n measureStyleList.push(parseMeasureStyle(content, msAttrs));\n }\n }\n if (measureStyleList.length > 0) attrs.measureStyle = measureStyleList;\n\n return attrs;\n}\n\nfunction parseTimeSignature(elements: OrderedElement[], parentElements: OrderedElement[]): TimeSignature {\n // Check for senza-misura first\n for (const el of elements) {\n if (el['senza-misura'] !== undefined) {\n const time: TimeSignature = {\n beats: '',\n beatType: 0,\n senzaMisura: true,\n };\n return time;\n }\n }\n\n // Collect all beats and beat-type values for compound time signatures\n const beatsList = collectElements(elements, 'beats', (c) => parseInt(extractText(c), 10));\n const beatTypeList = collectElements(elements, 'beat-type', (c) => parseInt(extractText(c), 10));\n\n const time: TimeSignature = {\n beats: beatsList.length > 0 ? String(beatsList[0]) : '4',\n beatType: beatTypeList.length > 0 ? beatTypeList[0] : 4,\n };\n\n // Store compound time signature data\n if (beatsList.length > 1 || beatTypeList.length > 1) {\n time.beatsList = beatsList;\n time.beatTypeList = beatTypeList;\n }\n\n // Get symbol and print-object attributes from parent\n for (const el of parentElements) {\n if (el['time']) {\n const attrs = getAttributes(el);\n if (attrs['symbol']) {\n const sym = attrs['symbol'];\n if (['common', 'cut', 'single-number', 'note', 'dotted-note', 'normal'].includes(sym)) {\n time.symbol = sym as TimeSignature['symbol'];\n }\n }\n if (attrs['print-object'] === 'no') {\n time.printObject = false;\n }\n break;\n }\n }\n\n return time;\n}\n\nfunction parseKeySignature(elements: OrderedElement[]): KeySignature {\n const fifths = getElementText(elements, 'fifths');\n const mode = getElementText(elements, 'mode');\n\n const key: KeySignature = {\n fifths: parseInt(fifths || '0', 10),\n };\n\n const validModes = ['major', 'minor', 'dorian', 'phrygian', 'lydian', 'mixolydian', 'aeolian', 'ionian', 'locrian'];\n if (mode && validModes.includes(mode)) {\n key.mode = mode as KeySignature['mode'];\n }\n\n // Parse cancel element with its location attribute\n parseFirstElement(elements, 'cancel', (c, a) => {\n key.cancel = parseInt(extractText(c), 10);\n if (a['location']) key.cancelLocation = a['location'] as 'left' | 'right' | 'before-barline';\n });\n\n // Non-traditional key signatures\n const keySteps = collectElements(elements, 'key-step', (c) => extractText(c));\n const keyAlters = collectElements(elements, 'key-alter', (c) => parseFloat(extractText(c)));\n const keyOctaves = collectElements(elements, 'key-octave', (c, a) => {\n const ko: KeyOctave = { number: parseInt(a['number'] || '1', 10), octave: parseInt(extractText(c), 10) };\n if (a['cancel'] === 'yes') ko.cancel = true;\n return ko;\n });\n\n if (keySteps.length > 0) key.keySteps = keySteps;\n if (keyAlters.length > 0) key.keyAlters = keyAlters;\n if (keyOctaves.length > 0) key.keyOctaves = keyOctaves;\n\n return key;\n}\n\nfunction parseClef(elements: OrderedElement[], attrs: Record<string, string>): Clef {\n const sign = getElementText(elements, 'sign') as Clef['sign'] || 'G';\n const line = parseInt(getElementText(elements, 'line') || '2', 10);\n\n const clef: Clef = { sign, line };\n\n if (attrs['number']) {\n clef.staff = parseInt(attrs['number'], 10);\n }\n\n const octaveChange = getElementTextAsInt(elements, 'clef-octave-change');\n if (octaveChange !== undefined) {\n clef.clefOctaveChange = octaveChange;\n }\n\n return clef;\n}\n\nfunction parseTranspose(elements: OrderedElement[]): Transpose {\n const transpose: Transpose = {\n diatonic: getElementTextAsInt(elements, 'diatonic', 0)!,\n chromatic: getElementTextAsInt(elements, 'chromatic', 0)!,\n };\n\n const octaveChange = getElementTextAsInt(elements, 'octave-change');\n if (octaveChange !== undefined) {\n transpose.octaveChange = octaveChange;\n }\n\n return transpose;\n}\n\nfunction parseNote(elements: OrderedElement[], attrs: Record<string, string>): NoteEntry {\n const note: NoteEntry = {\n type: 'note',\n duration: getElementTextAsInt(elements, 'duration', 0)!,\n voice: getElementTextAsInt(elements, 'voice', 1)!,\n };\n\n // Layout attributes\n if (attrs['default-x']) note.defaultX = parseFloat(attrs['default-x']);\n if (attrs['default-y']) note.defaultY = parseFloat(attrs['default-y']);\n if (attrs['relative-x']) note.relativeX = parseFloat(attrs['relative-x']);\n if (attrs['relative-y']) note.relativeY = parseFloat(attrs['relative-y']);\n if (attrs['dynamics']) note.dynamics = parseFloat(attrs['dynamics']);\n if (attrs['print-object'] === 'no') note.printObject = false;\n if (attrs['print-spacing'] === 'yes') note.printSpacing = true;\n if (attrs['print-spacing'] === 'no') note.printSpacing = false;\n\n // Cue note\n if (hasElement(elements, 'cue')) {\n note.cue = true;\n }\n\n // Instrument reference\n const instData = parseFirstElement(elements, 'instrument', (_, attrs) => attrs['id']);\n if (instData) note.instrument = instData;\n\n // Pitch or rest\n const pitch = getElementContent(elements, 'pitch');\n if (pitch) {\n note.pitch = parsePitch(pitch);\n }\n\n // Rest\n for (const el of elements) {\n if (el['rest'] !== undefined) {\n const restContent = el['rest'] as OrderedElement[];\n const restInfo: RestInfo = {};\n\n const restAttrs = getAttributes(el);\n if (restAttrs['measure'] === 'yes') restInfo.measure = true;\n\n const displayStep = getElementText(restContent, 'display-step');\n if (displayStep) restInfo.displayStep = displayStep;\n\n const displayOctave = getElementText(restContent, 'display-octave');\n if (displayOctave) restInfo.displayOctave = parseInt(displayOctave, 10);\n\n note.rest = restInfo;\n break;\n }\n }\n\n // Unpitched (percussion)\n parseFirstElement(elements, 'unpitched', (c) => {\n note.unpitched = {};\n const displayStep = getElementText(c, 'display-step');\n if (displayStep) note.unpitched.displayStep = displayStep;\n const displayOctave = getElementText(c, 'display-octave');\n if (displayOctave) note.unpitched.displayOctave = parseInt(displayOctave, 10);\n });\n\n // Staff\n const staff = getElementTextAsInt(elements, 'staff');\n if (staff !== undefined) note.staff = staff;\n\n // Chord - check if chord element exists\n if (hasElement(elements, 'chord')) {\n note.chord = true;\n }\n\n // Note type\n parseFirstElement(elements, 'type', (c, a) => {\n const noteType = extractText(c);\n if (isValidNoteType(noteType)) note.noteType = noteType;\n if (a['size']) note.noteTypeSize = a['size'];\n });\n\n // Dots\n const dotCount = elements.filter(el => el['dot'] !== undefined).length;\n if (dotCount > 0) note.dots = dotCount;\n\n // Accidental\n parseFirstElement(elements, 'accidental', (c, a) => {\n const accValue = extractText(c);\n if (isValidAccidental(accValue)) {\n const accInfo: AccidentalInfo = { value: accValue };\n if (a['cautionary'] === 'yes') accInfo.cautionary = true;\n if (a['editorial'] === 'yes') accInfo.editorial = true;\n if (a['parentheses'] === 'yes') accInfo.parentheses = true;\n if (a['bracket'] === 'yes') accInfo.bracket = true;\n if (a['relative-x']) accInfo.relativeX = parseFloat(a['relative-x']);\n if (a['relative-y']) accInfo.relativeY = parseFloat(a['relative-y']);\n if (a['color']) accInfo.color = a['color'];\n if (a['size']) accInfo.size = a['size'];\n if (a['font-size']) accInfo.fontSize = a['font-size'];\n note.accidental = accInfo;\n }\n });\n\n // Stem\n parseFirstElement(elements, 'stem', (c, a) => {\n const stemValue = extractText(c);\n if (stemValue === 'up' || stemValue === 'down' || stemValue === 'none' || stemValue === 'double') {\n note.stem = { value: stemValue };\n if (a['default-x']) note.stem.defaultX = parseFloat(a['default-x']);\n if (a['default-y']) note.stem.defaultY = parseFloat(a['default-y']);\n }\n });\n\n // Notehead\n parseFirstElement(elements, 'notehead', (c, a) => {\n const nhValue = extractText(c);\n if (isValidNotehead(nhValue)) {\n const nhInfo: NoteheadInfo = { value: nhValue };\n if (a['filled'] === 'yes') nhInfo.filled = true;\n else if (a['filled'] === 'no') nhInfo.filled = false;\n if (a['parentheses'] === 'yes') nhInfo.parentheses = true;\n note.notehead = nhInfo;\n }\n });\n\n // Tie (collect all tie elements)\n const tieElements = collectElements(elements, 'tie', (_, a) => {\n const t = a['type'];\n return (t === 'start' || t === 'stop' || t === 'continue') ? { type: t } : null;\n }).filter((t): t is { type: 'start' | 'stop' | 'continue' } => t !== null);\n if (tieElements.length > 0) {\n note.tie = tieElements[0];\n if (tieElements.length > 1) note.ties = tieElements;\n }\n\n // Beam\n const beams = collectElements(elements, 'beam', (c, a) => parseBeam(c, a));\n if (beams.length > 0) note.beam = beams;\n\n // Notations - collect ALL notations elements, not just the first\n const allNotations: Notation[] = [];\n let notationsIndex = 0;\n for (const el of elements) {\n if (el['notations']) {\n const parsedNotations = parseNotations(el['notations'] as OrderedElement[], notationsIndex);\n allNotations.push(...parsedNotations);\n notationsIndex++;\n }\n }\n if (allNotations.length > 0) {\n note.notations = allNotations;\n }\n\n // Lyrics\n const lyrics: Lyric[] = [];\n for (const el of elements) {\n if (el['lyric']) {\n lyrics.push(parseLyric(el['lyric'] as OrderedElement[], getAttributes(el)));\n }\n }\n if (lyrics.length > 0) note.lyrics = lyrics;\n\n // Grace note\n for (const el of elements) {\n if (el['grace'] !== undefined) {\n const graceAttrs = getAttributes(el);\n note.grace = {};\n if (graceAttrs['slash'] === 'yes') note.grace.slash = true;\n if (graceAttrs['steal-time-previous']) {\n note.grace.stealTimePrevious = parseFloat(graceAttrs['steal-time-previous']);\n }\n if (graceAttrs['steal-time-following']) {\n note.grace.stealTimeFollowing = parseFloat(graceAttrs['steal-time-following']);\n }\n note.duration = 0;\n break;\n }\n }\n\n // Time modification (tuplet)\n const timeMod = getElementContent(elements, 'time-modification');\n if (timeMod) {\n const actualNotes = getElementText(timeMod, 'actual-notes');\n const normalNotes = getElementText(timeMod, 'normal-notes');\n const normalType = getElementText(timeMod, 'normal-type');\n\n note.timeModification = {\n actualNotes: parseInt(actualNotes || '3', 10),\n normalNotes: parseInt(normalNotes || '2', 10),\n };\n\n if (normalType && isValidNoteType(normalType)) {\n note.timeModification.normalType = normalType;\n }\n\n // Count normal-dot elements\n let dotCount = 0;\n for (const tm of timeMod) {\n if (tm['normal-dot'] !== undefined) dotCount++;\n }\n if (dotCount > 0) note.timeModification.normalDots = dotCount;\n }\n\n return note;\n}\n\nfunction parsePitch(elements: OrderedElement[]): Pitch {\n const step = getElementText(elements, 'step') as Pitch['step'] || 'C';\n const octave = parseInt(getElementText(elements, 'octave') || '4', 10);\n const alter = getElementText(elements, 'alter');\n\n const pitch: Pitch = { step, octave };\n\n if (alter) {\n const alterValue = parseFloat(alter);\n if (alterValue !== 0) {\n pitch.alter = alterValue;\n }\n }\n\n return pitch;\n}\n\nfunction parseBeam(elements: OrderedElement[], attrs: Record<string, string>): BeamInfo {\n const text = extractText(elements);\n const validTypes = ['begin', 'continue', 'end', 'forward hook', 'backward hook'];\n return {\n number: parseInt(attrs['number'] || '1', 10),\n type: validTypes.includes(text) ? text as BeamInfo['type'] : 'begin',\n };\n}\n\nfunction parseNotations(elements: OrderedElement[], notationsIndex: number = 0): Notation[] {\n const notations: Notation[] = [];\n let articulationsIndex = 0;\n\n for (const el of elements) {\n if (el['tied']) {\n const attrs = getAttributes(el);\n const tied: TiedNotation = {\n type: 'tied',\n tiedType: (attrs['type'] as 'start' | 'stop' | 'continue' | 'let-ring') || 'start',\n number: attrs['number'] ? parseInt(attrs['number'], 10) : undefined,\n orientation: attrs['orientation'] as 'over' | 'under' | undefined,\n notationsIndex,\n };\n notations.push(tied);\n } else if (el['slur']) {\n const attrs = getAttributes(el);\n const slur: Notation = {\n type: 'slur',\n slurType: (attrs['type'] as 'start' | 'stop' | 'continue') || 'start',\n number: attrs['number'] ? parseInt(attrs['number'], 10) : undefined,\n lineType: attrs['line-type'] as 'solid' | 'dashed' | 'dotted' | 'wavy' | undefined,\n defaultX: attrs['default-x'] ? parseFloat(attrs['default-x']) : undefined,\n defaultY: attrs['default-y'] ? parseFloat(attrs['default-y']) : undefined,\n bezierX: attrs['bezier-x'] ? parseFloat(attrs['bezier-x']) : undefined,\n bezierY: attrs['bezier-y'] ? parseFloat(attrs['bezier-y']) : undefined,\n bezierX2: attrs['bezier-x2'] ? parseFloat(attrs['bezier-x2']) : undefined,\n bezierY2: attrs['bezier-y2'] ? parseFloat(attrs['bezier-y2']) : undefined,\n placement: attrs['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n };\n notations.push(slur);\n } else if (el['tuplet']) {\n const attrs = getAttributes(el);\n const tupletContent = el['tuplet'] as OrderedElement[];\n const tuplet: TupletNotation = {\n type: 'tuplet',\n tupletType: attrs['type'] === 'stop' ? 'stop' : 'start',\n number: attrs['number'] ? parseInt(attrs['number'], 10) : undefined,\n bracket: attrs['bracket'] === 'yes' ? true : attrs['bracket'] === 'no' ? false : undefined,\n showNumber: attrs['show-number'] as 'actual' | 'both' | 'none' | undefined,\n showType: attrs['show-type'] as 'actual' | 'both' | 'none' | undefined,\n lineShape: attrs['line-shape'] as 'straight' | 'curved' | undefined,\n placement: attrs['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n };\n\n // Parse tuplet-actual and tuplet-normal\n for (const tc of tupletContent) {\n if (tc['tuplet-actual']) {\n const actualContent = tc['tuplet-actual'] as OrderedElement[];\n const actual: NonNullable<TupletNotation['tupletActual']> = {};\n const num = getElementText(actualContent, 'tuplet-number');\n if (num) actual.tupletNumber = parseInt(num, 10);\n const type = getElementText(actualContent, 'tuplet-type');\n if (type && isValidNoteType(type)) actual.tupletType = type;\n let dotCount = 0;\n for (const ac of actualContent) {\n if (ac['tuplet-dot'] !== undefined) dotCount++;\n }\n if (dotCount > 0) actual.tupletDots = dotCount;\n if (Object.keys(actual).length > 0) tuplet.tupletActual = actual;\n } else if (tc['tuplet-normal']) {\n const normalContent = tc['tuplet-normal'] as OrderedElement[];\n const normal: NonNullable<TupletNotation['tupletNormal']> = {};\n const num = getElementText(normalContent, 'tuplet-number');\n if (num) normal.tupletNumber = parseInt(num, 10);\n const type = getElementText(normalContent, 'tuplet-type');\n if (type && isValidNoteType(type)) normal.tupletType = type;\n let dotCount = 0;\n for (const nc of normalContent) {\n if (nc['tuplet-dot'] !== undefined) dotCount++;\n }\n if (dotCount > 0) normal.tupletDots = dotCount;\n if (Object.keys(normal).length > 0) tuplet.tupletNormal = normal;\n }\n }\n\n notations.push(tuplet);\n } else if (el['articulations']) {\n const artContent = el['articulations'] as OrderedElement[];\n const articulationTypes = [\n 'accent', 'strong-accent', 'staccato', 'staccatissimo',\n 'tenuto', 'detached-legato', 'marcato', 'spiccato',\n 'scoop', 'plop', 'doit', 'falloff', 'breath-mark',\n 'caesura', 'stress', 'unstress', 'soft-accent',\n ];\n const currentArtIndex = articulationsIndex;\n articulationsIndex++;\n for (const art of artContent) {\n for (const artType of articulationTypes) {\n if (art[artType] !== undefined) {\n const artAttrs = getAttributes(art);\n const artNotation: ArticulationNotation = {\n type: 'articulation',\n articulation: artType as any,\n placement: artAttrs['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n articulationsIndex: currentArtIndex,\n };\n // Handle strong-accent type attribute\n if (artType === 'strong-accent') {\n if (artAttrs['type'] === 'up' || artAttrs['type'] === 'down') {\n artNotation.strongAccentType = artAttrs['type'];\n }\n }\n // Handle positioning attributes\n if (artAttrs['default-x']) {\n artNotation.defaultX = parseFloat(artAttrs['default-x']);\n }\n if (artAttrs['default-y']) {\n artNotation.defaultY = parseFloat(artAttrs['default-y']);\n }\n notations.push(artNotation);\n }\n }\n }\n } else if (el['ornaments']) {\n const ornContent = el['ornaments'] as OrderedElement[];\n const simpleOrnamentTypes = [\n 'trill-mark', 'mordent', 'inverted-mordent', 'turn', 'inverted-turn',\n 'delayed-turn', 'delayed-inverted-turn', 'vertical-turn', 'shake',\n 'schleifer', 'haydn',\n ];\n\n // Collect accidental-marks for the ornaments group\n const accidentalMarks = collectElements(ornContent, 'accidental-mark', (c, a) => {\n const value = extractText(c);\n return isValidAccidental(value) ? { value: value as Accidental, placement: a['placement'] as 'above' | 'below' | undefined } : null;\n }).filter((m) => m !== null);\n\n for (const orn of ornContent) {\n // Simple ornaments\n for (const ornType of simpleOrnamentTypes) {\n if (orn[ornType] !== undefined) {\n const ornAttrs = getAttributes(orn);\n const ornNotation: OrnamentNotation = {\n type: 'ornament',\n ornament: ornType as any,\n placement: ornAttrs['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n };\n // Handle default-y positioning\n if (ornAttrs['default-y']) {\n ornNotation.defaultY = parseFloat(ornAttrs['default-y']);\n }\n // Attach accidental marks to the first ornament in the group\n if (accidentalMarks.length > 0 && notations.filter(n => n.type === 'ornament').length === 0) {\n ornNotation.accidentalMarks = accidentalMarks as any;\n }\n notations.push(ornNotation);\n }\n }\n // Wavy-line\n if (orn['wavy-line'] !== undefined) {\n const wlAttrs = getAttributes(orn);\n const wlNotation: OrnamentNotation = {\n type: 'ornament',\n ornament: 'wavy-line',\n wavyLineType: wlAttrs['type'] as 'start' | 'stop' | 'continue' | undefined,\n number: wlAttrs['number'] ? parseInt(wlAttrs['number'], 10) : undefined,\n placement: wlAttrs['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n };\n if (wlAttrs['default-y']) {\n wlNotation.defaultY = parseFloat(wlAttrs['default-y']);\n }\n notations.push(wlNotation);\n }\n // Tremolo\n if (orn['tremolo'] !== undefined) {\n const tremAttrs = getAttributes(orn);\n const marks = extractText(orn['tremolo'] as OrderedElement[]);\n const tremNotation: OrnamentNotation = {\n type: 'ornament',\n ornament: 'tremolo',\n tremoloMarks: marks ? parseInt(marks, 10) : undefined,\n tremoloType: tremAttrs['type'] as 'start' | 'stop' | 'single' | 'unmeasured' | undefined,\n placement: tremAttrs['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n };\n if (tremAttrs['default-x']) tremNotation.defaultX = parseFloat(tremAttrs['default-x']);\n if (tremAttrs['default-y']) tremNotation.defaultY = parseFloat(tremAttrs['default-y']);\n notations.push(tremNotation);\n }\n }\n } else if (el['technical']) {\n const techContent = el['technical'] as OrderedElement[];\n // Technical elements that can have text content\n const technicalWithText = ['hammer-on', 'pull-off', 'tap', 'pluck', 'fingering', 'other-technical'];\n const technicalTypes = [\n 'up-bow', 'down-bow', 'harmonic', 'open-string', 'thumb-position',\n 'fingering', 'pluck', 'double-tongue', 'triple-tongue', 'stopped',\n 'snap-pizzicato', 'fret', 'string', 'hammer-on', 'pull-off',\n 'tap', 'heel', 'toe', 'fingernails', 'hole', 'arrow', 'handbell',\n 'brass-bend', 'flip', 'smear', 'open', 'half-muted', 'harmon-mute',\n 'golpe', 'other-technical',\n ];\n for (const tech of techContent) {\n // Handle bend with bend-alter\n if (tech['bend'] !== undefined) {\n const bendContent = tech['bend'] as OrderedElement[];\n const techAttrs = getAttributes(tech);\n const techNotation: TechnicalNotation = {\n type: 'technical',\n technical: 'bend',\n placement: techAttrs['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n };\n const bendAlter = getElementText(bendContent, 'bend-alter');\n if (bendAlter) techNotation.bendAlter = parseFloat(bendAlter);\n if (hasElement(bendContent, 'pre-bend')) techNotation.preBend = true;\n if (hasElement(bendContent, 'release')) techNotation.release = true;\n const withBar = getElementText(bendContent, 'with-bar');\n if (withBar) techNotation.withBar = parseFloat(withBar);\n notations.push(techNotation);\n }\n // Handle other technical elements\n for (const techType of technicalTypes) {\n if (tech[techType] !== undefined) {\n const techAttrs = getAttributes(tech);\n const notation: TechnicalNotation = {\n type: 'technical',\n technical: techType as any,\n placement: techAttrs['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n };\n const techElContent = tech[techType] as OrderedElement[];\n // Get text content for elements that have it\n if (technicalWithText.includes(techType)) {\n const text = extractText(techElContent);\n if (text) notation.text = text;\n }\n // Get string/fret for those elements\n if (techType === 'string') {\n const text = extractText(techElContent);\n if (text) notation.string = parseInt(text, 10);\n }\n if (techType === 'fret') {\n const text = extractText(techElContent);\n if (text) notation.fret = parseInt(text, 10);\n }\n // Handle harmonic children\n if (techType === 'harmonic') {\n if (hasElement(techElContent, 'natural')) notation.harmonicNatural = true;\n if (hasElement(techElContent, 'artificial')) notation.harmonicArtificial = true;\n if (hasElement(techElContent, 'base-pitch')) notation.basePitch = true;\n if (hasElement(techElContent, 'touching-pitch')) notation.touchingPitch = true;\n if (hasElement(techElContent, 'sounding-pitch')) notation.soundingPitch = true;\n }\n // Handle hammer-on/pull-off type attribute\n if (techType === 'hammer-on' || techType === 'pull-off') {\n const typeAttr = techAttrs['type'];\n if (typeAttr === 'start' || typeAttr === 'stop') {\n notation.startStop = typeAttr;\n }\n }\n // Handle fingering substitution/alternate\n if (techType === 'fingering') {\n if (techAttrs['substitution'] === 'yes') notation.fingeringSubstitution = true;\n if (techAttrs['alternate'] === 'yes') notation.fingeringAlternate = true;\n }\n // Handle heel/toe substitution\n if (techType === 'heel' || techType === 'toe') {\n if (techAttrs['substitution'] === 'yes') notation.substitution = true;\n }\n // Positioning attributes\n if (techAttrs['default-x']) {\n notation.defaultX = parseFloat(techAttrs['default-x']);\n }\n if (techAttrs['default-y']) {\n notation.defaultY = parseFloat(techAttrs['default-y']);\n }\n notations.push(notation);\n }\n }\n }\n } else if (el['dynamics']) {\n const dynContent = el['dynamics'] as OrderedElement[];\n const dynamicsValues: DynamicsValue[] = [];\n const allDynamics: DynamicsValue[] = [\n 'pppppp', 'ppppp', 'pppp', 'ppp', 'pp', 'p',\n 'mp', 'mf',\n 'f', 'ff', 'fff', 'ffff', 'fffff', 'ffffff',\n 'sf', 'sfz', 'sffz', 'sfp', 'sfpp', 'fp', 'rf', 'rfz', 'fz', 'n', 'pf',\n ];\n let otherDynamics: string | undefined;\n for (const dyn of dynContent) {\n for (const dv of allDynamics) {\n if (dyn[dv] !== undefined) dynamicsValues.push(dv);\n }\n // Handle other-dynamics\n const od = parseFirstElement([dyn], 'other-dynamics', (c) => extractText(c));\n if (od) otherDynamics = od;\n }\n if (dynamicsValues.length > 0 || otherDynamics) {\n const dynAttrs = getAttributes(el);\n const dynNotation: DynamicsNotation = {\n type: 'dynamics',\n dynamics: dynamicsValues,\n placement: dynAttrs['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n };\n if (otherDynamics) dynNotation.otherDynamics = otherDynamics;\n notations.push(dynNotation);\n }\n } else if (el['fermata'] !== undefined) {\n const a = getAttributes(el);\n const shape = extractText(el['fermata'] as OrderedElement[]);\n const fermataNotation: Notation = {\n type: 'fermata',\n shape: shape as any || undefined,\n fermataType: a['type'] as 'upright' | 'inverted' | undefined,\n placement: a['placement'] as 'above' | 'below' | undefined,\n notationsIndex,\n };\n if (a['default-x']) (fermataNotation as any).defaultX = parseFloat(a['default-x']);\n if (a['default-y']) (fermataNotation as any).defaultY = parseFloat(a['default-y']);\n notations.push(fermataNotation);\n } else if (el['arpeggiate'] !== undefined) {\n const arpAttrs = getAttributes(el);\n notations.push({\n type: 'arpeggiate',\n direction: arpAttrs['direction'] as 'up' | 'down' | undefined,\n number: arpAttrs['number'] ? parseInt(arpAttrs['number'], 10) : undefined,\n notationsIndex,\n });\n } else if (el['glissando']) {\n const glissAttrs = getAttributes(el);\n const glissContent = el['glissando'] as OrderedElement[];\n let text: string | undefined;\n for (const item of glissContent) {\n if (item['#text'] !== undefined) {\n text = String(item['#text']);\n break;\n }\n }\n notations.push({\n type: 'glissando',\n glissandoType: glissAttrs['type'] === 'stop' ? 'stop' : 'start',\n number: glissAttrs['number'] ? parseInt(glissAttrs['number'], 10) : undefined,\n lineType: glissAttrs['line-type'] as 'solid' | 'dashed' | 'dotted' | 'wavy' | undefined,\n text,\n notationsIndex,\n });\n } else if (el['slide']) {\n const slideAttrs = getAttributes(el);\n notations.push({\n type: 'slide',\n slideType: slideAttrs['type'] === 'stop' ? 'stop' : 'start',\n number: slideAttrs['number'] ? parseInt(slideAttrs['number'], 10) : undefined,\n lineType: slideAttrs['line-type'] as 'solid' | 'dashed' | 'dotted' | 'wavy' | undefined,\n notationsIndex,\n });\n }\n }\n\n return notations;\n}\n\nfunction parseLyric(elements: OrderedElement[], attrs: Record<string, string>): Lyric {\n // Collect all text elements and check for elision\n const textElements: LyricTextElement[] = [];\n let hasElision = false;\n let currentSyllabic: 'single' | 'begin' | 'middle' | 'end' | undefined;\n\n for (const el of elements) {\n if (el['syllabic']) {\n const content = el['syllabic'] as OrderedElement[];\n for (const item of content) {\n if (item['#text'] !== undefined) {\n const syl = String(item['#text']);\n if (syl === 'single' || syl === 'begin' || syl === 'middle' || syl === 'end') {\n currentSyllabic = syl;\n }\n break;\n }\n }\n } else if (el['text']) {\n const content = el['text'] as OrderedElement[];\n for (const item of content) {\n if (item['#text'] !== undefined) {\n textElements.push({\n text: String(item['#text']),\n syllabic: currentSyllabic,\n });\n currentSyllabic = undefined;\n break;\n }\n }\n } else if (el['elision'] !== undefined) {\n hasElision = true;\n }\n }\n\n const lyric: Lyric = {\n text: textElements.length > 0 ? textElements[0].text : '',\n };\n\n if (attrs['number']) {\n lyric.number = parseInt(attrs['number'], 10);\n }\n\n if (attrs['default-y']) {\n lyric.defaultY = parseFloat(attrs['default-y']);\n }\n\n if (attrs['name']) {\n lyric.name = attrs['name'];\n }\n\n if (attrs['justify']) {\n lyric.justify = attrs['justify'];\n }\n\n if (attrs['relative-x']) {\n lyric.relativeX = parseFloat(attrs['relative-x']);\n }\n\n if (attrs['placement']) {\n lyric.placement = attrs['placement'] as 'above' | 'below';\n }\n\n // Set syllabic from first text element\n if (textElements.length > 0 && textElements[0].syllabic) {\n lyric.syllabic = textElements[0].syllabic;\n }\n\n // If multiple text elements (elision case), store all of them\n if (textElements.length > 1) {\n lyric.textElements = textElements;\n }\n\n if (hasElision) {\n lyric.elision = true;\n }\n\n for (const el of elements) {\n if (el['extend'] !== undefined) {\n const extendAttrs = getAttributes(el);\n const extendType = extendAttrs['type'] as 'start' | 'stop' | 'continue' | undefined;\n if (extendType) {\n lyric.extend = { type: extendType };\n } else {\n lyric.extend = true;\n }\n } else if (el['end-line'] !== undefined) {\n lyric.endLine = true;\n } else if (el['end-paragraph'] !== undefined) {\n lyric.endParagraph = true;\n }\n }\n\n return lyric;\n}\n\nfunction parseBackup(elements: OrderedElement[]): BackupEntry {\n return {\n type: 'backup',\n duration: parseInt(getElementText(elements, 'duration') || '0', 10),\n };\n}\n\nfunction parseForward(elements: OrderedElement[]): ForwardEntry {\n const forward: ForwardEntry = {\n type: 'forward',\n duration: parseInt(getElementText(elements, 'duration') || '0', 10),\n };\n\n const voice = getElementText(elements, 'voice');\n if (voice) forward.voice = parseInt(voice, 10);\n\n const staff = getElementText(elements, 'staff');\n if (staff) forward.staff = parseInt(staff, 10);\n\n return forward;\n}\n\nfunction parseDirection(elements: OrderedElement[], attrs: Record<string, string>): DirectionEntry {\n const direction: DirectionEntry = {\n type: 'direction',\n directionTypes: [],\n };\n\n if (attrs['placement'] === 'above' || attrs['placement'] === 'below') {\n direction.placement = attrs['placement'];\n }\n\n if (attrs['directive'] === 'yes') {\n direction.directive = true;\n }\n\n if (attrs['system'] === 'only-top' || attrs['system'] === 'also-top' || attrs['system'] === 'none') {\n direction.system = attrs['system'];\n }\n\n const staff = getElementText(elements, 'staff');\n if (staff) direction.staff = parseInt(staff, 10);\n\n const voice = getElementText(elements, 'voice');\n if (voice) direction.voice = parseInt(voice, 10);\n\n // Parse offset with sound attribute\n parseFirstElement(elements, 'offset', (c, a) => {\n const text = extractText(c);\n if (text) direction.offset = parseInt(text, 10);\n if (a['sound'] === 'yes') direction.offsetSound = true;\n });\n\n // Direction types\n for (const el of elements) {\n if (el['direction-type']) {\n const parsed = parseDirectionType(el['direction-type'] as OrderedElement[]);\n if (parsed) {\n direction.directionTypes.push(parsed);\n }\n }\n }\n\n // Sound\n for (const el of elements) {\n if (el['sound']) {\n const soundAttrs = getAttributes(el);\n const soundContent = el['sound'] as OrderedElement[];\n direction.sound = {};\n if (soundAttrs['tempo']) direction.sound.tempo = parseFloat(soundAttrs['tempo']);\n if (soundAttrs['dynamics']) direction.sound.dynamics = parseFloat(soundAttrs['dynamics']);\n\n // Parse midi-instrument\n for (const soundEl of soundContent) {\n if (soundEl['midi-instrument']) {\n const midiAttrs = getAttributes(soundEl);\n const midiContent = soundEl['midi-instrument'] as OrderedElement[];\n direction.sound.midiInstrument = {\n id: midiAttrs['id'] || '',\n };\n const midiProgram = getElementText(midiContent, 'midi-program');\n if (midiProgram) direction.sound.midiInstrument.midiProgram = parseInt(midiProgram, 10);\n const midiChannel = getElementText(midiContent, 'midi-channel');\n if (midiChannel) direction.sound.midiInstrument.midiChannel = parseInt(midiChannel, 10);\n const volume = getElementText(midiContent, 'volume');\n if (volume) direction.sound.midiInstrument.volume = parseFloat(volume);\n const pan = getElementText(midiContent, 'pan');\n if (pan) direction.sound.midiInstrument.pan = parseFloat(pan);\n }\n }\n break;\n }\n }\n\n return direction;\n}\n\nfunction parseDirectionType(elements: OrderedElement[]): DirectionType | null {\n for (const el of elements) {\n // Dynamics\n if (el['dynamics']) {\n const dynAttrs = getAttributes(el);\n const dynContent = el['dynamics'] as OrderedElement[];\n const dynamicsValues: DynamicsValue[] = [\n 'pppppp', 'ppppp', 'pppp', 'ppp', 'pp', 'p',\n 'mp', 'mf',\n 'f', 'ff', 'fff', 'ffff', 'fffff', 'ffffff',\n 'sf', 'sfz', 'sffz', 'sfp', 'sfpp', 'fp', 'rf', 'rfz', 'fz', 'n', 'pf',\n ];\n for (const dyn of dynContent) {\n for (const dv of dynamicsValues) {\n if (dyn[dv] !== undefined) {\n const result: DirectionType = { kind: 'dynamics', value: dv };\n if (dynAttrs['default-x']) result.defaultX = parseFloat(dynAttrs['default-x']);\n if (dynAttrs['default-y']) result.defaultY = parseFloat(dynAttrs['default-y']);\n if (dynAttrs['relative-x']) result.relativeX = parseFloat(dynAttrs['relative-x']);\n if (dynAttrs['halign']) result.halign = dynAttrs['halign'];\n return result;\n }\n }\n }\n }\n\n // Wedge\n if (el['wedge']) {\n const wedgeAttrs = getAttributes(el);\n const wedgeType = wedgeAttrs['type'];\n if (wedgeType === 'crescendo' || wedgeType === 'diminuendo' || wedgeType === 'stop') {\n const result: DirectionType = { kind: 'wedge', type: wedgeType };\n if (wedgeAttrs['spread']) result.spread = parseFloat(wedgeAttrs['spread']);\n if (wedgeAttrs['default-y']) result.defaultY = parseFloat(wedgeAttrs['default-y']);\n if (wedgeAttrs['relative-x']) result.relativeX = parseFloat(wedgeAttrs['relative-x']);\n return result;\n }\n }\n\n // Metronome\n if (el['metronome']) {\n const metAttrs = getAttributes(el);\n const metContent = el['metronome'] as OrderedElement[];\n const perMinute = getElementText(metContent, 'per-minute');\n\n // Parse beat-units (could be one or two for tied/ratio)\n const beatUnits: string[] = [];\n const beatUnitDots: boolean[] = [];\n let dotForPrev = false;\n\n for (const met of metContent) {\n if (met['beat-unit']) {\n const buContent = met['beat-unit'] as OrderedElement[];\n for (const item of buContent) {\n if (item['#text'] !== undefined) {\n beatUnits.push(String(item['#text']));\n dotForPrev = true;\n break;\n }\n }\n } else if (met['beat-unit-dot'] !== undefined && dotForPrev) {\n beatUnitDots[beatUnits.length - 1] = true;\n }\n }\n\n if (beatUnits.length > 0 && isValidNoteType(beatUnits[0])) {\n const result: DirectionType = {\n kind: 'metronome',\n beatUnit: beatUnits[0] as any,\n };\n if (perMinute) {\n result.perMinute = isNaN(parseInt(perMinute, 10)) ? perMinute : parseInt(perMinute, 10);\n }\n if (beatUnitDots[0]) result.beatUnitDot = true;\n if (beatUnits.length > 1 && isValidNoteType(beatUnits[1])) {\n result.beatUnit2 = beatUnits[1] as any;\n if (beatUnitDots[1]) result.beatUnitDot2 = true;\n }\n if (metAttrs['parentheses'] === 'yes') result.parentheses = true;\n if (metAttrs['default-y']) result.defaultY = parseFloat(metAttrs['default-y']);\n if (metAttrs['font-family']) result.fontFamily = metAttrs['font-family'];\n if (metAttrs['font-size']) result.fontSize = metAttrs['font-size'];\n return result;\n }\n }\n\n // Words\n if (el['words']) {\n const a = getAttributes(el);\n const text = extractText(el['words'] as OrderedElement[]);\n if (text) {\n const result: DirectionType = { kind: 'words', text };\n if (a['default-x']) result.defaultX = parseFloat(a['default-x']);\n if (a['default-y']) result.defaultY = parseFloat(a['default-y']);\n if (a['relative-x']) result.relativeX = parseFloat(a['relative-x']);\n if (a['font-family']) result.fontFamily = a['font-family'];\n if (a['font-size']) result.fontSize = a['font-size'];\n if (a['font-style']) result.fontStyle = a['font-style'];\n if (a['font-weight']) result.fontWeight = a['font-weight'];\n if (a['xml:lang']) result.xmlLang = a['xml:lang'];\n if (a['justify']) result.justify = a['justify'];\n if (a['color']) result.color = a['color'];\n if (a['xml:space']) result.xmlSpace = a['xml:space'];\n if (a['halign']) result.halign = a['halign'];\n return result;\n }\n }\n\n // Rehearsal\n if (el['rehearsal']) {\n const a = getAttributes(el);\n const text = extractText(el['rehearsal'] as OrderedElement[]);\n if (text) {\n const result: DirectionType = { kind: 'rehearsal', text };\n if (a['enclosure']) result.enclosure = a['enclosure'];\n if (a['default-x']) result.defaultX = parseFloat(a['default-x']);\n if (a['default-y']) result.defaultY = parseFloat(a['default-y']);\n if (a['font-size']) result.fontSize = a['font-size'];\n if (a['font-weight']) result.fontWeight = a['font-weight'];\n return result;\n }\n }\n\n // Bracket\n if (el['bracket']) {\n const bracketAttrs = getAttributes(el);\n const bracketType = bracketAttrs['type'];\n if (bracketType === 'start' || bracketType === 'stop' || bracketType === 'continue') {\n const result: DirectionType = { kind: 'bracket', type: bracketType };\n if (bracketAttrs['number']) result.number = parseInt(bracketAttrs['number'], 10);\n if (bracketAttrs['line-end']) result.lineEnd = bracketAttrs['line-end'] as 'up' | 'down' | 'both' | 'arrow' | 'none';\n if (bracketAttrs['line-type']) result.lineType = bracketAttrs['line-type'] as 'solid' | 'dashed' | 'dotted' | 'wavy';\n return result;\n }\n }\n\n // Dashes\n if (el['dashes']) {\n const dashAttrs = getAttributes(el);\n const dashType = dashAttrs['type'];\n if (dashType === 'start' || dashType === 'stop' || dashType === 'continue') {\n const result: DirectionType = { kind: 'dashes', type: dashType };\n if (dashAttrs['number']) result.number = parseInt(dashAttrs['number'], 10);\n if (dashAttrs['dash-length']) result.dashLength = parseFloat(dashAttrs['dash-length']);\n if (dashAttrs['default-y']) result.defaultY = parseFloat(dashAttrs['default-y']);\n if (dashAttrs['space-length']) result.spaceLength = parseFloat(dashAttrs['space-length']);\n return result;\n }\n }\n\n // Accordion registration\n if (el['accordion-registration']) {\n const accContent = el['accordion-registration'] as OrderedElement[];\n const result: DirectionType = { kind: 'accordion-registration' };\n for (const acc of accContent) {\n if (acc['accordion-high'] !== undefined) {\n result.high = true;\n } else if (acc['accordion-middle']) {\n const midContent = acc['accordion-middle'] as OrderedElement[];\n for (const item of midContent) {\n if (item['#text'] !== undefined) {\n result.middle = parseInt(String(item['#text']), 10);\n break;\n }\n }\n } else if (acc['accordion-low'] !== undefined) {\n result.low = true;\n }\n }\n return result;\n }\n\n // Other direction\n if (el['other-direction']) {\n const otherAttrs = getAttributes(el);\n const otherContent = el['other-direction'] as OrderedElement[];\n for (const o of otherContent) {\n if (o['#text'] !== undefined) {\n const result: DirectionType = { kind: 'other-direction', text: String(o['#text']) };\n if (otherAttrs['default-x']) result.defaultX = parseFloat(otherAttrs['default-x']);\n if (otherAttrs['default-y']) result.defaultY = parseFloat(otherAttrs['default-y']);\n if (otherAttrs['halign']) result.halign = otherAttrs['halign'];\n if (otherAttrs['print-object'] === 'no') result.printObject = false;\n return result;\n }\n }\n }\n\n // Segno\n if (el['segno'] !== undefined) {\n return { kind: 'segno' };\n }\n\n // Coda\n if (el['coda'] !== undefined) {\n return { kind: 'coda' };\n }\n\n // Eyeglasses\n if (el['eyeglasses'] !== undefined) {\n return { kind: 'eyeglasses' };\n }\n\n // Damp\n if (el['damp'] !== undefined) {\n return { kind: 'damp' };\n }\n\n // Damp-all\n if (el['damp-all'] !== undefined) {\n return { kind: 'damp-all' };\n }\n\n // Scordatura\n if (el['scordatura'] !== undefined) {\n const scordContent = el['scordatura'] as OrderedElement[];\n const accords: { string: number; tuningStep: string; tuningAlter?: number; tuningOctave: number }[] = [];\n for (const sc of scordContent) {\n if (sc['accord']) {\n const accAttrs = getAttributes(sc);\n const accContent = sc['accord'] as OrderedElement[];\n const tuningStep = getElementText(accContent, 'tuning-step');\n const tuningOctave = getElementText(accContent, 'tuning-octave');\n const tuningAlter = getElementText(accContent, 'tuning-alter');\n if (tuningStep && tuningOctave) {\n const accord: { string: number; tuningStep: string; tuningAlter?: number; tuningOctave: number } = {\n string: parseInt(accAttrs['string'] || '1', 10),\n tuningStep,\n tuningOctave: parseInt(tuningOctave, 10),\n };\n if (tuningAlter) accord.tuningAlter = parseFloat(tuningAlter);\n accords.push(accord);\n }\n }\n }\n return { kind: 'scordatura', accords: accords.length > 0 ? accords : undefined };\n }\n\n // Harp pedals\n if (el['harp-pedals'] !== undefined) {\n const harpContent = el['harp-pedals'] as OrderedElement[];\n const pedalTunings: { pedalStep: string; pedalAlter: number }[] = [];\n for (const hp of harpContent) {\n if (hp['pedal-tuning']) {\n const ptContent = hp['pedal-tuning'] as OrderedElement[];\n const pedalStep = getElementText(ptContent, 'pedal-step');\n const pedalAlter = getElementText(ptContent, 'pedal-alter');\n if (pedalStep) {\n pedalTunings.push({\n pedalStep,\n pedalAlter: pedalAlter ? parseFloat(pedalAlter) : 0,\n });\n }\n }\n }\n return { kind: 'harp-pedals', pedalTunings: pedalTunings.length > 0 ? pedalTunings : undefined };\n }\n\n // Image\n if (el['image'] !== undefined) {\n const imgAttrs = getAttributes(el);\n return {\n kind: 'image',\n source: imgAttrs['source'],\n type: imgAttrs['type'],\n };\n }\n\n // Pedal\n if (el['pedal']) {\n const pedalAttrs = getAttributes(el);\n const pedalType = pedalAttrs['type'];\n if (pedalType === 'start' || pedalType === 'stop' || pedalType === 'change' || pedalType === 'continue') {\n const result: DirectionType = { kind: 'pedal', type: pedalType };\n if (pedalAttrs['line'] === 'yes') result.line = true;\n else if (pedalAttrs['line'] === 'no') result.line = false;\n if (pedalAttrs['default-y']) result.defaultY = parseFloat(pedalAttrs['default-y']);\n if (pedalAttrs['relative-x']) result.relativeX = parseFloat(pedalAttrs['relative-x']);\n if (pedalAttrs['halign']) result.halign = pedalAttrs['halign'];\n return result;\n }\n }\n\n // Octave shift\n if (el['octave-shift']) {\n const shiftAttrs = getAttributes(el);\n const shiftType = shiftAttrs['type'];\n if (shiftType === 'up' || shiftType === 'down' || shiftType === 'stop') {\n const result: DirectionType = { kind: 'octave-shift', type: shiftType };\n if (shiftAttrs['size']) result.size = parseInt(shiftAttrs['size'], 10);\n return result;\n }\n }\n\n // Swing\n if (el['swing']) {\n const swingContent = el['swing'] as OrderedElement[];\n const result: DirectionType = { kind: 'swing' };\n\n for (const sw of swingContent) {\n if (sw['straight'] !== undefined) {\n result.straight = true;\n } else if (sw['first']) {\n const firstContent = sw['first'] as OrderedElement[];\n for (const item of firstContent) {\n if (item['#text'] !== undefined) {\n result.first = parseInt(String(item['#text']), 10);\n break;\n }\n }\n } else if (sw['second']) {\n const secondContent = sw['second'] as OrderedElement[];\n for (const item of secondContent) {\n if (item['#text'] !== undefined) {\n result.second = parseInt(String(item['#text']), 10);\n break;\n }\n }\n } else if (sw['swing-type']) {\n const stContent = sw['swing-type'] as OrderedElement[];\n for (const item of stContent) {\n if (item['#text'] !== undefined && isValidNoteType(String(item['#text']))) {\n result.swingType = String(item['#text']) as any;\n break;\n }\n }\n }\n }\n\n return result;\n }\n }\n\n return null;\n}\n\nfunction parseBarline(elements: OrderedElement[], attrs: Record<string, string>): Barline {\n const location = (attrs['location'] || 'right') as Barline['location'];\n\n const barline: Barline = { location };\n\n const barStyle = getElementText(elements, 'bar-style');\n if (barStyle && isValidBarStyle(barStyle)) {\n barline.barStyle = barStyle;\n }\n\n for (const el of elements) {\n if (el['repeat']) {\n const repeatAttrs = getAttributes(el);\n const direction = repeatAttrs['direction'];\n if (direction === 'forward' || direction === 'backward') {\n barline.repeat = { direction };\n if (repeatAttrs['times']) {\n barline.repeat.times = parseInt(repeatAttrs['times'], 10);\n }\n }\n } else if (el['ending']) {\n const endingAttrs = getAttributes(el);\n const number = endingAttrs['number'];\n const type = endingAttrs['type'];\n if (number && (type === 'start' || type === 'stop' || type === 'discontinue')) {\n barline.ending = { number, type };\n }\n }\n }\n\n return barline;\n}\n\n// ============================================================\n// Type Validators (using Sets for O(1) lookup)\n// ============================================================\n\nconst VALID_NOTE_TYPES = new Set<string>([\n 'maxima', 'long', 'breve', 'whole', 'half', 'quarter',\n 'eighth', '16th', '32nd', '64th', '128th', '256th', '512th', '1024th',\n]);\n\nconst VALID_ACCIDENTALS = new Set<string>([\n 'sharp', 'natural', 'flat', 'double-sharp', 'double-flat', 'sharp-sharp', 'flat-flat',\n 'natural-sharp', 'natural-flat', 'quarter-flat', 'quarter-sharp',\n 'three-quarters-flat', 'three-quarters-sharp', 'sharp-down', 'sharp-up',\n 'natural-down', 'natural-up', 'flat-down', 'flat-up', 'double-sharp-down',\n 'double-sharp-up', 'flat-flat-down', 'flat-flat-up', 'arrow-down', 'arrow-up',\n 'triple-sharp', 'triple-flat', 'slash-quarter-sharp', 'slash-sharp',\n 'slash-flat', 'double-slash-flat', 'sharp-1', 'sharp-2', 'sharp-3', 'sharp-5',\n 'flat-1', 'flat-2', 'flat-3', 'flat-4', 'sori', 'koron', 'other',\n]);\n\nconst VALID_NOTEHEADS = new Set<string>([\n 'slash', 'triangle', 'diamond', 'square', 'cross', 'x', 'circle-x',\n 'inverted triangle', 'arrow down', 'arrow up', 'circled', 'slashed',\n 'back slashed', 'normal', 'cluster', 'circle dot', 'left triangle',\n 'rectangle', 'none', 'do', 're', 'mi', 'fa', 'fa up', 'so', 'la', 'ti', 'other',\n]);\n\nconst VALID_BAR_STYLES = new Set<string>([\n 'regular', 'dotted', 'dashed', 'heavy',\n 'light-light', 'light-heavy', 'heavy-light', 'heavy-heavy', 'none',\n]);\n\nfunction isValidNoteType(value: string): value is NoteType {\n return VALID_NOTE_TYPES.has(value);\n}\n\nfunction isValidAccidental(value: string): value is Accidental {\n return VALID_ACCIDENTALS.has(value);\n}\n\nfunction isValidNotehead(value: string): value is NoteheadValue {\n return VALID_NOTEHEADS.has(value);\n}\n\nfunction isValidBarStyle(value: string): value is NonNullable<Barline['barStyle']> {\n return VALID_BAR_STYLES.has(value);\n}\n\n// ============================================================\n// New Parse Functions for Extended Support\n// ============================================================\n\nfunction parseStaffDetails(elements: OrderedElement[], attrs: Record<string, string>): StaffDetails {\n const sd: StaffDetails = {};\n\n if (attrs['number']) sd.number = parseInt(attrs['number'], 10);\n if (attrs['print-object'] === 'no') sd.printObject = false;\n else if (attrs['print-object'] === 'yes') sd.printObject = true;\n\n const staffType = getElementText(elements, 'staff-type');\n if (staffType && ['ossia', 'cue', 'editorial', 'regular', 'alternate'].includes(staffType)) {\n sd.staffType = staffType as StaffDetails['staffType'];\n }\n\n const staffLines = getElementText(elements, 'staff-lines');\n if (staffLines) sd.staffLines = parseInt(staffLines, 10);\n\n const capo = getElementText(elements, 'capo');\n if (capo) sd.capo = parseInt(capo, 10);\n\n // Parse staff-size with scaling attribute\n for (const el of elements) {\n if (el['staff-size'] !== undefined) {\n const sizeContent = el['staff-size'] as OrderedElement[];\n const sizeAttrs = getAttributes(el);\n for (const item of sizeContent) {\n if (item['#text'] !== undefined) {\n sd.staffSize = parseFloat(String(item['#text']));\n break;\n }\n }\n if (sizeAttrs['scaling']) {\n sd.staffSizeScaling = parseFloat(sizeAttrs['scaling']);\n }\n break;\n }\n }\n\n // Check for show-frets attribute\n if (attrs['show-frets'] === 'numbers' || attrs['show-frets'] === 'letters') {\n sd.showFrets = attrs['show-frets'];\n }\n\n // Staff tuning\n const tunings: StaffTuning[] = [];\n for (const el of elements) {\n if (el['staff-tuning']) {\n const tuningAttrs = getAttributes(el);\n const tuningContent = el['staff-tuning'] as OrderedElement[];\n const tuning: StaffTuning = {\n line: parseInt(tuningAttrs['line'] || '1', 10),\n tuningStep: getElementText(tuningContent, 'tuning-step') || 'E',\n tuningOctave: parseInt(getElementText(tuningContent, 'tuning-octave') || '4', 10),\n };\n const tuningAlter = getElementText(tuningContent, 'tuning-alter');\n if (tuningAlter) tuning.tuningAlter = parseFloat(tuningAlter);\n tunings.push(tuning);\n }\n }\n if (tunings.length > 0) sd.staffTuning = tunings;\n\n return sd;\n}\n\nfunction parseMeasureStyle(elements: OrderedElement[], attrs: Record<string, string>): MeasureStyle {\n const ms: MeasureStyle = {};\n\n if (attrs['number']) ms.number = parseInt(attrs['number'], 10);\n\n const multipleRest = getElementText(elements, 'multiple-rest');\n if (multipleRest) ms.multipleRest = parseInt(multipleRest, 10);\n\n for (const el of elements) {\n if (el['measure-repeat']) {\n const mrAttrs = getAttributes(el);\n ms.measureRepeat = { type: mrAttrs['type'] === 'stop' ? 'stop' : 'start' };\n if (mrAttrs['slashes']) ms.measureRepeat.slashes = parseInt(mrAttrs['slashes'], 10);\n } else if (el['beat-repeat']) {\n const brAttrs = getAttributes(el);\n ms.beatRepeat = { type: brAttrs['type'] === 'stop' ? 'stop' : 'start' };\n if (brAttrs['slashes']) ms.beatRepeat.slashes = parseInt(brAttrs['slashes'], 10);\n } else if (el['slash']) {\n const slAttrs = getAttributes(el);\n ms.slash = { type: slAttrs['type'] === 'stop' ? 'stop' : 'start' };\n if (slAttrs['use-dots'] === 'yes') ms.slash.useDots = true;\n if (slAttrs['use-stems'] === 'yes') ms.slash.useStems = true;\n }\n }\n\n return ms;\n}\n\nfunction parseHarmony(elements: OrderedElement[], attrs: Record<string, string>): HarmonyEntry {\n const harmony: HarmonyEntry = {\n type: 'harmony',\n root: { rootStep: 'C' },\n kind: 'major',\n };\n\n if (attrs['placement'] === 'above' || attrs['placement'] === 'below') {\n harmony.placement = attrs['placement'];\n }\n\n if (attrs['print-frame'] === 'yes') {\n harmony.printFrame = true;\n } else if (attrs['print-frame'] === 'no') {\n harmony.printFrame = false;\n }\n if (attrs['default-y']) harmony.defaultY = parseFloat(attrs['default-y']);\n if (attrs['halign']) harmony.halign = attrs['halign'];\n if (attrs['font-size']) harmony.fontSize = attrs['font-size'];\n\n // Parse root\n const root = getElementContent(elements, 'root');\n if (root) {\n const rootStep = getElementText(root, 'root-step');\n if (rootStep) harmony.root.rootStep = rootStep;\n const rootAlter = getElementText(root, 'root-alter');\n if (rootAlter) harmony.root.rootAlter = parseFloat(rootAlter);\n }\n\n // Parse kind\n for (const el of elements) {\n if (el['kind']) {\n const kindAttrs = getAttributes(el);\n const kindContent = el['kind'] as OrderedElement[];\n for (const item of kindContent) {\n if (item['#text'] !== undefined) {\n harmony.kind = String(item['#text']);\n break;\n }\n }\n if (kindAttrs['text']) harmony.kindText = kindAttrs['text'];\n break;\n }\n }\n\n // Parse bass\n const bass = getElementContent(elements, 'bass');\n if (bass) {\n const bassStep = getElementText(bass, 'bass-step');\n if (bassStep) {\n harmony.bass = { bassStep };\n const bassAlter = getElementText(bass, 'bass-alter');\n if (bassAlter) harmony.bass.bassAlter = parseFloat(bassAlter);\n }\n }\n\n // Parse degrees\n const degrees: HarmonyDegree[] = [];\n for (const el of elements) {\n if (el['degree']) {\n const degContent = el['degree'] as OrderedElement[];\n const degValue = getElementText(degContent, 'degree-value');\n const degAlter = getElementText(degContent, 'degree-alter');\n const degType = getElementText(degContent, 'degree-type');\n if (degValue && degType && ['add', 'alter', 'subtract'].includes(degType)) {\n const degree: HarmonyDegree = {\n degreeValue: parseInt(degValue, 10),\n degreeType: degType as 'add' | 'alter' | 'subtract',\n };\n if (degAlter) degree.degreeAlter = parseFloat(degAlter);\n degrees.push(degree);\n }\n }\n }\n if (degrees.length > 0) harmony.degrees = degrees;\n\n // Parse frame\n const frame = getElementContent(elements, 'frame');\n if (frame) {\n const frameObj: HarmonyFrame = {};\n const frameStrings = getElementText(frame, 'frame-strings');\n if (frameStrings) frameObj.frameStrings = parseInt(frameStrings, 10);\n const frameFrets = getElementText(frame, 'frame-frets');\n if (frameFrets) frameObj.frameFrets = parseInt(frameFrets, 10);\n\n // Parse first-fret\n for (const fel of frame) {\n if (fel['first-fret']) {\n const ffAttrs = getAttributes(fel);\n const ffContent = fel['first-fret'] as OrderedElement[];\n for (const item of ffContent) {\n if (item['#text'] !== undefined) {\n frameObj.firstFret = parseInt(String(item['#text']), 10);\n break;\n }\n }\n if (ffAttrs['text']) frameObj.firstFretText = ffAttrs['text'];\n if (ffAttrs['location'] === 'left' || ffAttrs['location'] === 'right') {\n frameObj.firstFretLocation = ffAttrs['location'];\n }\n break;\n }\n }\n\n const frameNotes: FrameNote[] = [];\n for (const fel of frame) {\n if (fel['frame-note']) {\n const fnContent = fel['frame-note'] as OrderedElement[];\n const stringNum = getElementText(fnContent, 'string');\n const fretNum = getElementText(fnContent, 'fret');\n if (stringNum && fretNum) {\n const fn: FrameNote = {\n string: parseInt(stringNum, 10),\n fret: parseInt(fretNum, 10),\n };\n const fingering = getElementText(fnContent, 'fingering');\n if (fingering) fn.fingering = fingering;\n for (const fnEl of fnContent) {\n if (fnEl['barre']) {\n const barreAttrs = getAttributes(fnEl);\n if (barreAttrs['type'] === 'start' || barreAttrs['type'] === 'stop') {\n fn.barre = barreAttrs['type'];\n }\n }\n }\n frameNotes.push(fn);\n }\n }\n }\n if (frameNotes.length > 0) frameObj.frameNotes = frameNotes;\n\n if (Object.keys(frameObj).length > 0) harmony.frame = frameObj;\n }\n\n // Parse offset\n const offset = getElementText(elements, 'offset');\n if (offset) harmony.offset = parseInt(offset, 10);\n\n // Parse staff\n const staff = getElementText(elements, 'staff');\n if (staff) harmony.staff = parseInt(staff, 10);\n\n return harmony;\n}\n\nfunction parseFiguredBass(elements: OrderedElement[], attrs: Record<string, string>): FiguredBassEntry {\n const fb: FiguredBassEntry = {\n type: 'figured-bass',\n figures: [],\n };\n\n if (attrs['parentheses'] === 'yes') fb.parentheses = true;\n\n const duration = getElementText(elements, 'duration');\n if (duration) fb.duration = parseInt(duration, 10);\n\n for (const el of elements) {\n if (el['figure']) {\n const figContent = el['figure'] as OrderedElement[];\n const figure: Figure = {};\n\n const figNumber = getElementText(figContent, 'figure-number');\n if (figNumber) figure.figureNumber = figNumber;\n\n for (const figEl of figContent) {\n if (figEl['prefix']) {\n const prefixContent = figEl['prefix'] as OrderedElement[];\n for (const item of prefixContent) {\n if (item['#text'] !== undefined) {\n figure.prefix = String(item['#text']);\n break;\n }\n }\n } else if (figEl['suffix']) {\n const suffixContent = figEl['suffix'] as OrderedElement[];\n for (const item of suffixContent) {\n if (item['#text'] !== undefined) {\n figure.suffix = String(item['#text']);\n break;\n }\n }\n } else if (figEl['extend'] !== undefined) {\n const extendAttrs = getAttributes(figEl);\n const extendType = extendAttrs['type'] as 'start' | 'stop' | 'continue' | undefined;\n if (extendType) {\n figure.extend = { type: extendType };\n } else {\n figure.extend = true;\n }\n }\n }\n\n fb.figures.push(figure);\n }\n }\n\n return fb;\n}\n\nfunction parseSound(elements: OrderedElement[], attrs: Record<string, string>): SoundEntry {\n const sound: SoundEntry = {\n type: 'sound',\n };\n\n if (attrs['tempo']) sound.tempo = parseFloat(attrs['tempo']);\n if (attrs['dynamics']) sound.dynamics = parseFloat(attrs['dynamics']);\n if (attrs['dacapo'] === 'yes') sound.dacapo = true;\n if (attrs['segno']) sound.segno = attrs['segno'];\n if (attrs['dalsegno']) sound.dalsegno = attrs['dalsegno'];\n if (attrs['coda']) sound.coda = attrs['coda'];\n if (attrs['tocoda']) sound.tocoda = attrs['tocoda'];\n if (attrs['fine'] === 'yes') sound.fine = true;\n if (attrs['forward-repeat'] === 'yes') sound.forwardRepeat = true;\n\n // Parse swing element\n for (const el of elements) {\n if (el['swing']) {\n const swingContent = el['swing'] as OrderedElement[];\n const swing: Swing = {};\n for (const swingEl of swingContent) {\n if (swingEl['straight'] !== undefined) {\n swing.straight = true;\n } else if (swingEl['first'] !== undefined) {\n const firstContent = swingEl['first'] as OrderedElement[];\n for (const item of firstContent) {\n if (item['#text'] !== undefined) {\n swing.first = parseInt(String(item['#text']), 10);\n break;\n }\n }\n } else if (swingEl['second'] !== undefined) {\n const secondContent = swingEl['second'] as OrderedElement[];\n for (const item of secondContent) {\n if (item['#text'] !== undefined) {\n swing.second = parseInt(String(item['#text']), 10);\n break;\n }\n }\n } else if (swingEl['swing-type'] !== undefined) {\n const typeContent = swingEl['swing-type'] as OrderedElement[];\n for (const item of typeContent) {\n if (item['#text'] !== undefined) {\n swing.swingType = String(item['#text']);\n break;\n }\n }\n }\n }\n if (Object.keys(swing).length > 0) {\n sound.swing = swing;\n }\n }\n }\n\n return sound;\n}\n","import { unzipSync, strFromU8 } from 'fflate';\nimport { parse } from './musicxml';\nimport type { Score } from '../types';\n\n/**\n * Parse a compressed MusicXML (.mxl) file\n * @param data - The compressed file data as Uint8Array or Buffer\n * @returns The parsed Score\n */\nexport function parseCompressed(data: Uint8Array): Score {\n const files = unzipSync(data);\n\n // Find the container.xml to get the rootfile path\n const containerPath = 'META-INF/container.xml';\n const containerData = files[containerPath];\n\n let rootFilePath: string | undefined;\n\n if (containerData) {\n const containerXml = strFromU8(containerData);\n // Extract rootfile path from container.xml\n const rootfileMatch = containerXml.match(/full-path=\"([^\"]+)\"/);\n if (rootfileMatch) {\n rootFilePath = rootfileMatch[1];\n }\n }\n\n // If no container.xml, look for common patterns\n if (!rootFilePath) {\n // Try to find the main XML file\n const xmlFiles = Object.keys(files).filter(\n (name) => name.endsWith('.xml') && !name.startsWith('META-INF')\n );\n\n if (xmlFiles.length === 1) {\n rootFilePath = xmlFiles[0];\n } else {\n // Look for common names\n const commonNames = ['score.xml', 'musicxml.xml'];\n for (const name of commonNames) {\n if (files[name]) {\n rootFilePath = name;\n break;\n }\n }\n }\n }\n\n if (!rootFilePath || !files[rootFilePath]) {\n throw new Error('Could not find MusicXML file in compressed archive');\n }\n\n const xmlData = files[rootFilePath];\n const xmlString = strFromU8(xmlData);\n\n return parse(xmlString);\n}\n\n/**\n * Check if data is a compressed MusicXML file\n * @param data - The file data\n * @returns true if the data appears to be a ZIP file\n */\nexport function isCompressed(data: Uint8Array): boolean {\n // ZIP files start with PK (0x50 0x4B)\n return data.length >= 2 && data[0] === 0x50 && data[1] === 0x4b;\n}\n\n/**\n * Parse either compressed (.mxl) or uncompressed (.xml/.musicxml) MusicXML\n * Automatically detects the format\n * @param data - The file data as Uint8Array or string\n * @returns The parsed Score\n */\nexport function parseAuto(data: Uint8Array | string): Score {\n if (typeof data === 'string') {\n return parse(data);\n }\n\n if (isCompressed(data)) {\n return parseCompressed(data);\n }\n\n // Assume it's uncompressed XML\n const xmlString = strFromU8(data);\n return parse(xmlString);\n}\n","import type {\n Score,\n Part,\n Measure,\n TimeSignature,\n Pitch,\n} from '../types';\n\n// ============================================================\n// Validation Error Types\n// ============================================================\n\nexport type ValidationErrorCode =\n // Divisions\n | 'MISSING_DIVISIONS'\n | 'INVALID_DIVISIONS'\n // Measure duration\n | 'MEASURE_DURATION_MISMATCH'\n | 'MEASURE_DURATION_OVERFLOW'\n | 'MEASURE_DURATION_UNDERFLOW'\n // Position\n | 'NEGATIVE_POSITION'\n | 'BACKUP_EXCEEDS_POSITION'\n // Ties\n | 'TIE_START_WITHOUT_STOP'\n | 'TIE_STOP_WITHOUT_START'\n | 'TIE_PITCH_MISMATCH'\n // Beams\n | 'BEAM_BEGIN_WITHOUT_END'\n | 'BEAM_END_WITHOUT_BEGIN'\n // Slurs\n | 'SLUR_START_WITHOUT_STOP'\n | 'SLUR_STOP_WITHOUT_START'\n // Tuplets\n | 'TUPLET_START_WITHOUT_STOP'\n | 'TUPLET_STOP_WITHOUT_START'\n // Part references\n | 'PART_ID_NOT_IN_PART_LIST'\n | 'PART_LIST_ID_NOT_IN_PARTS'\n // Part structure\n | 'PART_MEASURE_COUNT_MISMATCH'\n | 'PART_MEASURE_NUMBER_MISMATCH'\n | 'PART_GROUP_START_WITHOUT_STOP'\n | 'PART_GROUP_STOP_WITHOUT_START'\n | 'DUPLICATE_PART_ID'\n // Voice/Staff\n | 'INVALID_VOICE_NUMBER'\n | 'INVALID_STAFF_NUMBER'\n | 'STAFF_EXCEEDS_STAVES'\n // Staff structure\n | 'MISSING_STAVES_DECLARATION'\n | 'STAVES_DECLARATION_MISMATCH'\n | 'MISSING_CLEF_FOR_STAFF'\n | 'CLEF_STAFF_EXCEEDS_STAVES'\n // General\n | 'INVALID_DURATION'\n | 'EMPTY_MEASURE';\n\nexport type ValidationLevel = 'error' | 'warning' | 'info';\n\nexport interface ValidationLocation {\n partIndex?: number;\n partId?: string;\n measureIndex?: number;\n measureNumber?: string;\n entryIndex?: number;\n voice?: number;\n staff?: number;\n}\n\nexport interface ValidationError {\n code: ValidationErrorCode;\n level: ValidationLevel;\n message: string;\n location: ValidationLocation;\n details?: Record<string, unknown>;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n infos: ValidationError[];\n}\n\nexport interface ValidateOptions {\n /** Check divisions consistency (default: true) */\n checkDivisions?: boolean;\n /** Check measure durations match time signature (default: true) */\n checkMeasureDuration?: boolean;\n /** Check backup/forward position consistency (default: true) */\n checkPosition?: boolean;\n /** Check tie start/stop pairing (default: true) */\n checkTies?: boolean;\n /** Check beam begin/end pairing (default: true) */\n checkBeams?: boolean;\n /** Check slur start/stop pairing (default: true) */\n checkSlurs?: boolean;\n /** Check tuplet start/stop pairing (default: true) */\n checkTuplets?: boolean;\n /** Check part ID references (default: true) */\n checkPartReferences?: boolean;\n /** Check part structure (measure count, numbers) (default: true) */\n checkPartStructure?: boolean;\n /** Check voice/staff numbers (default: true) */\n checkVoiceStaff?: boolean;\n /** Check staff structure (staves declaration, clefs) (default: true) */\n checkStaffStructure?: boolean;\n /** Tolerance for measure duration (in divisions, default: 0) */\n durationTolerance?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<ValidateOptions> = {\n checkDivisions: true,\n checkMeasureDuration: true,\n checkPosition: true,\n checkTies: true,\n checkBeams: true,\n checkSlurs: true,\n checkTuplets: true,\n checkPartReferences: true,\n checkPartStructure: true,\n checkVoiceStaff: true,\n checkStaffStructure: true,\n durationTolerance: 0,\n};\n\n// ============================================================\n// Main Validate Function\n// ============================================================\n\n/**\n * Validate a Score for internal consistency\n */\nexport function validate(score: Score, options: ValidateOptions = {}): ValidationResult {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const allErrors: ValidationError[] = [];\n\n if (opts.checkPartReferences) {\n allErrors.push(...validatePartReferences(score));\n }\n\n if (opts.checkPartStructure) {\n allErrors.push(...validatePartStructure(score));\n }\n\n if (opts.checkDivisions) {\n allErrors.push(...validateDivisions(score));\n }\n\n for (let partIndex = 0; partIndex < score.parts.length; partIndex++) {\n const part = score.parts[partIndex];\n\n // Track current attributes state\n let currentDivisions = 1;\n let currentTime: TimeSignature | undefined;\n let currentStaves = 1;\n\n for (let measureIndex = 0; measureIndex < part.measures.length; measureIndex++) {\n const measure = part.measures[measureIndex];\n const location: ValidationLocation = {\n partIndex,\n partId: part.id,\n measureIndex,\n measureNumber: measure.number,\n };\n\n // Update attributes\n if (measure.attributes) {\n if (measure.attributes.divisions !== undefined) {\n currentDivisions = measure.attributes.divisions;\n }\n if (measure.attributes.time !== undefined) {\n currentTime = measure.attributes.time;\n }\n if (measure.attributes.staves !== undefined) {\n currentStaves = measure.attributes.staves;\n }\n }\n\n if (opts.checkMeasureDuration && currentTime) {\n allErrors.push(...validateMeasureDuration(\n measure,\n currentDivisions,\n currentTime,\n location,\n opts.durationTolerance\n ));\n }\n\n if (opts.checkPosition) {\n allErrors.push(...validateBackupForward(measure, location));\n }\n\n if (opts.checkTies) {\n allErrors.push(...validateTies(measure, location));\n }\n\n if (opts.checkBeams) {\n allErrors.push(...validateBeams(measure, location));\n }\n\n if (opts.checkSlurs) {\n allErrors.push(...validateSlurs(measure, location));\n }\n\n if (opts.checkTuplets) {\n allErrors.push(...validateTuplets(measure, location));\n }\n\n if (opts.checkVoiceStaff) {\n allErrors.push(...validateVoiceStaff(measure, currentStaves, location));\n }\n }\n\n // Staff structure validation for the entire part\n if (opts.checkStaffStructure) {\n allErrors.push(...validateStaffStructure(part, partIndex));\n }\n }\n\n // Categorize errors\n const errors = allErrors.filter(e => e.level === 'error');\n const warnings = allErrors.filter(e => e.level === 'warning');\n const infos = allErrors.filter(e => e.level === 'info');\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n infos,\n };\n}\n\n// ============================================================\n// Individual Validators\n// ============================================================\n\n/**\n * Validate that divisions are defined and consistent\n */\nexport function validateDivisions(score: Score): ValidationError[] {\n const errors: ValidationError[] = [];\n\n for (let partIndex = 0; partIndex < score.parts.length; partIndex++) {\n const part = score.parts[partIndex];\n let hasDivisions = false;\n\n for (let measureIndex = 0; measureIndex < part.measures.length; measureIndex++) {\n const measure = part.measures[measureIndex];\n\n if (measure.attributes?.divisions !== undefined) {\n hasDivisions = true;\n\n if (measure.attributes.divisions <= 0) {\n errors.push({\n code: 'INVALID_DIVISIONS',\n level: 'error',\n message: `Invalid divisions value: ${measure.attributes.divisions}. Must be positive.`,\n location: {\n partIndex,\n partId: part.id,\n measureIndex,\n measureNumber: measure.number,\n },\n details: { divisions: measure.attributes.divisions },\n });\n }\n }\n\n // Check for notes before divisions are defined\n if (!hasDivisions) {\n const hasNotes = measure.entries.some(e => e.type === 'note');\n if (hasNotes) {\n errors.push({\n code: 'MISSING_DIVISIONS',\n level: 'error',\n message: 'Notes found before divisions are defined',\n location: {\n partIndex,\n partId: part.id,\n measureIndex,\n measureNumber: measure.number,\n },\n });\n hasDivisions = true; // Only report once\n }\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Validate measure duration matches time signature\n */\nexport function validateMeasureDuration(\n measure: Measure,\n divisions: number,\n time: TimeSignature,\n location: ValidationLocation,\n tolerance: number = 0\n): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Skip if senzaMisura (free time)\n if (time.senzaMisura) {\n return errors;\n }\n\n // Calculate expected duration\n const beats = parseInt(time.beats, 10);\n if (isNaN(beats)) {\n return errors; // Complex beats string, skip validation\n }\n\n const expectedDuration = (beats / time.beatType) * 4 * divisions;\n\n // Calculate actual duration per voice\n const voiceDurations = calculateVoiceDurations(measure);\n\n for (const [voiceKey, actualDuration] of voiceDurations.entries()) {\n const [staff, voice] = voiceKey.split('-').map(Number);\n const diff = actualDuration - expectedDuration;\n\n if (Math.abs(diff) > tolerance) {\n if (diff > 0) {\n errors.push({\n code: 'MEASURE_DURATION_OVERFLOW',\n level: 'error',\n message: `Voice ${voice} (staff ${staff}) duration ${actualDuration} exceeds expected ${expectedDuration}`,\n location: { ...location, voice, staff },\n details: {\n expected: expectedDuration,\n actual: actualDuration,\n difference: diff,\n },\n });\n } else {\n errors.push({\n code: 'MEASURE_DURATION_UNDERFLOW',\n level: 'warning',\n message: `Voice ${voice} (staff ${staff}) duration ${actualDuration} is less than expected ${expectedDuration}`,\n location: { ...location, voice, staff },\n details: {\n expected: expectedDuration,\n actual: actualDuration,\n difference: diff,\n },\n });\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Calculate the total duration for each voice in a measure\n */\nfunction calculateVoiceDurations(measure: Measure): Map<string, number> {\n const voiceDurations = new Map<string, number>();\n let currentPosition = 0;\n const voiceMaxPositions = new Map<string, number>();\n\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n const staff = entry.staff ?? 1;\n const voice = entry.voice;\n const key = `${staff}-${voice}`;\n\n if (!entry.chord) {\n // Track the max position reached by each voice\n const endPosition = currentPosition + entry.duration;\n const currentMax = voiceMaxPositions.get(key) ?? 0;\n voiceMaxPositions.set(key, Math.max(currentMax, endPosition));\n currentPosition = endPosition;\n }\n } else if (entry.type === 'backup') {\n currentPosition -= entry.duration;\n } else if (entry.type === 'forward') {\n currentPosition += entry.duration;\n }\n }\n\n // Convert max positions to durations\n for (const [key, maxPos] of voiceMaxPositions.entries()) {\n voiceDurations.set(key, maxPos);\n }\n\n return voiceDurations;\n}\n\n/**\n * Validate backup/forward position consistency\n */\nexport function validateBackupForward(\n measure: Measure,\n location: ValidationLocation\n): ValidationError[] {\n const errors: ValidationError[] = [];\n let position = 0;\n let minPosition = 0;\n\n for (let entryIndex = 0; entryIndex < measure.entries.length; entryIndex++) {\n const entry = measure.entries[entryIndex];\n\n if (entry.type === 'note') {\n if (!entry.chord) {\n position += entry.duration;\n }\n } else if (entry.type === 'backup') {\n const newPosition = position - entry.duration;\n if (newPosition < 0) {\n errors.push({\n code: 'BACKUP_EXCEEDS_POSITION',\n level: 'error',\n message: `Backup of ${entry.duration} at position ${position} results in negative position ${newPosition}`,\n location: { ...location, entryIndex },\n details: {\n backupDuration: entry.duration,\n positionBefore: position,\n positionAfter: newPosition,\n },\n });\n }\n position = newPosition;\n minPosition = Math.min(minPosition, position);\n } else if (entry.type === 'forward') {\n position += entry.duration;\n }\n }\n\n if (minPosition < 0) {\n errors.push({\n code: 'NEGATIVE_POSITION',\n level: 'error',\n message: `Position went negative (min: ${minPosition}) in measure`,\n location,\n details: { minPosition },\n });\n }\n\n return errors;\n}\n\n/**\n * Validate tie start/stop pairing\n */\nexport function validateTies(\n measure: Measure,\n location: ValidationLocation\n): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Track open ties by pitch\n const openTies = new Map<string, { entryIndex: number; pitch: Pitch }>();\n\n for (let entryIndex = 0; entryIndex < measure.entries.length; entryIndex++) {\n const entry = measure.entries[entryIndex];\n if (entry.type !== 'note' || !entry.pitch) continue;\n\n const pitchKey = `${entry.pitch.step}${entry.pitch.octave}${entry.pitch.alter ?? 0}-${entry.voice}-${entry.staff ?? 1}`;\n\n // Handle tie array\n const ties = entry.ties ?? (entry.tie ? [entry.tie] : []);\n\n for (const tie of ties) {\n if (tie.type === 'start') {\n if (openTies.has(pitchKey)) {\n // Already have an open tie for this pitch - might be valid in some cases\n // but worth warning about\n }\n openTies.set(pitchKey, { entryIndex, pitch: entry.pitch });\n } else if (tie.type === 'stop') {\n if (!openTies.has(pitchKey)) {\n errors.push({\n code: 'TIE_STOP_WITHOUT_START',\n level: 'warning',\n message: `Tie stop without matching start for ${entry.pitch.step}${entry.pitch.octave}`,\n location: { ...location, entryIndex, voice: entry.voice, staff: entry.staff ?? 1 },\n details: { pitch: entry.pitch },\n });\n } else {\n openTies.delete(pitchKey);\n }\n }\n // 'continue' type doesn't change open/closed state within a measure\n }\n }\n\n // Note: We don't report unclosed ties as errors because they may continue to next measure\n // This is a cross-measure validation that would need a different approach\n\n return errors;\n}\n\n/**\n * Validate beam begin/end pairing\n */\nexport function validateBeams(\n measure: Measure,\n location: ValidationLocation\n): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Track open beams by beam number and voice\n const openBeams = new Map<string, number>(); // key -> entryIndex\n\n for (let entryIndex = 0; entryIndex < measure.entries.length; entryIndex++) {\n const entry = measure.entries[entryIndex];\n if (entry.type !== 'note' || !entry.beam) continue;\n\n for (const beam of entry.beam) {\n const beamKey = `${beam.number}-${entry.voice}-${entry.staff ?? 1}`;\n\n if (beam.type === 'begin') {\n if (openBeams.has(beamKey)) {\n errors.push({\n code: 'BEAM_BEGIN_WITHOUT_END',\n level: 'error',\n message: `Beam ${beam.number} started again before previous beam ended`,\n location: { ...location, entryIndex, voice: entry.voice, staff: entry.staff ?? 1 },\n details: { beamNumber: beam.number },\n });\n }\n openBeams.set(beamKey, entryIndex);\n } else if (beam.type === 'end') {\n if (!openBeams.has(beamKey)) {\n errors.push({\n code: 'BEAM_END_WITHOUT_BEGIN',\n level: 'error',\n message: `Beam ${beam.number} end without matching begin`,\n location: { ...location, entryIndex, voice: entry.voice, staff: entry.staff ?? 1 },\n details: { beamNumber: beam.number },\n });\n } else {\n openBeams.delete(beamKey);\n }\n }\n // 'continue', 'forward hook', 'backward hook' don't affect open/closed state\n }\n }\n\n // Report unclosed beams\n for (const [beamKey, startIndex] of openBeams.entries()) {\n const [beamNumber, voice, staff] = beamKey.split('-').map(Number);\n errors.push({\n code: 'BEAM_BEGIN_WITHOUT_END',\n level: 'error',\n message: `Beam ${beamNumber} started but never ended in measure`,\n location: { ...location, entryIndex: startIndex, voice, staff },\n details: { beamNumber },\n });\n }\n\n return errors;\n}\n\n/**\n * Validate slur start/stop pairing\n */\nexport function validateSlurs(\n measure: Measure,\n _location: ValidationLocation\n): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Track open slurs by slur number and voice\n const openSlurs = new Map<string, number>(); // key -> entryIndex\n\n for (let entryIndex = 0; entryIndex < measure.entries.length; entryIndex++) {\n const entry = measure.entries[entryIndex];\n if (entry.type !== 'note' || !entry.notations) continue;\n\n for (const notation of entry.notations) {\n if (notation.type !== 'slur') continue;\n\n const slurNumber = notation.number ?? 1;\n const slurKey = `${slurNumber}-${entry.voice}-${entry.staff ?? 1}`;\n\n if (notation.slurType === 'start') {\n if (openSlurs.has(slurKey)) {\n // Starting a new slur while one is open - might be nested slurs which is valid\n // Don't report as error, but could be a warning\n }\n openSlurs.set(slurKey, entryIndex);\n } else if (notation.slurType === 'stop') {\n if (!openSlurs.has(slurKey)) {\n // Slur stop without start in this measure - could be continuing from previous measure\n // Only report as info, not error\n } else {\n openSlurs.delete(slurKey);\n }\n }\n // 'continue' doesn't affect open/closed state\n }\n }\n\n // Note: Open slurs at end of measure are valid (continue to next measure)\n // So we don't report them as errors\n\n return errors;\n}\n\n/**\n * Validate tuplet start/stop pairing\n */\nexport function validateTuplets(\n measure: Measure,\n location: ValidationLocation\n): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Track open tuplets by tuplet number and voice\n const openTuplets = new Map<string, number>(); // key -> entryIndex\n\n for (let entryIndex = 0; entryIndex < measure.entries.length; entryIndex++) {\n const entry = measure.entries[entryIndex];\n if (entry.type !== 'note' || !entry.notations) continue;\n\n for (const notation of entry.notations) {\n if (notation.type !== 'tuplet') continue;\n\n const tupletNumber = notation.number ?? 1;\n const tupletKey = `${tupletNumber}-${entry.voice}-${entry.staff ?? 1}`;\n\n if (notation.tupletType === 'start') {\n if (openTuplets.has(tupletKey)) {\n errors.push({\n code: 'TUPLET_START_WITHOUT_STOP',\n level: 'error',\n message: `Tuplet ${tupletNumber} started again before previous tuplet ended`,\n location: { ...location, entryIndex, voice: entry.voice, staff: entry.staff ?? 1 },\n details: { tupletNumber },\n });\n }\n openTuplets.set(tupletKey, entryIndex);\n } else if (notation.tupletType === 'stop') {\n if (!openTuplets.has(tupletKey)) {\n errors.push({\n code: 'TUPLET_STOP_WITHOUT_START',\n level: 'error',\n message: `Tuplet ${tupletNumber} stop without matching start`,\n location: { ...location, entryIndex, voice: entry.voice, staff: entry.staff ?? 1 },\n details: { tupletNumber },\n });\n } else {\n openTuplets.delete(tupletKey);\n }\n }\n }\n }\n\n // Report unclosed tuplets\n for (const [tupletKey, startIndex] of openTuplets.entries()) {\n const [tupletNumber, voice, staff] = tupletKey.split('-').map(Number);\n errors.push({\n code: 'TUPLET_START_WITHOUT_STOP',\n level: 'error',\n message: `Tuplet ${tupletNumber} started but never ended in measure`,\n location: { ...location, entryIndex: startIndex, voice, staff },\n details: { tupletNumber },\n });\n }\n\n return errors;\n}\n\n/**\n * Validate part ID references between partList and parts\n */\nexport function validatePartReferences(score: Score): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Get IDs from partList\n const partListIds = new Set<string>();\n for (const entry of score.partList) {\n if (entry.type === 'score-part') {\n partListIds.add(entry.id);\n }\n }\n\n // Get IDs from parts\n const partIds = new Set<string>();\n for (const part of score.parts) {\n partIds.add(part.id);\n }\n\n // Check for parts not in partList\n for (let partIndex = 0; partIndex < score.parts.length; partIndex++) {\n const part = score.parts[partIndex];\n if (!partListIds.has(part.id)) {\n errors.push({\n code: 'PART_ID_NOT_IN_PART_LIST',\n level: 'error',\n message: `Part \"${part.id}\" is not defined in partList`,\n location: { partIndex, partId: part.id },\n });\n }\n }\n\n // Check for partList entries not in parts\n for (const entry of score.partList) {\n if (entry.type === 'score-part' && !partIds.has(entry.id)) {\n errors.push({\n code: 'PART_LIST_ID_NOT_IN_PARTS',\n level: 'error',\n message: `PartList entry \"${entry.id}\" has no corresponding part`,\n location: { partId: entry.id },\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Validate voice and staff numbers\n */\nexport function validateVoiceStaff(\n measure: Measure,\n staves: number,\n location: ValidationLocation\n): ValidationError[] {\n const errors: ValidationError[] = [];\n\n for (let entryIndex = 0; entryIndex < measure.entries.length; entryIndex++) {\n const entry = measure.entries[entryIndex];\n if (entry.type !== 'note') continue;\n\n // Check voice number\n if (entry.voice <= 0) {\n errors.push({\n code: 'INVALID_VOICE_NUMBER',\n level: 'error',\n message: `Invalid voice number: ${entry.voice}. Must be positive.`,\n location: { ...location, entryIndex, voice: entry.voice },\n });\n }\n\n // Check staff number\n const staff = entry.staff ?? 1;\n if (staff <= 0) {\n errors.push({\n code: 'INVALID_STAFF_NUMBER',\n level: 'error',\n message: `Invalid staff number: ${staff}. Must be positive.`,\n location: { ...location, entryIndex, staff },\n });\n } else if (staff > staves) {\n errors.push({\n code: 'STAFF_EXCEEDS_STAVES',\n level: 'error',\n message: `Staff number ${staff} exceeds declared staves count ${staves}`,\n location: { ...location, entryIndex, staff },\n details: { declaredStaves: staves },\n });\n }\n\n // Check duration\n if (entry.duration < 0) {\n errors.push({\n code: 'INVALID_DURATION',\n level: 'error',\n message: `Invalid duration: ${entry.duration}. Must be non-negative.`,\n location: { ...location, entryIndex },\n details: { duration: entry.duration },\n });\n }\n }\n\n return errors;\n}\n\n// ============================================================\n// Part Structure Validators\n// ============================================================\n\n/**\n * Validate part structure (measure counts and numbers match across parts)\n */\nexport function validatePartStructure(score: Score): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (score.parts.length === 0) {\n return errors;\n }\n\n // Check for duplicate part IDs\n const partIds = new Map<string, number>();\n for (let partIndex = 0; partIndex < score.parts.length; partIndex++) {\n const part = score.parts[partIndex];\n if (partIds.has(part.id)) {\n errors.push({\n code: 'DUPLICATE_PART_ID',\n level: 'error',\n message: `Duplicate part ID \"${part.id}\" found at index ${partIndex} (first at index ${partIds.get(part.id)})`,\n location: { partIndex, partId: part.id },\n details: { firstIndex: partIds.get(part.id) },\n });\n } else {\n partIds.set(part.id, partIndex);\n }\n }\n\n // Use first part as reference\n const referencePart = score.parts[0];\n const referenceMeasureCount = referencePart.measures.length;\n\n // Check all other parts\n for (let partIndex = 1; partIndex < score.parts.length; partIndex++) {\n const part = score.parts[partIndex];\n\n // Check measure count\n if (part.measures.length !== referenceMeasureCount) {\n errors.push({\n code: 'PART_MEASURE_COUNT_MISMATCH',\n level: 'error',\n message: `Part \"${part.id}\" has ${part.measures.length} measures, expected ${referenceMeasureCount} (same as first part)`,\n location: { partIndex, partId: part.id },\n details: {\n expected: referenceMeasureCount,\n actual: part.measures.length,\n },\n });\n }\n\n // Check measure numbers match\n const minLength = Math.min(part.measures.length, referenceMeasureCount);\n for (let measureIndex = 0; measureIndex < minLength; measureIndex++) {\n const refMeasure = referencePart.measures[measureIndex];\n const partMeasure = part.measures[measureIndex];\n\n if (refMeasure.number !== partMeasure.number) {\n errors.push({\n code: 'PART_MEASURE_NUMBER_MISMATCH',\n level: 'warning',\n message: `Part \"${part.id}\" measure at index ${measureIndex} has number \"${partMeasure.number}\", expected \"${refMeasure.number}\"`,\n location: {\n partIndex,\n partId: part.id,\n measureIndex,\n measureNumber: partMeasure.number,\n },\n details: {\n expected: refMeasure.number,\n actual: partMeasure.number,\n },\n });\n }\n }\n }\n\n // Check part-group pairing in partList\n const openGroups = new Map<number, number>(); // groupNumber -> index in partList\n\n for (let i = 0; i < score.partList.length; i++) {\n const entry = score.partList[i];\n if (entry.type !== 'part-group') continue;\n\n const groupNumber = entry.number ?? 1;\n\n if (entry.groupType === 'start') {\n if (openGroups.has(groupNumber)) {\n errors.push({\n code: 'PART_GROUP_START_WITHOUT_STOP',\n level: 'error',\n message: `Part group ${groupNumber} started again at index ${i} before previous group ended`,\n location: {},\n details: { groupNumber, partListIndex: i },\n });\n }\n openGroups.set(groupNumber, i);\n } else if (entry.groupType === 'stop') {\n if (!openGroups.has(groupNumber)) {\n errors.push({\n code: 'PART_GROUP_STOP_WITHOUT_START',\n level: 'error',\n message: `Part group ${groupNumber} stop at index ${i} without matching start`,\n location: {},\n details: { groupNumber, partListIndex: i },\n });\n } else {\n openGroups.delete(groupNumber);\n }\n }\n }\n\n // Report unclosed groups\n for (const [groupNumber, startIndex] of openGroups.entries()) {\n errors.push({\n code: 'PART_GROUP_START_WITHOUT_STOP',\n level: 'error',\n message: `Part group ${groupNumber} started at index ${startIndex} but never stopped`,\n location: {},\n details: { groupNumber, partListIndex: startIndex },\n });\n }\n\n return errors;\n}\n\n// ============================================================\n// Staff Structure Validators\n// ============================================================\n\n/**\n * Validate staff structure within a part\n */\nexport function validateStaffStructure(part: Part, partIndex: number): ValidationError[] {\n const errors: ValidationError[] = [];\n\n let currentStaves: number | undefined = undefined;\n let stavesDeclarationMeasure: string | undefined = undefined;\n const clefsDeclaredForStaves = new Set<number>();\n\n for (let measureIndex = 0; measureIndex < part.measures.length; measureIndex++) {\n const measure = part.measures[measureIndex];\n const location: ValidationLocation = {\n partIndex,\n partId: part.id,\n measureIndex,\n measureNumber: measure.number,\n };\n\n // Check staves declaration\n if (measure.attributes?.staves !== undefined) {\n const newStaves = measure.attributes.staves;\n\n if (currentStaves !== undefined && newStaves !== currentStaves) {\n // Staves count changed - this is valid but might indicate an issue\n errors.push({\n code: 'STAVES_DECLARATION_MISMATCH',\n level: 'info',\n message: `Staves count changed from ${currentStaves} to ${newStaves}`,\n location,\n details: {\n previous: currentStaves,\n new: newStaves,\n previousMeasure: stavesDeclarationMeasure,\n },\n });\n // Reset clef tracking when staves change\n clefsDeclaredForStaves.clear();\n }\n\n currentStaves = newStaves;\n stavesDeclarationMeasure = measure.number;\n }\n\n // Check clef declarations\n if (measure.attributes?.clef) {\n for (const clef of measure.attributes.clef) {\n const staffNum = clef.staff ?? 1;\n clefsDeclaredForStaves.add(staffNum);\n\n // Check if clef staff exceeds staves\n if (currentStaves !== undefined && staffNum > currentStaves) {\n errors.push({\n code: 'CLEF_STAFF_EXCEEDS_STAVES',\n level: 'error',\n message: `Clef declared for staff ${staffNum}, but only ${currentStaves} staves declared`,\n location,\n details: {\n clefStaff: staffNum,\n declaredStaves: currentStaves,\n },\n });\n }\n }\n }\n\n // Check if notes use staff numbers that exceed staves\n if (currentStaves !== undefined) {\n const usedStaves = new Set<number>();\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n usedStaves.add(entry.staff ?? 1);\n } else if (entry.type === 'forward' && entry.staff) {\n usedStaves.add(entry.staff);\n }\n }\n\n for (const usedStaff of usedStaves) {\n if (usedStaff > currentStaves) {\n // This is already caught by validateVoiceStaff, so we skip it here\n }\n }\n }\n }\n\n // Check if multi-staff parts have clefs for all staves (at the end)\n if (currentStaves !== undefined && currentStaves > 1) {\n for (let staff = 1; staff <= currentStaves; staff++) {\n if (!clefsDeclaredForStaves.has(staff)) {\n errors.push({\n code: 'MISSING_CLEF_FOR_STAFF',\n level: 'warning',\n message: `No clef declared for staff ${staff} in part \"${part.id}\"`,\n location: { partIndex, partId: part.id },\n details: { staff, totalStaves: currentStaves },\n });\n }\n }\n }\n\n // Check if notes use multiple staves but staves not declared\n const allUsedStaves = new Set<number>();\n for (const measure of part.measures) {\n for (const entry of measure.entries) {\n if (entry.type === 'note' && entry.staff !== undefined) {\n allUsedStaves.add(entry.staff);\n }\n }\n }\n\n if (allUsedStaves.size > 1 && currentStaves === undefined) {\n errors.push({\n code: 'MISSING_STAVES_DECLARATION',\n level: 'warning',\n message: `Part \"${part.id}\" uses staff numbers ${Array.from(allUsedStaves).sort().join(', ')} but has no staves declaration`,\n location: { partIndex, partId: part.id },\n details: { usedStaves: Array.from(allUsedStaves).sort() },\n });\n }\n\n return errors;\n}\n\n// ============================================================\n// Local Validation (for operations)\n// ============================================================\n\n/**\n * Context needed to validate a single measure\n */\nexport interface MeasureValidationContext {\n /** Current divisions value (from previous attributes) */\n divisions: number;\n /** Current time signature */\n time?: TimeSignature;\n /** Current staves count */\n staves: number;\n /** Part index (for error location) */\n partIndex: number;\n /** Part ID (for error location) */\n partId: string;\n /** Measure index (for error location) */\n measureIndex: number;\n}\n\n/**\n * Options for local measure validation\n */\nexport interface LocalValidateOptions {\n checkMeasureDuration?: boolean;\n checkPosition?: boolean;\n checkBeams?: boolean;\n checkTuplets?: boolean;\n checkVoiceStaff?: boolean;\n durationTolerance?: number;\n}\n\nconst DEFAULT_LOCAL_OPTIONS: Required<LocalValidateOptions> = {\n checkMeasureDuration: true,\n checkPosition: true,\n checkBeams: true,\n checkTuplets: true,\n checkVoiceStaff: true,\n durationTolerance: 0,\n};\n\n/**\n * Validate a single measure with provided context.\n * This is useful for validating after local operations like addNote, deleteNote.\n *\n * @example\n * ```typescript\n * const context = getMeasureContext(score, partIndex, measureIndex);\n * const errors = validateMeasureLocal(measure, context);\n * if (errors.length > 0) {\n * throw new Error('Operation created invalid state');\n * }\n * ```\n */\nexport function validateMeasureLocal(\n measure: Measure,\n context: MeasureValidationContext,\n options: LocalValidateOptions = {}\n): ValidationError[] {\n const opts = { ...DEFAULT_LOCAL_OPTIONS, ...options };\n const errors: ValidationError[] = [];\n\n const location: ValidationLocation = {\n partIndex: context.partIndex,\n partId: context.partId,\n measureIndex: context.measureIndex,\n measureNumber: measure.number,\n };\n\n if (opts.checkMeasureDuration && context.time) {\n errors.push(...validateMeasureDuration(\n measure,\n context.divisions,\n context.time,\n location,\n opts.durationTolerance\n ));\n }\n\n if (opts.checkPosition) {\n errors.push(...validateBackupForward(measure, location));\n }\n\n if (opts.checkBeams) {\n errors.push(...validateBeams(measure, location));\n }\n\n if (opts.checkTuplets) {\n errors.push(...validateTuplets(measure, location));\n }\n\n if (opts.checkVoiceStaff) {\n errors.push(...validateVoiceStaff(measure, context.staves, location));\n }\n\n return errors;\n}\n\n/**\n * Get the validation context for a measure by traversing previous attributes.\n * This collects divisions, time, and staves from measure 0 to the target measure.\n */\nexport function getMeasureContext(\n score: Score,\n partIndex: number,\n measureIndex: number\n): MeasureValidationContext {\n const part = score.parts[partIndex];\n if (!part) {\n throw new Error(`Part index ${partIndex} out of bounds`);\n }\n\n let divisions = 1;\n let time: TimeSignature | undefined;\n let staves = 1;\n\n // Traverse from start to the target measure to collect current state\n for (let i = 0; i <= measureIndex && i < part.measures.length; i++) {\n const measure = part.measures[i];\n if (measure.attributes) {\n if (measure.attributes.divisions !== undefined) {\n divisions = measure.attributes.divisions;\n }\n if (measure.attributes.time !== undefined) {\n time = measure.attributes.time;\n }\n if (measure.attributes.staves !== undefined) {\n staves = measure.attributes.staves;\n }\n }\n\n // Also check for mid-measure attribute changes\n for (const entry of measure.entries) {\n if (entry.type === 'attributes') {\n if (entry.attributes.divisions !== undefined) {\n divisions = entry.attributes.divisions;\n }\n if (entry.attributes.time !== undefined) {\n time = entry.attributes.time;\n }\n if (entry.attributes.staves !== undefined) {\n staves = entry.attributes.staves;\n }\n }\n }\n }\n\n return {\n divisions,\n time,\n staves,\n partIndex,\n partId: part.id,\n measureIndex,\n };\n}\n\n/**\n * Validate a measure after an operation, throwing if invalid.\n * Convenience wrapper around validateMeasureLocal.\n */\nexport function assertMeasureValid(\n score: Score,\n partIndex: number,\n measureIndex: number,\n options?: LocalValidateOptions\n): void {\n const part = score.parts[partIndex];\n if (!part) {\n throw new Error(`Part index ${partIndex} out of bounds`);\n }\n\n const measure = part.measures[measureIndex];\n if (!measure) {\n throw new Error(`Measure index ${measureIndex} out of bounds`);\n }\n\n const context = getMeasureContext(score, partIndex, measureIndex);\n const errors = validateMeasureLocal(measure, context, options);\n\n const criticalErrors = errors.filter(e => e.level === 'error');\n if (criticalErrors.length > 0) {\n const errorMessages = criticalErrors\n .map(e => `[${e.code}] ${e.message}`)\n .join('\\n');\n throw new ValidationException(criticalErrors, errorMessages);\n }\n}\n\n// ============================================================\n// Convenience Functions\n// ============================================================\n\n/**\n * Check if a score is valid (no errors)\n */\nexport function isValid(score: Score, options?: ValidateOptions): boolean {\n return validate(score, options).valid;\n}\n\n/**\n * Validate and throw if invalid\n */\nexport function assertValid(score: Score, options?: ValidateOptions): void {\n const result = validate(score, options);\n if (!result.valid) {\n const errorMessages = result.errors.map(e =>\n `[${e.code}] ${e.message} at ${formatLocation(e.location)}`\n ).join('\\n');\n throw new ValidationException(result.errors, errorMessages);\n }\n}\n\n/**\n * Format a validation location for display\n */\nexport function formatLocation(location: ValidationLocation): string {\n const parts: string[] = [];\n\n if (location.partId !== undefined) {\n parts.push(`part=${location.partId}`);\n } else if (location.partIndex !== undefined) {\n parts.push(`part[${location.partIndex}]`);\n }\n\n if (location.measureNumber !== undefined) {\n parts.push(`measure=${location.measureNumber}`);\n } else if (location.measureIndex !== undefined) {\n parts.push(`measure[${location.measureIndex}]`);\n }\n\n if (location.entryIndex !== undefined) {\n parts.push(`entry[${location.entryIndex}]`);\n }\n\n if (location.voice !== undefined) {\n parts.push(`voice=${location.voice}`);\n }\n\n if (location.staff !== undefined) {\n parts.push(`staff=${location.staff}`);\n }\n\n return parts.join(', ');\n}\n\n/**\n * Validation exception with structured error information\n */\nexport class ValidationException extends Error {\n constructor(\n public readonly errors: ValidationError[],\n message: string\n ) {\n super(message);\n this.name = 'ValidationException';\n }\n}\n\n// ============================================================\n// Cross-Measure Validators (for future use)\n// ============================================================\n\n/**\n * Validate ties across measures\n * This is more complex as ties can span multiple measures\n */\nexport function validateTiesAcrossMeasures(part: Part): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Track open ties by pitch across all measures\n const openTies = new Map<string, { measureIndex: number; entryIndex: number; pitch: Pitch }>();\n\n for (let measureIndex = 0; measureIndex < part.measures.length; measureIndex++) {\n const measure = part.measures[measureIndex];\n\n for (let entryIndex = 0; entryIndex < measure.entries.length; entryIndex++) {\n const entry = measure.entries[entryIndex];\n if (entry.type !== 'note' || !entry.pitch) continue;\n\n const pitchKey = `${entry.pitch.step}${entry.pitch.octave}${entry.pitch.alter ?? 0}-${entry.voice}-${entry.staff ?? 1}`;\n const ties = entry.ties ?? (entry.tie ? [entry.tie] : []);\n\n for (const tie of ties) {\n if (tie.type === 'start') {\n openTies.set(pitchKey, { measureIndex, entryIndex, pitch: entry.pitch });\n } else if (tie.type === 'stop') {\n if (!openTies.has(pitchKey)) {\n errors.push({\n code: 'TIE_STOP_WITHOUT_START',\n level: 'error',\n message: `Tie stop without matching start for ${entry.pitch.step}${entry.pitch.octave}`,\n location: {\n measureIndex,\n measureNumber: measure.number,\n entryIndex,\n voice: entry.voice,\n staff: entry.staff ?? 1,\n },\n details: { pitch: entry.pitch },\n });\n } else {\n openTies.delete(pitchKey);\n }\n }\n }\n }\n }\n\n // Report unclosed ties at end of part\n for (const [, { measureIndex, entryIndex, pitch }] of openTies.entries()) {\n const measure = part.measures[measureIndex];\n errors.push({\n code: 'TIE_START_WITHOUT_STOP',\n level: 'warning',\n message: `Tie started for ${pitch.step}${pitch.octave} but never stopped`,\n location: {\n measureIndex,\n measureNumber: measure.number,\n entryIndex,\n },\n details: { pitch },\n });\n }\n\n return errors;\n}\n\n/**\n * Validate slurs across measures\n */\nexport function validateSlursAcrossMeasures(part: Part): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Track open slurs across all measures\n const openSlurs = new Map<string, { measureIndex: number; entryIndex: number }>();\n\n for (let measureIndex = 0; measureIndex < part.measures.length; measureIndex++) {\n const measure = part.measures[measureIndex];\n\n for (let entryIndex = 0; entryIndex < measure.entries.length; entryIndex++) {\n const entry = measure.entries[entryIndex];\n if (entry.type !== 'note' || !entry.notations) continue;\n\n for (const notation of entry.notations) {\n if (notation.type !== 'slur') continue;\n\n const slurNumber = notation.number ?? 1;\n const slurKey = `${slurNumber}-${entry.voice}-${entry.staff ?? 1}`;\n\n if (notation.slurType === 'start') {\n openSlurs.set(slurKey, { measureIndex, entryIndex });\n } else if (notation.slurType === 'stop') {\n if (!openSlurs.has(slurKey)) {\n errors.push({\n code: 'SLUR_STOP_WITHOUT_START',\n level: 'error',\n message: `Slur ${slurNumber} stop without matching start`,\n location: {\n measureIndex,\n measureNumber: measure.number,\n entryIndex,\n voice: entry.voice,\n staff: entry.staff ?? 1,\n },\n details: { slurNumber },\n });\n } else {\n openSlurs.delete(slurKey);\n }\n }\n }\n }\n }\n\n // Report unclosed slurs at end of part\n for (const [slurKey, { measureIndex, entryIndex }] of openSlurs.entries()) {\n const [slurNumber, voice, staff] = slurKey.split('-').map(Number);\n const measure = part.measures[measureIndex];\n errors.push({\n code: 'SLUR_START_WITHOUT_STOP',\n level: 'warning',\n message: `Slur ${slurNumber} started but never stopped`,\n location: {\n measureIndex,\n measureNumber: measure.number,\n entryIndex,\n voice,\n staff,\n },\n details: { slurNumber },\n });\n }\n\n return errors;\n}\n","import type {\n Score,\n ScoreMetadata,\n PartListEntry,\n PartInfo,\n PartGroup,\n Part,\n Measure,\n MeasureAttributes,\n MeasureEntry,\n NoteEntry,\n BackupEntry,\n ForwardEntry,\n DirectionEntry,\n DirectionType,\n Pitch,\n BeamInfo,\n Notation,\n Lyric,\n TimeSignature,\n KeySignature,\n Clef,\n Transpose,\n Barline,\n Print,\n Defaults,\n Credit,\n SystemLayout,\n PageLayout,\n StaffDetails,\n MeasureStyle,\n HarmonyEntry,\n FiguredBassEntry,\n TupletNotation,\n SoundEntry,\n TechnicalNotation,\n DisplayText,\n AttributesEntry,\n} from '../types';\nimport {\n validate,\n ValidationException,\n type ValidateOptions,\n type ValidationResult,\n} from '../validator';\n\nexport interface SerializeOptions {\n version?: '3.1' | '4.0';\n indent?: string;\n /** Validate score before serializing (default: false) */\n validate?: boolean;\n /** Options for validation (if validate is true) */\n validateOptions?: ValidateOptions;\n /** Throw error if validation fails (default: false, will only warn) */\n throwOnValidationError?: boolean;\n /** Callback to receive validation result */\n onValidation?: (result: ValidationResult) => void;\n}\n\nexport function serialize(score: Score, options: SerializeOptions = {}): string {\n const version = options.version || '4.0';\n const indent = options.indent ?? ' ';\n\n // Validation\n if (options.validate) {\n const result = validate(score, options.validateOptions);\n\n // Call the callback if provided\n if (options.onValidation) {\n options.onValidation(result);\n }\n\n if (!result.valid && options.throwOnValidationError) {\n const errorMessages = result.errors\n .map(e => `[${e.code}] ${e.message}`)\n .join('\\n');\n throw new ValidationException(result.errors, `Score validation failed:\\n${errorMessages}`);\n }\n }\n\n const lines: string[] = [];\n\n // XML declaration\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n\n // DOCTYPE\n if (version === '4.0') {\n lines.push('<!DOCTYPE score-partwise PUBLIC \"-//Recordare//DTD MusicXML 4.0 Partwise//EN\" \"http://www.musicxml.org/dtds/partwise.dtd\">');\n } else {\n lines.push('<!DOCTYPE score-partwise PUBLIC \"-//Recordare//DTD MusicXML 3.1 Partwise//EN\" \"http://www.musicxml.org/dtds/partwise.dtd\">');\n }\n\n // score-partwise\n lines.push(`<score-partwise version=\"${version}\">`);\n\n // Metadata\n lines.push(...serializeMetadata(score.metadata, indent));\n\n // Defaults\n if (score.defaults) {\n lines.push(...serializeDefaults(score.defaults, indent));\n }\n\n // Credits\n if (score.credits) {\n for (const credit of score.credits) {\n lines.push(...serializeCredit(credit, indent));\n }\n }\n\n // Part list\n lines.push(...serializePartList(score.partList, indent));\n\n // Parts\n for (const part of score.parts) {\n lines.push(...serializePart(part, indent));\n }\n\n lines.push('</score-partwise>');\n\n return lines.join('\\n');\n}\n\nfunction serializeMetadata(metadata: ScoreMetadata, indent: string): string[] {\n const lines: string[] = [];\n\n // Work\n if (metadata.workTitle !== undefined || metadata.workNumber !== undefined) {\n lines.push(`${indent}<work>`);\n if (metadata.workNumber !== undefined) {\n lines.push(`${indent}${indent}<work-number>${escapeXml(metadata.workNumber)}</work-number>`);\n }\n if (metadata.workTitle !== undefined) {\n lines.push(`${indent}${indent}<work-title>${escapeXml(metadata.workTitle)}</work-title>`);\n }\n lines.push(`${indent}</work>`);\n }\n\n // Movement\n if (metadata.movementNumber !== undefined) {\n lines.push(`${indent}<movement-number>${escapeXml(metadata.movementNumber)}</movement-number>`);\n }\n if (metadata.movementTitle !== undefined) {\n lines.push(`${indent}<movement-title>${escapeXml(metadata.movementTitle)}</movement-title>`);\n }\n\n // Identification\n if (metadata.creators || metadata.rights || metadata.encoding || metadata.source || metadata.miscellaneous) {\n lines.push(`${indent}<identification>`);\n\n if (metadata.creators) {\n for (const creator of metadata.creators) {\n const typeAttr = creator.type ? ` type=\"${escapeXml(creator.type)}\"` : '';\n lines.push(`${indent}${indent}<creator${typeAttr}>${escapeXml(creator.value)}</creator>`);\n }\n }\n\n if (metadata.rights) {\n for (const right of metadata.rights) {\n lines.push(`${indent}${indent}<rights>${escapeXml(right)}</rights>`);\n }\n }\n\n if (metadata.encoding) {\n lines.push(`${indent}${indent}<encoding>`);\n if (metadata.encoding.software) {\n for (const sw of metadata.encoding.software) {\n lines.push(`${indent}${indent}${indent}<software>${escapeXml(sw)}</software>`);\n }\n }\n if (metadata.encoding.encodingDate) {\n lines.push(`${indent}${indent}${indent}<encoding-date>${escapeXml(metadata.encoding.encodingDate)}</encoding-date>`);\n }\n if (metadata.encoding.encoder) {\n for (const enc of metadata.encoding.encoder) {\n lines.push(`${indent}${indent}${indent}<encoder>${escapeXml(enc)}</encoder>`);\n }\n }\n if (metadata.encoding.encodingDescription) {\n lines.push(`${indent}${indent}${indent}<encoding-description>${escapeXml(metadata.encoding.encodingDescription)}</encoding-description>`);\n }\n if (metadata.encoding.supports) {\n for (const support of metadata.encoding.supports) {\n let attrs = ` element=\"${escapeXml(support.element)}\" type=\"${support.type}\"`;\n if (support.attribute) attrs += ` attribute=\"${escapeXml(support.attribute)}\"`;\n if (support.value) attrs += ` value=\"${escapeXml(support.value)}\"`;\n lines.push(`${indent}${indent}${indent}<supports${attrs}/>`);\n }\n }\n lines.push(`${indent}${indent}</encoding>`);\n }\n\n if (metadata.source) {\n lines.push(`${indent}${indent}<source>${escapeXml(metadata.source)}</source>`);\n }\n\n if (metadata.miscellaneous) {\n lines.push(`${indent}${indent}<miscellaneous>`);\n for (const field of metadata.miscellaneous) {\n lines.push(`${indent}${indent}${indent}<miscellaneous-field name=\"${escapeXml(field.name)}\">${escapeXml(field.value)}</miscellaneous-field>`);\n }\n lines.push(`${indent}${indent}</miscellaneous>`);\n }\n\n lines.push(`${indent}</identification>`);\n }\n\n return lines;\n}\n\nfunction serializeDefaults(defaults: Defaults, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<defaults>`);\n\n if (defaults.scaling) {\n lines.push(`${indent}${indent}<scaling>`);\n lines.push(`${indent}${indent}${indent}<millimeters>${defaults.scaling.millimeters}</millimeters>`);\n lines.push(`${indent}${indent}${indent}<tenths>${defaults.scaling.tenths}</tenths>`);\n lines.push(`${indent}${indent}</scaling>`);\n }\n\n if (defaults.pageLayout) {\n lines.push(...serializePageLayout(defaults.pageLayout, indent + indent));\n }\n\n if (defaults.systemLayout) {\n lines.push(...serializeSystemLayout(defaults.systemLayout, indent + indent));\n }\n\n if (defaults.staffLayout) {\n for (const sl of defaults.staffLayout) {\n const numAttr = sl.number !== undefined ? ` number=\"${sl.number}\"` : '';\n lines.push(`${indent}${indent}<staff-layout${numAttr}>`);\n if (sl.staffDistance !== undefined) {\n lines.push(`${indent}${indent}${indent}<staff-distance>${sl.staffDistance}</staff-distance>`);\n }\n lines.push(`${indent}${indent}</staff-layout>`);\n }\n }\n\n // Appearance\n if (defaults.appearance) {\n lines.push(`${indent}${indent}<appearance>`);\n const app = defaults.appearance;\n if (app['line-widths']) {\n for (const lw of app['line-widths'] as Array<{ type: string; value: number }>) {\n lines.push(`${indent}${indent}${indent}<line-width type=\"${escapeXml(lw.type)}\">${lw.value}</line-width>`);\n }\n }\n if (app['note-sizes']) {\n for (const ns of app['note-sizes'] as Array<{ type: string; value: number }>) {\n lines.push(`${indent}${indent}${indent}<note-size type=\"${escapeXml(ns.type)}\">${ns.value}</note-size>`);\n }\n }\n if (app['distances']) {\n for (const d of app['distances'] as Array<{ type: string; value: number }>) {\n lines.push(`${indent}${indent}${indent}<distance type=\"${escapeXml(d.type)}\">${d.value}</distance>`);\n }\n }\n lines.push(`${indent}${indent}</appearance>`);\n }\n\n // Music font\n if (defaults.musicFont) {\n let attrs = '';\n if (defaults.musicFont.fontFamily) attrs += ` font-family=\"${escapeXml(defaults.musicFont.fontFamily)}\"`;\n if (defaults.musicFont.fontSize) attrs += ` font-size=\"${escapeXml(defaults.musicFont.fontSize)}\"`;\n if (defaults.musicFont.fontStyle) attrs += ` font-style=\"${escapeXml(defaults.musicFont.fontStyle)}\"`;\n if (defaults.musicFont.fontWeight) attrs += ` font-weight=\"${escapeXml(defaults.musicFont.fontWeight)}\"`;\n lines.push(`${indent}${indent}<music-font${attrs}/>`);\n }\n\n // Word font\n if (defaults.wordFont) {\n let attrs = '';\n if (defaults.wordFont.fontFamily) attrs += ` font-family=\"${escapeXml(defaults.wordFont.fontFamily)}\"`;\n if (defaults.wordFont.fontSize) attrs += ` font-size=\"${escapeXml(defaults.wordFont.fontSize)}\"`;\n if (defaults.wordFont.fontStyle) attrs += ` font-style=\"${escapeXml(defaults.wordFont.fontStyle)}\"`;\n if (defaults.wordFont.fontWeight) attrs += ` font-weight=\"${escapeXml(defaults.wordFont.fontWeight)}\"`;\n lines.push(`${indent}${indent}<word-font${attrs}/>`);\n }\n\n // Lyric fonts\n if (defaults.lyricFont) {\n for (const lf of defaults.lyricFont) {\n let attrs = '';\n if (lf.number !== undefined) attrs += ` number=\"${lf.number}\"`;\n if (lf.name) attrs += ` name=\"${escapeXml(lf.name)}\"`;\n if (lf.fontFamily) attrs += ` font-family=\"${escapeXml(lf.fontFamily)}\"`;\n if (lf.fontSize) attrs += ` font-size=\"${escapeXml(lf.fontSize)}\"`;\n if (lf.fontStyle) attrs += ` font-style=\"${escapeXml(lf.fontStyle)}\"`;\n if (lf.fontWeight) attrs += ` font-weight=\"${escapeXml(lf.fontWeight)}\"`;\n lines.push(`${indent}${indent}<lyric-font${attrs}/>`);\n }\n }\n\n // Lyric languages\n if (defaults.lyricLanguage) {\n for (const ll of defaults.lyricLanguage) {\n let attrs = '';\n if (ll.number !== undefined) attrs += ` number=\"${ll.number}\"`;\n if (ll.name) attrs += ` name=\"${escapeXml(ll.name)}\"`;\n attrs += ` xml:lang=\"${escapeXml(ll.xmlLang)}\"`;\n lines.push(`${indent}${indent}<lyric-language${attrs}/>`);\n }\n }\n\n lines.push(`${indent}</defaults>`);\n\n return lines;\n}\n\nfunction serializePageLayout(layout: PageLayout, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<page-layout>`);\n\n if (layout.pageHeight !== undefined) {\n lines.push(`${indent} <page-height>${layout.pageHeight}</page-height>`);\n }\n if (layout.pageWidth !== undefined) {\n lines.push(`${indent} <page-width>${layout.pageWidth}</page-width>`);\n }\n\n if (layout.pageMargins) {\n for (const m of layout.pageMargins) {\n const typeAttr = m.type ? ` type=\"${m.type}\"` : '';\n lines.push(`${indent} <page-margins${typeAttr}>`);\n if (m.leftMargin !== undefined) {\n lines.push(`${indent} <left-margin>${m.leftMargin}</left-margin>`);\n }\n if (m.rightMargin !== undefined) {\n lines.push(`${indent} <right-margin>${m.rightMargin}</right-margin>`);\n }\n if (m.topMargin !== undefined) {\n lines.push(`${indent} <top-margin>${m.topMargin}</top-margin>`);\n }\n if (m.bottomMargin !== undefined) {\n lines.push(`${indent} <bottom-margin>${m.bottomMargin}</bottom-margin>`);\n }\n lines.push(`${indent} </page-margins>`);\n }\n }\n\n lines.push(`${indent}</page-layout>`);\n\n return lines;\n}\n\nfunction serializeSystemLayout(layout: SystemLayout, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<system-layout>`);\n\n if (layout.systemMargins) {\n lines.push(`${indent} <system-margins>`);\n if (layout.systemMargins.leftMargin !== undefined) {\n lines.push(`${indent} <left-margin>${layout.systemMargins.leftMargin}</left-margin>`);\n }\n if (layout.systemMargins.rightMargin !== undefined) {\n lines.push(`${indent} <right-margin>${layout.systemMargins.rightMargin}</right-margin>`);\n }\n lines.push(`${indent} </system-margins>`);\n }\n\n if (layout.systemDistance !== undefined) {\n lines.push(`${indent} <system-distance>${layout.systemDistance}</system-distance>`);\n }\n\n if (layout.topSystemDistance !== undefined) {\n lines.push(`${indent} <top-system-distance>${layout.topSystemDistance}</top-system-distance>`);\n }\n\n lines.push(`${indent}</system-layout>`);\n\n return lines;\n}\n\nfunction serializeCredit(credit: Credit, indent: string): string[] {\n const lines: string[] = [];\n\n const pageAttr = credit.page !== undefined ? ` page=\"${credit.page}\"` : '';\n lines.push(`${indent}<credit${pageAttr}>`);\n\n if (credit.creditType) {\n for (const ct of credit.creditType) {\n lines.push(`${indent}${indent}<credit-type>${escapeXml(ct)}</credit-type>`);\n }\n }\n\n if (credit.creditWords) {\n for (const cw of credit.creditWords) {\n let attrs = '';\n if (cw.defaultX !== undefined) attrs += ` default-x=\"${cw.defaultX}\"`;\n if (cw.defaultY !== undefined) attrs += ` default-y=\"${cw.defaultY}\"`;\n if (cw.fontSize) attrs += ` font-size=\"${escapeXml(cw.fontSize)}\"`;\n if (cw.fontWeight) attrs += ` font-weight=\"${escapeXml(cw.fontWeight)}\"`;\n if (cw.fontStyle) attrs += ` font-style=\"${escapeXml(cw.fontStyle)}\"`;\n if (cw.justify) attrs += ` justify=\"${escapeXml(cw.justify)}\"`;\n if (cw.halign) attrs += ` halign=\"${escapeXml(cw.halign)}\"`;\n if (cw.valign) attrs += ` valign=\"${escapeXml(cw.valign)}\"`;\n if (cw.letterSpacing) attrs += ` letter-spacing=\"${escapeXml(cw.letterSpacing)}\"`;\n if (cw.xmlLang) attrs += ` xml:lang=\"${escapeXml(cw.xmlLang)}\"`;\n if (cw.xmlSpace) attrs += ` xml:space=\"${escapeXml(cw.xmlSpace)}\"`;\n lines.push(`${indent}${indent}<credit-words${attrs}>${escapeXml(cw.text)}</credit-words>`);\n }\n }\n\n lines.push(`${indent}</credit>`);\n\n return lines;\n}\n\nfunction serializePartList(partList: PartListEntry[], indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<part-list>`);\n\n for (const entry of partList) {\n if (entry.type === 'score-part') {\n lines.push(...serializeScorePart(entry, indent + indent));\n } else if (entry.type === 'part-group') {\n lines.push(...serializePartGroup(entry, indent + indent));\n }\n }\n\n lines.push(`${indent}</part-list>`);\n\n return lines;\n}\n\nfunction serializeDisplayTexts(texts: DisplayText[], indent: string): string[] {\n const lines: string[] = [];\n for (const dt of texts) {\n let attrs = '';\n if (dt.fontFamily) attrs += ` font-family=\"${escapeXml(dt.fontFamily)}\"`;\n if (dt.fontSize) attrs += ` font-size=\"${escapeXml(dt.fontSize)}\"`;\n if (dt.fontStyle) attrs += ` font-style=\"${escapeXml(dt.fontStyle)}\"`;\n if (dt.fontWeight) attrs += ` font-weight=\"${escapeXml(dt.fontWeight)}\"`;\n if (dt.xmlSpace) attrs += ` xml:space=\"${escapeXml(dt.xmlSpace)}\"`;\n lines.push(`${indent}<display-text${attrs}>${escapeXml(dt.text)}</display-text>`);\n }\n return lines;\n}\n\nfunction serializeScorePart(part: PartInfo, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<score-part id=\"${escapeXml(part.id)}\">`);\n\n if (part.name !== undefined) {\n let pnAttrs = '';\n if (part.namePrintObject === false) pnAttrs += ' print-object=\"no\"';\n lines.push(`${indent} <part-name${pnAttrs}>${escapeXml(part.name)}</part-name>`);\n }\n\n if (part.partNameDisplay && part.partNameDisplay.length > 0) {\n lines.push(`${indent} <part-name-display>`);\n lines.push(...serializeDisplayTexts(part.partNameDisplay, indent + ' '));\n lines.push(`${indent} </part-name-display>`);\n }\n\n if (part.abbreviation !== undefined) {\n let paAttrs = '';\n if (part.abbreviationPrintObject === false) paAttrs += ' print-object=\"no\"';\n lines.push(`${indent} <part-abbreviation${paAttrs}>${escapeXml(part.abbreviation)}</part-abbreviation>`);\n }\n\n if (part.partAbbreviationDisplay && part.partAbbreviationDisplay.length > 0) {\n lines.push(`${indent} <part-abbreviation-display>`);\n lines.push(...serializeDisplayTexts(part.partAbbreviationDisplay, indent + ' '));\n lines.push(`${indent} </part-abbreviation-display>`);\n }\n\n if (part.scoreInstruments) {\n for (const inst of part.scoreInstruments) {\n lines.push(`${indent} <score-instrument id=\"${escapeXml(inst.id)}\">`);\n lines.push(`${indent} <instrument-name>${escapeXml(inst.name)}</instrument-name>`);\n if (inst.abbreviation) {\n lines.push(`${indent} <instrument-abbreviation>${escapeXml(inst.abbreviation)}</instrument-abbreviation>`);\n }\n if (inst.sound) {\n lines.push(`${indent} <instrument-sound>${escapeXml(inst.sound)}</instrument-sound>`);\n }\n if (inst.solo) {\n lines.push(`${indent} <solo/>`);\n }\n if (inst.ensemble !== undefined) {\n lines.push(`${indent} <ensemble>${inst.ensemble}</ensemble>`);\n }\n lines.push(`${indent} </score-instrument>`);\n }\n }\n\n if (part.groups) {\n for (const group of part.groups) {\n lines.push(`${indent} <group>${escapeXml(group)}</group>`);\n }\n }\n\n if (part.midiInstruments) {\n for (const midi of part.midiInstruments) {\n lines.push(`${indent} <midi-instrument id=\"${escapeXml(midi.id)}\">`);\n if (midi.channel !== undefined) {\n lines.push(`${indent} <midi-channel>${midi.channel}</midi-channel>`);\n }\n if (midi.name) {\n lines.push(`${indent} <midi-name>${escapeXml(midi.name)}</midi-name>`);\n }\n if (midi.bank !== undefined) {\n lines.push(`${indent} <midi-bank>${midi.bank}</midi-bank>`);\n }\n if (midi.program !== undefined) {\n lines.push(`${indent} <midi-program>${midi.program}</midi-program>`);\n }\n if (midi.unpitched !== undefined) {\n lines.push(`${indent} <midi-unpitched>${midi.unpitched}</midi-unpitched>`);\n }\n if (midi.volume !== undefined) {\n lines.push(`${indent} <volume>${midi.volume}</volume>`);\n }\n if (midi.pan !== undefined) {\n lines.push(`${indent} <pan>${midi.pan}</pan>`);\n }\n if (midi.elevation !== undefined) {\n lines.push(`${indent} <elevation>${midi.elevation}</elevation>`);\n }\n lines.push(`${indent} </midi-instrument>`);\n }\n }\n\n lines.push(`${indent}</score-part>`);\n\n return lines;\n}\n\nfunction serializePartGroup(group: PartGroup, indent: string): string[] {\n const lines: string[] = [];\n\n let attrs = ` type=\"${group.groupType}\"`;\n if (group.number !== undefined) attrs += ` number=\"${group.number}\"`;\n lines.push(`${indent}<part-group${attrs}>`);\n\n if (group.groupName) {\n lines.push(`${indent} <group-name>${escapeXml(group.groupName)}</group-name>`);\n }\n\n if (group.groupNameDisplay && group.groupNameDisplay.length > 0) {\n lines.push(`${indent} <group-name-display>`);\n lines.push(...serializeDisplayTexts(group.groupNameDisplay, indent + ' '));\n lines.push(`${indent} </group-name-display>`);\n }\n\n if (group.groupAbbreviation) {\n lines.push(`${indent} <group-abbreviation>${escapeXml(group.groupAbbreviation)}</group-abbreviation>`);\n }\n\n if (group.groupAbbreviationDisplay && group.groupAbbreviationDisplay.length > 0) {\n lines.push(`${indent} <group-abbreviation-display>`);\n lines.push(...serializeDisplayTexts(group.groupAbbreviationDisplay, indent + ' '));\n lines.push(`${indent} </group-abbreviation-display>`);\n }\n\n if (group.groupSymbol) {\n const defaultXAttr = group.groupSymbolDefaultX !== undefined ? ` default-x=\"${group.groupSymbolDefaultX}\"` : '';\n lines.push(`${indent} <group-symbol${defaultXAttr}>${group.groupSymbol}</group-symbol>`);\n }\n\n if (group.groupBarline) {\n lines.push(`${indent} <group-barline>${group.groupBarline}</group-barline>`);\n }\n\n lines.push(`${indent}</part-group>`);\n\n return lines;\n}\n\nfunction serializePart(part: Part, indent: string): string[] {\n const lines: string[] = [];\n\n // Only output id attribute if it's present and non-empty\n const idAttr = part.id ? ` id=\"${escapeXml(part.id)}\"` : '';\n lines.push(`${indent}<part${idAttr}>`);\n\n for (const measure of part.measures) {\n lines.push(...serializeMeasure(measure, indent + indent));\n }\n\n lines.push(`${indent}</part>`);\n\n return lines;\n}\n\nfunction serializeMeasure(measure: Measure, indent: string): string[] {\n const lines: string[] = [];\n\n let attrs = ` number=\"${measure.number}\"`;\n if (measure.width !== undefined) attrs += ` width=\"${measure.width}\"`;\n if (measure.implicit) attrs += ` implicit=\"yes\"`;\n lines.push(`${indent}<measure${attrs}>`);\n\n // Print\n if (measure.print) {\n lines.push(...serializePrint(measure.print, indent + ' '));\n }\n\n // Attributes\n if (measure.attributes) {\n lines.push(...serializeAttributes(measure.attributes, indent + ' '));\n }\n\n // Entries\n for (const entry of measure.entries) {\n lines.push(...serializeEntry(entry, indent + ' '));\n }\n\n // Barlines\n if (measure.barlines) {\n for (const barline of measure.barlines) {\n lines.push(...serializeBarline(barline, indent + ' '));\n }\n }\n\n lines.push(`${indent}</measure>`);\n\n return lines;\n}\n\nfunction serializePrint(print: Print, indent: string): string[] {\n const lines: string[] = [];\n\n let attrs = '';\n if (print.newSystem) attrs += ' new-system=\"yes\"';\n if (print.newPage) attrs += ' new-page=\"yes\"';\n if (print.blankPage !== undefined) attrs += ` blank-page=\"${print.blankPage}\"`;\n if (print.pageNumber) attrs += ` page-number=\"${escapeXml(print.pageNumber)}\"`;\n\n lines.push(`${indent}<print${attrs}>`);\n\n if (print.pageLayout) {\n lines.push(...serializePageLayout(print.pageLayout, indent + ' '));\n }\n\n if (print.systemLayout) {\n lines.push(...serializeSystemLayout(print.systemLayout, indent + ' '));\n }\n\n if (print.staffLayouts) {\n for (const sl of print.staffLayouts) {\n const numAttr = sl.number !== undefined ? ` number=\"${sl.number}\"` : '';\n lines.push(`${indent} <staff-layout${numAttr}>`);\n if (sl.staffDistance !== undefined) {\n lines.push(`${indent} <staff-distance>${sl.staffDistance}</staff-distance>`);\n }\n lines.push(`${indent} </staff-layout>`);\n }\n }\n\n if (print.measureLayout) {\n lines.push(`${indent} <measure-layout>`);\n if (print.measureLayout.measureDistance !== undefined) {\n lines.push(`${indent} <measure-distance>${print.measureLayout.measureDistance}</measure-distance>`);\n }\n lines.push(`${indent} </measure-layout>`);\n }\n\n if (print.measureNumbering) {\n const mn = print.measureNumbering;\n // Support both string and MeasureNumbering object\n if (typeof mn === 'string') {\n lines.push(`${indent} <measure-numbering>${escapeXml(mn)}</measure-numbering>`);\n } else {\n let mnAttrs = '';\n if (mn.system) mnAttrs += ` system=\"${mn.system}\"`;\n lines.push(`${indent} <measure-numbering${mnAttrs}>${escapeXml(mn.value)}</measure-numbering>`);\n }\n }\n\n if (print.partNameDisplay && print.partNameDisplay.length > 0) {\n lines.push(`${indent} <part-name-display>`);\n lines.push(...serializeDisplayTexts(print.partNameDisplay, indent + ' '));\n lines.push(`${indent} </part-name-display>`);\n }\n\n if (print.partAbbreviationDisplay && print.partAbbreviationDisplay.length > 0) {\n lines.push(`${indent} <part-abbreviation-display>`);\n lines.push(...serializeDisplayTexts(print.partAbbreviationDisplay, indent + ' '));\n lines.push(`${indent} </part-abbreviation-display>`);\n }\n\n lines.push(`${indent}</print>`);\n\n return lines;\n}\n\nfunction serializeAttributes(attrs: MeasureAttributes, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<attributes>`);\n\n if (attrs.divisions !== undefined) {\n lines.push(`${indent} <divisions>${attrs.divisions}</divisions>`);\n }\n\n // Multiple key signatures (for multi-staff)\n if (attrs.keys && attrs.keys.length > 0) {\n for (const key of attrs.keys) {\n lines.push(...serializeKey(key, indent + ' '));\n }\n } else if (attrs.key) {\n lines.push(...serializeKey(attrs.key, indent + ' '));\n }\n\n if (attrs.time) {\n lines.push(...serializeTime(attrs.time, indent + ' '));\n }\n\n if (attrs.staves !== undefined) {\n lines.push(`${indent} <staves>${attrs.staves}</staves>`);\n }\n\n if (attrs.clef) {\n for (const clef of attrs.clef) {\n lines.push(...serializeClef(clef, indent + ' '));\n }\n }\n\n if (attrs.transpose) {\n lines.push(...serializeTranspose(attrs.transpose, indent + ' '));\n }\n\n if (attrs.staffDetails) {\n for (const sd of attrs.staffDetails) {\n lines.push(...serializeStaffDetails(sd, indent + ' '));\n }\n }\n\n if (attrs.measureStyle) {\n for (const ms of attrs.measureStyle) {\n lines.push(...serializeMeasureStyle(ms, indent + ' '));\n }\n }\n\n lines.push(`${indent}</attributes>`);\n\n return lines;\n}\n\nfunction serializeKey(key: KeySignature, indent: string): string[] {\n const lines: string[] = [];\n\n let keyAttrs = '';\n if (key.number !== undefined) keyAttrs += ` number=\"${key.number}\"`;\n if (key.printObject === false) keyAttrs += ' print-object=\"no\"';\n lines.push(`${indent}<key${keyAttrs}>`);\n\n // Cancel (for key changes)\n if (key.cancel !== undefined) {\n const locationAttr = key.cancelLocation ? ` location=\"${key.cancelLocation}\"` : '';\n lines.push(`${indent} <cancel${locationAttr}>${key.cancel}</cancel>`);\n }\n\n // Non-traditional key signatures\n if (key.keySteps && key.keyAlters && key.keySteps.length > 0) {\n for (let i = 0; i < key.keySteps.length; i++) {\n lines.push(`${indent} <key-step>${key.keySteps[i]}</key-step>`);\n if (i < key.keyAlters.length) {\n lines.push(`${indent} <key-alter>${key.keyAlters[i]}</key-alter>`);\n }\n }\n if (key.keyOctaves) {\n for (const ko of key.keyOctaves) {\n let koAttrs = ` number=\"${ko.number}\"`;\n if (ko.cancel !== undefined) koAttrs += ` cancel=\"${ko.cancel ? 'yes' : 'no'}\"`;\n lines.push(`${indent} <key-octave${koAttrs}>${ko.octave}</key-octave>`);\n }\n }\n } else {\n lines.push(`${indent} <fifths>${key.fifths}</fifths>`);\n if (key.mode) {\n lines.push(`${indent} <mode>${key.mode}</mode>`);\n }\n // key-octave can also appear with traditional fifths-based keys\n if (key.keyOctaves) {\n for (const ko of key.keyOctaves) {\n let koAttrs = ` number=\"${ko.number}\"`;\n if (ko.cancel !== undefined) koAttrs += ` cancel=\"${ko.cancel ? 'yes' : 'no'}\"`;\n lines.push(`${indent} <key-octave${koAttrs}>${ko.octave}</key-octave>`);\n }\n }\n }\n\n lines.push(`${indent}</key>`);\n\n return lines;\n}\n\nfunction serializeTime(time: TimeSignature, indent: string): string[] {\n const lines: string[] = [];\n\n let attrs = '';\n if (time.symbol) attrs += ` symbol=\"${time.symbol}\"`;\n if (time.printObject === false) attrs += ' print-object=\"no\"';\n lines.push(`${indent}<time${attrs}>`);\n\n // Senza misura\n if (time.senzaMisura) {\n lines.push(`${indent} <senza-misura/>`);\n }\n // Compound time signatures\n else if (time.beatsList && time.beatTypeList && time.beatsList.length > 1) {\n const maxLen = Math.max(time.beatsList.length, time.beatTypeList.length);\n for (let i = 0; i < maxLen; i++) {\n if (i < time.beatsList.length) {\n lines.push(`${indent} <beats>${time.beatsList[i]}</beats>`);\n }\n if (i < time.beatTypeList.length) {\n lines.push(`${indent} <beat-type>${time.beatTypeList[i]}</beat-type>`);\n }\n }\n } else {\n lines.push(`${indent} <beats>${time.beats}</beats>`);\n lines.push(`${indent} <beat-type>${time.beatType}</beat-type>`);\n }\n\n lines.push(`${indent}</time>`);\n\n return lines;\n}\n\nfunction serializeClef(clef: Clef, indent: string): string[] {\n const lines: string[] = [];\n\n const numberAttr = clef.staff ? ` number=\"${clef.staff}\"` : '';\n lines.push(`${indent}<clef${numberAttr}>`);\n lines.push(`${indent} <sign>${clef.sign}</sign>`);\n lines.push(`${indent} <line>${clef.line}</line>`);\n if (clef.clefOctaveChange !== undefined) {\n lines.push(`${indent} <clef-octave-change>${clef.clefOctaveChange}</clef-octave-change>`);\n }\n lines.push(`${indent}</clef>`);\n\n return lines;\n}\n\nfunction serializeTranspose(transpose: Transpose, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<transpose>`);\n lines.push(`${indent} <diatonic>${transpose.diatonic}</diatonic>`);\n lines.push(`${indent} <chromatic>${transpose.chromatic}</chromatic>`);\n if (transpose.octaveChange !== undefined) {\n lines.push(`${indent} <octave-change>${transpose.octaveChange}</octave-change>`);\n }\n lines.push(`${indent}</transpose>`);\n\n return lines;\n}\n\nfunction serializeEntry(entry: MeasureEntry, indent: string): string[] {\n switch (entry.type) {\n case 'note':\n return serializeNote(entry, indent);\n case 'backup':\n return serializeBackup(entry, indent);\n case 'forward':\n return serializeForward(entry, indent);\n case 'direction':\n return serializeDirection(entry, indent);\n case 'harmony':\n return serializeHarmony(entry, indent);\n case 'figured-bass':\n return serializeFiguredBass(entry, indent);\n case 'sound':\n return serializeSound(entry, indent);\n case 'attributes':\n return serializeAttributes((entry as AttributesEntry).attributes, indent);\n default:\n return [];\n }\n}\n\nfunction serializeNote(note: NoteEntry, indent: string): string[] {\n const lines: string[] = [];\n\n // Build note attributes\n const noteAttrs = buildAttrs({\n 'default-x': note.defaultX,\n 'default-y': note.defaultY,\n 'relative-x': note.relativeX,\n 'relative-y': note.relativeY,\n 'dynamics': note.dynamics,\n 'print-object': note.printObject === false ? false : undefined,\n 'print-spacing': note.printSpacing,\n });\n lines.push(`${indent}<note${noteAttrs}>`);\n\n // Grace note\n if (note.grace) {\n const graceAttrs = buildAttrs({\n 'slash': note.grace.slash || undefined,\n 'steal-time-previous': note.grace.stealTimePrevious,\n 'steal-time-following': note.grace.stealTimeFollowing,\n });\n lines.push(`${indent} <grace${graceAttrs}/>`);\n }\n\n // Cue note\n if (note.cue) {\n lines.push(`${indent} <cue/>`);\n }\n\n // Chord\n if (note.chord) {\n lines.push(`${indent} <chord/>`);\n }\n\n // Pitch, rest, or unpitched\n if (note.pitch) {\n lines.push(...serializePitch(note.pitch, indent + ' '));\n } else if (note.rest) {\n let restAttrs = '';\n if (note.rest.measure) restAttrs += ' measure=\"yes\"';\n if (note.rest.displayStep || note.rest.displayOctave !== undefined) {\n lines.push(`${indent} <rest${restAttrs}>`);\n if (note.rest.displayStep) {\n lines.push(`${indent} <display-step>${note.rest.displayStep}</display-step>`);\n }\n if (note.rest.displayOctave !== undefined) {\n lines.push(`${indent} <display-octave>${note.rest.displayOctave}</display-octave>`);\n }\n lines.push(`${indent} </rest>`);\n } else {\n lines.push(`${indent} <rest${restAttrs}/>`);\n }\n } else if (note.unpitched) {\n if (note.unpitched.displayStep || note.unpitched.displayOctave !== undefined) {\n lines.push(`${indent} <unpitched>`);\n if (note.unpitched.displayStep) {\n lines.push(`${indent} <display-step>${note.unpitched.displayStep}</display-step>`);\n }\n if (note.unpitched.displayOctave !== undefined) {\n lines.push(`${indent} <display-octave>${note.unpitched.displayOctave}</display-octave>`);\n }\n lines.push(`${indent} </unpitched>`);\n } else {\n lines.push(`${indent} <unpitched/>`);\n }\n } else {\n lines.push(`${indent} <rest/>`);\n }\n\n // Duration (not for grace notes)\n if (!note.grace) {\n lines.push(`${indent} <duration>${note.duration}</duration>`);\n }\n\n // Tie\n if (note.ties && note.ties.length > 0) {\n for (const tie of note.ties) {\n lines.push(`${indent} <tie type=\"${tie.type}\"/>`);\n }\n } else if (note.tie) {\n lines.push(`${indent} <tie type=\"${note.tie.type}\"/>`);\n }\n\n // Voice\n lines.push(`${indent} <voice>${note.voice}</voice>`);\n\n // Type\n if (note.noteType) {\n const typeAttrs = note.noteTypeSize ? ` size=\"${escapeXml(note.noteTypeSize)}\"` : '';\n lines.push(`${indent} <type${typeAttrs}>${note.noteType}</type>`);\n }\n\n // Dots\n if (note.dots) {\n for (let i = 0; i < note.dots; i++) {\n lines.push(`${indent} <dot/>`);\n }\n }\n\n // Accidental\n if (note.accidental) {\n const accAttrs = buildAttrs({\n 'cautionary': note.accidental.cautionary || undefined,\n 'editorial': note.accidental.editorial || undefined,\n 'parentheses': note.accidental.parentheses || undefined,\n 'bracket': note.accidental.bracket || undefined,\n 'relative-x': note.accidental.relativeX,\n 'relative-y': note.accidental.relativeY,\n 'color': note.accidental.color,\n 'size': note.accidental.size,\n 'font-size': note.accidental.fontSize,\n });\n lines.push(`${indent} <accidental${accAttrs}>${note.accidental.value}</accidental>`);\n }\n\n // Time modification\n if (note.timeModification) {\n lines.push(`${indent} <time-modification>`);\n lines.push(`${indent} <actual-notes>${note.timeModification.actualNotes}</actual-notes>`);\n lines.push(`${indent} <normal-notes>${note.timeModification.normalNotes}</normal-notes>`);\n if (note.timeModification.normalType) {\n lines.push(`${indent} <normal-type>${note.timeModification.normalType}</normal-type>`);\n }\n if (note.timeModification.normalDots) {\n for (let i = 0; i < note.timeModification.normalDots; i++) {\n lines.push(`${indent} <normal-dot/>`);\n }\n }\n lines.push(`${indent} </time-modification>`);\n }\n\n // Stem\n if (note.stem) {\n const stemAttrs = buildAttrs({\n 'default-x': note.stem.defaultX,\n 'default-y': note.stem.defaultY,\n });\n lines.push(`${indent} <stem${stemAttrs}>${note.stem.value}</stem>`);\n }\n\n // Notehead\n if (note.notehead) {\n const nhAttrs = buildAttrs({\n 'filled': note.notehead.filled,\n 'parentheses': note.notehead.parentheses || undefined,\n });\n lines.push(`${indent} <notehead${nhAttrs}>${note.notehead.value}</notehead>`);\n }\n\n // Staff\n if (note.staff !== undefined) {\n lines.push(`${indent} <staff>${note.staff}</staff>`);\n }\n\n // Instrument reference\n if (note.instrument) {\n lines.push(`${indent} <instrument id=\"${escapeXml(note.instrument)}\"/>`);\n }\n\n // Beam\n if (note.beam) {\n for (const beam of note.beam) {\n lines.push(...serializeBeam(beam, indent + ' '));\n }\n }\n\n // Notations\n if (note.notations && note.notations.length > 0) {\n lines.push(...serializeNotations(note.notations, indent + ' '));\n }\n\n // Lyrics\n if (note.lyrics) {\n for (const lyric of note.lyrics) {\n lines.push(...serializeLyric(lyric, indent + ' '));\n }\n }\n\n lines.push(`${indent}</note>`);\n\n return lines;\n}\n\nfunction serializePitch(pitch: Pitch, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<pitch>`);\n lines.push(`${indent} <step>${pitch.step}</step>`);\n if (pitch.alter !== undefined && pitch.alter !== 0) {\n lines.push(`${indent} <alter>${pitch.alter}</alter>`);\n }\n lines.push(`${indent} <octave>${pitch.octave}</octave>`);\n lines.push(`${indent}</pitch>`);\n\n return lines;\n}\n\nfunction serializeBeam(beam: BeamInfo, indent: string): string[] {\n return [`${indent}<beam number=\"${beam.number}\">${beam.type}</beam>`];\n}\n\nfunction serializeNotations(notations: Notation[], indent: string): string[] {\n const lines: string[] = [];\n\n // Group notations by notationsIndex for separate <notations> elements\n const notationsGroups = new Map<number, Notation[]>();\n for (const notation of notations) {\n const idx = notation.notationsIndex ?? 0;\n if (!notationsGroups.has(idx)) {\n notationsGroups.set(idx, []);\n }\n notationsGroups.get(idx)!.push(notation);\n }\n\n // Sort by notationsIndex and serialize each group\n const sortedIndices = Array.from(notationsGroups.keys()).sort((a, b) => a - b);\n\n for (const notationsIdx of sortedIndices) {\n const groupNotations = notationsGroups.get(notationsIdx)!;\n lines.push(...serializeNotationsGroup(groupNotations, indent));\n }\n\n return lines;\n}\n\nfunction serializeNotationsGroup(notations: Notation[], indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<notations>`);\n\n // Group articulations by articulationsIndex, and ornaments/technicals together\n const articulationsGroups = new Map<number, Notation[]>();\n const ornaments: Notation[] = [];\n const technicals: Notation[] = [];\n const others: Notation[] = [];\n\n for (const notation of notations) {\n if (notation.type === 'articulation') {\n const artIdx = (notation as any).articulationsIndex ?? 0;\n if (!articulationsGroups.has(artIdx)) {\n articulationsGroups.set(artIdx, []);\n }\n articulationsGroups.get(artIdx)!.push(notation);\n } else if (notation.type === 'ornament') {\n ornaments.push(notation);\n } else if (notation.type === 'technical') {\n technicals.push(notation);\n } else {\n others.push(notation);\n }\n }\n\n // Serialize non-grouped notations first\n for (const notation of others) {\n if (notation.type === 'tied') {\n let attrs = ` type=\"${notation.tiedType}\"`;\n if (notation.number !== undefined) attrs += ` number=\"${notation.number}\"`;\n if (notation.orientation) attrs += ` orientation=\"${notation.orientation}\"`;\n lines.push(`${indent} <tied${attrs}/>`);\n } else if (notation.type === 'slur') {\n let attrs = '';\n if (notation.number !== undefined) attrs += ` number=\"${notation.number}\"`;\n attrs += ` type=\"${notation.slurType}\"`;\n if (notation.lineType) attrs += ` line-type=\"${notation.lineType}\"`;\n if (notation.defaultX !== undefined) attrs += ` default-x=\"${notation.defaultX}\"`;\n if (notation.defaultY !== undefined) attrs += ` default-y=\"${notation.defaultY}\"`;\n if (notation.bezierX !== undefined) attrs += ` bezier-x=\"${notation.bezierX}\"`;\n if (notation.bezierY !== undefined) attrs += ` bezier-y=\"${notation.bezierY}\"`;\n if (notation.bezierX2 !== undefined) attrs += ` bezier-x2=\"${notation.bezierX2}\"`;\n if (notation.bezierY2 !== undefined) attrs += ` bezier-y2=\"${notation.bezierY2}\"`;\n if (notation.placement) attrs += ` placement=\"${notation.placement}\"`;\n lines.push(`${indent} <slur${attrs}/>`);\n } else if (notation.type === 'tuplet') {\n let attrs = ` type=\"${notation.tupletType}\"`;\n if (notation.number !== undefined) attrs += ` number=\"${notation.number}\"`;\n if (notation.bracket !== undefined) attrs += ` bracket=\"${notation.bracket ? 'yes' : 'no'}\"`;\n if (notation.showNumber) attrs += ` show-number=\"${notation.showNumber}\"`;\n if (notation.showType) attrs += ` show-type=\"${notation.showType}\"`;\n if (notation.lineShape) attrs += ` line-shape=\"${notation.lineShape}\"`;\n if (notation.placement) attrs += ` placement=\"${notation.placement}\"`;\n\n const tup = notation as TupletNotation;\n if (tup.tupletActual || tup.tupletNormal) {\n lines.push(`${indent} <tuplet${attrs}>`);\n if (tup.tupletActual) {\n lines.push(`${indent} <tuplet-actual>`);\n if (tup.tupletActual.tupletNumber !== undefined) {\n lines.push(`${indent} <tuplet-number>${tup.tupletActual.tupletNumber}</tuplet-number>`);\n }\n if (tup.tupletActual.tupletType) {\n lines.push(`${indent} <tuplet-type>${tup.tupletActual.tupletType}</tuplet-type>`);\n }\n if (tup.tupletActual.tupletDots) {\n for (let i = 0; i < tup.tupletActual.tupletDots; i++) {\n lines.push(`${indent} <tuplet-dot/>`);\n }\n }\n lines.push(`${indent} </tuplet-actual>`);\n }\n if (tup.tupletNormal) {\n lines.push(`${indent} <tuplet-normal>`);\n if (tup.tupletNormal.tupletNumber !== undefined) {\n lines.push(`${indent} <tuplet-number>${tup.tupletNormal.tupletNumber}</tuplet-number>`);\n }\n if (tup.tupletNormal.tupletType) {\n lines.push(`${indent} <tuplet-type>${tup.tupletNormal.tupletType}</tuplet-type>`);\n }\n if (tup.tupletNormal.tupletDots) {\n for (let i = 0; i < tup.tupletNormal.tupletDots; i++) {\n lines.push(`${indent} <tuplet-dot/>`);\n }\n }\n lines.push(`${indent} </tuplet-normal>`);\n }\n lines.push(`${indent} </tuplet>`);\n } else {\n lines.push(`${indent} <tuplet${attrs}/>`);\n }\n } else if (notation.type === 'dynamics') {\n const placementAttr = notation.placement ? ` placement=\"${notation.placement}\"` : '';\n lines.push(`${indent} <dynamics${placementAttr}>`);\n for (const dyn of notation.dynamics) {\n lines.push(`${indent} <${dyn}/>`);\n }\n if (notation.otherDynamics) {\n lines.push(`${indent} <other-dynamics>${escapeXml(notation.otherDynamics)}</other-dynamics>`);\n }\n lines.push(`${indent} </dynamics>`);\n } else if (notation.type === 'fermata') {\n let attrs = '';\n if (notation.fermataType) attrs += ` type=\"${notation.fermataType}\"`;\n if (notation.placement) attrs += ` placement=\"${notation.placement}\"`;\n if (notation.defaultX !== undefined) attrs += ` default-x=\"${notation.defaultX}\"`;\n if (notation.defaultY !== undefined) attrs += ` default-y=\"${notation.defaultY}\"`;\n if (notation.shape) {\n lines.push(`${indent} <fermata${attrs}>${notation.shape}</fermata>`);\n } else {\n lines.push(`${indent} <fermata${attrs}/>`);\n }\n } else if (notation.type === 'arpeggiate') {\n let attrs = '';\n if (notation.direction) attrs += ` direction=\"${notation.direction}\"`;\n if (notation.number !== undefined) attrs += ` number=\"${notation.number}\"`;\n lines.push(`${indent} <arpeggiate${attrs}/>`);\n } else if (notation.type === 'glissando') {\n let attrs = ` type=\"${notation.glissandoType}\"`;\n if (notation.number !== undefined) attrs += ` number=\"${notation.number}\"`;\n if (notation.lineType) attrs += ` line-type=\"${notation.lineType}\"`;\n if (notation.text) {\n lines.push(`${indent} <glissando${attrs}>${escapeXml(notation.text)}</glissando>`);\n } else {\n lines.push(`${indent} <glissando${attrs}/>`);\n }\n } else if (notation.type === 'slide') {\n let attrs = ` type=\"${notation.slideType}\"`;\n if (notation.number !== undefined) attrs += ` number=\"${notation.number}\"`;\n if (notation.lineType) attrs += ` line-type=\"${notation.lineType}\"`;\n lines.push(`${indent} <slide${attrs}/>`);\n }\n }\n\n // Serialize grouped articulations - each articulationsIndex gets its own <articulations> element\n const sortedArtIndices = Array.from(articulationsGroups.keys()).sort((a, b) => a - b);\n for (const artIdx of sortedArtIndices) {\n const artGroup = articulationsGroups.get(artIdx)!;\n lines.push(`${indent} <articulations>`);\n for (const art of artGroup) {\n if (art.type === 'articulation') {\n let artAttrs = art.placement ? ` placement=\"${art.placement}\"` : '';\n // Handle strong-accent type attribute\n if (art.articulation === 'strong-accent' && art.strongAccentType) {\n artAttrs += ` type=\"${art.strongAccentType}\"`;\n }\n // Handle positioning attributes\n if (art.defaultX !== undefined) artAttrs += ` default-x=\"${art.defaultX}\"`;\n if (art.defaultY !== undefined) artAttrs += ` default-y=\"${art.defaultY}\"`;\n lines.push(`${indent} <${art.articulation}${artAttrs}/>`);\n }\n }\n lines.push(`${indent} </articulations>`);\n }\n\n // Serialize grouped ornaments\n if (ornaments.length > 0) {\n lines.push(`${indent} <ornaments>`);\n // Collect all accidental-marks from ornaments for serialization after ornaments\n const allAccidentalMarks: { value: string; placement?: 'above' | 'below' }[] = [];\n for (const orn of ornaments) {\n if (orn.type === 'ornament') {\n const placementAttr = orn.placement ? ` placement=\"${orn.placement}\"` : '';\n if (orn.ornament === 'wavy-line') {\n let wlAttrs = '';\n if (orn.wavyLineType) wlAttrs += ` type=\"${orn.wavyLineType}\"`;\n if (orn.number !== undefined) wlAttrs += ` number=\"${orn.number}\"`;\n wlAttrs += placementAttr;\n if (orn.defaultY !== undefined) wlAttrs += ` default-y=\"${orn.defaultY}\"`;\n lines.push(`${indent} <wavy-line${wlAttrs}/>`);\n } else if (orn.ornament === 'tremolo') {\n let tremAttrs = '';\n if (orn.tremoloType) tremAttrs += ` type=\"${orn.tremoloType}\"`;\n tremAttrs += placementAttr;\n if (orn.defaultX !== undefined) tremAttrs += ` default-x=\"${orn.defaultX}\"`;\n if (orn.defaultY !== undefined) tremAttrs += ` default-y=\"${orn.defaultY}\"`;\n if (orn.tremoloMarks !== undefined) {\n lines.push(`${indent} <tremolo${tremAttrs}>${orn.tremoloMarks}</tremolo>`);\n } else {\n lines.push(`${indent} <tremolo${tremAttrs}/>`);\n }\n } else {\n let ornAttrs = placementAttr;\n if (orn.defaultY !== undefined) ornAttrs += ` default-y=\"${orn.defaultY}\"`;\n lines.push(`${indent} <${orn.ornament}${ornAttrs}/>`);\n }\n // Collect accidental marks\n if (orn.accidentalMarks) {\n allAccidentalMarks.push(...orn.accidentalMarks);\n }\n }\n }\n // Serialize accidental-marks after other ornaments\n for (const am of allAccidentalMarks) {\n const amPlacement = am.placement ? ` placement=\"${am.placement}\"` : '';\n lines.push(`${indent} <accidental-mark${amPlacement}>${am.value}</accidental-mark>`);\n }\n lines.push(`${indent} </ornaments>`);\n }\n\n // Serialize grouped technical\n if (technicals.length > 0) {\n lines.push(`${indent} <technical>`);\n for (const tech of technicals) {\n if (tech.type === 'technical') {\n let placementAttr = tech.placement ? ` placement=\"${tech.placement}\"` : '';\n const techNotation = tech as TechnicalNotation;\n if (techNotation.defaultX !== undefined) placementAttr += ` default-x=\"${techNotation.defaultX}\"`;\n if (techNotation.defaultY !== undefined) placementAttr += ` default-y=\"${techNotation.defaultY}\"`;\n if (tech.technical === 'bend' && (techNotation.bendAlter !== undefined || techNotation.preBend || techNotation.release)) {\n lines.push(`${indent} <bend${placementAttr}>`);\n if (techNotation.bendAlter !== undefined) {\n lines.push(`${indent} <bend-alter>${techNotation.bendAlter}</bend-alter>`);\n }\n if (techNotation.preBend) {\n lines.push(`${indent} <pre-bend/>`);\n }\n if (techNotation.release) {\n lines.push(`${indent} <release/>`);\n }\n if (techNotation.withBar !== undefined) {\n lines.push(`${indent} <with-bar>${techNotation.withBar}</with-bar>`);\n }\n lines.push(`${indent} </bend>`);\n } else if (tech.technical === 'harmonic') {\n // harmonic with optional children\n const hasChildren = techNotation.harmonicNatural || techNotation.harmonicArtificial ||\n techNotation.basePitch || techNotation.touchingPitch || techNotation.soundingPitch;\n if (hasChildren) {\n lines.push(`${indent} <harmonic${placementAttr}>`);\n if (techNotation.harmonicNatural) lines.push(`${indent} <natural/>`);\n if (techNotation.harmonicArtificial) lines.push(`${indent} <artificial/>`);\n if (techNotation.basePitch) lines.push(`${indent} <base-pitch/>`);\n if (techNotation.touchingPitch) lines.push(`${indent} <touching-pitch/>`);\n if (techNotation.soundingPitch) lines.push(`${indent} <sounding-pitch/>`);\n lines.push(`${indent} </harmonic>`);\n } else {\n lines.push(`${indent} <harmonic${placementAttr}/>`);\n }\n } else if (tech.technical === 'hammer-on' || tech.technical === 'pull-off') {\n let attrs = placementAttr;\n if (techNotation.startStop) attrs += ` type=\"${techNotation.startStop}\"`;\n if (techNotation.text !== undefined) {\n lines.push(`${indent} <${tech.technical}${attrs}>${escapeXml(techNotation.text)}</${tech.technical}>`);\n } else {\n lines.push(`${indent} <${tech.technical}${attrs}/>`);\n }\n } else if (tech.technical === 'string' && techNotation.string !== undefined) {\n lines.push(`${indent} <string${placementAttr}>${techNotation.string}</string>`);\n } else if (tech.technical === 'fret' && techNotation.fret !== undefined) {\n lines.push(`${indent} <fret${placementAttr}>${techNotation.fret}</fret>`);\n } else if (tech.technical === 'fingering') {\n let fAttrs = placementAttr;\n if (techNotation.fingeringSubstitution) fAttrs += ' substitution=\"yes\"';\n if (techNotation.fingeringAlternate) fAttrs += ' alternate=\"yes\"';\n if (techNotation.text !== undefined) {\n lines.push(`${indent} <fingering${fAttrs}>${escapeXml(techNotation.text)}</fingering>`);\n } else {\n lines.push(`${indent} <fingering${fAttrs}/>`);\n }\n } else if (tech.technical === 'heel' || tech.technical === 'toe') {\n let htAttrs = placementAttr;\n if (techNotation.substitution) htAttrs += ' substitution=\"yes\"';\n lines.push(`${indent} <${tech.technical}${htAttrs}/>`);\n } else if (techNotation.text !== undefined) {\n // Elements that can have text content (tap, etc.)\n lines.push(`${indent} <${tech.technical}${placementAttr}>${escapeXml(techNotation.text)}</${tech.technical}>`);\n } else {\n lines.push(`${indent} <${tech.technical}${placementAttr}/>`);\n }\n }\n }\n lines.push(`${indent} </technical>`);\n }\n\n lines.push(`${indent}</notations>`);\n\n return lines;\n}\n\nfunction serializeLyric(lyric: Lyric, indent: string): string[] {\n const lines: string[] = [];\n\n let attrs = '';\n if (lyric.number) attrs += ` number=\"${lyric.number}\"`;\n if (lyric.name) attrs += ` name=\"${escapeXml(lyric.name)}\"`;\n if (lyric.defaultY !== undefined) attrs += ` default-y=\"${lyric.defaultY}\"`;\n if (lyric.relativeX !== undefined) attrs += ` relative-x=\"${lyric.relativeX}\"`;\n if (lyric.justify) attrs += ` justify=\"${escapeXml(lyric.justify)}\"`;\n if (lyric.placement) attrs += ` placement=\"${lyric.placement}\"`;\n lines.push(`${indent}<lyric${attrs}>`);\n\n // Multiple text elements with elision\n if (lyric.textElements && lyric.textElements.length > 1) {\n for (let i = 0; i < lyric.textElements.length; i++) {\n const te = lyric.textElements[i];\n if (te.syllabic) {\n lines.push(`${indent} <syllabic>${te.syllabic}</syllabic>`);\n }\n lines.push(`${indent} <text>${escapeXml(te.text)}</text>`);\n // Add elision between text elements (but not after the last one)\n if (i < lyric.textElements.length - 1) {\n lines.push(`${indent} <elision/>`);\n }\n }\n } else {\n // Single text element\n if (lyric.syllabic) {\n lines.push(`${indent} <syllabic>${lyric.syllabic}</syllabic>`);\n }\n lines.push(`${indent} <text>${escapeXml(lyric.text)}</text>`);\n }\n\n if (lyric.extend) {\n if (typeof lyric.extend === 'object' && lyric.extend.type) {\n lines.push(`${indent} <extend type=\"${lyric.extend.type}\"/>`);\n } else {\n lines.push(`${indent} <extend/>`);\n }\n }\n\n if (lyric.endLine) {\n lines.push(`${indent} <end-line/>`);\n }\n\n if (lyric.endParagraph) {\n lines.push(`${indent} <end-paragraph/>`);\n }\n\n lines.push(`${indent}</lyric>`);\n\n return lines;\n}\n\nfunction serializeBackup(backup: BackupEntry, indent: string): string[] {\n return [\n `${indent}<backup>`,\n `${indent} <duration>${backup.duration}</duration>`,\n `${indent}</backup>`,\n ];\n}\n\nfunction serializeForward(forward: ForwardEntry, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<forward>`);\n lines.push(`${indent} <duration>${forward.duration}</duration>`);\n\n if (forward.voice !== undefined) {\n lines.push(`${indent} <voice>${forward.voice}</voice>`);\n }\n\n if (forward.staff !== undefined) {\n lines.push(`${indent} <staff>${forward.staff}</staff>`);\n }\n\n lines.push(`${indent}</forward>`);\n\n return lines;\n}\n\nfunction serializeDirection(direction: DirectionEntry, indent: string): string[] {\n const lines: string[] = [];\n\n let attrs = '';\n if (direction.placement) attrs += ` placement=\"${direction.placement}\"`;\n if (direction.directive) attrs += ' directive=\"yes\"';\n if (direction.system) attrs += ` system=\"${direction.system}\"`;\n lines.push(`${indent}<direction${attrs}>`);\n\n for (const dirType of direction.directionTypes) {\n lines.push(...serializeDirectionType(dirType, indent + ' '));\n }\n\n if (direction.offset !== undefined) {\n const soundAttr = direction.offsetSound ? ' sound=\"yes\"' : '';\n lines.push(`${indent} <offset${soundAttr}>${direction.offset}</offset>`);\n }\n\n if (direction.staff !== undefined) {\n lines.push(`${indent} <staff>${direction.staff}</staff>`);\n }\n\n if (direction.sound) {\n const attrs: string[] = [];\n if (direction.sound.tempo !== undefined) {\n attrs.push(`tempo=\"${direction.sound.tempo}\"`);\n }\n if (direction.sound.dynamics !== undefined) {\n attrs.push(`dynamics=\"${direction.sound.dynamics}\"`);\n }\n const attrStr = attrs.length > 0 ? ` ${attrs.join(' ')}` : '';\n\n if (direction.sound.midiInstrument) {\n lines.push(`${indent} <sound${attrStr}>`);\n const midi = direction.sound.midiInstrument;\n lines.push(`${indent} <midi-instrument id=\"${escapeXml(midi.id)}\">`);\n if (midi.midiChannel !== undefined) {\n lines.push(`${indent} <midi-channel>${midi.midiChannel}</midi-channel>`);\n }\n if (midi.midiProgram !== undefined) {\n lines.push(`${indent} <midi-program>${midi.midiProgram}</midi-program>`);\n }\n if (midi.volume !== undefined) {\n lines.push(`${indent} <volume>${midi.volume}</volume>`);\n }\n if (midi.pan !== undefined) {\n lines.push(`${indent} <pan>${midi.pan}</pan>`);\n }\n lines.push(`${indent} </midi-instrument>`);\n lines.push(`${indent} </sound>`);\n } else if (attrs.length > 0) {\n lines.push(`${indent} <sound${attrStr}/>`);\n }\n }\n\n lines.push(`${indent}</direction>`);\n\n return lines;\n}\n\nfunction serializeDirectionType(dirType: DirectionType, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<direction-type>`);\n\n switch (dirType.kind) {\n case 'dynamics': {\n let dynAttrs = '';\n if (dirType.defaultX !== undefined) dynAttrs += ` default-x=\"${dirType.defaultX}\"`;\n if (dirType.defaultY !== undefined) dynAttrs += ` default-y=\"${dirType.defaultY}\"`;\n if (dirType.relativeX !== undefined) dynAttrs += ` relative-x=\"${dirType.relativeX}\"`;\n if (dirType.halign) dynAttrs += ` halign=\"${dirType.halign}\"`;\n lines.push(`${indent} <dynamics${dynAttrs}>`);\n lines.push(`${indent} <${dirType.value}/>`);\n lines.push(`${indent} </dynamics>`);\n break;\n }\n\n case 'wedge': {\n let wedgeAttrs = ` type=\"${dirType.type}\"`;\n if (dirType.spread !== undefined) wedgeAttrs += ` spread=\"${dirType.spread}\"`;\n if (dirType.defaultY !== undefined) wedgeAttrs += ` default-y=\"${dirType.defaultY}\"`;\n if (dirType.relativeX !== undefined) wedgeAttrs += ` relative-x=\"${dirType.relativeX}\"`;\n lines.push(`${indent} <wedge${wedgeAttrs}/>`);\n break;\n }\n\n case 'metronome': {\n let metAttrs = '';\n if (dirType.parentheses) metAttrs += ' parentheses=\"yes\"';\n if (dirType.defaultY !== undefined) metAttrs += ` default-y=\"${dirType.defaultY}\"`;\n if (dirType.fontFamily) metAttrs += ` font-family=\"${escapeXml(dirType.fontFamily)}\"`;\n if (dirType.fontSize) metAttrs += ` font-size=\"${escapeXml(dirType.fontSize)}\"`;\n lines.push(`${indent} <metronome${metAttrs}>`);\n lines.push(`${indent} <beat-unit>${dirType.beatUnit}</beat-unit>`);\n if (dirType.beatUnitDot) {\n lines.push(`${indent} <beat-unit-dot/>`);\n }\n if (dirType.beatUnit2) {\n lines.push(`${indent} <beat-unit>${dirType.beatUnit2}</beat-unit>`);\n if (dirType.beatUnitDot2) {\n lines.push(`${indent} <beat-unit-dot/>`);\n }\n }\n if (dirType.perMinute !== undefined) {\n lines.push(`${indent} <per-minute>${dirType.perMinute}</per-minute>`);\n }\n lines.push(`${indent} </metronome>`);\n break;\n }\n\n case 'words': {\n let wordAttrs = '';\n if (dirType.defaultX !== undefined) wordAttrs += ` default-x=\"${dirType.defaultX}\"`;\n if (dirType.defaultY !== undefined) wordAttrs += ` default-y=\"${dirType.defaultY}\"`;\n if (dirType.relativeX !== undefined) wordAttrs += ` relative-x=\"${dirType.relativeX}\"`;\n if (dirType.fontFamily) wordAttrs += ` font-family=\"${escapeXml(dirType.fontFamily)}\"`;\n if (dirType.fontSize) wordAttrs += ` font-size=\"${escapeXml(dirType.fontSize)}\"`;\n if (dirType.fontStyle) wordAttrs += ` font-style=\"${escapeXml(dirType.fontStyle)}\"`;\n if (dirType.fontWeight) wordAttrs += ` font-weight=\"${escapeXml(dirType.fontWeight)}\"`;\n if (dirType.xmlLang) wordAttrs += ` xml:lang=\"${escapeXml(dirType.xmlLang)}\"`;\n if (dirType.justify) wordAttrs += ` justify=\"${escapeXml(dirType.justify)}\"`;\n if (dirType.color) wordAttrs += ` color=\"${escapeXml(dirType.color)}\"`;\n if (dirType.xmlSpace) wordAttrs += ` xml:space=\"${escapeXml(dirType.xmlSpace)}\"`;\n if (dirType.halign) wordAttrs += ` halign=\"${escapeXml(dirType.halign)}\"`;\n lines.push(`${indent} <words${wordAttrs}>${escapeXml(dirType.text)}</words>`);\n break;\n }\n\n case 'rehearsal': {\n let rehAttrs = '';\n if (dirType.enclosure) rehAttrs += ` enclosure=\"${escapeXml(dirType.enclosure)}\"`;\n if (dirType.defaultX !== undefined) rehAttrs += ` default-x=\"${dirType.defaultX}\"`;\n if (dirType.defaultY !== undefined) rehAttrs += ` default-y=\"${dirType.defaultY}\"`;\n if (dirType.fontSize) rehAttrs += ` font-size=\"${escapeXml(dirType.fontSize)}\"`;\n if (dirType.fontWeight) rehAttrs += ` font-weight=\"${escapeXml(dirType.fontWeight)}\"`;\n lines.push(`${indent} <rehearsal${rehAttrs}>${escapeXml(dirType.text)}</rehearsal>`);\n break;\n }\n\n case 'bracket': {\n let bracketAttrs = ` type=\"${dirType.type}\"`;\n if (dirType.number !== undefined) bracketAttrs += ` number=\"${dirType.number}\"`;\n if (dirType.lineEnd) bracketAttrs += ` line-end=\"${dirType.lineEnd}\"`;\n if (dirType.lineType) bracketAttrs += ` line-type=\"${dirType.lineType}\"`;\n lines.push(`${indent} <bracket${bracketAttrs}/>`);\n break;\n }\n\n case 'dashes': {\n let dashAttrs = ` type=\"${dirType.type}\"`;\n if (dirType.number !== undefined) dashAttrs += ` number=\"${dirType.number}\"`;\n if (dirType.dashLength !== undefined) dashAttrs += ` dash-length=\"${dirType.dashLength}\"`;\n if (dirType.defaultY !== undefined) dashAttrs += ` default-y=\"${dirType.defaultY}\"`;\n if (dirType.spaceLength !== undefined) dashAttrs += ` space-length=\"${dirType.spaceLength}\"`;\n lines.push(`${indent} <dashes${dashAttrs}/>`);\n break;\n }\n\n case 'accordion-registration':\n lines.push(`${indent} <accordion-registration>`);\n if (dirType.high) {\n lines.push(`${indent} <accordion-high/>`);\n }\n if (dirType.middle !== undefined) {\n lines.push(`${indent} <accordion-middle>${dirType.middle}</accordion-middle>`);\n }\n if (dirType.low) {\n lines.push(`${indent} <accordion-low/>`);\n }\n lines.push(`${indent} </accordion-registration>`);\n break;\n\n case 'other-direction': {\n let otherAttrs = '';\n if (dirType.defaultX !== undefined) otherAttrs += ` default-x=\"${dirType.defaultX}\"`;\n if (dirType.defaultY !== undefined) otherAttrs += ` default-y=\"${dirType.defaultY}\"`;\n if (dirType.halign) otherAttrs += ` halign=\"${escapeXml(dirType.halign)}\"`;\n if (dirType.printObject === false) otherAttrs += ' print-object=\"no\"';\n lines.push(`${indent} <other-direction${otherAttrs}>${escapeXml(dirType.text)}</other-direction>`);\n }\n break;\n\n case 'segno':\n lines.push(`${indent} <segno/>`);\n break;\n\n case 'coda':\n lines.push(`${indent} <coda/>`);\n break;\n\n case 'eyeglasses':\n lines.push(`${indent} <eyeglasses/>`);\n break;\n\n case 'damp':\n lines.push(`${indent} <damp/>`);\n break;\n\n case 'damp-all':\n lines.push(`${indent} <damp-all/>`);\n break;\n\n case 'scordatura':\n if (dirType.accords && dirType.accords.length > 0) {\n lines.push(`${indent} <scordatura>`);\n for (const accord of dirType.accords) {\n lines.push(`${indent} <accord string=\"${accord.string}\">`);\n lines.push(`${indent} <tuning-step>${accord.tuningStep}</tuning-step>`);\n if (accord.tuningAlter !== undefined) {\n lines.push(`${indent} <tuning-alter>${accord.tuningAlter}</tuning-alter>`);\n }\n lines.push(`${indent} <tuning-octave>${accord.tuningOctave}</tuning-octave>`);\n lines.push(`${indent} </accord>`);\n }\n lines.push(`${indent} </scordatura>`);\n } else {\n lines.push(`${indent} <scordatura/>`);\n }\n break;\n\n case 'harp-pedals':\n if (dirType.pedalTunings && dirType.pedalTunings.length > 0) {\n lines.push(`${indent} <harp-pedals>`);\n for (const pt of dirType.pedalTunings) {\n lines.push(`${indent} <pedal-tuning>`);\n lines.push(`${indent} <pedal-step>${pt.pedalStep}</pedal-step>`);\n lines.push(`${indent} <pedal-alter>${pt.pedalAlter}</pedal-alter>`);\n lines.push(`${indent} </pedal-tuning>`);\n }\n lines.push(`${indent} </harp-pedals>`);\n } else {\n lines.push(`${indent} <harp-pedals/>`);\n }\n break;\n\n case 'image':\n let imgAttrs = '';\n if (dirType.source) imgAttrs += ` source=\"${escapeXml(dirType.source)}\"`;\n if (dirType.type) imgAttrs += ` type=\"${escapeXml(dirType.type)}\"`;\n lines.push(`${indent} <image${imgAttrs}/>`);\n break;\n\n case 'pedal': {\n let pedalAttrs = ` type=\"${dirType.type}\"`;\n if (dirType.line !== undefined) pedalAttrs += ` line=\"${dirType.line ? 'yes' : 'no'}\"`;\n if (dirType.defaultY !== undefined) pedalAttrs += ` default-y=\"${dirType.defaultY}\"`;\n if (dirType.relativeX !== undefined) pedalAttrs += ` relative-x=\"${dirType.relativeX}\"`;\n if (dirType.halign) pedalAttrs += ` halign=\"${dirType.halign}\"`;\n lines.push(`${indent} <pedal${pedalAttrs}/>`);\n break;\n }\n\n case 'octave-shift': {\n const sizeAttr = dirType.size !== undefined ? ` size=\"${dirType.size}\"` : '';\n lines.push(`${indent} <octave-shift type=\"${dirType.type}\"${sizeAttr}/>`);\n break;\n }\n\n case 'swing':\n lines.push(`${indent} <swing>`);\n if (dirType.straight) {\n lines.push(`${indent} <straight/>`);\n } else {\n if (dirType.first !== undefined) {\n lines.push(`${indent} <first>${dirType.first}</first>`);\n }\n if (dirType.second !== undefined) {\n lines.push(`${indent} <second>${dirType.second}</second>`);\n }\n if (dirType.swingType) {\n lines.push(`${indent} <swing-type>${dirType.swingType}</swing-type>`);\n }\n }\n lines.push(`${indent} </swing>`);\n break;\n }\n\n lines.push(`${indent}</direction-type>`);\n\n return lines;\n}\n\nfunction serializeBarline(barline: Barline, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<barline location=\"${barline.location}\">`);\n\n if (barline.barStyle) {\n lines.push(`${indent} <bar-style>${barline.barStyle}</bar-style>`);\n }\n\n if (barline.ending) {\n lines.push(`${indent} <ending number=\"${barline.ending.number}\" type=\"${barline.ending.type}\"/>`);\n }\n\n if (barline.repeat) {\n const timesAttr = barline.repeat.times !== undefined ? ` times=\"${barline.repeat.times}\"` : '';\n lines.push(`${indent} <repeat direction=\"${barline.repeat.direction}\"${timesAttr}/>`);\n }\n\n lines.push(`${indent}</barline>`);\n\n return lines;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Build XML attributes from an object.\n * Only includes attributes with defined values.\n */\ntype AttrValue = string | number | boolean | undefined;\n\nfunction buildAttrs(attrs: Record<string, AttrValue>): string {\n let result = '';\n for (const [key, value] of Object.entries(attrs)) {\n if (value === undefined) continue;\n if (typeof value === 'boolean') {\n result += ` ${key}=\"${value ? 'yes' : 'no'}\"`;\n } else if (typeof value === 'number') {\n result += ` ${key}=\"${value}\"`;\n } else {\n result += ` ${key}=\"${escapeXml(value)}\"`;\n }\n }\n return result;\n}\n\n/**\n * Push an optional XML element if value is defined\n */\nfunction pushOptionalElement(lines: string[], indent: string, tag: string, value: string | number | undefined): void {\n if (value !== undefined) {\n const escaped = typeof value === 'string' ? escapeXml(value) : value;\n lines.push(`${indent}<${tag}>${escaped}</${tag}>`);\n }\n}\n\n// ============================================================\n// New Serialize Functions for Extended Support\n// ============================================================\n\nfunction serializeStaffDetails(sd: StaffDetails, indent: string): string[] {\n const lines: string[] = [];\n\n const attrs = buildAttrs({\n 'number': sd.number,\n 'show-frets': sd.showFrets,\n 'print-object': sd.printObject,\n });\n lines.push(`${indent}<staff-details${attrs}>`);\n\n pushOptionalElement(lines, `${indent} `, 'staff-type', sd.staffType);\n\n pushOptionalElement(lines, `${indent} `, 'staff-lines', sd.staffLines);\n\n if (sd.staffTuning) {\n for (const tuning of sd.staffTuning) {\n lines.push(`${indent} <staff-tuning${buildAttrs({ line: tuning.line })}>`);\n lines.push(`${indent} <tuning-step>${tuning.tuningStep}</tuning-step>`);\n pushOptionalElement(lines, `${indent} `, 'tuning-alter', tuning.tuningAlter);\n lines.push(`${indent} <tuning-octave>${tuning.tuningOctave}</tuning-octave>`);\n lines.push(`${indent} </staff-tuning>`);\n }\n }\n\n pushOptionalElement(lines, `${indent} `, 'capo', sd.capo);\n\n if (sd.staffSize !== undefined) {\n const attrs = buildAttrs({ scaling: sd.staffSizeScaling });\n lines.push(`${indent} <staff-size${attrs}>${sd.staffSize}</staff-size>`);\n }\n\n lines.push(`${indent}</staff-details>`);\n\n return lines;\n}\n\nfunction serializeMeasureStyle(ms: MeasureStyle, indent: string): string[] {\n const lines: string[] = [];\n\n lines.push(`${indent}<measure-style${buildAttrs({ number: ms.number })}>`);\n\n pushOptionalElement(lines, `${indent} `, 'multiple-rest', ms.multipleRest);\n\n if (ms.measureRepeat) {\n const mrAttrs = buildAttrs({\n type: ms.measureRepeat.type,\n slashes: ms.measureRepeat.slashes,\n });\n lines.push(`${indent} <measure-repeat${mrAttrs}/>`);\n }\n\n if (ms.beatRepeat) {\n const brAttrs = buildAttrs({ type: ms.beatRepeat.type, slashes: ms.beatRepeat.slashes });\n lines.push(`${indent} <beat-repeat${brAttrs}/>`);\n }\n\n if (ms.slash) {\n const slAttrs = buildAttrs({\n type: ms.slash.type,\n 'use-dots': ms.slash.useDots,\n 'use-stems': ms.slash.useStems,\n });\n lines.push(`${indent} <slash${slAttrs}/>`);\n }\n\n lines.push(`${indent}</measure-style>`);\n\n return lines;\n}\n\nfunction serializeHarmony(harmony: HarmonyEntry, indent: string): string[] {\n const lines: string[] = [];\n\n const attrs = buildAttrs({\n placement: harmony.placement,\n 'print-frame': harmony.printFrame,\n 'default-y': harmony.defaultY,\n halign: harmony.halign,\n 'font-size': harmony.fontSize,\n });\n lines.push(`${indent}<harmony${attrs}>`);\n\n // Root\n lines.push(`${indent} <root>`);\n lines.push(`${indent} <root-step>${harmony.root.rootStep}</root-step>`);\n if (harmony.root.rootAlter !== undefined) {\n lines.push(`${indent} <root-alter>${harmony.root.rootAlter}</root-alter>`);\n }\n lines.push(`${indent} </root>`);\n\n // Kind\n let kindAttrs = '';\n if (harmony.kindText) kindAttrs += ` text=\"${escapeXml(harmony.kindText)}\"`;\n lines.push(`${indent} <kind${kindAttrs}>${escapeXml(harmony.kind)}</kind>`);\n\n // Bass\n if (harmony.bass) {\n lines.push(`${indent} <bass>`);\n lines.push(`${indent} <bass-step>${harmony.bass.bassStep}</bass-step>`);\n if (harmony.bass.bassAlter !== undefined) {\n lines.push(`${indent} <bass-alter>${harmony.bass.bassAlter}</bass-alter>`);\n }\n lines.push(`${indent} </bass>`);\n }\n\n // Degrees\n if (harmony.degrees) {\n for (const deg of harmony.degrees) {\n lines.push(`${indent} <degree>`);\n lines.push(`${indent} <degree-value>${deg.degreeValue}</degree-value>`);\n if (deg.degreeAlter !== undefined) {\n lines.push(`${indent} <degree-alter>${deg.degreeAlter}</degree-alter>`);\n }\n lines.push(`${indent} <degree-type>${deg.degreeType}</degree-type>`);\n lines.push(`${indent} </degree>`);\n }\n }\n\n // Frame\n if (harmony.frame) {\n lines.push(`${indent} <frame>`);\n if (harmony.frame.frameStrings !== undefined) {\n lines.push(`${indent} <frame-strings>${harmony.frame.frameStrings}</frame-strings>`);\n }\n if (harmony.frame.frameFrets !== undefined) {\n lines.push(`${indent} <frame-frets>${harmony.frame.frameFrets}</frame-frets>`);\n }\n if (harmony.frame.firstFret !== undefined) {\n let ffAttrs = '';\n if (harmony.frame.firstFretText) ffAttrs += ` text=\"${escapeXml(harmony.frame.firstFretText)}\"`;\n if (harmony.frame.firstFretLocation) ffAttrs += ` location=\"${harmony.frame.firstFretLocation}\"`;\n lines.push(`${indent} <first-fret${ffAttrs}>${harmony.frame.firstFret}</first-fret>`);\n }\n if (harmony.frame.frameNotes) {\n for (const fn of harmony.frame.frameNotes) {\n lines.push(`${indent} <frame-note>`);\n lines.push(`${indent} <string>${fn.string}</string>`);\n lines.push(`${indent} <fret>${fn.fret}</fret>`);\n if (fn.fingering) {\n lines.push(`${indent} <fingering>${escapeXml(fn.fingering)}</fingering>`);\n }\n if (fn.barre) {\n lines.push(`${indent} <barre type=\"${fn.barre}\"/>`);\n }\n lines.push(`${indent} </frame-note>`);\n }\n }\n lines.push(`${indent} </frame>`);\n }\n\n // Offset\n if (harmony.offset !== undefined) {\n lines.push(`${indent} <offset>${harmony.offset}</offset>`);\n }\n\n // Staff\n if (harmony.staff !== undefined) {\n lines.push(`${indent} <staff>${harmony.staff}</staff>`);\n }\n\n lines.push(`${indent}</harmony>`);\n\n return lines;\n}\n\nfunction serializeFiguredBass(fb: FiguredBassEntry, indent: string): string[] {\n const lines: string[] = [];\n\n let attrs = '';\n if (fb.parentheses) attrs += ' parentheses=\"yes\"';\n lines.push(`${indent}<figured-bass${attrs}>`);\n\n for (const fig of fb.figures) {\n lines.push(`${indent} <figure>`);\n if (fig.prefix) {\n lines.push(`${indent} <prefix>${escapeXml(fig.prefix)}</prefix>`);\n }\n if (fig.figureNumber) {\n lines.push(`${indent} <figure-number>${escapeXml(fig.figureNumber)}</figure-number>`);\n }\n if (fig.suffix) {\n lines.push(`${indent} <suffix>${escapeXml(fig.suffix)}</suffix>`);\n }\n if (fig.extend) {\n if (typeof fig.extend === 'object' && fig.extend.type) {\n lines.push(`${indent} <extend type=\"${fig.extend.type}\"/>`);\n } else {\n lines.push(`${indent} <extend/>`);\n }\n }\n lines.push(`${indent} </figure>`);\n }\n\n if (fb.duration !== undefined) {\n lines.push(`${indent} <duration>${fb.duration}</duration>`);\n }\n\n lines.push(`${indent}</figured-bass>`);\n\n return lines;\n}\n\nfunction serializeSound(sound: SoundEntry, indent: string): string[] {\n const lines: string[] = [];\n const attrs: string[] = [];\n\n if (sound.tempo !== undefined) attrs.push(`tempo=\"${sound.tempo}\"`);\n if (sound.dynamics !== undefined) attrs.push(`dynamics=\"${sound.dynamics}\"`);\n if (sound.dacapo) attrs.push('dacapo=\"yes\"');\n if (sound.segno) attrs.push(`segno=\"${escapeXml(sound.segno)}\"`);\n if (sound.dalsegno) attrs.push(`dalsegno=\"${escapeXml(sound.dalsegno)}\"`);\n if (sound.coda) attrs.push(`coda=\"${escapeXml(sound.coda)}\"`);\n if (sound.tocoda) attrs.push(`tocoda=\"${escapeXml(sound.tocoda)}\"`);\n if (sound.fine) attrs.push('fine=\"yes\"');\n if (sound.forwardRepeat) attrs.push('forward-repeat=\"yes\"');\n\n const attrStr = attrs.length > 0 ? ` ${attrs.join(' ')}` : '';\n\n // If there's a swing element, we need opening/closing tags\n if (sound.swing) {\n lines.push(`${indent}<sound${attrStr}>`);\n lines.push(`${indent} <swing>`);\n if (sound.swing.straight) {\n lines.push(`${indent} <straight/>`);\n } else {\n if (sound.swing.first !== undefined) {\n lines.push(`${indent} <first>${sound.swing.first}</first>`);\n }\n if (sound.swing.second !== undefined) {\n lines.push(`${indent} <second>${sound.swing.second}</second>`);\n }\n if (sound.swing.swingType) {\n lines.push(`${indent} <swing-type>${sound.swing.swingType}</swing-type>`);\n }\n }\n lines.push(`${indent} </swing>`);\n lines.push(`${indent}</sound>`);\n } else if (attrs.length === 0) {\n lines.push(`${indent}<sound/>`);\n } else {\n lines.push(`${indent}<sound${attrStr}/>`);\n }\n\n return lines;\n}\n","import { zipSync, strToU8 } from 'fflate';\nimport { serialize, SerializeOptions } from './musicxml';\nimport type { Score } from '../types';\n\nexport type { SerializeOptions };\n\n/**\n * Serialize a Score to compressed MusicXML (.mxl) format\n * @param score - The Score to serialize\n * @param options - Serialization options\n * @returns The compressed file data as Uint8Array\n */\nexport function serializeCompressed(\n score: Score,\n options: SerializeOptions = {}\n): Uint8Array {\n const xmlString = serialize(score, options);\n const rootFileName = 'score.xml';\n\n // Create container.xml\n const containerXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<container>\n <rootfiles>\n <rootfile full-path=\"${rootFileName}\"/>\n </rootfiles>\n</container>`;\n\n // Create the zip file\n const files: Record<string, Uint8Array> = {\n 'META-INF/container.xml': strToU8(containerXml),\n [rootFileName]: strToU8(xmlString),\n };\n\n return zipSync(files, { level: 6 });\n}\n","import type { Score, NoteEntry, Pitch, Part, Measure } from '../types';\n\n/**\n * MIDI export options\n */\nexport interface MidiExportOptions {\n /** Ticks per quarter note (default: 480) */\n ticksPerQuarterNote?: number;\n /** Default tempo in BPM (default: 120) */\n defaultTempo?: number;\n /** Default velocity for notes (default: 80) */\n defaultVelocity?: number;\n}\n\n/**\n * Export a Score to Standard MIDI File format (SMF Type 1)\n * @param score - The Score to export\n * @param options - Export options\n * @returns The MIDI file data as Uint8Array\n */\nexport function exportMidi(score: Score, options: MidiExportOptions = {}): Uint8Array {\n const ticksPerQuarterNote = options.ticksPerQuarterNote ?? 480;\n const defaultTempo = options.defaultTempo ?? 120;\n const defaultVelocity = options.defaultVelocity ?? 80;\n\n const tracks: Uint8Array[] = [];\n\n // Track 0: Tempo and time signature\n const conductorTrack = createConductorTrack(score, defaultTempo, ticksPerQuarterNote);\n tracks.push(conductorTrack);\n\n // Create a track for each part\n // Filter partList to only include score-parts (exclude part-groups)\n const scoreParts = score.partList.filter(entry => entry.type === 'score-part');\n\n for (let partIndex = 0; partIndex < score.parts.length; partIndex++) {\n const part = score.parts[partIndex];\n const partEntry = scoreParts[partIndex];\n // Only score-part entries have MIDI instruments\n let channel = partIndex % 16;\n let program = 1;\n if (partEntry && partEntry.midiInstruments?.[0]) {\n const midiInst = partEntry.midiInstruments[0];\n channel = midiInst.channel ?? channel;\n program = midiInst.program ?? program;\n }\n\n const trackData = createPartTrack(\n part,\n score,\n channel,\n program,\n ticksPerQuarterNote,\n defaultVelocity\n );\n tracks.push(trackData);\n }\n\n // Build the complete MIDI file\n return buildMidiFile(tracks, ticksPerQuarterNote);\n}\n\n/**\n * Convert pitch to MIDI note number with optional transposition\n * @param pitch - The pitch to convert\n * @param transpose - Optional transpose settings (chromatic semitones to add)\n */\nfunction pitchToMidiNote(pitch: Pitch, chromaticTranspose: number = 0): number {\n const stepValues: Record<string, number> = {\n 'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11,\n };\n const baseMidi = (pitch.octave + 1) * 12 + stepValues[pitch.step] + (pitch.alter ?? 0);\n // Apply transposition for transposing instruments\n // chromatic value indicates how many semitones the written pitch should be transposed\n return baseMidi + chromaticTranspose;\n}\n\n/**\n * Create conductor track (tempo, time signature, key signature)\n */\nfunction createConductorTrack(\n score: Score,\n defaultTempo: number,\n ticksPerQuarterNote: number\n): Uint8Array {\n const events: number[] = [];\n\n // Set tempo at the beginning (microseconds per quarter note)\n const microsecondsPerQuarterNote = Math.round(60000000 / defaultTempo);\n events.push(\n ...writeVariableLength(0), // Delta time\n 0xff, 0x51, 0x03, // Tempo meta event\n (microsecondsPerQuarterNote >> 16) & 0xff,\n (microsecondsPerQuarterNote >> 8) & 0xff,\n microsecondsPerQuarterNote & 0xff\n );\n\n // Get initial time signature from first measure\n if (score.parts.length > 0 && score.parts[0].measures.length > 0) {\n const firstMeasure = score.parts[0].measures[0];\n const time = firstMeasure.attributes?.time;\n if (time) {\n const numerator = parseInt(time.beats, 10) || 4;\n const denominator = Math.log2(time.beatType);\n events.push(\n ...writeVariableLength(0), // Delta time\n 0xff, 0x58, 0x04, // Time signature meta event\n numerator,\n denominator,\n 24, // MIDI clocks per metronome click\n 8 // 32nd notes per 24 MIDI clocks\n );\n }\n }\n\n // Scan for tempo changes in directions (with repeat expansion)\n let currentTick = 0;\n if (score.parts.length > 0) {\n const part = score.parts[0];\n let divisions = 1;\n\n // Expand repeats for conductor track as well\n const measureOrder = expandRepeats(part.measures);\n\n for (const measureIndex of measureOrder) {\n const measure = part.measures[measureIndex];\n if (measure.attributes?.divisions) {\n divisions = measure.attributes.divisions;\n }\n\n let measurePosition = 0;\n\n for (const entry of measure.entries) {\n if (entry.type === 'direction') {\n for (const dirType of entry.directionTypes) {\n if (dirType.kind === 'metronome') {\n const bpm = typeof dirType.perMinute === 'number' ? dirType.perMinute : parseInt(String(dirType.perMinute), 10);\n if (isNaN(bpm)) continue;\n const usPerQuarter = Math.round(60000000 / bpm);\n const tickDelta = (measurePosition * ticksPerQuarterNote) / divisions;\n\n events.push(\n ...writeVariableLength(Math.round(tickDelta)),\n 0xff, 0x51, 0x03,\n (usPerQuarter >> 16) & 0xff,\n (usPerQuarter >> 8) & 0xff,\n usPerQuarter & 0xff\n );\n currentTick += tickDelta;\n }\n }\n } else if (entry.type === 'note' && !entry.chord) {\n measurePosition += entry.duration;\n } else if (entry.type === 'backup') {\n measurePosition -= entry.duration;\n } else if (entry.type === 'forward') {\n measurePosition += entry.duration;\n }\n }\n }\n }\n\n // End of track\n events.push(...writeVariableLength(0), 0xff, 0x2f, 0x00);\n\n return new Uint8Array(events);\n}\n\n/**\n * Create a track for a part\n */\nfunction createPartTrack(\n part: Part,\n _score: Score,\n channel: number,\n program: number,\n ticksPerQuarterNote: number,\n defaultVelocity: number\n): Uint8Array {\n const events: number[] = [];\n\n // Program change\n events.push(\n ...writeVariableLength(0),\n 0xc0 | (channel & 0x0f),\n (program - 1) & 0x7f // MIDI programs are 0-indexed\n );\n\n // Track note events\n const noteEvents: { tick: number; type: 'on' | 'off'; note: number; velocity: number }[] = [];\n\n let currentTick = 0;\n let divisions = 1;\n let chromaticTranspose = 0; // Track transposition for transposing instruments\n\n // Expand repeats to get playback order\n const measureOrder = expandRepeats(part.measures);\n\n for (const measureIndex of measureOrder) {\n const measure = part.measures[measureIndex];\n\n // Update divisions from the original measure (need to track last seen divisions)\n if (measure.attributes?.divisions) {\n divisions = measure.attributes.divisions;\n }\n // Update transposition if specified in this measure's attributes\n if (measure.attributes?.transpose) {\n chromaticTranspose = measure.attributes.transpose.chromatic;\n }\n\n const measureStartTick = currentTick;\n let position = 0;\n let chordBasePosition = 0; // Position for chord notes (same as previous non-chord note)\n let maxPosition = 0; // Track maximum position for multi-voice measures\n\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n const note = entry as NoteEntry;\n\n if (note.pitch && !note.grace) {\n const midiNote = pitchToMidiNote(note.pitch, chromaticTranspose);\n // Chord notes use the same position as the previous non-chord note\n const notePosition = note.chord ? chordBasePosition : position;\n const startTick = measureStartTick + Math.round((notePosition * ticksPerQuarterNote) / divisions);\n const durationTicks = Math.round((note.duration * ticksPerQuarterNote) / divisions);\n\n noteEvents.push({\n tick: startTick,\n type: 'on',\n note: midiNote,\n velocity: defaultVelocity,\n });\n\n noteEvents.push({\n tick: startTick + durationTicks,\n type: 'off',\n note: midiNote,\n velocity: 0,\n });\n }\n\n // Chord notes share the same position\n if (!note.chord) {\n chordBasePosition = position; // Save position for subsequent chord notes\n position += note.duration;\n if (position > maxPosition) {\n maxPosition = position;\n }\n }\n } else if (entry.type === 'backup') {\n position -= entry.duration;\n } else if (entry.type === 'forward') {\n position += entry.duration;\n if (position > maxPosition) {\n maxPosition = position;\n }\n }\n }\n\n // Move to the end of the measure\n // For implicit (pickup) measures, use actual content duration\n // For regular measures, use time signature-based duration\n if (measure.implicit) {\n // Implicit measures (pickup/anacrusis) should use actual content length\n currentTick = measureStartTick + Math.round((maxPosition * ticksPerQuarterNote) / divisions);\n } else {\n const timeAttrs = findTimeSignature(part, measure.number);\n if (timeAttrs) {\n const measureDuration = (timeAttrs.beats / timeAttrs.beatType) * 4 * divisions;\n const calculatedTicks = Math.round((measureDuration * ticksPerQuarterNote) / divisions);\n const actualTicks = Math.round((maxPosition * ticksPerQuarterNote) / divisions);\n // Use the smaller of calculated and actual for incomplete measures\n // (e.g., last measure before repeat that combines with pickup)\n const ticksToAdd = Math.min(calculatedTicks, actualTicks > 0 ? actualTicks : calculatedTicks);\n currentTick = measureStartTick + ticksToAdd;\n } else {\n currentTick = measureStartTick + Math.round((maxPosition * ticksPerQuarterNote) / divisions);\n }\n }\n }\n\n // Sort events by tick, then note-off before note-on at same tick\n noteEvents.sort((a, b) => {\n if (a.tick !== b.tick) return a.tick - b.tick;\n if (a.type !== b.type) return a.type === 'off' ? -1 : 1;\n return a.note - b.note;\n });\n\n // Convert to MIDI events with delta times\n let lastTick = 0;\n for (const event of noteEvents) {\n const deltaTick = event.tick - lastTick;\n lastTick = event.tick;\n\n if (event.type === 'on') {\n events.push(\n ...writeVariableLength(deltaTick),\n 0x90 | (channel & 0x0f),\n event.note & 0x7f,\n event.velocity & 0x7f\n );\n } else {\n events.push(\n ...writeVariableLength(deltaTick),\n 0x80 | (channel & 0x0f),\n event.note & 0x7f,\n 0\n );\n }\n }\n\n // End of track\n events.push(...writeVariableLength(0), 0xff, 0x2f, 0x00);\n\n return new Uint8Array(events);\n}\n\n/**\n * Find time signature at a measure\n */\nfunction findTimeSignature(\n part: Part,\n measureNumber: string | number\n): { beats: number; beatType: number } | undefined {\n const targetMeasure = parseInt(String(measureNumber), 10);\n let time: { beats: number; beatType: number } | undefined;\n\n for (const measure of part.measures) {\n const mNum = parseInt(measure.number, 10);\n if (!isNaN(targetMeasure) && !isNaN(mNum) && mNum > targetMeasure) break;\n if (measure.attributes?.time) {\n time = {\n beats: parseInt(measure.attributes.time.beats, 10) || 4,\n beatType: measure.attributes.time.beatType\n };\n }\n }\n\n return time;\n}\n\n/**\n * Check if a measure has a forward repeat at the start\n */\nfunction hasForwardRepeat(measure: Measure): boolean {\n if (!measure.barlines) return false;\n return measure.barlines.some(\n (b) => b.location === 'left' && b.repeat?.direction === 'forward'\n );\n}\n\n/**\n * Check if a measure has a backward repeat at the end\n */\nfunction hasBackwardRepeat(measure: Measure): { found: boolean; times: number } {\n if (!measure.barlines) return { found: false, times: 2 };\n const barline = measure.barlines.find(\n (b) => b.location === 'right' && b.repeat?.direction === 'backward'\n );\n if (barline?.repeat) {\n return { found: true, times: barline.repeat.times ?? 2 };\n }\n return { found: false, times: 2 };\n}\n\n/**\n * Expand repeats and return an array of measure indices in playback order\n */\nfunction expandRepeats(measures: Measure[]): number[] {\n const result: number[] = [];\n let i = 0;\n\n while (i < measures.length) {\n // Find if there's a backward repeat ahead\n let backwardRepeatIndex = -1;\n let repeatTimes = 2;\n\n for (let j = i; j < measures.length; j++) {\n const backwardInfo = hasBackwardRepeat(measures[j]);\n if (backwardInfo.found) {\n backwardRepeatIndex = j;\n repeatTimes = backwardInfo.times;\n break;\n }\n // Stop searching if we hit another forward repeat (nested repeats)\n if (j > i && hasForwardRepeat(measures[j])) {\n break;\n }\n }\n\n if (backwardRepeatIndex >= 0) {\n // Find the matching forward repeat (or start of piece)\n let forwardRepeatIndex = 0;\n for (let j = i; j <= backwardRepeatIndex; j++) {\n if (hasForwardRepeat(measures[j])) {\n forwardRepeatIndex = j;\n break;\n }\n }\n\n // Play through the repeat section 'times' times\n for (let rep = 0; rep < repeatTimes; rep++) {\n for (let j = forwardRepeatIndex; j <= backwardRepeatIndex; j++) {\n result.push(j);\n }\n }\n\n // Continue after the repeat\n i = backwardRepeatIndex + 1;\n } else {\n // No repeat, just add this measure\n result.push(i);\n i++;\n }\n }\n\n return result;\n}\n\n/**\n * Write a variable-length quantity\n */\nfunction writeVariableLength(value: number): number[] {\n if (value < 0) value = 0;\n\n const bytes: number[] = [];\n bytes.unshift(value & 0x7f);\n value >>= 7;\n\n while (value > 0) {\n bytes.unshift((value & 0x7f) | 0x80);\n value >>= 7;\n }\n\n return bytes;\n}\n\n/**\n * Write a 32-bit big-endian integer\n */\nfunction writeUint32BE(value: number): number[] {\n return [\n (value >> 24) & 0xff,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff,\n ];\n}\n\n/**\n * Write a 16-bit big-endian integer\n */\nfunction writeUint16BE(value: number): number[] {\n return [\n (value >> 8) & 0xff,\n value & 0xff,\n ];\n}\n\n/**\n * Build the complete MIDI file\n */\nfunction buildMidiFile(tracks: Uint8Array[], ticksPerQuarterNote: number): Uint8Array {\n const chunks: number[] = [];\n\n // Header chunk\n const headerChunkType = [0x4d, 0x54, 0x68, 0x64]; // \"MThd\"\n const headerLength = writeUint32BE(6);\n const format = writeUint16BE(1); // Type 1 MIDI file\n const numTracks = writeUint16BE(tracks.length);\n const division = writeUint16BE(ticksPerQuarterNote);\n\n chunks.push(\n ...headerChunkType,\n ...headerLength,\n ...format,\n ...numTracks,\n ...division\n );\n\n // Track chunks\n for (const track of tracks) {\n const trackChunkType = [0x4d, 0x54, 0x72, 0x6b]; // \"MTrk\"\n const trackLength = writeUint32BE(track.length);\n\n chunks.push(\n ...trackChunkType,\n ...trackLength,\n ...Array.from(track)\n );\n }\n\n return new Uint8Array(chunks);\n}\n","import type { Pitch, Measure, MeasureEntry, NoteEntry } from '../types';\n\n// Pitch constants\nexport const STEPS: Pitch['step'][] = ['C', 'D', 'E', 'F', 'G', 'A', 'B'];\nexport const STEP_SEMITONES: Record<Pitch['step'], number> = {\n 'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11,\n};\n\n/** Convert pitch to semitone value (MIDI-like) */\nexport function pitchToSemitone(pitch: Pitch): number {\n return pitch.octave * 12 + STEP_SEMITONES[pitch.step] + (pitch.alter ?? 0);\n}\n\n// Position tracking for measure iteration\nexport interface PositionState {\n position: number;\n lastNonChordPosition: number;\n}\n\nexport function createPositionState(): PositionState {\n return { position: 0, lastNonChordPosition: 0 };\n}\n\n/** Update position state for entry, returns position before update */\nexport function updatePositionForEntry(state: PositionState, entry: MeasureEntry): number {\n const pos = state.position;\n switch (entry.type) {\n case 'note': {\n const note = entry as NoteEntry;\n if (!note.chord) {\n state.lastNonChordPosition = state.position;\n state.position += note.duration;\n }\n return note.chord ? state.lastNonChordPosition : pos;\n }\n case 'backup':\n state.position -= entry.duration;\n state.lastNonChordPosition = state.position;\n return pos;\n case 'forward':\n state.position += entry.duration;\n state.lastNonChordPosition = state.position;\n return pos;\n default:\n return pos;\n }\n}\n\n/** Get absolute position of a note within a measure */\nexport function getAbsolutePositionForNote(note: NoteEntry, measure: Measure): number {\n const state = createPositionState();\n for (const entry of measure.entries) {\n if (entry === note) return entry.chord ? state.lastNonChordPosition : state.position;\n updatePositionForEntry(state, entry);\n }\n return state.position;\n}\n\n/** Get position at end of measure */\nexport function getMeasureEndPosition(measure: Measure): number {\n const state = createPositionState();\n for (const entry of measure.entries) updatePositionForEntry(state, entry);\n return state.position;\n}\n","import type {\n Score,\n Measure,\n NoteEntry,\n VoiceGroup,\n StaffGroup,\n NoteWithPosition,\n Chord,\n NoteIteratorItem,\n} from '../types';\nimport { getAbsolutePositionForNote, createPositionState, updatePositionForEntry } from '../utils';\n\n/**\n * Filter options for voice/staff selection\n */\nexport interface VoiceFilter {\n voice?: number;\n staff?: number;\n}\n\n/**\n * Get all notes for a specific voice (and optionally staff)\n */\nexport function getNotesForVoice(measure: Measure, filter: VoiceFilter): NoteEntry[] {\n return measure.entries.filter((entry): entry is NoteEntry => {\n if (entry.type !== 'note') return false;\n if (filter.voice !== undefined && entry.voice !== filter.voice) return false;\n if (filter.staff !== undefined && (entry.staff ?? 1) !== filter.staff) return false;\n return true;\n });\n}\n\n/**\n * Get all notes for a specific staff (regardless of voice)\n */\nexport function getNotesForStaff(measure: Measure, filter: { staff: number }): NoteEntry[] {\n return measure.entries.filter((entry): entry is NoteEntry => {\n if (entry.type !== 'note') return false;\n return (entry.staff ?? 1) === filter.staff;\n });\n}\n\n/**\n * Group notes by voice (and staff)\n */\nexport function groupByVoice(measure: Measure): VoiceGroup[] {\n const groups = new Map<string, VoiceGroup>();\n\n for (const entry of measure.entries) {\n if (entry.type !== 'note') continue;\n\n const staff = entry.staff ?? 1;\n const voice = entry.voice;\n const key = `${staff}-${voice}`;\n\n if (!groups.has(key)) {\n groups.set(key, { staff, voice, notes: [] });\n }\n\n groups.get(key)!.notes.push(entry);\n }\n\n // Sort by staff, then by voice\n return Array.from(groups.values()).sort((a, b) => {\n if (a.staff !== b.staff) return a.staff - b.staff;\n return a.voice - b.voice;\n });\n}\n\n/**\n * Group notes by staff\n */\nexport function groupByStaff(measure: Measure): StaffGroup[] {\n const groups = new Map<number, StaffGroup>();\n\n for (const entry of measure.entries) {\n if (entry.type !== 'note') continue;\n\n const staff = entry.staff ?? 1;\n\n if (!groups.has(staff)) {\n groups.set(staff, { staff, notes: [] });\n }\n\n groups.get(staff)!.notes.push(entry);\n }\n\n return Array.from(groups.values()).sort((a, b) => a.staff - b.staff);\n}\n\n/**\n * Calculate absolute position of a note within a measure\n * Position is in divisions from the start of the measure\n */\nexport function getAbsolutePosition(note: NoteEntry, measure: Measure): number {\n return getAbsolutePositionForNote(note, measure);\n}\n\n/**\n * Add absolute position to all notes in a measure\n */\nexport function withAbsolutePositions(measure: Measure): NoteWithPosition[] {\n const result: NoteWithPosition[] = [];\n const state = createPositionState();\n\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n const notePosition = entry.chord ? state.lastNonChordPosition : state.position;\n result.push({\n ...entry,\n absolutePosition: notePosition,\n });\n }\n updatePositionForEntry(state, entry);\n }\n\n return result;\n}\n\n/**\n * Get chords (groups of simultaneously sounding notes)\n */\nexport function getChords(measure: Measure, filter?: VoiceFilter): Chord[] {\n const notesWithPos = withAbsolutePositions(measure);\n\n // Filter by voice/staff if specified\n const filteredNotes = filter\n ? notesWithPos.filter((note) => {\n if (filter.voice !== undefined && note.voice !== filter.voice) return false;\n if (filter.staff !== undefined && (note.staff ?? 1) !== filter.staff) return false;\n return true;\n })\n : notesWithPos;\n\n // Group by position\n const chordMap = new Map<number, NoteWithPosition[]>();\n\n for (const note of filteredNotes) {\n const pos = note.absolutePosition;\n if (!chordMap.has(pos)) {\n chordMap.set(pos, []);\n }\n chordMap.get(pos)!.push(note);\n }\n\n // Convert to Chord array\n const chords: Chord[] = [];\n\n for (const [position, notes] of chordMap.entries()) {\n // All notes in a chord should have the same duration (using first note's duration)\n const duration = notes[0].duration;\n\n chords.push({\n position,\n duration,\n notes: notes.map(({ absolutePosition, ...note }) => note),\n });\n }\n\n // Sort by position\n return chords.sort((a, b) => a.position - b.position);\n}\n\n/**\n * Iterate over all notes in a score\n */\nexport function* iterateNotes(score: Score): Generator<NoteIteratorItem> {\n for (const part of score.parts) {\n for (const measure of part.measures) {\n const state = createPositionState();\n\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n const notePosition = entry.chord ? state.lastNonChordPosition : state.position;\n yield {\n part,\n measure,\n note: entry,\n position: notePosition,\n };\n }\n updatePositionForEntry(state, entry);\n }\n }\n }\n}\n\n/**\n * Get all notes from a score as an array\n */\nexport function getAllNotes(score: Score): NoteIteratorItem[] {\n return Array.from(iterateNotes(score));\n}\n\n/**\n * Get unique voices used in a measure\n */\nexport function getVoices(measure: Measure): number[] {\n const voices = new Set<number>();\n\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n voices.add(entry.voice);\n }\n }\n\n return Array.from(voices).sort((a, b) => a - b);\n}\n\n/**\n * Get unique staves used in a measure\n */\nexport function getStaves(measure: Measure): number[] {\n const staves = new Set<number>();\n\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n staves.add(entry.staff ?? 1);\n }\n }\n\n return Array.from(staves).sort((a, b) => a - b);\n}\n\n/**\n * Check if a measure contains any notes\n */\nexport function hasNotes(measure: Measure): boolean {\n return measure.entries.some((entry) => entry.type === 'note');\n}\n\n/**\n * Check if a measure is a rest (no pitched notes)\n */\nexport function isRestMeasure(measure: Measure): boolean {\n const notes = measure.entries.filter((entry): entry is NoteEntry => entry.type === 'note');\n return notes.length === 0 || notes.every((note) => !note.pitch);\n}\n\n/**\n * Options for normalized position calculation\n */\nexport interface NormalizedPositionOptions {\n baseDivisions: number;\n currentDivisions?: number;\n}\n\n/**\n * Get a normalized position of a note using a common base divisions\n * This is useful when comparing positions across measures with different divisions\n */\nexport function getNormalizedPosition(\n note: NoteEntry,\n measure: Measure,\n options: NormalizedPositionOptions\n): number {\n const absolutePosition = getAbsolutePosition(note, measure);\n const currentDivisions = options.currentDivisions ?? measure.attributes?.divisions ?? 1;\n\n // Convert from current divisions to base divisions\n return (absolutePosition * options.baseDivisions) / currentDivisions;\n}\n\n/**\n * Get normalized duration of a note using a common base divisions\n */\nexport function getNormalizedDuration(\n note: NoteEntry,\n options: NormalizedPositionOptions\n): number {\n const currentDivisions = options.currentDivisions ?? 1;\n return (note.duration * options.baseDivisions) / currentDivisions;\n}\n","import type {\n Score,\n Part,\n Measure,\n MeasureAttributes,\n NoteEntry,\n Pitch,\n} from '../types';\nimport { pitchToSemitone } from '../utils';\n\n/**\n * Get a specific measure from the score\n */\nexport function getMeasure(score: Score, options: { part: number; measure: string | number }): Measure | undefined {\n const part = score.parts[options.part];\n if (!part) return undefined;\n const targetMeasure = String(options.measure);\n\n return part.measures.find((m) => m.number === targetMeasure);\n}\n\n/**\n * Get measure by index\n */\nexport function getMeasureByIndex(score: Score, options: { part: number; measureIndex: number }): Measure | undefined {\n const part = score.parts[options.part];\n if (!part) return undefined;\n\n return part.measures[options.measureIndex];\n}\n\n/**\n * Get the total number of measures in a score\n */\nexport function getMeasureCount(score: Score): number {\n if (score.parts.length === 0) return 0;\n return score.parts[0].measures.length;\n}\n\n/**\n * Get the divisions value at a specific measure\n * Searches backwards from the specified measure to find the most recent divisions\n */\nexport function getDivisions(score: Score, options: { part: number; measure: string | number }): number {\n const part = score.parts[options.part];\n if (!part) return 1;\n const targetMeasure = parseInt(String(options.measure), 10);\n if (isNaN(targetMeasure)) return 1;\n\n for (let i = 0; i < part.measures.length; i++) {\n const m = part.measures[i];\n const mNum = parseInt(m.number, 10);\n if (!isNaN(mNum) && mNum > targetMeasure) break;\n\n if (m.attributes?.divisions !== undefined) {\n // Continue searching for a more recent value\n }\n }\n\n // Search from the beginning up to the specified measure\n let divisions = 1;\n for (const m of part.measures) {\n const mNum = parseInt(m.number, 10);\n if (!isNaN(mNum) && mNum > targetMeasure) break;\n if (m.attributes?.divisions !== undefined) {\n divisions = m.attributes.divisions;\n }\n }\n\n return divisions;\n}\n\n/**\n * Get the current attributes at a specific measure\n * Merges all attribute changes from measure 1 to the specified measure\n */\nexport function getAttributesAtMeasure(score: Score, options: { part: number; measure: string | number }): MeasureAttributes {\n const part = score.parts[options.part];\n if (!part) return {};\n const targetMeasure = parseInt(String(options.measure), 10);\n\n const result: MeasureAttributes = {};\n\n for (const m of part.measures) {\n const mNum = parseInt(m.number, 10);\n if (!isNaN(targetMeasure) && !isNaN(mNum) && mNum > targetMeasure) break;\n\n if (m.attributes) {\n if (m.attributes.divisions !== undefined) result.divisions = m.attributes.divisions;\n if (m.attributes.time !== undefined) result.time = m.attributes.time;\n if (m.attributes.key !== undefined) result.key = m.attributes.key;\n if (m.attributes.clef !== undefined) result.clef = m.attributes.clef;\n if (m.attributes.staves !== undefined) result.staves = m.attributes.staves;\n if (m.attributes.transpose !== undefined) result.transpose = m.attributes.transpose;\n }\n }\n\n return result;\n}\n\n/**\n * Pitch range filter\n */\nexport interface PitchRange {\n min?: Pitch;\n max?: Pitch;\n}\n\n/**\n * Find notes filter\n */\nexport interface FindNotesFilter {\n pitchRange?: PitchRange;\n voice?: number;\n staff?: number;\n noteType?: string;\n hasTie?: boolean;\n}\n\n/**\n * Find notes matching specific criteria\n */\nexport function findNotes(score: Score, filter: FindNotesFilter): NoteEntry[] {\n const results: NoteEntry[] = [];\n\n for (const part of score.parts) {\n for (const measure of part.measures) {\n for (const entry of measure.entries) {\n if (entry.type !== 'note') continue;\n\n // Filter by pitch range\n if (filter.pitchRange && entry.pitch) {\n const noteValue = pitchToSemitone(entry.pitch);\n\n if (filter.pitchRange.min) {\n const minValue = pitchToSemitone(filter.pitchRange.min);\n if (noteValue < minValue) continue;\n }\n\n if (filter.pitchRange.max) {\n const maxValue = pitchToSemitone(filter.pitchRange.max);\n if (noteValue > maxValue) continue;\n }\n }\n\n // Filter by voice\n if (filter.voice !== undefined && entry.voice !== filter.voice) continue;\n\n // Filter by staff\n if (filter.staff !== undefined && (entry.staff ?? 1) !== filter.staff) continue;\n\n // Filter by note type\n if (filter.noteType !== undefined && entry.noteType !== filter.noteType) continue;\n\n // Filter by tie\n if (filter.hasTie !== undefined) {\n const hasTie = entry.tie !== undefined;\n if (filter.hasTie !== hasTie) continue;\n }\n\n results.push(entry);\n }\n }\n }\n\n return results;\n}\n\n/**\n * Get the total duration of the score in divisions\n */\nexport function getDuration(score: Score): number {\n if (score.parts.length === 0) return 0;\n\n const part = score.parts[0];\n let totalDuration = 0;\n let divisions = 1;\n\n for (const measure of part.measures) {\n if (measure.attributes?.divisions !== undefined) {\n divisions = measure.attributes.divisions;\n }\n\n // Calculate measure duration based on time signature or actual notes\n let measureDuration = 0;\n\n for (const entry of measure.entries) {\n if (entry.type === 'note' && !entry.chord) {\n measureDuration = Math.max(measureDuration, entry.duration);\n }\n }\n\n // Use time signature to calculate expected duration if available\n const attrs = getAttributesAtMeasure(score, { part: 0, measure: measure.number });\n if (attrs.time) {\n const beats = parseInt(attrs.time.beats, 10) || 4;\n const expectedDuration = (beats / attrs.time.beatType) * 4 * divisions;\n measureDuration = Math.max(measureDuration, expectedDuration);\n }\n\n totalDuration += measureDuration;\n }\n\n return totalDuration;\n}\n\n/**\n * Get part by ID\n */\nexport function getPartById(score: Score, id: string): Part | undefined {\n return score.parts.find((p) => p.id === id);\n}\n\n/**\n * Get part index by ID\n */\nexport function getPartIndex(score: Score, id: string): number {\n return score.parts.findIndex((p) => p.id === id);\n}\n\n/**\n * Check if the score has multiple staves (e.g., piano grand staff)\n */\nexport function hasMultipleStaves(score: Score, partIndex: number = 0): boolean {\n const part = score.parts[partIndex];\n if (!part) return false;\n\n for (const measure of part.measures) {\n if (measure.attributes?.staves !== undefined && measure.attributes.staves > 1) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Get the number of staves for a part\n */\nexport function getStaveCount(score: Score, partIndex: number = 0): number {\n const part = score.parts[partIndex];\n if (!part) return 1;\n\n for (const measure of part.measures) {\n if (measure.attributes?.staves !== undefined) {\n return measure.attributes.staves;\n }\n }\n\n return 1;\n}\n\n/**\n * Round-trip metrics for measuring preservation fidelity\n */\nexport interface RoundtripMetrics {\n notesOriginal: number;\n notesPreserved: number;\n measuresOriginal: number;\n measuresPreserved: number;\n partsOriginal: number;\n partsPreserved: number;\n preservationRate: number;\n}\n\n/**\n * Compare two scores and calculate round-trip preservation metrics\n */\nexport function measureRoundtrip(original: Score, exported: Score): RoundtripMetrics {\n const notesOriginal = countNotes(original);\n const notesExported = countNotes(exported);\n const notesPreserved = Math.min(notesOriginal, notesExported);\n\n const measuresOriginal = getMeasureCount(original);\n const measuresExported = getMeasureCount(exported);\n const measuresPreserved = Math.min(measuresOriginal, measuresExported);\n\n const partsOriginal = original.parts.length;\n const partsExported = exported.parts.length;\n const partsPreserved = Math.min(partsOriginal, partsExported);\n\n // Calculate preservation rate based on notes (most granular)\n const preservationRate = notesOriginal > 0\n ? notesPreserved / notesOriginal\n : 1;\n\n return {\n notesOriginal,\n notesPreserved,\n measuresOriginal,\n measuresPreserved,\n partsOriginal,\n partsPreserved,\n preservationRate,\n };\n}\n\n/**\n * Count total notes in a score\n */\nexport function countNotes(score: Score): number {\n let count = 0;\n\n for (const part of score.parts) {\n for (const measure of part.measures) {\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n count++;\n }\n }\n }\n }\n\n return count;\n}\n\n/**\n * Compare two scores for structural equality\n */\nexport function scoresEqual(a: Score, b: Score): boolean {\n // Check parts count\n if (a.parts.length !== b.parts.length) return false;\n\n for (let i = 0; i < a.parts.length; i++) {\n const partA = a.parts[i];\n const partB = b.parts[i];\n\n if (partA.measures.length !== partB.measures.length) return false;\n\n for (let j = 0; j < partA.measures.length; j++) {\n const measureA = partA.measures[j];\n const measureB = partB.measures[j];\n\n if (measureA.number !== measureB.number) return false;\n\n // Compare entries count\n const notesA = measureA.entries.filter(e => e.type === 'note');\n const notesB = measureB.entries.filter(e => e.type === 'note');\n\n if (notesA.length !== notesB.length) return false;\n\n // Compare each note\n for (let k = 0; k < notesA.length; k++) {\n const noteA = notesA[k] as NoteEntry;\n const noteB = notesB[k] as NoteEntry;\n\n if (!pitchesEqual(noteA.pitch, noteB.pitch)) return false;\n if (noteA.duration !== noteB.duration) return false;\n if (noteA.voice !== noteB.voice) return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Compare two pitches for equality\n */\nfunction pitchesEqual(a: Pitch | undefined, b: Pitch | undefined): boolean {\n if (a === undefined && b === undefined) return true;\n if (a === undefined || b === undefined) return false;\n return a.step === b.step && a.octave === b.octave && (a.alter ?? 0) === (b.alter ?? 0);\n}\n","import type {\n Score,\n Measure,\n NoteEntry,\n Pitch,\n KeySignature,\n TimeSignature,\n} from '../types';\nimport { STEPS, STEP_SEMITONES, getMeasureEndPosition } from '../utils';\n\n/**\n * Deep clone a score\n */\nfunction cloneScore(score: Score): Score {\n return JSON.parse(JSON.stringify(score));\n}\n\n/**\n * Transpose a pitch by a number of semitones\n */\nfunction transposePitch(pitch: Pitch, semitones: number): Pitch {\n const currentSemitone = STEP_SEMITONES[pitch.step] + (pitch.alter ?? 0) + pitch.octave * 12;\n const targetSemitone = currentSemitone + semitones;\n\n const targetOctave = Math.floor(targetSemitone / 12);\n const targetPitchClass = ((targetSemitone % 12) + 12) % 12;\n\n // Find the closest natural step with smallest alteration\n let bestStep: Pitch['step'] = 'C';\n let bestAlter = 99; // Start with large value so any real alter is smaller\n\n for (const step of STEPS) {\n const stepSemitone = STEP_SEMITONES[step];\n // Calculate the alteration needed to reach target from this step\n let diff = targetPitchClass - stepSemitone;\n\n // Normalize to range -6 to +6 for smallest alteration\n if (diff > 6) diff -= 12;\n if (diff < -6) diff += 12;\n\n // Only consider alterations within -2 to +2 (double flat to double sharp)\n if (diff >= -2 && diff <= 2) {\n if (Math.abs(diff) < Math.abs(bestAlter)) {\n bestStep = step;\n bestAlter = diff;\n }\n }\n }\n\n return {\n step: bestStep,\n octave: targetOctave,\n alter: bestAlter !== 0 ? bestAlter : undefined,\n };\n}\n\n/**\n * Transpose all notes in a score by a number of semitones\n */\nexport function transpose(score: Score, semitones: number): Score {\n if (semitones === 0) return score;\n\n const result = cloneScore(score);\n\n for (const part of result.parts) {\n for (const measure of part.measures) {\n for (const entry of measure.entries) {\n if (entry.type === 'note' && entry.pitch) {\n entry.pitch = transposePitch(entry.pitch, semitones);\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Options for adding a note\n */\nexport interface AddNoteOptions {\n partIndex: number;\n measureIndex: number;\n staff?: number;\n voice: number;\n position: number;\n note: Omit<NoteEntry, 'type' | 'voice' | 'staff'>;\n}\n\n/**\n * Add a note to a measure\n * Automatically handles backup/forward insertion\n */\nexport function addNote(score: Score, options: AddNoteOptions): Score {\n const result = cloneScore(score);\n const part = result.parts[options.partIndex];\n if (!part) return result;\n\n const measure = part.measures[options.measureIndex];\n if (!measure) return result;\n\n const newNote: NoteEntry = {\n type: 'note',\n voice: options.voice,\n staff: options.staff,\n ...options.note,\n };\n\n // Find the current position at the end of the measure using shared utility\n const currentPosition = getMeasureEndPosition(measure);\n\n // Calculate backup/forward needed\n const positionDiff = options.position - currentPosition;\n\n if (positionDiff < 0) {\n // Need to backup\n measure.entries.push({\n type: 'backup',\n duration: -positionDiff,\n });\n } else if (positionDiff > 0) {\n // Need to forward\n measure.entries.push({\n type: 'forward',\n duration: positionDiff,\n voice: options.voice,\n staff: options.staff,\n });\n }\n\n measure.entries.push(newNote);\n\n return result;\n}\n\n/**\n * Delete a note from a measure\n */\nexport function deleteNote(score: Score, options: {\n partIndex: number;\n measureIndex: number;\n noteIndex: number;\n}): Score {\n const result = cloneScore(score);\n const part = result.parts[options.partIndex];\n if (!part) return result;\n\n const measure = part.measures[options.measureIndex];\n if (!measure) return result;\n\n // Find the note by counting only notes\n let noteCount = 0;\n let entryIndex = -1;\n\n for (let i = 0; i < measure.entries.length; i++) {\n if (measure.entries[i].type === 'note') {\n if (noteCount === options.noteIndex) {\n entryIndex = i;\n break;\n }\n noteCount++;\n }\n }\n\n if (entryIndex !== -1) {\n measure.entries.splice(entryIndex, 1);\n }\n\n return result;\n}\n\n/**\n * Change key signature from a specific measure\n */\nexport function changeKey(\n score: Score,\n key: KeySignature,\n options: { fromMeasure: string | number }\n): Score {\n const result = cloneScore(score);\n const targetMeasure = String(options.fromMeasure);\n\n for (const part of result.parts) {\n for (const measure of part.measures) {\n if (measure.number === targetMeasure) {\n if (!measure.attributes) {\n measure.attributes = {};\n }\n measure.attributes.key = key;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Change time signature from a specific measure\n */\nexport function changeTime(\n score: Score,\n time: TimeSignature,\n options: { fromMeasure: string | number }\n): Score {\n const result = cloneScore(score);\n const targetMeasure = String(options.fromMeasure);\n\n for (const part of result.parts) {\n for (const measure of part.measures) {\n if (measure.number === targetMeasure) {\n if (!measure.attributes) {\n measure.attributes = {};\n }\n measure.attributes.time = time;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Insert a new measure after a specific measure number\n */\nexport function insertMeasure(\n score: Score,\n options: {\n afterMeasure: string | number;\n copyAttributes?: boolean;\n }\n): Score {\n const result = cloneScore(score);\n const targetMeasure = String(options.afterMeasure);\n\n for (const part of result.parts) {\n const insertIndex = part.measures.findIndex((m) => m.number === targetMeasure);\n if (insertIndex === -1) continue;\n\n // Parse target measure number and increment for new measure\n const numericPart = parseInt(targetMeasure, 10);\n const newMeasureNumber = String(isNaN(numericPart) ? insertIndex + 2 : numericPart + 1);\n\n // Create new empty measure\n const newMeasure: Measure = {\n number: newMeasureNumber,\n entries: [],\n };\n\n // Copy attributes if requested\n if (options.copyAttributes) {\n const sourceMeasure = part.measures[insertIndex];\n if (sourceMeasure.attributes) {\n newMeasure.attributes = { ...sourceMeasure.attributes };\n }\n }\n\n // Insert the new measure\n part.measures.splice(insertIndex + 1, 0, newMeasure);\n\n // Update measure numbers for subsequent measures\n for (let i = insertIndex + 2; i < part.measures.length; i++) {\n const currentNum = parseInt(part.measures[i].number, 10);\n if (!isNaN(currentNum)) {\n part.measures[i].number = String(currentNum + 1);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Delete a measure\n */\nexport function deleteMeasure(score: Score, measureNumber: string | number): Score {\n const result = cloneScore(score);\n const targetMeasure = String(measureNumber);\n\n for (const part of result.parts) {\n const deleteIndex = part.measures.findIndex((m) => m.number === targetMeasure);\n if (deleteIndex === -1) continue;\n\n // Remove the measure\n part.measures.splice(deleteIndex, 1);\n\n // Update measure numbers for subsequent measures\n for (let i = deleteIndex; i < part.measures.length; i++) {\n const currentNum = parseInt(part.measures[i].number, 10);\n if (!isNaN(currentNum)) {\n part.measures[i].number = String(currentNum - 1);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Set divisions for a measure\n */\nexport function setDivisions(\n score: Score,\n options: {\n partIndex: number;\n measureIndex: number;\n divisions: number;\n }\n): Score {\n const result = cloneScore(score);\n const part = result.parts[options.partIndex];\n if (!part) return result;\n\n const measure = part.measures[options.measureIndex];\n if (!measure) return result;\n\n if (!measure.attributes) {\n measure.attributes = {};\n }\n measure.attributes.divisions = options.divisions;\n\n return result;\n}\n\n/**\n * Add a chord note (note that sounds simultaneously with the previous note)\n */\nexport function addChordNote(\n score: Score,\n options: {\n partIndex: number;\n measureIndex: number;\n afterNoteIndex: number;\n pitch: Pitch;\n }\n): Score {\n const result = cloneScore(score);\n const part = result.parts[options.partIndex];\n if (!part) return result;\n\n const measure = part.measures[options.measureIndex];\n if (!measure) return result;\n\n // Find the note by counting only notes\n let noteCount = 0;\n let entryIndex = -1;\n let targetNote: NoteEntry | null = null;\n\n for (let i = 0; i < measure.entries.length; i++) {\n const entry = measure.entries[i];\n if (entry.type === 'note') {\n if (noteCount === options.afterNoteIndex) {\n entryIndex = i;\n targetNote = entry;\n break;\n }\n noteCount++;\n }\n }\n\n if (entryIndex !== -1 && targetNote) {\n const chordNote: NoteEntry = {\n type: 'note',\n pitch: options.pitch,\n duration: targetNote.duration,\n voice: targetNote.voice,\n staff: targetNote.staff,\n chord: true,\n noteType: targetNote.noteType,\n dots: targetNote.dots,\n };\n\n measure.entries.splice(entryIndex + 1, 0, chordNote);\n }\n\n return result;\n}\n\n/**\n * Modify a note's pitch\n */\nexport function modifyNotePitch(\n score: Score,\n options: {\n partIndex: number;\n measureIndex: number;\n noteIndex: number;\n pitch: Pitch;\n }\n): Score {\n const result = cloneScore(score);\n const part = result.parts[options.partIndex];\n if (!part) return result;\n\n const measure = part.measures[options.measureIndex];\n if (!measure) return result;\n\n // Find the note by counting only notes\n let noteCount = 0;\n\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n if (noteCount === options.noteIndex) {\n entry.pitch = options.pitch;\n break;\n }\n noteCount++;\n }\n }\n\n return result;\n}\n\n/**\n * Modify a note's duration\n */\nexport function modifyNoteDuration(\n score: Score,\n options: {\n partIndex: number;\n measureIndex: number;\n noteIndex: number;\n duration: number;\n noteType?: NoteEntry['noteType'];\n dots?: number;\n }\n): Score {\n const result = cloneScore(score);\n const part = result.parts[options.partIndex];\n if (!part) return result;\n\n const measure = part.measures[options.measureIndex];\n if (!measure) return result;\n\n // Find the note by counting only notes\n let noteCount = 0;\n\n for (const entry of measure.entries) {\n if (entry.type === 'note') {\n if (noteCount === options.noteIndex) {\n entry.duration = options.duration;\n if (options.noteType !== undefined) {\n entry.noteType = options.noteType;\n }\n if (options.dots !== undefined) {\n entry.dots = options.dots;\n }\n break;\n }\n noteCount++;\n }\n }\n\n return result;\n}\n","import { readFile, writeFile } from 'fs/promises';\nimport { parse, parseCompressed, isCompressed } from './importers';\nimport { serialize, serializeCompressed, exportMidi, SerializeOptions, MidiExportOptions } from './exporters';\nimport type { Score } from './types';\n\n/**\n * Parse a MusicXML file from disk\n * Automatically handles both .xml/.musicxml and .mxl formats\n * @param filePath - Path to the file\n * @returns The parsed Score\n */\nexport async function parseFile(filePath: string): Promise<Score> {\n const data = await readFile(filePath);\n\n // Check if it's a compressed file\n if (isCompressed(data)) {\n return parseCompressed(data);\n }\n\n // Parse as XML string\n const xmlString = decodeBuffer(data);\n return parse(xmlString);\n}\n\n/**\n * Detect encoding from BOM and decode buffer to string\n * Supports UTF-8, UTF-16BE, UTF-16LE\n */\nexport function decodeBuffer(buffer: Buffer): string {\n // UTF-16 BE BOM: FE FF\n if (buffer.length >= 2 && buffer[0] === 0xFE && buffer[1] === 0xFF) {\n return buffer.swap16().toString('utf-16le'); // Node.js usually handles LE well, or just use ucs2\n // Actually Node's utf16le is standard. efficient way to read BE is swap and read LE or use TextDecoder.\n // simpler: TextDecoder\n }\n\n // UTF-16 LE BOM: FF FE\n if (buffer.length >= 2 && buffer[0] === 0xFF && buffer[1] === 0xFE) {\n return buffer.toString('utf16le');\n }\n\n // UTF-8 BOM: EF BB BF\n if (buffer.length >= 3 && buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {\n return buffer.toString('utf8', 3); // Skip BOM\n }\n\n // Default to UTF-8\n return buffer.toString('utf8');\n}\n\n\n/**\n * Export options combining all format options\n */\nexport interface ExportOptions extends SerializeOptions, MidiExportOptions { }\n\n/**\n * Serialize a Score to a file\n * Format is determined by file extension:\n * - .mxl: Compressed MusicXML\n * - .xml/.musicxml: Uncompressed MusicXML\n * - .mid/.midi: Standard MIDI File\n * @param score - The Score to serialize\n * @param filePath - Path to write the file\n * @param options - Serialization options\n */\nexport async function serializeToFile(\n score: Score,\n filePath: string,\n options: ExportOptions = {}\n): Promise<void> {\n const lowerPath = filePath.toLowerCase();\n\n if (lowerPath.endsWith('.mxl')) {\n const data = serializeCompressed(score, options);\n await writeFile(filePath, data);\n } else if (lowerPath.endsWith('.mid') || lowerPath.endsWith('.midi')) {\n const data = exportMidi(score, options);\n await writeFile(filePath, data);\n } else {\n const xmlString = serialize(score, options);\n await writeFile(filePath, xmlString, 'utf-8');\n }\n}\n"],"mappings":"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","names":["transpose","time","attrs","dotCount","hasNotes","transpose","attrs","import_fflate"]}
|