"""Collection of converters""" from music21 import converter, note, stream, meter, chord, environment from ziffers import zparse, Ziffers, Pitch, Rest, Chord def to_music21(expression: str | Ziffers, **options): """Helper for passing options to the parser""" converter.registerSubconverter(ZiffersMusic21) if isinstance(expression, Ziffers): if options: options["preparsed"] = expression else: options = {"preparsed": expression} options = {"ziffers": options} return converter.parse("PREPARSED", format="ziffers", keywords=options) if options: options = {"ziffers": options} return converter.parse(expression, format="ziffers", keywords=options) test = converter.parse(expression, format="ziffers") return test def set_musescore_path(path: str): """Helper for setting the Musescore path""" settings = environment.UserSettings() # Default windows path: # 'C:\\Program Files\\MuseScore 3\\bin\\MuseScore3.exe' settings["musicxmlPath"] = path settings["musescoreDirectPNGPath"] = path class ZiffersMusic21(converter.subConverters.SubConverter): """Ziffers converter to Music21""" registerFormats = ("ziffers",) registerInputExtensions = ("zf",) def parseData(self, dataString, number=None): """Parses Ziffers string to Music21 object""" # Look for options in keywords object keywords = self.keywords["keywords"] if "ziffers" in keywords: options = keywords["ziffers"] if "preparsed" in options: parsed = options["preparsed"] else: parsed = zparse(dataString, **options) else: parsed = zparse(dataString) note_stream = stream.Part() if "time" in options: m_item = meter.TimeSignature(options["time"]) # Common time else: m_item = meter.TimeSignature("c") # Common time note_stream.insert(0, m_item) for item in parsed: if isinstance(item, Pitch): m_item = note.Note(item.note) m_item.duration.quarterLength = item.duration * 4 elif isinstance(item, Rest): m_item = note.Rest(item.duration * 4) elif isinstance(item, Chord): m_item = chord.Chord(item.notes) m_item.duration.quarterLength = item.durations * 4 note_stream.append(m_item) self.stream = note_stream.makeMeasures()