"""Explicit single-role build. Does not publish or consume an existing ensemble.""" import argparse import json import time import pathlib import generator.musicxml import generator.parts import generator.production import generator.solo.export def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--song', type=pathlib.Path, required=True) parser.add_argument('--role', choices=generator.production.ROLES, required=True) parser.add_argument('--data-dir', type=pathlib.Path, default=pathlib.Path('data')) parser.add_argument('--output', type=pathlib.Path, required=True) parser.add_argument('--cache-dir', type=pathlib.Path) parser.add_argument('--solo-xml', type=pathlib.Path, help='Also export a completed solo role as MusicXML.') parser.add_argument('--settings', type=pathlib.Path) args = parser.parse_args() if args.solo_xml and not args.role.endswith('_solo'): parser.error('--solo-xml requires a solo role') source = generator.production.SourceAnalysis.read(generator.parts.prepare_document(generator.musicxml.load_musicxml(args.song))) start = time.monotonic() result = generator.production.generate_role(source, args.role, args.data_dir, json.loads(args.settings.read_text()) if args.settings else {}, args.cache_dir) args.output.parent.mkdir(parents=True, exist_ok=True) args.output.write_text(json.dumps(result, indent=2)) if args.solo_xml: manifest = generator.solo.export.write_role(result, args.solo_xml) args.solo_xml.with_suffix('.manifest.solo').write_text(json.dumps(manifest, indent=2) + '\n') print(f'{args.role}: {time.monotonic() - start:.2f}s wall; cached={result["cache_hit"]}; role generation/cache lookup {result["seconds"]:.2f}s') if __name__ == '__main__': main()