62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
"""Collection of converters"""
|
|
from music21 import converter, note, stream, meter
|
|
from ziffers import zparse, Ziffers
|
|
|
|
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 z in parsed:
|
|
m_note = note.Note(z.note)
|
|
m_note.duration.quarterLength = z.duration * 4
|
|
s.append(m_note)
|
|
self.stream = s.makeMeasures()
|