Files
ziffers-python/ziffers/converters.py

68 lines
2.4 KiB
Python

"""Collection of converters"""
from music21 import converter, note, stream, meter, chord
from ziffers import zparse, Ziffers, Pitch, Rest, Chord
def to_music21(strData: str|Ziffers, **options):
"""Helper for passing options to the parser"""
converter.registerSubconverter(ZiffersMusic21)
if isinstance(strData,Ziffers):
if options:
options["preparsed"] = strData
else:
options = {"preparsed": strData}
options = {"ziffers": options}
return converter.parse("PREPARSED", format="ziffers", keywords=options)
if options:
options = {"ziffers": options}
return converter.parse(strData, format="ziffers", keywords=options)
else:
test = converter.parse(strData, format="ziffers")
return test
def set_musescore_path(path: str):
"""Helper for setting the Musescore path"""
us = environment.UserSettings()
# Default windows path:
# 'C:\\Program Files\\MuseScore 3\\bin\\MuseScore3.exe'
us['musicxmlPath'] = path
us['musescoreDirectPNGPath'] = path
class ZiffersMusic21(converter.subConverters.SubConverter):
"""Ziffers converter to Music21"""
registerFormats = ("ziffers",)
registerInputExtensions = ("zf",)
def parseData(self, strData, 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(strData, **options)
else:
parsed = zparse(strData)
s = stream.Part()
if "time" in options:
m = meter.TimeSignature(options["time"]) # Common time
else:
m = meter.TimeSignature("c") # Common time
s.insert(0, m)
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.duration * 4
s.append(m_item)
self.stream = s.makeMeasures()