Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Load_score select the correct parser based on the file extension #314

Merged
merged 2 commits into from
Sep 13, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 18 additions & 36 deletions partitura/io/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
This module contains methods for importing and exporting symbolic music formats.
"""
from typing import Union
import os

from .importmusicxml import load_musicxml
from .importmidi import load_score_midi, load_performance_midi
Expand Down Expand Up @@ -35,7 +36,7 @@ def load_score(filename: PathLike, force_note_ids="keep") -> Score:
"""
Load a score format supported by partitura. Currently the accepted formats
are MusicXML, MIDI, Kern and MEI, plus all formats for which
MuseScore has support import-support (requires MuseScore 3).
MuseScore has support import-support (requires MuseScore 4 or 3).

Parameters
----------
Expand All @@ -54,20 +55,16 @@ def load_score(filename: PathLike, force_note_ids="keep") -> Score:
scr: :class:`partitura.score.Score`
A score instance.
"""
part = None

# Catch exceptions
exception_dictionary = dict()
# Load MusicXML
try:

extension = os.path.splitext(filename)[-1].lower()
if extension in (".mxl", ".xml", ".musicxml"):
# Load MusicXML
return load_musicxml(
filename=filename,
force_note_ids=force_note_ids,
)
except Exception as e:
exception_dictionary["MusicXML"] = e
# Load MIDI
try:
elif extension in [".midi", ".mid"]:
# Load MIDI
if (force_note_ids is None) or (not force_note_ids):
assign_note_ids = False
else:
Expand All @@ -76,44 +73,29 @@ def load_score(filename: PathLike, force_note_ids="keep") -> Score:
filename=filename,
assign_note_ids=assign_note_ids,
)
except Exception as e:
exception_dictionary["MIDI"] = e
# Load MEI
try:
elif extension in [".mei"]:
# Load MEI
return load_mei(filename=filename)
except Exception as e:
exception_dictionary["MEI"] = e
# Load Kern
try:
elif extension in [".kern", ".krn"]:
return load_kern(
filename=filename,
force_note_ids=force_note_ids,
)
except Exception as e:
exception_dictionary["Kern"] = e
# Load MuseScore
try:
elif extension in [".mscz", ".mscx", ".musescore", ".mscore", ".ms"]:
# Load MuseScore
return load_via_musescore(
filename=filename,
force_note_ids=force_note_ids,
)
except Exception as e:
exception_dictionary["MuseScore"] = e
try:
elif extension in [".match"]:
# Load the score information from a Matchfile
_, _, part = load_match(
_, _, score = load_match(
filename=filename,
create_score=True,
)

except Exception as e:
exception_dictionary["matchfile"] = e
if part is None:
for score_format, exception in exception_dictionary.items():
print(f"Error loading score as {score_format}:")
print(exception)

raise NotSupportedFormatError
return score
else:
raise NotSupportedFormatError(f"{extension} file extension is not supported. If this should be supported, consider editing partitura/io/__init__.py file")


def load_score_as_part(filename: PathLike) -> Part:
Expand Down