Source code for muprocdurham

import re
import random
from warnings import warn

import numpy as np
from os import environ
environ['PYGAME_HIDE_SUPPORT_PROMPT'] = '1'  # supress pygame message before import
import pygame
import music21 as m21

# check for most up-to-date version
import muprocdurham.version_check

# see https://github.com/DCMLab/standards/blob/main/harmony.py
dcml_harmony_regex = re.compile("".join(r"""
    ^(\.?
        ((?P<globalkey>[a-gA-G](b*|\#*))\.)?
        ((?P<localkey>(b*|\#*)(VII|VI|V|IV|III|II|I|vii|vi|v|iv|iii|ii|i))\.)?
        ((?P<pedal>(b*|\#*)(VII|VI|V|IV|III|II|I|vii|vi|v|iv|iii|ii|i))\[)?
        (?P<chord>
            (?P<numeral>(b*|\#*)(VII|VI|V|IV|III|II|I|vii|vi|v|iv|iii|ii|i|Ger|It|Fr|@none))
            (?P<form>(%|o|\+|M|\+M))?
            (?P<figbass>(7|65|43|42|2|64|6))?
            (\((?P<changes>((\+|-|\^|v)?(b*|\#*)\d)+)\))?
            (/(?P<relativeroot>((b*|\#*)(VII|VI|V|IV|III|II|I|vii|vi|v|iv|iii|ii|i)/?)*))?
        )
        (?P<pedalend>\])?
    )?
    (|(?P<cadence>((HC|PAC|IAC|DC|EC)(\..*?)?)))?
    (?P<phraseend>(\\\\|\{|\}|\}\{))?$
    """.split()))


[docs] def seed_everything(seed): """Set random seed for reproducibility across multiple libraries.""" random.seed(seed) # Python's built-in random module np.random.seed(seed) # NumPy's random module
[docs] def show_stream(stream): try: stream.show() except m21.converter.subConverters.SubConverterException: warn("Cannot show score, falling back to text representation.", UserWarning) stream.show('t')
[docs] def play_stream(stream): try: m21.midi.realtime.StreamPlayer(stream).play() except pygame.error: warn("Cannot play stream", UserWarning)