#!/usr/bin/env python3 """为 MusicXML 钢琴谱添加花括号分组。""" import sys import xml.etree.ElementTree as ET if len(sys.argv) < 2: print('Usage: python add_brace.py input.musicxml [output.musicxml]') sys.exit(1) input_file = sys.argv[1] output_file = sys.argv[2] if len(sys.argv) > 2 else input_file.replace('.musicxml', '_braced.musicxml') ET.register_namespace('m', 'http://www.musescore.org/ns/mscore') ET.register_namespace('xlink', 'http://www.w3.org/1999/xlink') tree = ET.parse(input_file) root = tree.getroot() part_list = root.find('part-list') if part_list is None: print('Error: no found in file') sys.exit(1) # 添加花括号分组(插在 part-list 最前面) group_start = ET.Element('part-group') group_start.set('number', '1') group_start.set('type', 'start') ET.SubElement(group_start, 'group-symbol').text = 'brace' ET.SubElement(group_start, 'group-barline').text = 'bracket' ET.SubElement(group_start, 'group-time') part_list.insert(0, group_start) # 每个 score-part 加 1 for sp in part_list.findall('score-part'): g = ET.SubElement(sp, 'group') g.text = '1' # 结束分组 part_list.append(ET.Element('part-group', number='1', type='stop')) try: ET.indent(root) except AttributeError: pass tree.write(output_file, encoding='UTF-8', xml_declaration=True) print(f'Added brace grouping') print(f'Output: {output_file}')