"""
Make a PDF of a given Midi file
"""
import argparse
import os
import shutil
import sys
from pathlib import Path
from music21 import converter, environment
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../"))
from decologr import Decologr as log
from decologr import setup_logging
from jdxi_editor.midi.music.pdf_export import (
annotate_staffs,
cleanup_score,
export_score,
remove_empty_parts,
set_metadata,
)
from jdxi_editor.midi.music.track import get_track_names
[docs]
env = environment.UserSettings()
env["lilypondPath"] = "/opt/lilypond-2.24.4/bin/lilypond"
[docs]
def main(midi_file: str):
"""main entry point"""
midi_file = Path(midi_file)
setup_logging(project_name="scorely")
midi_file_stem = midi_file.stem
# try to match the format "Title - Composer - JDXi"
if " - " in midi_file_stem:
filename_parts = midi_file_stem.split(" - ")
title = filename_parts[0]
composer = filename_parts[1]
# Gary_Numan_Cars.mid
elif "_" in midi_file_stem:
filename_parts = midi_file_stem.split("_")
title = filename_parts[0]
composer = filename_parts[1]
elif "-" in midi_file_stem:
filename_parts = midi_file_stem.split("-")
title = filename_parts[0]
composer = filename_parts[1]
else:
title = midi_file_stem
composer = "Unknown"
# Parse the MIDI file
score = converter.parse(midi_file)
set_metadata(composer, score, title)
# --- Get MIDI track names for staff labels ---
track_names = get_track_names(str(midi_file))
annotate_staffs(score, track_names)
score = remove_empty_parts(score)
score = cleanup_score(score)
try:
final_file, safe_output = export_score(midi_file, midi_file_stem, score)
except ValueError as e:
log.error(f"Export failed: {e}")
raise
shutil.move(safe_output.with_suffix(".pdf"), final_file)
log.message(f"Moved file to {final_file}")
if __name__ == "__main__":
[docs]
args = argparse.ArgumentParser()
args.add_argument("--midi-file", type=str, required=True)
args = args.parse_args()
main(args.midi_file)