§
    ƒØj-â ã                  ó.  — U d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlZd dl	Z
d dlZd dlmc mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZmZ d dlmZmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dlm$Z$ d dlm%Z% d dlm&Z& d dlm'Z' d dlm(Z( d dlm)Z) d dlm*Z* d dl+m,Z,m-Z- d dlm.Z. d dlm/Z/ d dlm0Z0 d dlm1Z1 d dlm2Z2 d d lm3Z3 d d!lm4Z4 d d"lm5Z5 d d#lm6Z6 d d$lm7Z7 d d%lm8Z8 d d&l9m:Z: d d'l9m;Z; d d(l<m=Z= d d)l>m?Z?m@Z@ e;jA        ZBe;jC        ZDe
jE        r!d d*lmFZF d d+lGmHZH eIeJeKeFjL                 f         ZM e!jN        d,¦  «        ZOd ZP eKe)jQ        jR        e)jQ        jS        z   e)jQ        jT        z   ¦  «        ZUd-eVd.<   dJd2„ZWdKd6„ZXdLd8„ZYd9„ ZZdMdd:œd;„Z[dNd>„Z\ G d?„ d@¦  «        Z] G dA„ dB¦  «        Z^ G dC„ dDe]¦  «        Z_ G dE„ dFe]¦  «        Z` G dG„ dHe=e]¦  «        ZaebdIk    rd dlZ ejc        ¦   «          dS dS )Oé    )ÚannotationsN)Úisclose)Úarticulations)Úbar)Úbeam)Úchord)Úclef)Úcommon)Údefaults©Úduration)Údynamics)ÚOffsetSpecialÚOrnamentDelay)ÚopFracÚnearestMultiple)Ú	editorial)Úenvironment)Úexceptions21)Úexpressions)Úharmony)Ú
instrument)Úinterval©Úkey)Úlayout)Úmetadata)Úmeter)ÚMIDIPercussionExceptionÚPercussionMapper)Únote)Ú
percussion)Úpitch)Úrepeat)Úspanner)Ústream)Ústyle)Ú	tablature)Útempo)Útext)Útie)Ú
xmlObjects)Úhelpers)ÚSoundTagMixin)ÚMusicXMLImportExceptionÚMusicXMLWarning)Úbase)ÚOffsetQLzmusicxml.xmlToM21z	list[str]Ú_recognizableKeysÚbadStrú
str | NoneÚreturnc                ób   — | €d S |                       ¦   «         } |                      dd¦  «        }|S )Nú
ú )ÚstripÚreplace)r4   ÚgoodStrs     úŽ/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/musicxml/xmlToM21.pyÚ_cleanr>   Z   s1   € à€~ØˆtØ�\Š\‰^Œ^€FØ�nŠn˜T 3Ñ'Ô'€GØ€Nó    ÚmxObjúET.Element | NoneÚstrc                ól   — | €dS 	 | j         }|€dS |                     ¦   «         S # t          $ r Y dS w xY w)ak  
    Returns the `mxObj.text.strip()` from an Element (or None)
    taking into account that `.text` might be None, or the
    Element might be undefined.

    Replacement for the older textStripValid()

    >>> from xml.etree.ElementTree import Element
    >>> e = Element('an-element')
    >>> musicxml.xmlToM21.strippedText(e)
    ''
    >>> e.text = '    '
    >>> musicxml.xmlToM21.strippedText(e)
    ''
    >>> e.text = '  hello  '
    >>> musicxml.xmlToM21.strippedText(e)
    'hello'

    >>> musicxml.xmlToM21.strippedText(None)
    ''
    >>> musicxml.xmlToM21.strippedText(440.0)
    ''

    New in v9.
    NÚ )r*   r:   ÚAttributeError)r@   Útxts     r=   ÚstrippedTextrG   c   sT   € ð4 €}ØˆrðØŒjˆØˆ;Ø�2Ø�yŠy‰{Œ{ÐøÝð ð ð Øˆrˆrðøøøs   †	% ‘% ¥
3²3Úvaluec                óf   — | t           j        vr"| dk    rdS | dk    rdS t          d| › �¦  «        ‚| S )ai  
    Utility function to convert a MusicXML duration type to a music21 duration type.

    Changes 'long' to 'longa' and deals with a Guitar Pro 5.2 bug in MusicXML
    export, that exports a 32nd note with the type '32th'.

    >>> musicxml.xmlToM21.musicXMLTypeToType('long')
    'longa'
    >>> musicxml.xmlToM21.musicXMLTypeToType('32th')
    '32nd'
    >>> musicxml.xmlToM21.musicXMLTypeToType('quarter')
    'quarter'
    >>> musicxml.xmlToM21.musicXMLTypeToType(None)
    Traceback (most recent call last):
    music21.musicxml.xmlObjects.MusicXMLImportException:
        found unknown MusicXML type: None
    ÚlongÚlongaÚ32thÚ32ndzfound unknown MusicXML type: )r   ÚtypeToDurationr/   )rH   s    r=   ÚmusicXMLTypeToTyperO   ‰   sJ   € ð& •HÔ+Ð+Ð+Ø�FŠ?ˆ?Ø�7Ø�fŠ_ˆ_Ø�6å)Ð*QÈ%Ð*QÐ*QÑRÔRÐRàˆr?   c                ó–   — | €dS 	 t          | ¦  «        }|t          |¦  «        k    rt          |¦  «        }|S # t          $ r | cY S w xY w)zØ
    Convert a string to float or int if possible.

    >>> _f = musicxml.xmlToM21._floatOrIntStr
    >>> _f('20.3')
    20.3
    >>> _f('20.0')
    20
    >>> _f(None) is None
    True
    >>> _f('hi')
    'hi'
    N)ÚfloatÚintÚ
ValueError)ÚstrObjÚvals     r=   Ú_floatOrIntStrrV   §   sa   € ð €~ØˆtðÝ�F‰mŒmˆØ•#�c‘(”(Š?ˆ?Ý�c‘(”(ˆCØˆ
øÝð ð ð Øˆˆˆðøøøs   †29 ¹AÁA©Ú	transformc               óº   — |                      |¦  «        }|€dS |j        }|dv rdS |� ||¦  «        }|€t          j        |¦  «        }t	          | ||¦  «         dS )aJ  
    If xmlEl has at least one element of tag==tag with some text. If
    it does, set the attribute either with the same name (with "foo-bar" changed to
    "fooBar") or with attributeName to the text contents.

    Pass a function or lambda function as `transform` to transform the value before setting it

    >>> from xml.etree.ElementTree import Element, SubElement

    This is essentially `<accidental><alter>-2</alter></accidental>`:

    >>> e = Element('accidental')
    >>> a = SubElement(e, 'alter')
    >>> a.text = '-2'

    >>> seta = musicxml.xmlToM21._setAttributeFromTagText
    >>> acc = pitch.Accidental()

    Transform the alter text to a float.

    >>> seta(acc, e, 'alter', transform=float)
    >>> acc.alter
    -2.0

    >>> e2 = Element('score-partwise')
    >>> a2 = SubElement(e2, 'movement-title')
    >>> a2.text = 'Trout'
    >>> md = metadata.Metadata()
    >>> seta(md, e2, 'movement-title', 'movementName')
    >>> md.movementName
    'Trout'

    set a different attribute

    >>> seta(md, e2, 'movement-title', 'composer')
    >>> md.composer
    'Trout'
    N©NrD   )Úfindr*   r
   ÚhyphenToCamelCaseÚsetattr)Úm21ElÚxmlElÚtagÚattributeNamerX   ÚmatchElrH   s          r=   Ú_setAttributeFromTagTextrc   À   sx   € ðN �jŠj˜‰oŒo€GØ€ØˆàŒL€EØ�
ÐÐØˆàÐØ�	˜%Ñ Ô ˆàÐÝÔ0°Ñ5Ô5ˆåˆE�= %Ñ(Ô(Ð(Ð(Ð(r?   Úm21mdúmetadata.Metadatac                ó~   — |                      |¦  «        }|€d S |j        }|dv rd S |                      ||¦  «         d S )NrZ   )r[   r*   Úadd)rd   r_   r`   ÚmdUniqueNamerb   rH   s         r=   Ú_addMetadataItemFromTagTextri   ÷   sL   € Ø�jŠj˜‰oŒo€GØ€ØˆàŒL€EØ�
ÐÐØˆà	‡I‚Iˆl˜EÑ"Ô"Ð"Ð"Ð"r?   c                  ó�   — e Zd ZdZdddddddœZdd
„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zdd„Zdd„Zdd„Zdd„Zdd„Zd	S )ÚXMLParserBasezk
    contains functions that could be called
    at multiple levels of parsing (Score, Part, Measure).
    z
half-sharpzone-and-a-half-sharpz	half-flatzone-and-a-half-flatzdouble-flatzdouble-sharp)zquarter-sharpzthree-quarters-sharpzquarter-flatzthree-quarters-flatz	flat-flatzsharp-sharpNc                óü  — t          |t          j        ¦  «        r|}nd}t          j        |¦  «        s|f}|€d„ |D ¦   «         }nt          j        |¦  «        s|f}t          ||¦  «        D ]Ž\  }}|                     |¦  «        }|€Œ|t          j        v rt          j	        |¦  «        }	 |dur|durt          j
        |¦  «        }n# t          t          f$ r Y nw xY w|€|j        }t          |||¦  «         Œ�dS )a  
        Takes an mxObject, a music21Object, and a list/tuple of musicXML names and
        a list/tuple of m21Names, and assigns each of the mxObject's attributes
        that fits this style name to the corresponding style object's m21Name attribute.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> XP = musicxml.xmlToM21.XMLParserBase()
        >>> mxObj = EL('<a x="20.1" y="10.0" z="yes" />')
        >>> m21Obj = base.Music21Object()
        >>> musicXMLNames = ('w', 'x', 'y', 'z')
        >>> m21Names = ('justify', 'absoluteX', 'absoluteY', 'hideObjectOnPrint')

        >>> XP.setStyleAttributes(mxObj, m21Obj, musicXMLNames, m21Names)

        `.justify` requires a TextStyle object.

        >>> m21Obj.style.justify
        Traceback (most recent call last):
        AttributeError: 'Style' object has no attribute 'justify'

        >>> m21Obj.style.absoluteX
        20.1
        >>> m21Obj.style.absoluteY
        10
        >>> m21Obj.style.hideObjectOnPrint
        True
        Nc              3  ó>   K  — | ]}t          j        |¦  «        V — Œd S ©N)r
   r\   )Ú.0Úxs     r=   ú	<genexpr>z3XMLParserBase.setStyleAttributes.<locals>.<genexpr>9  s-   è è € ÐKÐK¸�Ô0°Ñ3Ô3ÐKÐKÐKÐKÐKÐKr?   TF)Ú
isinstancer'   ÚStyler
   Ú
isIterableÚzipÚgetr,   ÚSTYLE_ATTRIBUTES_YES_NO_TO_BOOLÚyesNoToBooleanÚnumToIntOrFloatrS   Ú	TypeErrorr]   )	ÚselfÚmxObjectÚ	m21ObjectÚmusicXMLNamesÚm21NamesÚstObjÚxmlNameÚm21NameÚmxValues	            r=   ÚsetStyleAttributesz XMLParserBase.setStyleAttributes  sF  € õ: �i¥¤Ñ-Ô-ð 	ØˆEˆEàˆEåÔ  Ñ/Ô/ð 	-Ø*Ð,ˆMàÐØKÐK¸]ÐKÑKÔKˆHˆHÝÔ" 8Ñ,Ô,ð 	#Ø �{ˆHå # M°8Ñ <Ô <ð 	-ð 	-ÑˆG�WØ—l’l 7Ñ+Ô+ˆGØˆØà�*ÔDÐDÐDÝ$Ô3°GÑ<Ô<�ðØ $Ð&Ð&¨7¸%Ð+?Ð+?Ý$Ô4°WÑ=Ô=�GøøÝ¥	Ð*ð ð ð Ø�ðøøøð ˆ}Ø!œ�Ý�E˜7 GÑ,Ô,Ð,Ð,ð#	-ð 	-s   Â-C
Ã
CÃCc                ój   — d}d}|                       ||||¦  «         |                      ||¦  «         dS )a|  
        sets the justification, print-style-align group, and
        text-decoration, text-rotation,
        letter-spacing, line-height, lang, text-direction, and
        enclosure, on an
        m21Object, which must have style.TextStyle as its Style class,
        and then calls setPrintStyleAlign

        conforms to attr-group %text-formatting in the MusicXML DTD
        )Újustifyztext-decorationztext-rotationzletter-spacingzline-heightÚlangztext-directionÚ	enclosure)r†   ÚtextDecorationÚtextRotationÚletterSpacingÚ
lineHeightÚlanguageÚtextDirectionrˆ   N)r„   ÚsetPrintStyleAlign©r{   r|   r}   r~   r   s        r=   ÚsetTextFormattingzXMLParserBase.setTextFormattingP  sJ   € ðOˆðLˆð 	×Ò ¨)°]ÀHÑMÔMÐMØ×Ò ¨)Ñ4Ô4Ð4Ð4Ð4r?   c                ó”   — d}t          |d¦  «        r|                     d¦  «        }|�||_        |                      |||¦  «         dS )z¨
        Sets four additional elements for line elements, conforms to entity
        %line-shape, %line-type, %dashed-formatting (dash-length and space-length)
        )ú
line-shapeú	line-typezdash-lengthzspace-lengthÚlineTyper”   N)Úhasattrrv   r•   r„   )r{   r|   r}   r~   Ú
mxLineTypes        r=   ÚsetLineStylezXMLParserBase.setLineStylec  sY   € ð
 Sˆå�9˜jÑ)Ô)ð 	0Ø!Ÿš kÑ2Ô2ˆJØÐ%Ø%/�	Ô"à×Ò ¨)°]ÑCÔCÐCÐCÐCr?   c                óª   — |                      d¦  «        dk    rdS t          |d¦  «        rd|j        _        dS 	 d|_        dS # t          $ r Y dS w xY w)zY
        convert 'print-object="no"' to m21Object.style.hideObjectOnPrint = True
        úprint-objectÚnoNr'   T)rv   r–   r'   ÚhideObjectOnPrintrE   ©r{   r|   r}   s      r=   ÚsetPrintObjectzXMLParserBase.setPrintObjectq  sw   € ð �<Š<˜Ñ'Ô'¨4Ò/Ð/ØˆFå�9˜gÑ&Ô&ð 	Ø04ˆIŒOÔ-Ð-Ð-ðØ.2�	Ô+Ð+Ð+øÝ!ð ð ð Ø��ðøøøs   »A Á
AÁAc                ób   — |                       ||¦  «         |                      ||dd¦  «         dS )zé
        runs setPrintStyle and then sets horizontalAlign and verticalAlign, on an
        m21Object, which must have style.TextStyle as its Style class.

        conforms to attr-group %print-style-align in the MusicXML DTD
        )ÚvalignÚhalign)ÚalignVerticalÚalignHorizontalN)ÚsetPrintStyler„   r�   s      r=   r�   z XMLParserBase.setPrintStyleAlign€  sL   € ð 	×Ò˜8 YÑ/Ô/Ð/Ø×Ò Ø )Ø 4Ø Dñ	Fô 	Fð 	Fð 	Fð 	Fr?   c                óŠ   — |                       ||¦  «         |                      ||¦  «         |                      ||¦  «         dS )zÞ
        get position, font, and color information from the mxObject
        into the m21Object, which must have style.TextStyle as its Style class.

        conforms to attr-group %print-style in the MusicXML DTD
        N)ÚsetPositionÚsetFontÚsetColorr�   s      r=   r¤   zXMLParserBase.setPrintStyle�  sH   € ð 	×Ò˜ 9Ñ-Ô-Ð-Ø�Š�X˜yÑ)Ô)Ð)Ø�Š�h 	Ñ*Ô*Ð*Ð*Ð*r?   c                ó6   — |                       ||dd¦  «         dS )zE
        Sets m21Object.style.color to be the same as color.
        ÚcolorN©r„   r�   s      r=   r¨   zXMLParserBase.setColor˜  s$   € ð 	×Ò ¨)°W¸gÑFÔFÐFÐFÐFr?   c                ó>   — d}d}|                       ||||¦  «         dS )a  
        sets font-family, font-style, font-size, and font-weight as
        fontFamily (list), fontStyle, fontSize and fontWeight from
        an object into a TextStyle object

        conforms to attr-group %font in the MusicXML DTD

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> XP = musicxml.xmlToM21.XMLParserBase()
        >>> mxObj = EL('<text font-family="Courier,monospaced" font-style="italic" '
        ...            'font-size="24" font-weight="bold" />')

        >>> te = expressions.TextExpression('hi!')
        >>> XP.setFont(mxObj, te)
        >>> te.style.fontFamily
        ['Courier', 'monospaced']
        >>> te.style.fontStyle
        'italic'
        >>> te.style.fontSize
        24
        >>> te.style.fontWeight
        'bold'
        )zfont-familyz
font-stylez	font-sizezfont-weight)Ú
fontFamilyÚ	fontStyleÚfontSizeÚ
fontWeightNr«   r�   s        r=   r§   zXMLParserBase.setFont¡  s/   € ð0 RˆØHˆØ×Ò ¨)°]ÀHÑMÔMÐMÐMÐMr?   c                ó>   — d}d}|                       ||||¦  «         dS )zþ
        get positioning information for an object from
        default-x, default-y, relative-x, relative-y into
        the .style attribute's absoluteX, relativeX, etc. attributes'

        conforms to attr-group %position in the MusicXML DTD
        )z	default-xz	default-yz
relative-xz
relative-y)Ú	absoluteXÚ	absoluteYÚ	relativeXÚ	relativeYNr«   r�   s        r=   r¦   zXMLParserBase.setPosition½  s/   € ð OˆØGˆØ×Ò ¨)°]ÀHÑMÔMÐMÐMÐMr?   c                ó‚   — |                      d¦  «        }|€dS t          |d¦  «        r	||_        dS ||j        _        dS )z²
        Sets the placement for objects that have a .placement attribute
        (most but not all spanners) and sets the `style.placement` for those
        that don't.
        Ú	placementN)rv   r–   r·   r'   )r{   r|   r}   r·   s       r=   ÚsetPlacementzXMLParserBase.setPlacementÉ  sP   € ð —L’L Ñ-Ô-ˆ	ØÐØˆFå�9˜kÑ*Ô*ð 	2Ø"+ˆIÔÐÐà(1ˆIŒOÔ%Ð%Ð%r?   c                óÐ  — |                      d¦  «        }|                      d¦  «        }|€|€dS t          j        ¦   «         }|�)|j        |_        d|_        |                      ||¦  «         |�.|j        |_        |                     d¦  «        }|dk    rd|_        |j        r!|j        j	         
                    |¦  «         dS |j        j         
                    |¦  «         dS )ag  
        Set editorial information from an mxObj

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> XP = musicxml.xmlToM21.XMLParserBase()
        >>> mxObj = EL('<a/>')
        >>> n = note.Note('C#4')

        Most common case:

        >>> XP.setEditorial(mxObj, n)
        >>> n.hasEditorialInformation
        False

        >>> mxObj = EL('<note><footnote>Sharp is conjectural</footnote>'
        ...            '<level reference="yes">2</level></note>')
        >>> XP.setEditorial(mxObj, n)
        >>> n.hasEditorialInformation
        True
        >>> len(n.editorial.footnotes)
        1
        >>> fn = n.editorial.footnotes[0]
        >>> fn
        <music21.editorial.Comment 'Sharp is conjectu...'>
        >>> fn.isFootnote
        True
        >>> fn.levelInformation
        '2'
        >>> fn.isReference
        True

        If no <footnote> tag exists, the editorial information will be found in
        comments:

        >>> mxObj = EL('<note><level reference="no">ed</level></note>')
        >>> n = note.Note('C#4')
        >>> XP.setEditorial(mxObj, n)
        >>> len(n.editorial.footnotes)
        0
        >>> len(n.editorial.comments)
        1
        >>> com = n.editorial.comments[0]
        >>> com.isReference
        False
        >>> com.text is None
        True
        >>> com.levelInformation
        'ed'
        ÚfootnoteÚlevelNTÚ	referenceÚyes)r[   r   ÚCommentr*   Ú
isFootnoter‘   ÚlevelInformationrv   ÚisReferenceÚ	footnotesÚappendÚcomments)r{   r@   Úm21ObjÚ
mxFootnoteÚmxLevelÚcÚreferenceAttributes          r=   ÚsetEditorialzXMLParserBase.setEditorialØ  sð   € ðf —Z’Z 
Ñ+Ô+ˆ
Ø—*’*˜WÑ%Ô%ˆàÐ ' /àˆFåÔÑÔˆàÐ!Ø”_ˆAŒFØˆAŒLØ×"Ò" :¨qÑ1Ô1Ð1àÐØ!(¤ˆAÔØ!(§¢¨[Ñ!9Ô!9ÐØ! UÒ*Ð*Ø $�”ð
 Œ<ð 	0ØÔÔ&×-Ò-¨aÑ0Ô0Ð0Ð0Ð0àÔÔ%×,Ò,¨QÑ/Ô/Ð/Ð/Ð/r?   c                óú   — |€t          j        ¦   «         }n|}t          } |||ddt          j        ¬¦  «          |||dt
          ¬¦  «         |D ]&}|j        dk    r|                      ||¬¦  «          nŒ'|€|S dS )a;  
        Given an mxPrint object, set object data for
        the print section of a layout.PageLayout object

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxPrint = EL(
        ...    '<print new-page="yes" page-number="5">'
        ...    '    <page-layout><page-height>4000</page-height>'
        ...    '        <page-margins><left-margin>20</left-margin>'
        ...    '                 <right-margin>30.25</right-margin></page-margins>'
        ...    '</page-layout></print>'
        ... )

        >>> pl = MP.xmlPrintToPageLayout(mxPrint)
        >>> pl.isNew
        True
        >>> pl.rightMargin
        30.25
        >>> pl.leftMargin
        20
        >>> pl.pageNumber
        5
        >>> pl.pageHeight
        4000
        Núnew-pageÚisNewrW   úpage-numberúpage-layout©ÚinputM21)r   Ú
PageLayoutÚsetAttributeFromAttributer,   rx   rR   r`   ÚxmlPageLayoutToPageLayout)r{   ÚmxPrintrÑ   Ú
pageLayoutÚsetbrp   s         r=   ÚxmlPrintToPageLayoutz"XMLParserBase.xmlPrintToPageLayout'  s°   € ð: ÐÝÔ*Ñ,Ô,ˆJˆJà!ˆJå(ˆØˆˆZ˜ *¨gÅÔAZÐ[Ñ[Ô[Ð[ØˆˆZ˜ -½3Ð?Ñ?Ô?Ð?àð 	ð 	ˆAØŒu˜Ò%Ð%Ø×.Ò.¨q¸:Ð.ÑFÔFÐFØ�ð &ð ÐØÐð Ðr?   c                ó  — |€t          j        ¦   «         }n|}t          } |||dt          ¬¦  «          |||dt          ¬¦  «         |                     d¦  «        }|�dD ]} ||||dz   t          ¬¦  «         Œ|€|S dS )z¡
        get a PageLayout object from an mxPageLayout

        Called out from mxPrintToPageLayout because it
        is also used in the <defaults> tag
        Nzpage-heightrW   z
page-widthzpage-margins©ÚtopÚbottomÚleftÚrightú-margin)r   rÒ   rc   rV   r[   )r{   ÚmxPageLayoutrÑ   rÖ   ÚsetaÚmxPageMarginsÚ	directions          r=   rÔ   z'XMLParserBase.xmlPageLayoutToPageLayoutU  sÂ   € ð ÐÝÔ*Ñ,Ô,ˆJˆJà!ˆJå'ˆàˆˆZ˜ }ÅÐOÑOÔOÐOØˆˆZ˜ |½~ÐNÑNÔNÐNð %×)Ò)¨.Ñ9Ô9ˆØÐ$Ø?ð /ð /�	Ø��Z °	¸IÑ0EÝ-ð/ñ /ô /ð /ð /ð ÐØÐð Ðr?   c                óÚ   — |€t          j        ¦   «         }n|}t          } |||ddt          j        ¦  «         |                     d¦  «        }|�|                      ||¬¦  «         |€|S dS )aØ  
        Given an mxPrint object, set object data

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxPrint = EL(
        ...    '<print new-system="yes">'
        ...    '    <system-layout><system-distance>55</system-distance>'
        ...    '        <system-margins><left-margin>20</left-margin>'
        ...    '                 <right-margin>30.25</right-margin></system-margins>'
        ...    '</system-layout></print>'
        ... )
        >>> sl = MP.xmlPrintToSystemLayout(mxPrint)
        >>> sl.isNew
        True
        >>> sl.rightMargin
        30.25
        >>> sl.leftMargin
        20
        >>> sl.distance
        55
        Nú
new-systemrÍ   úsystem-layoutrÐ   )r   ÚSystemLayoutrÓ   r,   rx   r[   ÚxmlSystemLayoutToSystemLayout)r{   rÕ   rÑ   ÚsystemLayoutr×   ÚmxSystemLayouts         r=   ÚxmlPrintToSystemLayoutz$XMLParserBase.xmlPrintToSystemLayoutp  s…   € ð2 ÐÝ!Ô.Ñ0Ô0ˆLˆLà#ˆLå(ˆØˆˆ\˜7 L°'½:Ô;TÑUÔUÐUð !Ÿš oÑ6Ô6ˆàÐ%Ø×.Ò.¨~ÈÐ.ÑUÔUÐUàÐØÐð Ðr?   c                ó  — |€t          j        ¦   «         }n|}t          }|                     d¦  «        }|�dD ]} ||||dz   t          ¬¦  «         Œ |||ddt          ¬¦  «          |||dd	t          ¬¦  «         |€|S dS )
z±
        get a SystemLayout object from an <system-layout> element

        Called out from xmlPrintToSystemLayout because it
        is also used in the <defaults> tag
        Nzsystem-marginsrÚ   rß   rW   zsystem-distanceÚdistanceztop-system-distanceÚtopDistance)r   rç   rc   r[   rV   )r{   rê   rÑ   ré   rá   ÚmxSystemMarginsrã   s          r=   rè   z+XMLParserBase.xmlSystemLayoutToSystemLayoutš  sÝ   € ð ÐÝ!Ô.Ñ0Ô0ˆLˆLà#ˆLå'ˆð )×-Ò-Ð.>Ñ?Ô?ˆØÐ&Ø?ð /ð /�	Ø��\ ?°IÀ	Ñ4IÝ-ð/ñ /ô /ð /ð /ð 	ˆˆ\˜>Ð+<¸jÝ%ð	'ñ 	'ô 	'ð 	'àˆˆ\˜>Ð+@À-Ý%ð	'ñ 	'ô 	'ð 	'ð
 ÐØÐð Ðr?   c                ó:  — |€t          j        ¦   «         }n|}t          } |||ddt          ¬¦  «         |                     d¦  «        }|�t          |¦  «        }||_        t          | d¦  «        r%t          | d¦  «        r|pd| j        f}|| j	        |<   |€|S dS )	z²
        get a StaffLayout object from an <staff-layout> tag

        In music21, the <staff-layout> and <staff-details> are
        intertwined in a StaffLayout object.
        Nzstaff-distancerí   rW   ÚnumberÚstaffLayoutObjectsÚoffsetMeasureNoteé   )
r   ÚStaffLayoutrc   rV   rv   rR   ÚstaffNumberr–   ró   rò   )r{   ÚmxStaffLayoutrÑ   ÚstaffLayoutrá   rö   ÚstaffLayoutKeys          r=   ÚxmlStaffLayoutToStaffLayoutz)XMLParserBase.xmlStaffLayoutToStaffLayout¹  sÖ   € ð ÐÝ Ô,Ñ.Ô.ˆKˆKà"ˆKÝ'ˆØˆˆ[˜-Ø˜zµ^ð	Eñ 	Eô 	Eð 	Eð $×'Ò'¨Ñ1Ô1ˆØÐ"Ý˜kÑ*Ô*ˆKØ&1ˆKÔ#å�4Ð-Ñ.Ô.ð 	Bµ7¸4ÐATÑ3UÔ3Uð 	BØ*Ð/¨a°$Ô2HÐIˆNØ6AˆDÔ# NÑ3àÐØÐð Ðr?   rn   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚmxAccidentalNameToM21r„   r‘   r˜   rž   r�   r¤   r¨   r§   r¦   r¸   rÊ   rØ   rÔ   rë   rè   rú   © r?   r=   rk   rk     sc  € € € € € ðð ð /;Ø5KØ-8Ø4IØ*7Ø,:ðð Ðð;-ð ;-ð ;-ð ;-ðz5ð 5ð 5ð&Dð Dð Dðð ð ðFð Fð Fð	+ð 	+ð 	+ðGð Gð GðNð Nð Nð8
Nð 
Nð 
Nð2ð 2ð 2ðM0ð M0ð M0ð^,ð ,ð ,ð ,ð\ð ð ð ð6( ð ( ð ( ð ( ðT ð  ð  ð  ð>ð ð ð ð ð r?   rk   c                  ó   — e Zd ZdZd„ Zd„ ZdS )Ú	PartGroupz†
    Small helper class for keeping track of part-groups from XML since they
    are converted to StaffGroup spanners much later.
    c                ó‚   — || _         g | _        |                     d¦  «        }|�t          |¦  «        }nd}|| _        d S )Nrñ   rô   )ÚmxPartGroupÚpartGroupIdsrv   rR   rñ   )r{   r  rñ   s      r=   Ú__init__zPartGroup.__init__Ü  sF   € Ø&ˆÔØˆÔØ—’ Ñ*Ô*ˆØÐÝ˜‘[”[ˆFˆFàˆFØˆŒˆˆr?   c                ó:   — | j                              |¦  «         dS )z8
        Add a partGroupId to self.partGroupIds
        N)r  rÃ   )r{   ÚpartGroupIds     r=   rg   zPartGroup.addæ  s!   € ð 	Ô× Ò  Ñ-Ô-Ð-Ð-Ð-r?   N)rû   rü   rý   rþ   r  rg   r   r?   r=   r  r  Ö  s<   € € € € € ðð ð
ð ð ð.ð .ð .ð .ð .r?   r  c                  óì   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd)d„Zd„ Z	d	„ Z
d
„ Zd)d„Zd„ Zd„ Zd„ Z	 	 d*d+d„Zd,d„Z ej        ddd¦  «        	 d)d-d„¦   «         Zed.d"„¦   «         Zd/d$„Z	 d)d0d'„Zd(„ Zˆ xZS )1ÚMusicXMLImporterzR
    Object for importing .xml, .mxl, .musicxml, MusicXML files into music21.
    c                óH  •— t          ¦   «                              ¦   «          d | _        d | _        d | _        t          j        ¦   «         | _        d| _        d| _        | j        j	        | _	        i | _
        i | _        g | _        g | _        t          j        | _        d| _        d S )NF)Úsuperr  ÚxmlTextÚxmlFilenameÚxmlRootr&   ÚScoreÚdefinesExplicitSystemBreaksÚdefinesExplicitPageBreaksÚspannerBundleÚmxScorePartDictÚm21PartObjectsByIdÚpartGroupListÚpartsr   ÚmusicxmlVersionÚmusicXmlVersionÚapplyFinaleWorkarounds)r{   Ú	__class__s    €r=   r  zMusicXMLImporter.__init__ô  s“   ø€ Ý‰Œ×ÒÑÔÐØˆŒØˆÔØˆŒÝ”l‘n”nˆŒà+0ˆÔ(Ø).ˆÔ&à!œ[Ô6ˆÔØ!ˆÔØ"$ˆÔØˆÔØˆŒ
å'Ô7ˆÔð
 ',ˆÔ#Ð#Ð#r?   c                ó:   — |                       |¦  «         | j        S )zt
        main program: opens a file given by filename and returns a complete
        music21 Score from it.
        )ÚreadFiler&   )r{   Úfilenames     r=   ÚscoreFromFilezMusicXMLImporter.scoreFromFile  s   € ð 	�Š�hÑÔÐàŒ{Ðr?   c                ó   — t          j        |¦  «        }|                     ¦   «         | _        | j        j        dk    r t          dd| j        j        › d�z   ¦  «        ‚|                      | j        | j        ¦  «         d S )Núscore-partwiseú3Cannot parse MusicXML files not in score-partwise. úRoot tag was 'ú')ÚETÚparseÚgetrootr  r`   r/   ÚxmlRootToScorer&   )r{   r  Úetrees      r=   r  zMusicXMLImporter.readFile  s‚   € Ý”˜Ñ"Ô"ˆØ—}’}‘”ˆŒØŒ<ÔÐ/Ò/Ð/Ý)Ð*_Ø,P¸T¼\Ô=MÐ,PÐ,PÐ,Pñ+Qñ Rô Rð Rà×Ò˜DœL¨$¬+Ñ6Ô6Ð6Ð6Ð6r?   c                ó  — t          | j        t          ¦  «        r| j                             d¦  «        | _        t	          j        | j        ¦  «        }	 t          j        |¦  «        }|                     ¦   «         | _	        n3# t          j
        $ r! t          j        | j        ¦  «        | _	        Y nw xY w| j	        j        dk    r t          dd| j	        j        › d�z   ¦  «        ‚|                      | j	        | j        ¦  «         d S )Nzutf-8r!  r"  r#  r$  )rr   r  ÚbytesÚdecodeÚioÚStringIOr%  r&  r'  r  Ú
ParseErrorÚXMLr`   r/   r(  r&   )r{   Úsior)  s      r=   ÚparseXMLTextzMusicXMLImporter.parseXMLText  sû   € Ý�d”l¥EÑ*Ô*ð 	8Øœ<×.Ò.¨wÑ7Ô7ˆDŒLÝŒk˜$œ,Ñ'Ô'ˆð	0õ ”H˜S‘M”MˆEØ Ÿ=š=™?œ?ˆDŒLˆLøÝŒ}ð 	0ð 	0ð 	0Ýœ6 $¤,Ñ/Ô/ˆDŒLˆLˆLð	0øøøð Œ<ÔÐ/Ò/Ð/Ý)Ð*_Ø,P¸T¼\Ô=MÐ,PÐ,PÐ,Pñ+Qñ Rô Rð Rà×Ò˜DœL¨$¬+Ñ6Ô6Ð6Ð6Ð6s   Á-B Â-B2Â1B2Nc                óÌ  — |€t          j        ¦   «         }n|}|                     d¦  «        }|�|| _        |                      |¦  «        }|                     d|¦  «         |                     d¦  «        }|�+|                      |¦  «        }|                     d|¦  «         |                     d¦  «        D ]-}|  	                    |¦  «        }	|                     d|	¦  «         Œ.|  
                    |¦  «         |                     d¦  «        D ]¼}
|
                     d¦  «        }|€,t          | j                             ¦   «         ¦  «        d         }	 | j        |         }n0# t          $ r# t                               d|› �d	z   ¦  «         Y Œ€w xY w|                      |
|¦  «        }|� |                     d
|¦  «         || j        |<   Œ½|                      ¦   «          | j                             t,          j        ¦  «        D ]	}d|_        Œ
g }| j                             d¦  «        D ]2}| j                              d|¦  «         |                     |¦  «         Œ3|D ]}| j                             |¦  «         Œ|                     ¦   «          | j        |_        | j        |_        |j        D ]}
| j        |
_        | j        |
_        Œ|                      ¦   «          |€|S dS )z:
        parse an xml file into a Score() object.
        NÚversionr   r   ÚcreditÚpartÚidz$Cannot find info for part with name z, skipping the partç        T)!r&   r  rv   r  ÚxmlMetadataÚ
coreInsertr[   ÚxmlDefaultsToScoreLayoutÚfindallÚxmlCreditToTextBoxÚparsePartListÚlistr  ÚkeysÚKeyErrorÚenvironLocalÚ
printDebugÚxmlPartToPartr  Ú
partGroupsr  Ú
getByClassr   ÚArpeggioMarkSpannerÚcompleteStatusÚgetByCompleteStatusrÃ   ÚremoveÚcoreElementsChangedr  r  r  Úsort)r{   ÚmxScorerÑ   ÚsÚ	mxVersionÚmdÚ
mxDefaultsÚscoreLayoutÚmxCreditr5  ÚpÚpartIdÚmxScorePartr6  ÚspÚrms                   r=   r(  zMusicXMLImporter.xmlRootToScore/  s  € ð ÐÝ”‘”ˆAˆAàˆAà—K’K 	Ñ*Ô*ˆ	ØÐ Ø#,ˆDÔ à×Ò˜gÑ&Ô&ˆØ	�Š�Q˜ÑÔÐà—\’\ *Ñ-Ô-ˆ
ØÐ!Ø×7Ò7¸
ÑCÔCˆKØ�LŠL˜˜KÑ(Ô(Ð(àŸš¨Ñ1Ô1ð 	$ð 	$ˆHØ×,Ò,¨XÑ6Ô6ˆFØ�LŠL˜˜FÑ#Ô#Ð#Ð#à×Ò˜7Ñ#Ô#Ð#Ø—’ Ñ(Ô(ð 	7ð 	7ˆAØ—U’U˜4‘[”[ˆFØˆ~Ý˜dÔ2×7Ò7Ñ9Ô9Ñ:Ô:¸1Ô=�ðØ"Ô2°6Ô:��øÝð ð ð Ý×'Ò'Ð(WÈvÐ(WÐ(WØ*?ñ)@ñ Aô Að Aà�ðøøøð
 ×%Ò% a¨Ñ5Ô5ˆDàÐØ—’˜S $Ñ'Ô'Ð'Ø26�Ô'¨Ñ/øà�ŠÑÔÐð Ô$×/Ò/µÔ0OÑPÔPð 	%ð 	%ˆBØ $ˆBÔÐð ˆØÔ$×8Ò8¸Ñ>Ô>ð 	ð 	ˆBØŒK×"Ò" 1 bÑ)Ô)Ð)Ø�IŠI�b‰MŒMˆMˆMàð 	*ð 	*ˆBØÔ×%Ò% bÑ)Ô)Ð)Ð)à	×ÒÑÔÐØ(,Ô(HˆÔ%Ø&*Ô&DˆÔ#Ø”ð 	Ið 	IˆAØ,0Ô,LˆAÔ)Ø*.Ô*HˆAÔ'Ð'à	�Š‰ŒˆØÐØˆHð Ðs   ÅE%Å%*FÆFc                ór   — t          ||| ¬¦  «        }|                     ¦   «          |j        du r|j        S dS )z[
        Given a <part> object and the <score-part> object, parse a complete part.
        )rV  ÚparentTN)Ú
PartParserr&  ÚappendToScoreAfterParser&   )r{   ÚmxPartrV  Úparsers       r=   rD  zMusicXMLImporter.xmlPartToPartu  s@   € õ ˜F°ÀDÐIÑIÔIˆØ�Š‰ŒˆØÔ)¨TÐ1Ð1Ø”=Ð à�4r?   c                óp  — |                      d¦  «        }|€dS g }|D �]}|j        dk    r:|                     d¦  «        }|| j        |<   |D ]}|                     |¦  «         ŒŒH|j        dk    rÃ|                     d¦  «        dk    r?t          |¦  «        }| j                             |¦  «         |                     |¦  «         Œ«|                     d¦  «        dk    rR|                     d	¦  «        }|�t          |¦  «        }nd
}g }|D ]"}|j	        |k    r|                     |¦  «         Œ#|}�ŒdS )zç
        Parses the <part-list> tag and adds
        <score-part> entries into self.mxScorePartDict[partId]
        and adds them to any open <part-group> entries,
        stored as PartGroup objects in self.partGroupList

        z	part-listNz
score-partr7  z
part-groupÚtypeÚstartÚstoprñ   rô   )
r[   r`   rv   r  rg   r  r  rÃ   rR   rñ   )	r{   rM  Ú
mxPartListÚopenPartGroupsÚpartListElementrU  Úpgrñ   ÚopgTemps	            r=   r>  zMusicXMLImporter.parsePartList€  sq  € ð —\’\ +Ñ.Ô.ˆ
ØÐØˆFØˆØ)ð 	-ñ 	-ˆOØÔ" lÒ2Ð2Ø(×,Ò,¨TÑ2Ô2�Ø/>�Ô$ VÑ,Ø(ð #ð #�BØ—F’F˜6‘N”N�N�Nð#à Ô$¨Ò4Ð4Ø"×&Ò& vÑ.Ô.°'Ò9Ð9Ý" ?Ñ3Ô3�BØÔ&×-Ò-¨bÑ1Ô1Ð1Ø"×)Ò)¨"Ñ-Ô-Ð-Ð-Ø$×(Ò(¨Ñ0Ô0°FÒ:Ð:Ø,×0Ò0°Ñ:Ô:�FØÐ)Ý!$ V¡¤˜˜à!"˜Ø �GØ,ð /ð /˜Øœ9¨Ò.Ð.Ø#ŸNšN¨2Ñ.Ô.Ð.øØ%,�Nùð+	-ð 	-r?   c                ó  — t          j        ¦   «         }d|j        _        d|j        _        |                     d¦  «        }|€d}nt          |¦  «        }||_        g }|                     d¦  «        D ]%}|j         dvr| 	                    |j         ¦  «         Œ&|s	d|_
        |S d                     |¦  «        |_
        |                     d¦  «        }|                      ||¦  «         |                     d¦  «        |j        _        |S )	a‰  
        Convert a MusicXML credit to a music21 TextBox

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> credit = EL('<credit page="2"><credit-words>Testing</credit-words></credit>')

        >>> MI = musicxml.xmlToM21.MusicXMLImporter()
        >>> tb = MI.xmlCreditToTextBox(credit)
        >>> tb.page
        2
        >>> tb.content
        'Testing'

        OMIT_FROM_DOCS

        Capella generates empty credit-words.  Make sure they do not crash.

        >>> credit = EL('<credit><credit-words/></credit>')
        >>> tb = MI.xmlCreditToTextBox(credit)
        >>> tb
        <music21.text.TextBox ''>
        NÚpagerô   zcredit-wordsrZ   rD   r8   r†   )r*   ÚTextBoxr'   r£   r¢   rv   rR   ri  r<  rÃ   ÚcontentÚjoinr[   r�   r†   )r{   rS  ÚtbÚpageNumrk  ÚcwÚcw1s          r=   r=  z#MusicXMLImporter.xmlCreditToTextBox£  s  € õ0 Œ\‰^Œ^ˆð $(ˆŒÔ Ø!%ˆŒÔà—,’,˜vÑ&Ô&ˆØˆ?ØˆGˆGå˜'‘l”lˆGØˆŒØˆØ×"Ò" >Ñ2Ô2ð 	(ð 	(ˆBØŒw˜jÐ(Ð(Ø—’˜rœwÑ'Ô'Ð'øØð 	ØˆBŒJØˆIà—Y’Y˜wÑ'Ô'ˆŒ
à�mŠm˜NÑ+Ô+ˆà×Ò  RÑ(Ô(Ð(ØŸ7š7 9Ñ-Ô-ˆŒÔð ˆ	r?   c                óB  — |€t          j        ¦   «         }n|}t          }|                     d¦  «        }|�* |||ddt          ¬¦  «          |||ddt          ¬¦  «         |                     d¦  «        }|�|                      |¦  «        |_        |                     d	¦  «        }|�|                      |¦  «        |_        | 	                    d
¦  «        D ]1}|  
                    |¦  «        }	|j                             |	¦  «         Œ2|                      |¦  «         |S )zc
        Convert a <defaults> tag to a :class:`~music21.layout.ScoreLayout`
        object
        NÚscalingÚmillimetersÚscalingMillimetersrW   ÚtenthsÚscalingTenthsrÏ   ræ   ústaff-layout)r   ÚScoreLayoutrc   r[   rV   rÔ   rÖ   rè   ré   r<  rú   ÚstaffLayoutListrÃ   ÚstyleFromXmlDefaults)
r{   rQ  rÑ   rR  rá   Ú	mxScalingrà   rê   r÷   rø   s
             r=   r;  z)MusicXMLImporter.xmlDefaultsToScoreLayoutÜ  s;  € ð
 ÐÝ Ô,Ñ.Ô.ˆKˆKà"ˆKå'ˆà—O’O IÑ.Ô.ˆ	ØÐ ØˆD�˜i¨Ð8LÝ)ð+ñ +ô +ð +àˆD�˜i¨°?ÍnÐ]Ñ]Ô]Ð]ð "—’ }Ñ5Ô5ˆØÐ#Ø%)×%CÒ%CÀLÑ%QÔ%QˆKÔ"Ø#Ÿš¨Ñ9Ô9ˆØÐ%Ø'+×'IÒ'IÈ.Ñ'YÔ'YˆKÔ$Ø'×/Ò/°Ñ?Ô?ð 	<ð 	<ˆMØ×:Ò:¸=ÑIÔIˆKØÔ'×.Ò.¨{Ñ;Ô;Ð;Ð;à×!Ò! *Ñ-Ô-Ð-àÐr?   c                ó¼  — |                      d¦  «        }|�|                      |¦  «         |                      d¦  «        }|�:t          j        ¦   «         }|                      ||¦  «         || j        j        _        |                      d¦  «        }|�:t          j        ¦   «         }|                      ||¦  «         || j        j        _        |                     d¦  «        D ]h}t          j        ¦   «         }|                      ||¦  «         | 	                    d¦  «        }||f}| j        j        j
                             |¦  «         Œi|                     d¦  «        D ]y}	d}
|	 	                    d¦  «        }|	j                             ¦   «         D ]\  }}|                     d	¦  «        r|}
 nŒ||
f}| j        j        j                             |¦  «         ŒzdS )
a  
        Set the appearance and font information from mxDefault
        <appearance>, <music-font>, <word-font>, <lyric-font> (multiple),
        and <lyric-language> tags.

        Here the demo does not include the <appearance> tag since that is
        documented in `xmlAppearanceToStyle`

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> defaults = EL(
        ...    '<defaults>'
        ...    '<music-font font-family="Maestro, Opus" font-weight="bold" />'
        ...    '<word-font font-family="Garamond" font-style="italic" />'
        ...    '<lyric-font name="verse" font-size="12" />'
        ...    '<lyric-font name="chorus" font-size="14" />'
        ...    '<lyric-language name="verse" xml:lang="fr" />'
        ...    '<lyric-language name="chorus" xml:lang="en" />'
        ...    '</defaults>'
        ... )

        >>> MI = musicxml.xmlToM21.MusicXMLImporter()
        >>> MI.styleFromXmlDefaults(defaults)
        >>> st = MI.stream.style
        >>> st.musicFont
        <music21.style.TextStyle object at 0x10535c0f0>
        >>> st.musicFont.fontFamily
        ['Maestro', 'Opus']
        >>> st.musicFont.fontWeight
        'bold'
        >>> st.wordFont.fontFamily
        ['Garamond']
        >>> st.wordFont.fontStyle
        'italic'
        >>> len(st.lyricFonts)
        2
        >>> st.lyricFonts[0]
        ('verse', <music21.style.TextStyle object at 0x10535d438>)
        >>> st.lyricFonts[0][1].fontSize
        12
        >>> st.lyricLanguages
        [('verse', 'fr'), ('chorus', 'en')]
        Ú
appearanceNz
music-fontz	word-fontz
lyric-fontÚnamezlyric-languageÚenz}lang)r[   ÚxmlAppearanceToStyler'   Ú	TextStyler§   r&   Ú	musicFontÚwordFontr<  rv   Ú
lyricFontsrÃ   ÚattribÚitemsÚendswithÚlyricLanguages)r{   rQ  ÚmxAppearanceÚmxMusicFontÚstÚ
mxWordFontÚmxLyricFontÚ	lyricNameÚ
styleTupleÚmxLyricLanguageÚlyricLanguageÚaKeyrH   Ú
lyricTuples                 r=   rz  z%MusicXMLImporter.styleFromXmlDefaultsý  så  € ðX "—’ |Ñ4Ô4ˆØÐ#Ø×%Ò% lÑ3Ô3Ð3à —o’o lÑ3Ô3ˆØÐ"Ý”Ñ"Ô"ˆBØ�LŠL˜ bÑ)Ô)Ð)Ø*,ˆDŒKÔÔ'à—_’_ [Ñ1Ô1ˆ
ØÐ!Ý”Ñ"Ô"ˆBØ�LŠL˜ RÑ(Ô(Ð(Ø)+ˆDŒKÔÔ&à%×-Ò-¨lÑ;Ô;ð 	<ð 	<ˆKÝ”Ñ"Ô"ˆBØ�LŠL˜ bÑ)Ô)Ð)Ø#Ÿš¨Ñ/Ô/ˆIØ# R˜ˆJØŒKÔÔ(×/Ò/°
Ñ;Ô;Ð;Ð;à)×1Ò1Ð2BÑCÔCð 		@ð 		@ˆOØ ˆMØ'×+Ò+¨FÑ3Ô3ˆIØ.Ô5×;Ò;Ñ=Ô=ð ð ‘��eà—=’= Ñ)Ô)ð Ø$)�MØ�Eðð # MÐ1ˆJØŒKÔÔ,×3Ò3°JÑ?Ô?Ð?Ð?ð		@ð 		@r?   c                óR  — |                      d¦  «        D ]X}|                     d¦  «        }t          j        |j        ¦  «        }||f}| j        j        j                             |¦  «         ŒY|                      d¦  «        D ]X}|                     d¦  «        }t          j        |j        ¦  «        }||f}	| j        j        j	                             |	¦  «         ŒY|                      d¦  «        D ]X}
|
                     d¦  «        }t          j        |
j        ¦  «        }||f}| j        j        j
                             |¦  «         ŒY|                      d¦  «        D ]F}|                     d¦  «        }|j        }||f}| j        j        j                             |¦  «         ŒGdS )a   
        Parse the appearance tag for information about line widths and note sizes

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> appear = EL(
        ...    '<appearance>'
        ...    '<line-width type="beam">5</line-width>'
        ...    '<line-width type="ledger">1.5625</line-width>'
        ...    '<note-size type="grace">60</note-size>'
        ...    '<distance type="hyphen">0.5</distance>'
        ...    '<other-appearance type="sharps">dotted</other-appearance>'
        ...    '</appearance>'
        ... )

        >>> MI = musicxml.xmlToM21.MusicXMLImporter()
        >>> MI.xmlAppearanceToStyle(appear)
        >>> st = MI.stream.style

        >>> st.lineWidths
        [('beam', 5), ('ledger', 1.5625)]

        >>> st.noteSizes
        [('grace', 60)]

        >>> st.distances
        [('hyphen', 0.5)]

        >>> st.otherAppearances
        [('sharps', 'dotted')]
        z
line-widthr`  z	note-sizerí   zother-appearanceN)r<  rv   r
   ry   r*   r&   r'   Ú
lineWidthsrÃ   Ú	noteSizesÚ	distancesÚotherAppearances)r{   r‰  ÚmxLineWidthÚlineWidthTypeÚlineWidthValueÚlineWidthInfoÚ
mxNoteSizeÚnoteSizeTypeÚnoteSizeValueÚnoteSizeInfoÚ
mxDistanceÚdistanceTypeÚdistanceValueÚdistanceInfoÚmxOtherÚ	otherTypeÚ
otherValueÚ	otherInfos                     r=   r€  z%MusicXMLImporter.xmlAppearanceToStyleK  s®  € ð@ (×/Ò/°Ñ=Ô=ð 	?ð 	?ˆKØ'ŸOšO¨FÑ3Ô3ˆMÝ#Ô3°KÔ4DÑEÔEˆNØ*¨NÐ;ˆMØŒKÔÔ(×/Ò/°Ñ>Ô>Ð>Ð>à&×.Ò.¨{Ñ;Ô;ð 	=ð 	=ˆJØ%Ÿ>š>¨&Ñ1Ô1ˆLÝ"Ô2°:´?ÑCÔCˆMØ(¨-Ð8ˆLØŒKÔÔ'×.Ò.¨|Ñ<Ô<Ð<Ð<à&×.Ò.¨zÑ:Ô:ð 	=ð 	=ˆJØ%Ÿ>š>¨&Ñ1Ô1ˆLÝ"Ô2°:´?ÑCÔCˆMØ(¨-Ð8ˆLØŒKÔÔ'×.Ò.¨|Ñ<Ô<Ð<Ð<à#×+Ò+Ð,>Ñ?Ô?ð 	Að 	AˆGØŸš FÑ+Ô+ˆIØ œˆJØ" JÐ/ˆIØŒKÔÔ.×5Ò5°iÑ@Ô@Ð@Ð@ð		Að 	Ar?   c           
     ó8  — t           }| j        D �]‰}t          j        ¦   «         }|j        D ]ª}	 |                     | j        |         ¦  «         Œ$# t          $ rz}d}t          | j        ¦  «        D ]<}| 	                    |dz   ¦  «        r"|                     | j        |         ¦  «         d}Œ=|st          d|› d| j        ›d�¦  «        ‚Y d}~Œ£d}~ww xY w|j        } |||dd	¦  «          |||d
d¦  «         |                     d¦  «        }	|	�; |||dd¦  «         |                      |	|¦  «         |                      |	|¦  «         nd|_         |||dd¦  «         |                      ||¦  «         d|_        | j                             |¦  «         �Œ‹dS )zD
        set StaffGroup objects from the <part-group> tags.
        Fú-StaffTz9Cannot find part in m21PartObjectsById dictionary by Id: z 
   Full Dict:
   r9   Nz
group-namer~  zgroup-abbreviationÚabbreviationzgroup-symbolÚsymbolÚbracezgroup-barlineÚbarTogether)rc   r  r   Ú
StaffGroupr  ÚaddSpannedElementsr  rA  ÚsortedÚ
startswithr/   r  r[   r¦   r¨   r¬  rÊ   rH  r  rÃ   )
r{   rá   ÚpgObjÚ
staffGrouprU  ÚkeÚfoundOneÚ
partIdTestr  ÚmxGroupSymbols
             r=   rE  zMusicXMLImporter.partGroupsƒ  sA  € õ (ˆØÔ'ð #	2ñ #	2ˆEÝÔ*Ñ,Ô,ˆJØÔ,ð Wð W�ðWØ×1Ò1°$Ô2IÈ&Ô2QÑRÔRÐRÐRøÝð 
Wð 
Wð 
WØ$�HÝ&,¨TÔ-DÑ&EÔ&Eð ,ð ,˜
Ø%×0Ò0°¸(Ñ1BÑCÔCð ,Ø&×9Ò9¸$Ô:QÐR\Ô:]Ñ^Ô^Ð^Ø'+˜Høà#ð WÝ5ðVØ "ðVð VØ9=Ô9PðVð Vð VñWô Wð WðWð Wð Wð Wð Wøøøøð
Wøøøð  Ô+ˆKØˆD�˜[¨,¸Ñ?Ô?Ð?àˆD�˜[Ð*>ÀÑOÔOÐOà'×,Ò,¨^Ñ<Ô<ˆMØÐ(Ø��Z ¨n¸hÑGÔGÐGØ× Ò  °
Ñ;Ô;Ð;Ø—’˜m¨ZÑ8Ô8Ð8Ð8à$+�
Ô!àˆD�˜[¨/¸=ÑIÔIÐIð ×Ò˜k¨:Ñ6Ô6Ð6Ø(,ˆJÔ%ØÔ×%Ò% jÑ1Ô1Ð1Ñ1ðG#	2ð #	2s   ¯ AÁ
CÁA0CÃCÚelrA   rÑ   úmetadata.Metadata | Noner6   c                ó   — |€| j         }|€t          j        ¦   «         }n|}t          }|                     d¦  «        }|�* |||dd¦  «          |||dd¦  «          |||dd¦  «          |||d	d
¦  «          |||dd¦  «         |d         |d         k    rd|d<   |                     d¦  «        }|�|                      ||¦  «         |€|S dS )zµ
        Converts part of the root element into a metadata object

        Supported: work-title, work-number, opus, movement-number,
        movement-title, identification
        NÚworkz
work-titleÚtitlezwork-numberrñ   ÚopusÚ
opusNumberzmovement-numberÚmovementNumberzmovement-titleÚmovementNameÚidentification)r  r   ÚMetadatari   r[   ÚaddIdentificationToMetadata)r{   r¹  rÑ   rP  Úadd_mr¼  rÂ  s          r=   r9  zMusicXMLImporter.xmlMetadata®  s  € ð ˆ:Ø”ˆBàÐÝÔ"Ñ$Ô$ˆBˆBàˆBå+ˆð �wŠw�v‰ŒˆØÐØˆE�"�d˜L¨'Ñ2Ô2Ð2ØˆE�"�d˜M¨8Ñ4Ô4Ð4ØˆE�"�d˜F LÑ1Ô1Ð1àˆˆb�"Ð'Ð)9Ñ:Ô:Ð:Øˆˆb�"Ð&¨Ñ7Ô7Ð7ð ˆgŒ;˜"˜^Ô,Ò,Ð,ØˆBˆw‰KàŸšÐ!1Ñ2Ô2ˆØÐ%Ø×,Ò,¨^¸RÑ@Ô@Ð@àÐØˆIØˆtr?   rÂ  ú
ET.ElementrP  re   ÚNonec                ó  — |                      d¦  «        D ]c}|                      |¦  «        }|                     |j        ¦  «        r|                     |j        |¦  «         ŒM|                     d|¦  «         Œd|                      d¦  «        D ]-}|                      |¦  «        }|                     d|¦  «          |                     d¦  «        }|�|                      ||¦  «         |                     d¦  «        }|�}|                      d¦  «        D ]i}|                     d	¦  «        }	|	€Œ|j	        }
|
€d
}
|  
                    |	¦  «        r|                     |	|
¦  «         ŒQ|                     |	|
¦  «         ŒhdS dS )a  
        Given an <identification> tag, , containing <creator> tags, <rights> tags, and
        <miscellaneous> tags etc., add this information to the
        :class:`~music21.metadata.Metadata` object passed in.

        (Replaces identificationToMetadata which is now deprecated.)

        Not supported: source, relation

        Only the first <rights> tag is supported

        Encoding only parses "supports" and that only has
        new-system (definesExplicitSystemBreaks) and
        new-page (definesExplicitPageBreaks)
        ÚcreatorÚotherContributorÚrightsÚ	copyrightÚencodingNÚmiscellaneouszmiscellaneous-fieldr~  rD   )r<  ÚcreatorToContributorÚisContributorUniqueNameÚrolerg   ÚrightsToCopyrightr[   ÚprocessEncodingrv   r*   ÚisRecognizableMetadataKeyÚ	addCustom)r{   rÂ  rP  rÉ  rÈ   rË  rÍ  rÎ  ÚmxMiscFieldÚmiscFieldNameÚmiscFieldValues              r=   rÄ  z,MusicXMLImporter.addIdentificationToMetadataä  s¸  € ð( &×-Ò-¨iÑ8Ô8ð 	.ð 	.ˆGØ×)Ò)¨'Ñ2Ô2ˆAØ×)Ò)¨!¬&Ñ1Ô1ð .Ø—’�q”v˜qÑ!Ô!Ð!Ð!ð —’Ð)¨1Ñ-Ô-Ð-Ð-à$×,Ò,¨XÑ6Ô6ð 	ð 	ˆFØ×&Ò& vÑ.Ô.ˆAØ�FŠF�; Ñ"Ô"Ð"Øà!×&Ò& zÑ2Ô2ˆØÐØ× Ò  ¨2Ñ.Ô.Ð.ð '×+Ò+¨OÑ<Ô<ˆØÐ$Ø,×4Ò4Ð5JÑKÔKð @ð @�Ø +§¢°Ñ 7Ô 7�Ø Ð(ØØ!,Ô!1�Ø!Ð)Ø%'�Nà×1Ò1°-Ñ@Ô@ð @Ø—F’F˜=¨.Ñ9Ô9Ð9Ð9ð —L’L °Ñ?Ô?Ð?Ð?ð %Ð$ð@ð @r?   zuse addIdentificationToMetadataÚv10Úv11c                ój   — |�|}nt          j        ¦   «         }|                      ||¦  «         |�|S dS )zu
        Deprecated -- use addIdentificationToMetadata instead and always
        pass in a metadata object.
        N)r   rÃ  rÄ  )r{   rÂ  rÑ   rP  s       r=   ÚidentificationToMetadataz)MusicXMLImporter.identificationToMetadata  sE   € ð ÐØˆBˆBåÔ"Ñ$Ô$ˆBØ×(Ò(¨¸Ñ<Ô<Ð<ØÐØˆIØˆtr?   r×  rB   Úboolc                ó   — | t           v S )a¤  
        Returns bool on whether `miscFieldName` is a one of the names
        that is among the list of names we might see in <miscellaneous>,
        that this parser will interpret as supported metadata keys.
        Currently, this is all the uniqueName keys (e.g. 'dateCreated'),
        the 'namespace:name' keys (e.g. 'dcterms:created'),
        and the pre-v8 music21 workIds (e.g. 'date').

        >>> MI = musicxml.xmlToM21.MusicXMLImporter()
        >>> MI.isRecognizableMetadataKey('dateCreated')
        True
        >>> MI.isRecognizableMetadataKey('dcterms:created')
        True
        >>> MI.isRecognizableMetadataKey('dateDestroyed')
        False
        )r3   )r×  s    r=   rÔ  z*MusicXMLImporter.isRecognizableMetadataKey0  s   € ð$ Õ 1Ð1Ð1r?   rÍ  c                ó¢  — d}d}|                      d¦  «        D ]3}t          |¦  «        x}r |sd|v rd}d}|                     d|¦  «         Œ4|rd| _        |                      d¦  «        D ]b}|                     d¦  «        }|                     d¦  «        }	|	€|                     d	¦  «        }	||	fd
k    rd| _        ŒS||	fdk    rd| _        ŒcdS )aM  
        Process all information in the <encoding> element and put it into the
        Metadata object passed in as `md`.

        Currently only processes 'software' and these `supports` attributes:

            * new-system = Metadata.definesExplicitSystemBreaks
            * new-page = Metadata.definesExplicitPageBreaks
        FÚsoftwareÚFinaleTÚsupportsÚ	attributerH   Nr`  )rå   r½   )rÌ   r½   )r<  rG   rg   r  rv   r  r  )
r{   rÍ  rP  ÚfoundOneSoftwareTagÚfinaleIsFirstrà  ÚsoftwareTextrâ  ÚattrrH   s
             r=   rÓ  z MusicXMLImporter.processEncodingD  s  € ð  %*ÐØ#ˆØ ×(Ò(¨Ñ4Ô4ð 	1ð 	1ˆHÝ+¨HÑ5Ô5Ð5ˆ|ð 1Ø*ð -Ø <Ð/Ð/Ø(,˜Ø&*Ð#Ø—’�z <Ñ0Ô0Ð0øØð 	/Ø*.ˆDÔ'à ×(Ò(¨Ñ4Ô4ð 	6ð 	6ˆHð —<’< Ñ,Ô,ˆDØ—L’L Ñ)Ô)ˆEØˆ}Ø Ÿš VÑ,Ô,�ð �eˆ}Ð 5Ò5Ð5Ø37�Ô0Ð0Ø˜�Ð"5Ò5Ð5Ø15�Ô.øð!	6ð 	6r?   rÉ  ú&metadata.primitives.Contributor | Nonec                ó¾   — |€t          j        ¦   «         }n|}|                     d¦  «        }|�||_        |j        }|�|                     ¦   «         |_        |€|S dS )aÀ  
        Given a <creator> tag, fill the necessary parameters of a Contributor.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> creator = EL('<creator type="composer">Beethoven, Ludwig van</creator>')

        >>> MI = musicxml.xmlToM21.MusicXMLImporter()
        >>> c = MI.creatorToContributor(creator)
        >>> c
        <music21.metadata.primitives.Contributor composer:Beethoven, Ludwig van>
        >>> c.role
        'composer'
        >>> c.name
        'Beethoven, Ludwig van'

        Pass in a Contributor object and set it:

        >>> c2 = metadata.Contributor()
        >>> MI.creatorToContributor(creator, c2)
        >>> c2.role
        'composer'
        Nr`  )r   ÚContributorrv   rÑ  r*   r:   r~  )r{   rÉ  rÑ   rÈ   ÚcreatorTypeÚcreatorTexts         r=   rÏ  z%MusicXMLImporter.creatorToContributorr  sr   € ð4 ÐÝÔ$Ñ&Ô&ˆAˆAàˆAà—k’k &Ñ)Ô)ˆØÐ"ð
 !ˆAŒFà”lˆØÐ"Ø ×&Ò&Ñ(Ô(ˆAŒFØÐØˆHð Ðr?   c                ó¤   — |j         }|�|                     ¦   «         }t          j        |¦  «        }|                     d¦  «        }|�||_        |S )a   
        Given a <rights> tag, fill the necessary parameters of a
        :class:`~music21.metadata.primitives.Copyright` object.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> rights = EL('<rights type="owner">CC-SA-BY</rights>')

        >>> MI = musicxml.xmlToM21.MusicXMLImporter()
        >>> c = MI.rightsToCopyright(rights)
        >>> c
        <music21.metadata.primitives.Copyright CC-SA-BY>
        >>> c.role
        'owner'
        >>> str(c)
        'CC-SA-BY'
        Nr`  )r*   r:   r   Ú	Copyrightrv   rÑ  )r{   rË  ÚrtrÈ   ÚcopyrightTypes        r=   rÒ  z"MusicXMLImporter.rightsToCopyrightŸ  sP   € ð$ Œ[ˆØˆ>Ø—’‘”ˆBåÔ˜rÑ"Ô"ˆàŸ
š
 6Ñ*Ô*ˆØÐ$Ø"ˆAŒFàˆr?   rn   ©NN)r¹  rA   rÑ   rº  r6   rº  )rÂ  rÆ  rP  re   r6   rÇ  )rÂ  rÆ  rÑ   rº  r6   rº  )r×  rB   r6   rÝ  )rÍ  rÆ  rP  re   r6   rÇ  )rÉ  rÆ  rÑ   rè  )rû   rü   rý   rþ   r  r  r  r2  r(  rD  r>  r=  r;  rz  r€  rE  r9  rÄ  r
   Ú
deprecatedrÜ  ÚstaticmethodrÔ  rÓ  rÏ  rÒ  Ú__classcell__©r  s   @r=   r
  r
  ï  sã  ø€ € € € € ðð ð,ð ,ð ,ð ,ð ,ð.ð ð ð7ð 7ð 7ð7ð 7ð 7ð$Dð Dð Dð DðL	ð 	ð 	ð!-ð !-ð !-ðF7ð 7ð 7ðrð ð ð ðBL@ð L@ð L@ð\6Að 6Að 6Aðp(2ð (2ð (2ðZ #Ø+/ð3ð 3ð 3ð 3ð 3ðl6@ð 6@ð 6@ð 6@ðp €VÔÐ8¸%ÀÑGÔGð ,0ðð ð ð ñ HÔGðð& ð2ð 2ð 2ñ „\ð2ð&,6ð ,6ð ,6ð ,6ð` OSð+ð +ð +ð +ð +ðZð ð ð ð ð ð r?   r
  c                  óº   ‡ — e Zd ZdZ	 	 	 d3d4ˆ fd„Zd5d„Zd6d„Zd7d„Zd„ Zd8d9d„Z	e
d:d„¦   «         Zd„ Zd5d„Zd;d„Zd<d$„Zd=d&„Zd>d)„Zd?d,„Zd@d.„Zd@d/„ZdAd2„Zˆ xZS )Br[  zj
    parser to work with a single <part> tag.

    called out for multiprocessing potential in future
    Nr]  rA   rV  rZ  úMusicXMLImporter | Nonec                ó|  •— t          ¦   «                              ¦   «          || _        || _        |�U|                     d¦  «        | _        | j        €3|�1t          |j                             ¦   «         ¦  «        d         | _        nd| _        |�|nt          ¦   «         | _
        | j
        j        | _        t          j        ¦   «         | _        | j        �[| j                             d¦  «        D ]@}t          |¦  «        }|r-t!          |¦  «        dk    rt          j        ¦   «         | _         nŒAd| _        g | _        d | _        d| _        d| _        i | _        d gd	z  | _        d| _        d| _        d | _        d| _        d | _        d | _        d| _        d | _         tB          j"        | _#        d| _$        d | _%        d S )
Nr7  r   rD   zmeasure/attributes/stavesrô   TFr8  é   )&r  r  r]  rV  rv   rU  r?  r  r@  r
  rZ  r  r&   ÚPartr<  rG   rR   Ú	PartStaffÚatSoundingPitchÚstaffReferenceListÚlastTimeSignatureÚlastMeasureWasShortÚlastMeasureOffsetÚ	lastClefsÚactiveTupletsÚ	maxStavesÚlastMeasureNumberÚlastNumberSuffixÚmultiMeasureRestsToCaptureÚactiveMultiMeasureRestSpannerÚactiveInstrumentÚfirstMeasureParsedÚactiveAttributesr   ÚdivisionsPerQuarterÚlastDivisionsr\  ÚlastMeasureParser)r{   r]  rV  rZ  ÚmxStavesÚ
stavesTextr  s         €r=   r  zPartParser.__init__Æ  s°  ø€ õ 	‰Œ×ÒÑÔÐØˆŒØ&ˆÔàÐØ Ÿ*š* TÑ*Ô*ˆDŒKØŒ{Ð" vÐ'9Ý" 6Ô#9×#>Ò#>Ñ#@Ô#@ÑAÔAÀ!ÔD�”øàˆDŒKØ &Ð 2�f�fÕ8HÑ8JÔ8JˆŒØ!œ[Ô6ˆÔå#)¤;¡=¤=ˆŒØŒ;Ð"Ø œK×/Ò/Ð0KÑLÔLð ð �Ý)¨(Ñ3Ô3�
Øð ¥# j¡/¤/°AÒ"5Ð"5Ý"(Ô"2Ñ"4Ô"4�D”KØ�Eøà#ˆÔð =?ˆÔà;?ˆÔØ#(ˆÔ Ø!$ˆÔð 57ˆŒØ:>¸À!¹ˆÔàˆŒà!"ˆÔØ*.ˆÔà*+ˆÔ'ØLPˆÔ*à<@ˆÔØ"'ˆÔØ $ˆÔÝ"*Ô">ˆÔà'+ˆÔ$Ø59ˆÔÐÐr?   r6   rÇ  c                ó¾  — |                       ¦   «          |                      ¦   «          | j        | j        _        g }| j                             d¦  «        D ]L}t          |t          j        ¦  «        s| j         	                    d|¦  «         | 
                    |¦  «         ŒM|D ]}| j                             |¦  «         Œ| j                             ¦   «          g }| j        dk    r|                      ¦   «         }nJ| j        �C| j                             | j        ¦  «         | j        j         
                    | j        ¦  «         |                      ||¦  «         dS )z1
        Run the parser on a single part
        Tr   rô   N)ÚparseXmlScorePartÚparseMeasuresrü  r&   r  rI  rr   r%   ÚOttavar:  rÃ   rJ  rK  r  ÚseparateOutPartStavesrU  ÚaddGroupForElementsÚgroupsÚ _fillAndInsertOttavasInPartStaff)r{   ÚcompletedSpannersrW  Ú
partStavess       r=   r&  zPartParser.parseü  sZ  € ð 	×ÒÑ Ô Ð Ø×ÒÑÔÐØ&*Ô&:ˆŒÔ#ð 46ÐØÔ$×8Ò8¸Ñ>Ô>ð 	)ð 	)ˆBÝ˜b¥'¤.Ñ1Ô1ð .à”×&Ò& q¨"Ñ-Ô-Ð-Ø×$Ò$ RÑ(Ô(Ð(Ð(à#ð 	*ð 	*ˆBØÔ×%Ò% bÑ)Ô)Ð)Ð)àŒ×'Ò'Ñ)Ô)Ð)à-/ˆ
ØŒ>˜AÒÐØ×3Ò3Ñ5Ô5ˆJˆJØŒ[Ð$ØŒK×+Ò+¨D¬KÑ8Ô8Ð8ØŒKÔ×%Ò% d¤kÑ2Ô2Ð2à×-Ò-Ð.?ÀÑLÔLÐLÐLÐLr?   Úspannersúlist[spanner.Spanner]r  úlist[stream.PartStaff]c                ó0  — |D ]’}t          |t          j        ¦  «        sŒd }|r)|                      |                     ¦   «         |¦  «        }n| j        }|�?|                     d|¦  «         |                     ¦   «          |                     |¦  «         Œ“d S )Nr   )	rr   r%   r  Ú_findFirstPartStaffContainingÚgetFirstr&   r:  rK  Úfill)r{   r  r  rW  ÚspannerParts        r=   r  z+PartParser._fillAndInsertOttavasInPartStaff   s©   € ð ð 	%ð 	%ˆBÝ˜b¥'¤.Ñ1Ô1ð ØØ,0ˆKØð *Ø"×@Ò@ÀÇÂÁÄÐPZÑ[Ô[��à"œk�àÐ&Ø×&Ò& q¨"Ñ-Ô-Ð-Ø×/Ò/Ñ1Ô1Ð1Ø—’˜Ñ$Ô$Ð$øð	%ð 	%r?   Úobjúbase.Music21Object | Noneústream.PartStaff | Nonec                óN   — |€d S |D ]}|                      |d¬¦  «        �|c S Œd S )NF©ÚsetActiveSite)ÚcontainerInHierarchy)r{   r"  r  Ú	partStaffs       r=   r  z(PartParser._findFirstPartStaffContaining6  sO   € ð
 ˆ;Ø�4à#ð 	!ð 	!ˆIØ×-Ò-¨cÀÐ-ÑGÔGÐSà Ð Ð Ð ð Tð ˆtr?   c                ód  — | j         }| j        }t          } |||dt          ¬¦  «         |                     d¦  «        }|�'|                     d¦  «        }|dk    rd|j        _         |||dt          ¬¦  «         |                     d¦  «        }|�'|                     d¦  «        }|dk    rd|j        _        |  	                    ¦   «         }| 
                    ¦   «         �| 
                    ¦   «         |_        || _        |j        |_        |j        |_        |                     d|¦  «         dS )	aÑ  
        The <score-part> tag contains a lot of information about the
        Part itself.  It was found in the <part-list> in the ScoreParser but
        was not parsed and instead passed into the PartParser as .mxScorePart.

        Sets the stream.partName, stream.partAbbreviation, self.activeInstrument,
        and inserts an instrument at the beginning of the stream.

        The instrumentObj being configured comes from self.getDefaultInstrument.
        z	part-namerW   Nrš   r›   Fzpart-abbreviationr8  )r&   rV  rc   r>   r[   rv   r'   ÚprintPartNameÚprintPartAbbreviationÚgetDefaultInstrumentÚbestNamer7  r  ÚpartNameÚpartAbbreviationr:  )r{   r6  rV  rá   Ú
mxPartNameÚprintObjectÚmxPartAbbreviationÚinstrumentObjs           r=   r  zPartParser.parseXmlScorePartE  s@  € ð Œ{ˆØÔ&ˆå'ˆð 	ˆˆT�; µvÐ>Ñ>Ô>Ð>Ø ×%Ò% kÑ2Ô2ˆ
ØÐ!Ø$Ÿ.š.¨Ñ8Ô8ˆKØ˜dÒ"Ð"Ø+0�”
Ô(ð
 	ˆˆT�;Ð 3½vÐFÑFÔFÐFØ(×-Ò-Ð.AÑBÔBÐØÐ)Ø,×0Ò0°Ñ@Ô@ˆKØ˜dÒ"Ð"Ø38�”
Ô0ð ×1Ò1Ñ3Ô3ˆà×!Ò!Ñ#Ô#Ð/Ø#×,Ò,Ñ.Ô.ˆDŒGØ -ˆÔà%Ô.ˆŒØ -Ô >ˆÔØ�Š˜˜]Ñ+Ô+Ð+Ð+Ð+r?   úinstrument.Instrumentc                óV  — |€| j         }|€t          d¦  «        ‚d„ }t          }|                     d¦  «        }d}|��W|                     d¦  «        }|                     d¦  «        }t	          |¦  «        x}r‹t          ¦   «         }		 |	                      ||¦  «        ¦  «        }nî# t          $ rP}
t          j	        t          |
¦  «        d¬¦  «         t          j        ¦   «         } ||¦  «        |_        Y d}
~
n™d}
~
ww xY wt	          |¦  «        x}r€	 t          j         ||¦  «        ¦  «        }nR# t          j        $ r@}t          j	        t          |¦  «        d¬¦  «         t          j        ¦   «         }Y d}~nd}~ww xY w |||d	|¬
¦  «         |€t          j        ¦   «         }|                     d¦  «        }|�\t#          |t          j        ¦  «        sB|                      ||¦  «        }|j        |j        k    st#          |t          j        ¦  «        r|}| j        |_        | j        �|j                             | j        ¦  «         | j        j        |_        | j        j        |_        |�5 |||dt6          ¬
¦  «          |||dt6          ¬
¦  «          |||d¦  «         |S )al  
        Get a default instrument from the mxScorePart tag.

        >>> scorePart = (
        ...     '<score-part id="P4"><part-name>Bass</part-name>'
        ...     '<part-abbreviation>B.</part-abbreviation>'
        ...     '<score-instrument id="P4-I4">'
        ...     '    <instrument-name>Instrument 4</instrument-name>'
        ...     '</score-instrument>'
        ...     '<midi-instrument id="P4-I4">'
        ...     '   <midi-channel>4</midi-channel>'
        ...     '<midi-program>1</midi-program>'
        ...     '</midi-instrument>'
        ...     '</score-part>')
        >>> from xml.etree.ElementTree import fromstring as EL
        >>> pp = musicxml.xmlToM21.PartParser()

        >>> mxScorePart = EL(scorePart)
        >>> i = pp.getDefaultInstrument(mxScorePart)
        >>> i
        <music21.instrument.Instrument ': Instrument 4'>
        >>> i.instrumentName
        'Instrument 4'

        Non-default transpositions captured as of v7.3:

        >>> scorePart = (
        ...     '<score-part id="P5"><part-name>C Trumpet</part-name>'
        ...     '<part-abbreviation>C Tpt.</part-abbreviation>'
        ...     '<score-instrument id="P5-I5">'
        ...     '    <instrument-name>C Trumpet</instrument-name>'
        ...     '</score-instrument>'
        ...     '<midi-instrument id="P5-I5">'
        ...     '   <midi-channel>2</midi-channel>'
        ...     '<midi-program>57</midi-program>'
        ...     '</midi-instrument>'
        ...     '</score-part>')
        >>> from xml.etree.ElementTree import fromstring as EL
        >>> pp = musicxml.xmlToM21.PartParser()

        >>> mxScorePart = EL(scorePart)
        >>> i = pp.getDefaultInstrument(mxScorePart)
        >>> i
        <music21.instrument.Trumpet ': C Trumpet'>
        >>> i.instrumentName
        'C Trumpet'
        >>> i.transposition
        <music21.interval.Interval P1>
        Nz/score-part must be defined before calling this.c                ó:   — t          | ¦  «        dz
  }|dk    rd}|S )Nrô   éÿÿÿÿr   )rR   )ÚmcÚadjusteds     r=   Ú_adjustMidiDataz8PartParser.getDefaultInstrument.<locals>._adjustMidiData²  s$   € Ý˜2‘w”w ‘{ˆHØ˜2Š~ˆ~Ø�ØˆOr?   zmidi-instrumentzmidi-programzmidi-unpitchedé   ©Ú
stacklevelzmidi-channelrW   zscore-instrumentúinstrument-namezinstrument-abbreviationzinstrument-sound)rV  r/   rc   r[   rG   r    ÚmidiPitchToInstrumentr   ÚwarningsÚwarnr0   r   ÚUnpitchedPercussionÚpercMapPitchÚinstrumentFromMidiProgramÚInstrumentExceptionÚ
Instrumentrr   ÚreclassifyInstrumentFromNameÚmidiProgramÚPianorU  r  rÃ   r&   r/  r0  r>   )r{   rV  r;  rá   ÚmxMIDIInstrumentÚiÚmxMidiProgramÚmxMidiUnpitchedÚmidiUnpitchedTextÚpmÚmpeÚmidiProgramTextÚieÚmxScoreInstrumentÚinst_from_names                  r=   r-  zPartParser.getDefaultInstrumentw  s  € ðf ÐØÔ*ˆKàÐÝ)ØAñô ð ð	ð 	ð 	õ (ˆð '×+Ò+Ð,=Ñ>Ô>ÐØ(,ˆØÑ'Ø,×1Ò1°.ÑAÔAˆMØ.×3Ò3Ð4DÑEÔEˆOÝ$0°Ñ$AÔ$AÐAÐ ð UÝ%Ñ'Ô'�ðHØ×0Ò0°°ÐARÑ1SÔ1SÑTÔT�A�AøÝ.ð Hð Hð Hå”M¥/°#Ñ"6Ô"6À1ÐEÑEÔEÐEÝ"Ô6Ñ8Ô8�AØ%4 _Ð5FÑ%GÔ%G�A”N�N�N�N�N�Nøøøøð	Høøøõ
 %1°Ñ$?Ô$?Ð?�ð Uð0Ý"Ô<¸_¸_È_Ñ=]Ô=]Ñ^Ô^�A�AøÝ!Ô5ð 0ð 0ð 0Ý”M¥/°"Ñ"5Ô"5À!ÐDÑDÔDÐDå"Ô-Ñ/Ô/�A�A�A�A�A�Aøøøøð0øøøð ��QÐ(¨.ÀOÐTÑTÔTÐTØˆ9åÔ%Ñ'Ô'ˆAð (×,Ò,Ð-?Ñ@Ô@ÐØÐ(µ¸A½zÔ?]Ñ1^Ô1^Ð(à!×>Ò>¸qÐBSÑTÔTˆNð Ô)¨Q¬]Ò:Ð:½jÈÍJÔL\Ñ>]Ô>]Ð:Ø"�à”;ˆŒØŒ;Ð"ØŒH�OŠO˜DœKÑ(Ô(Ð(Ø”[Ô)ˆŒ
Ø!œ[Ô9ˆÔð Ð(ØˆD�Ð%Ð'8ÅFÐKÑKÔKÐKØˆD�Ð%Ð'@ÍFÐSÑSÔSÐSØˆD�Ð%Ð'9Ñ:Ô:Ð:ð
 ˆs1   Â	B( Â(
DÂ2AC=Ã=DÄD5 Ä5FÅ6E?Å?FrL  rT  rÆ  c                óê   — |                      d¦  «        }t          |¦  «        x}rL| j        }	 t          j        |¦  «        } n(# t          j        $ r t          j        ¦   «         } Y nw xY w|| _        | S )Nr?  )r[   rG   ÚmidiChannelr   Ú
fromStringrF  rG  )rL  rT  ÚmxInstrumentNameÚinstrumentNameTextÚprevious_midi_channels        r=   rH  z'PartParser.reclassifyInstrumentFromNameú  sŒ   € ð
 -×1Ò1Ð2CÑDÔDÐÝ!-Ð.>Ñ!?Ô!?Ð?Ðð 	2Ø$%¤MÐ!ð,ÝÔ)Ð*<Ñ=Ô=��øÝÔ1ð ,ð ,ð ,ÝÔ)Ñ+Ô+���ð,øøøà1ˆAŒMØˆs   ¯A Á"A)Á(A)c                óÈ   — | j         }| j                             d¦  «        D ]}|                      |¦  «         Œ|                      ¦   «          |                     ¦   «          dS )zI
        Parse each <measure> tag using self.xmlMeasureToMeasure
        ÚmeasureN)r&   r]  ÚiterfindÚxmlMeasureToMeasureÚ&removeFinaleIncorrectEndingForwardRestrK  )r{   r6  Ú	mxMeasures      r=   r  zPartParser.parseMeasures	  sk   € ð Œ{ˆØœ×-Ò-¨iÑ8Ô8ð 	0ð 	0ˆIØ×$Ò$ YÑ/Ô/Ð/Ð/à×3Ò3Ñ5Ô5Ð5Ø× Ò Ñ"Ô"Ð"Ð"Ð"r?   c                óö   — | j         }|€dS d| _         |j        €dS |j        rdS |j        }|j        t          j                                      ¦   «         |u r |� |j                             |d¬¦  «         dS dS dS )a#  
        If Finale generated the file AND it ended with an incomplete
        measure (like 4/4 beginning with a quarter pickup and ending
        with a 3-beat measure) then the file might have ended with a
        `<forward>` tag, which Finale used to create hidden rests.

        If this forward tag is at the end of the piece, then it
        will create rests that "complete" the measure in an incorrect way
        If voices are not involved (e.g., NOT bwv66.6) then we should
        remove this forward tag.

        * New in v7.
        NT)Úrecurse)r  ÚlastForwardTagCreatedByFinaleÚ	useVoicesr&   r!   ÚGeneralNoteÚlastrJ  )r{   ÚlmpÚendingForwardRests      r=   r`  z1PartParser.removeFinaleIncorrectEndingForwardRest  s�   € ð Ô$ˆØˆ;ØˆFØ!%ˆÔàÔ,Ð4ØˆFØŒ=ð 	ØˆFØ,/Ô,MÐàŒJ•tÔ'Ô(×-Ò-Ñ/Ô/Ð3DÐDÐDØ%Ð1ØŒJ×ÒÐ/¸ÐÑ>Ô>Ð>Ð>Ð>ð EÐDØ1Ð1r?   c           	     óH  ‡‡— g d¢Št          dg¦  «        }|                      ¦   «         }g }t          ¦   «         Šdˆˆfd
„}| j                             t          j        ¦  «        }t          |¦  «        D �]¦\  }}‰dd…         }|dk    r|                     d¦  «         t          j	        t          j
        | j                             |d|¬¦  «        ¦  «        }	| j        › d|› �}
|
|	_        |	                     |
d¬¦  «         |	j                             |
¦  «         |                     |	¦  «         |	| j        j        |
<   t          ¦   «         }| j        D ]?}|                      ||¦  «        }|D ]$}|                     t          |¦  «        ¦  «         Œ%Œ@t+          ||	                     t          j        ¦  «        ¦  «        D ]V\  }} ||||¦  «         t+          |j        |j        ¦  «        D ]\  }} ||||¦  «         Œ|                     dd¬¦  «         ŒW�Œ¨| j        j        }t1          j        || j        j        d¬¦  «        }d|j        _        |                     d|¦  «         |D ]}|                     d|¦  «         Œ|                     ¦   «          d| _        |S )z—
        Take a `Part` with multiple staves and make them a set of `PartStaff` objects.

        There must be more than one staff to do this.
        )ÚClefÚDynamicÚ
Expressionrf  ÚKeySignaturerõ   ÚTempoIndicationÚTimeSignatureÚRepeatBracketÚsourceústream.StreamÚtargetÚomitTheseElementIdsúset[int]r6   rÇ  c                óÎ  •— |                       ‰¦  «        }d|_        |D ]°}t          |¦  «        }||v rŒ|‰	v rt          j        |¦  «        }n|}‰	                     |¦  «         |                      |d¬¦  «        }|t          j        k    r.t          |t          ¦  «        rJ ‚| 
                    ||¦  «         Œ›|                     |¦  «         Œ±|                     ¦   «          d S )NFT)ÚreturnSpecial)ÚgetElementsByClassÚrestoreActiveSitesr7  ÚcopyÚdeepcopyrg   ÚelementOffsetr   ÚAT_ENDrr   r:  ÚcoreStoreAtEndrK  )
rr  rt  ru  ÚelementIteratorÚ
sourceElemÚidSourceÚ
targetElemÚsourceOffsetÚSTAFF_SPECIFIC_CLASSESÚappendedElementIdss
           €€r=   Úcopy_into_partStaffz=PartParser.separateOutPartStaves.<locals>.copy_into_partStaffM  s  ø€ ð %×7Ò7Ð8NÑOÔOˆOØ16ˆOÔ.Ø-ð 6ð 6�
Ý˜j™>œ>�ØÐ2Ð2Ð2ØØÐ1Ð1Ð1Ý!%¤¨zÑ!:Ô!:�J�Jà!+�JØ&×*Ò*¨8Ñ4Ô4Ð4Ø%×3Ò3°JÈdÐ3ÑSÔS�Ø¥=Ô#7Ò7Ð7å)¨,½ÑFÔFÐFÐFÐFØ×%Ò% l°JÑ?Ô?Ð?Ð?à×)Ò)¨*Ñ5Ô5Ð5Ð5Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(r?   Nr   ÚSpannerF)ÚremoveClassesÚfillWithRestsÚexemptFromRemoverª  r&  T)ÚforceÚinPlacer­  )r~  r¬  )rr  rs  rt  rs  ru  rv  r6   rÇ  ) Ú	frozensetÚ_getUniqueStaffKeysÚsetr&   ry  ÚMeasureÚ	enumeraterÃ   ÚtÚcastrû  ÚtemplaterU  r7  r  r  rZ  r  rý  Ú_getStaffExcluderg   ru   ÚvoicesÚflattenUnnecessaryVoicesr   r¯  r/  r'   rœ   r:  rK  r\  )r{   ÚEXEMPT_FROM_REMOVEÚuniqueStaffKeysr  r‡  ÚsourceMeasureIteratorÚ
staffIndexÚstaffKeyr‰  ÚnewPartStaffÚpartStaffIdÚelementsIdsNotToGoInThisStaffÚstaffReferenceÚexcludeOneMeasurer¹  ÚsourceMeasureÚcopyMeasureÚsourceVoiceÚ	copyVoiceÚscorer´  r)  r…  r†  s                         @@r=   r  z PartParser.separateOutPartStaves1  s6  øø€ ð	"
ð 	"
ð 	"
Ðõ 'ØÐñ
ô 
Ðð &*×%=Ò%=Ñ%?Ô%?ˆØ-/ˆ
Ý'*¡u¤uÐð	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð. !%¤× >Ò >½v¼~Ñ NÔ NÐÝ$-¨oÑ$>Ô$>ð &	Pñ &	PÑ ˆJ˜à2°1°1°1Ô5ˆMØ˜QŠˆØ×$Ò$ YÑ/Ô/Ð/Ýœ6ÝÔ Ø”×$Ò$°=Ø38Ø6Hð %ñ Jô Jñô ˆLð "œ[Ð:Ð:°Ð:Ð:ˆKØ)ˆLŒOà×,Ò,¨[ÈÐ,ÑNÔNÐNØÔ×&Ò& {Ñ3Ô3Ð3Ø×Ò˜lÑ+Ô+Ð+Ø:FˆDŒKÔ*¨;Ñ7Ý69±e´eÐ)ð #'Ô"9ð >ð >�ð %)×$9Ò$9Ø"Øñ%ô %Ð!ð ,ð >ð >�BØ1×5Ò5µb¸±f´fÑ=Ô=Ð=Ð=ð>õ /2Ø%Ø×/Ò/µ´Ñ?Ô?ñ/ô /ð Pð PÑ*�˜{ð $Ð# M°;Ð@]Ñ^Ô^Ð^Ý.1°-Ô2FÈÔHZÑ.[Ô.[ð _ð _Ñ*�K Ø'Ð'¨°YÐ@]Ñ^Ô^Ð^Ð^Ø×4Ò4¸5È$Ð4ÑOÔOÐOÐOñPð ”Ô"ˆÝÔ& z¸¼Ô8LÐU\Ð]Ñ]Ô]ˆ
Ø-1ˆ
ÔÔ*Ø×Ò˜˜JÑ'Ô'Ð'à#ð 	+ð 	+ˆIØ×Ò˜Q 	Ñ*Ô*Ð*Ð*Ø×!Ò!Ñ#Ô#Ð#à',ˆÔ$ð Ðr?   r¡  ÚStaffReferenceTypeÚ	targetKeyrR   úlist[base.Music21Object]c                ój   — |t           k    rg S g }|D ] }|t           k    rŒ||k    rŒ|||         z  }Œ!|S )aÒ  
        Given a staff reference dictionary (for a single measure),
        remove and combine in a list all elements that
        are NOT part of the given targetKey. Thus, return a list of all entries to remove.
        It keeps those elements under the staff key None (common to all) and
        those under given key. This then is the list of all elements that should be deleted.

        If targetKey is NO_STAFF_ASSIGNED (0) then returns an empty list
        )ÚNO_STAFF_ASSIGNED)r{   r¡  r©  ÚpostÚks        r=   r–  zPartParser._getStaffExcludeœ  sZ   € ð Õ)Ò)Ð)ØˆIàˆØð 	&ð 	&ˆAØÕ%Ò%Ð%ØØ�i’�ØØ�N 1Ô%Ñ%ˆDˆDØˆr?   ú	list[int]c                ó˜   — g }| j         D ]+}|D ]&}|t          k    r||vr|                     |¦  «         Œ'Œ,|                     ¦   «          |S )z�
        Given a list of staffReference dictionaries,
        collect and return a list of all unique keys except NO_STAFF_ASSIGNED (0)
        )rý  r¬  rÃ   rL  )r{   r­  r¡  r®  s       r=   r�  zPartParser._getUniqueStaffKeys¶  sg   € ð
 ˆØ"Ô5ð 	#ð 	#ˆNØ#ð #ð #�ØÕ)Ò)Ð)¨a°t¨m¨mØ—K’K ‘N”N�Nøð#ð 	�	Š	‰ŒˆØˆr?   ra  ústream.Measurec                ó2  — t          || ¬¦  «        }	 |                     ¦   «          nƒ# t          $ r1}t          |j        ¦  «        |_        | j        j        |_        |‚d}~wt          $ r=}t          j	        d|j        › d�d| j        j        › d�z   t          d¬¦  «         |‚d}~ww xY w|| _        t          | j        |j        ¦  «        | _        |j        �|                      |j        ¦  «         d	| _        | j                             |j        ¦  «         |j        }|                      |¦  «         |j        d	u r¥|t.          j                                      ¦   «         }t4          j        r|€J ‚| j        �| j        j        j        }nd
}|j        d	u s:|j         j        |k    r=|j         j!        dv r/|j         j"        dk    r|j         j#        s||j         _        d	|_        | j         $                    | j%        |¦  «         |  &                    |¦  «         |S )a3  
        Convert a measure element to a Measure, using
        :class:`~music21.musicxml.xmlToM21.MeasureParser`

        >>> from xml.etree.ElementTree import fromstring as EL

        Full-measure rests get auto-assigned to match the time signature if they
        do not have a type, or have a type of "whole".

        Here is a measure with a rest that lasts 4 beats, but we will put it in a 3/4 context.

        >>> scoreMeasure = '<measure><note><rest/><duration>40320</duration></note></measure>'
        >>> mxMeasure = EL(scoreMeasure)
        >>> pp = musicxml.xmlToM21.PartParser()
        >>> pp.lastDivisions
        10080
        >>> 40320 / 10080
        4.0
        >>> pp.lastTimeSignature = meter.TimeSignature('3/4')
        >>> m = pp.xmlMeasureToMeasure(mxMeasure)

        Test that the rest lasts three, not four beats:

        >>> measureRest = m.notesAndRests[0]
        >>> measureRest
        <music21.note.Rest dotted-half>
        >>> measureRest.duration.type
        'half'
        >>> measureRest.duration.quarterLength
        3.0
        )rZ  Nz)The following exception took place in m. ú in zpart ú.r<  r=  Tç      @©ÚwholeÚbrever   )'ÚMeasureParserr&  r/   rB   ÚmeasureNumberr&   r/  Ú	ExceptionrA  rB  r0   r  Úmaxr  ÚstavesÚtranspositionÚupdateTranspositionr	  rý  rÃ   r¡  ÚsetLastMeasureInfoÚfullMeasureRestr!   ÚRestÚfirstr“  ÚTYPE_CHECKINGrþ  ÚbarDurationÚquarterLengthÚfullMeasurer   r`  ÚdotsÚtupletsÚinsertr   ÚadjustTimeAttributesFromMeasure)r{   ra  ÚmeasureParserÚeÚmÚr1ÚlastTSQls          r=   r_  zPartParser.xmlMeasureToMeasureÃ  sB  € õB & i¸Ð=Ñ=Ô=ˆð	Ø×ÒÑ!Ô!Ð!Ð!øÝ&ð 	ð 	ð 	Ý! -Ô"=Ñ>Ô>ˆAŒOØœÔ-ˆAŒJØˆGøøøøÝð 	ð 	ð 	ÝŒMØ]¸MÔ<WÐ]Ð]Ð]Ø1˜$œ+Ô.Ð1Ð1Ð1ñ2åØð	ñ ô ð ð ˆGøøøøð	øøøð "/ˆÔå˜Tœ^¨]Ô-AÑBÔBˆŒàÔ&Ð2Ø×$Ò$ ]Ô%@ÑAÔAÐAà"&ˆÔØÔ×&Ò& }Ô'CÑDÔDÐDàÔ ˆØ×Ò Ñ"Ô"Ð"ð Ô(¨DÐ0Ð0à•4”9”×#Ò#Ñ%Ô%ˆBåŒð &à�~�~�~àÔ%Ð1ØÔ1Ô=ÔK��à�à” $Ð&Ð&Ø”KÔ-°Ò9Ð9ØœÔ(Ð,>Ð>Ð>ØœÔ(¨AÒ-Ð-ØœKÔ/ð .à,4�”Ô)Ø!%�”ð 	Œ×Ò˜4Ô1°1Ñ5Ô5Ð5Ø×,Ò,¨QÑ/Ô/Ð/ð ˆs    “( ¨
B(²,AÁB(Á+8B#Â#B(ÚnewTranspositionúinterval.Intervalc                ó´  — | j         �g| j         j        €
| j        du rn§| j         j        |k    r@t          j        | j         ¦  «        }|| _         | j                             | j        |¦  «         nVt          j	        dt          d¬¦  «         t          j        ¦   «         }|| _         | j                             | j        |¦  «         || j         _        d| _        dS )a³  
        As one might expect, a measureParser that reveals a change
        in transposition is going to have an effect on the
        Part's instrument list.  This (totally undocumented) method
        deals with it.

        If `measureParser.transposition` is None, does nothing.

        NOTE: Need to test a change of instrument w/o a change of
        transposition such as: Bb clarinet to Bb Soprano Sax to Eb clarinet?
        NFz=Received a transposition tag, but no instrument to put it on!r<  r=  )r  r¾  r	  r{  r|  r&   r:  r   rA  rB  r0   r   rG  rü  )r{   rÑ  ÚnewInstÚfakeInsts       r=   r¿  zPartParser.updateTransposition   sè   € ð Ô Ð,ØÔ%Ô3Ð;ØÔ/°5Ð8Ð8ð àÔ&Ô4Ð8HÒHÐHõ
 œ-¨Ô(=Ñ>Ô>�à(/�Ô%Ø”×&Ò& tÔ'=¸wÑGÔGÐGøõ
 ŒMØOÝØðñ ô ð õ
 "Ô,Ñ.Ô.ˆHØ$,ˆDÔ!ØŒK×"Ò" 4Ô#9¸8ÑDÔDÐDð
 /?ˆÔÔ+Ø$ˆÔÐÐr?   rÎ  c                óÊ   — |j         | j        k    rn|j         | _        |j        | _        |j        �|j        | _        dS | j        €t          j        d¦  «        }|| _        dS dS )at  
        Sets self.lastMeasureNumber and self.lastMeasureSuffix from the measure,
        which is used in fixing Finale unnumbered measure issues.

        Also sets self.lastTimeSignature from the timeSignature found in
        the measure, if any.

        >>> pp = musicxml.xmlToM21.PartParser()

        Here are the defaults:

        >>> pp.lastMeasureNumber
        0
        >>> pp.lastNumberSuffix is None
        True
        >>> pp.lastTimeSignature is None
        True

        After setLastMeasureInfo:

        >>> m = stream.Measure(number=4)
        >>> m.numberSuffix = 'b'
        >>> ts38 = meter.TimeSignature('3/8')
        >>> m.timeSignature = ts38
        >>> pp.setLastMeasureInfo(m)

        >>> pp.lastMeasureNumber
        4
        >>> pp.lastNumberSuffix
        'b'
        >>> pp.lastTimeSignature
        <music21.meter.TimeSignature 3/8>
        >>> pp.lastTimeSignature is ts38
        True

        Note that if there was no timeSignature defined in m,
        and no lastTimeSignature exists,
        the PartParser gets a default of 4/4, because
        after the first measure there's going to be routines
        that need some sort of time signature:

        >>> pp2 = musicxml.xmlToM21.PartParser()
        >>> m2 = stream.Measure(number=2)
        >>> pp2.setLastMeasureInfo(m2)
        >>> pp2.lastTimeSignature
        <music21.meter.TimeSignature 4/4>

        For obscure reasons relating to how Finale gives suffixes
        to unnumbered measures, if a measure has the same number
        as the lastMeasureNumber, the lastNumberSuffix is not updated:

        >>> pp3 = musicxml.xmlToM21.PartParser()
        >>> pp3.lastMeasureNumber = 10
        >>> pp3.lastNumberSuffix = 'X1'

        >>> m10 = stream.Measure(number=10)
        >>> m10.numberSuffix = 'X2'
        >>> pp3.setLastMeasureInfo(m10)
        >>> pp3.lastNumberSuffix
        'X1'
        Nz4/4)rñ   r  ÚnumberSuffixr  ÚtimeSignaturerþ  r   rp  )r{   rÎ  Útss      r=   rÀ  zPartParser.setLastMeasureInfoS  su   € ð~ Œ8�tÔ-Ò-Ð-Øð &'¤XˆDÔ"Ø$%¤NˆDÔ!àŒ?Ð&Ø%&¤_ˆDÔ"Ð"Ð"ØÔ#Ð+åÔ$ UÑ+Ô+ˆBØ%'ˆDÔ"Ð"Ð"ð ,Ð+r?   c                óò  — |j         }| j        �| j        j        j        }nd}||k    r|}�nº||k    r„||z
  }d}|dk    s4t	          |d¦  «        d         |k     st	          |d¦  «        d         |k     r|}�no|}t          j        d|j        › d	| j        j	        › d
|› d|› d|› d�t          d¬¦  «         �n0|dk    rk|                     ¦   «         j                             d¦  «        s?t          j        ¦   «         }||j        _        |                     d|¦  «         |}d| _        n¿| j        dk    r/|                     ¦   «         dk     r|                     ¦   «          |}n…|}| j        du r4|                     ¦   «         dk     r|                     ¦   «          d| _        nF|                     ¦   «         dk     r|j        j        |j         z
  |_        ||k     rd| _        nd| _        | xj        |z  c_        dS )a  
        Adds padAsAnacrusis to pickup measures and other measures that
        do not fill the whole tile, if the first measure of the piece, or
        immediately follows an incomplete measure (such as a repeat sign mid-measure
        in a piece where each phrase begins with a pickup and ends with an
        incomplete measure).

        Fills an empty measure with a measure of rest (bug in PDFtoMusic and
        other MusicXML writers).

        Sets self.lastMeasureWasShort to True or False if it is an incomplete measure
        that is not a pickup and sets paddingRight.

        >>> m = stream.Measure([meter.TimeSignature('4/4'), harmony.ChordSymbol('C7')])
        >>> m.highestTime
        0.0
        >>> pp = musicxml.xmlToM21.PartParser()
        >>> pp.setLastMeasureInfo(m)
        >>> pp.adjustTimeAttributesFromMeasure(m)
        >>> m.highestTime
        4.0
        >>> pp.lastMeasureWasShort
        False

        Incomplete final measure:

        >>> m = stream.Measure([meter.TimeSignature('6/8'), note.Note(), note.Note()])
        >>> m.offset = 24.0
        >>> pp = musicxml.xmlToM21.PartParser()
        >>> pp.lastMeasureOffset = 21.0
        >>> pp.setLastMeasureInfo(m)
        >>> pp.adjustTimeAttributesFromMeasure(m)
        >>> m.paddingRight
        1.0
        Nrµ  g�íµ ÷Æ°>g      à?g      °?rô   gUUUUUUµ?zWarning: measure z	 in part zis overfull: z > z
,assuming z is correct.r<  r=  r8  ÚHarmonyFg      ð?T)ÚhighestTimerþ  rÅ  rÆ  r   rA  rB  rñ   r&   r/  r0   rc  ÚnotesAndRestsÚgetElementsNotOfClassr!   rÂ  r   rÊ  rÿ  r   ÚbarDurationProportionÚpadAsAnacrusisÚpaddingRight)r{   rÎ  ÚmHighestTimeÚlastTimeSignatureQuarterLengthÚmOffsetShiftÚdiffÚtolÚrs           r=   rË  z*PartParser.adjustTimeAttributesFromMeasure£  st  € ðT ”}ˆð
 Ô!Ð-Ø-1Ô-CÔ-OÔ-]Ð*Ð*à-0Ð*àÐ9Ò9Ð9Ø'ˆL‰LØÐ:Ò:Ð:ØÐ"@Ñ@ˆDØˆCð �s’
�
Ý$ T¨6Ñ2Ô2°1Ô5¸Ò;Ð;Ý$ T¨6Ñ2Ô2°1Ô5¸Ò;Ð;Ø+�‘à=�Ý”ð;¨¬ð ;ð ;¸4¼;Ô;Oð ;ð ;Ø$0ð;ð ;Ø5Sð;ð ;à ,ð;ð ;ð ;õ $Ø ðñ ô ð ñ ð ˜cÒ!Ð!Ø—i’i‘k”kÔ/×EÒEÀiÑPÔPð "õ ”	‘”ˆAØ'EˆAŒJÔ$Ø�HŠH�S˜!ÑÔÐØ9ˆLØ',ˆDÔ$Ð$ð
 Ô%¨Ò,Ð,à×*Ò*Ñ,Ô,¨sÒ2Ð2Ø×$Ò$Ñ&Ô&Ð&ð  ,��à+�ØÔ+¨tÐ3Ð3Ø×.Ò.Ñ0Ô0°3Ò6Ð6Ø×(Ò(Ñ*Ô*Ð*à38˜Ô0øð ×.Ò.Ñ0Ô0°3Ò6Ð6Ø)*¬Ô)DÀqÄ}Ñ)T˜œØ#Ð&DÒDÐDØ37˜Ô0Ð0à38˜Ô0àÐÔ ,Ñ.ÐÔÐÐr?   rç  ú	note.Restc                óÔ   — | j         €dS | j                              |¦  «         | xj        dz  c_        | j        dk    r)| j                             d| j         ¦  «         d| _         dS dS )aó  
        If there is an active MultiMeasureRestSpanner, add the Rest, r, to it:

        >>> pp = musicxml.xmlToM21.PartParser()
        >>> mmrSpanner = spanner.MultiMeasureRest()
        >>> mmrSpanner
        <music21.spanner.MultiMeasureRest 0 measures>

        >>> pp.activeMultiMeasureRestSpanner = mmrSpanner
        >>> pp.multiMeasureRestsToCapture = 2
        >>> r1 = note.Rest(type='whole', id='r1')
        >>> pp.applyMultiMeasureRest(r1)
        >>> pp.multiMeasureRestsToCapture
        1
        >>> pp.activeMultiMeasureRestSpanner
        <music21.spanner.MultiMeasureRest 1 measure>

        >>> pp.activeMultiMeasureRestSpanner is mmrSpanner
        True
        >>> pp.stream.show('text')  # Nothing shown!

        >>> r2 = note.Rest(type='whole', id='r2')
        >>> pp.applyMultiMeasureRest(r2)
        >>> pp.multiMeasureRestsToCapture
        0
        >>> pp.activeMultiMeasureRestSpanner is None
        True

        # spanner added to stream

        >>> pp.stream.show('text')
        {0.0} <music21.spanner.MultiMeasureRest 2 measures>

        >>> r3 = note.Rest(type='whole', id='r3')
        >>> pp.applyMultiMeasureRest(r3)
        >>> pp.stream.show('text')
        {0.0} <music21.spanner.MultiMeasureRest 2 measures>

        Nrô   r   )r  r°  r  r&   rÊ  )r{   rç  s     r=   ÚapplyMultiMeasureRestz PartParser.applyMultiMeasureRest	  s}   € ðP Ô-Ð5ØˆFØÔ*×=Ò=¸aÑ@Ô@Ð@ØÐ'Ô'¨1Ñ,Ð'Ô'ØÔ*¨aÒ/Ð/ØŒK×Ò˜q $Ô"DÑEÔEÐEØ15ˆDÔ.Ð.Ð.ð 0Ð/r?   )NNN)r]  rA   rV  rA   rZ  r÷  )r6   rÇ  )r  r  r  r  )r"  r#  r  r  r6   r$  rn   )rV  rA   r6   r5  )rL  r5  rT  rÆ  r6   r5  )r6   r  )r¡  r¨  r©  rR   r6   rª  )r6   r¯  )ra  rÆ  r6   r±  )rÑ  rÒ  )rÎ  r±  )rç  rè  )rû   rü   rý   rþ   r  r&  r  r  r  r-  ró  rH  r  r`  r  r–  r�  r_  r¿  rÀ  rË  rê  rô  rõ  s   @r=   r[  r[  ¿  sÀ  ø€ € € € € ðð ð ,0Ø04Ø15ð4:ð 4:ð 4:ð 4:ð 4:ð 4:ð 4:ðl"Mð "Mð "Mð "MðH%ð %ð %ð %ð,ð ð ð ð.,ð .,ð .,ðdAð Að Að Að AðF ðð ð ñ „\ðð	#ð 	#ð 	#ð?ð ?ð ?ð ?ð:ið ið ið iðVð ð ð ð4ð ð ð ð[ð [ð [ð [ðz1%ð 1%ð 1%ð 1%ðfN(ð N(ð N(ð N(ð`n/ð n/ð n/ð n/ð`.6ð .6ð .6ð .6ð .6ð .6ð .6ð .6r?   r[  c                  ól  ‡ — e Zd ZdZddddddœZdd	d
ddddddddddœZ	 	 d‘d’ˆ fd„Zed“d„¦   «         Zd”d!„Z	d•d#„Z
d$„ Zd–d'„Zd–d(„Zd—d*„Zd˜d,„Zd™d0„Zdšd›d3„Zdœd�d5„Zdœd6„Zd7„ Zdœd8„Z	 dœdžd=„Z	 dœdŸdA„ZdB„ ZdšdC„ZdœdD„ZdE„ Zd dI„ZdJ„ ZdK„ ZedL„ ¦   «         ZdM„ Z dN„ Z!ddOœd¡dR„Z"	 	 d‘d¢dW„Z#dX„ Z$dY„ Z%dZd[œd\„Z&d]„ Z'd£d_„Z(d`„ Z)dœd¤db„Z*dc„ Z+	 dœd¥df„Z,d¦dh„Z-dœdi„Z.dœdj„Z/dk„ Z0d§dn„Z1do„ Z2d¨ds„Z3d©du„Z4dv„ Z5dw„ Z6dœdx„Z7dªdy„Z8dz„ Z9d{„ Z:d|„ Z;d}„ Z<d«d€„Z=d¬d‚„Z>dƒ„ Z?d„„ Z@d­d‡„ZAdˆ„ ZBd‰„ ZCdŠ„ ZD	 dœd®d�„ZEdŽ„ ZFdœd�„ZGd�„ ZHˆ xZIS )¯r¹  a7  
    parser to work with a single <measure> tag.

    called out for simplicity.

    >>> from xml.etree.ElementTree import fromstring as EL

    >>> scoreMeasure = '<measure><note><rest/><duration>40320</duration></note></measure>'
    >>> mxMeasure = EL(scoreMeasure)
    >>> mp = musicxml.xmlToM21.MeasureParser(mxMeasure)
    >>> mp.parse()
    >>> mp.restAndNoteCount['rest']
    1
    >>> mp.restAndNoteCount['note']
    0

    fullMeasureRest indicates that a rest lasts the full measure of the current time signature.

    >>> mp.fullMeasureRest
    True
    ÚhandleTimeSignatureÚ
handleClefÚhandleKeySignatureÚhandleStaffDetailsÚhandleMeasureStyle)Útimer	   r   ústaff-detailsúmeasure-styleÚ	xmlToNoteÚ	xmlBackupÚ
xmlForwardÚxmlDirectionÚparseAttributesTagÚ
xmlHarmonyNÚxmlSoundÚ
xmlBarline)r!   ÚbackupÚforwardrã   Ú
attributesr   zfigured-bassÚsoundÚbarlineÚgroupingÚlinkÚbookmarkra  rA   rZ  úPartParser | Nonec                ó°  •— t          ¦   «                              ¦   «          || _        g | _        |�|nt	          ¦   «         | _        d | _        | j        j        | _        i | _        | j        j	        | _	        d| _
        i | _        t          ¦   «         | _        d| _        d | _        d| _        d| _        d| _        | j        j        | _        i | _        t-          j        ¦   «         | _        g | _        g | _        d | _        d | _        d| _        dddœ| _        | j        j        | _        d| _        d| _         d | _!        tE          j#        ¦   «         | _$        d S )NFrô   Tr   rD   )Úrestr!   r8  )%r  r  ra  ÚmxMeasureElementsr[  rZ  r¾  r  r¡  r  re  Ú
voicesByIdr�  ÚvoiceIndicesr½  r
  ÚattributesAreInternalrº  r×  r  Ú	divisionsrò   r&   r‘  Ú
mxNoteListÚmxLyricListÚnLastÚ	lastVoicerÁ  ÚrestAndNoteCountr  Ú
parseIndexró   rd  ÚweakrefÚWeakKeyDictionaryÚpedalToStartOffset)r{   ra  rZ  r  s      €r=   r  zMeasureParser.__init__r	  sM  ø€ õ 	‰Œ×ÒÑÔÐà"ˆŒØ35ˆÔà,2Ð,> & &ÅJÁLÄLˆŒà!ˆÔØ!œ[Ô6ˆÔØ24ˆÔØ9=¼Ô9RˆÔà$ˆŒØ79ˆŒÝ*-©%¬%ˆÔØˆŒà $ˆÔØ%)ˆÔ"àˆÔØˆÔàœÔ2ˆŒð
 UWˆÔÝ”nÑ&Ô&ˆŒà,.ˆŒØ-/ˆÔØ,0ˆŒ
ð (,ˆŒð
  %ˆÔð *+°AÐ 6Ð 6ˆÔà48´KÔ4IˆŒØˆŒð ,/ˆÔð >BˆÔ*õ >EÔ=VÑ=XÔ=XˆÔÐÐr?   r|   úET.Element | int | Noner6   rR   c                ó,  — t          | t          ¦  «        r| S t          | t          ¦  «        rt          | ¦  «        S | €t          S | j        }|dv ri	 |                      d¦  «        }|�,|j        }|�#|                     ¦   «         }t          |¦  «        S n# t          t          t          f$ r Y nw xY wt          S |dv rR	 |                      d¦  «        }|�t          |¦  «        S n# t          t          t          f$ r Y nw xY w|dv rdS t          S t          S )ab  
        gets an int representing a staff number from an mxObject or a number:

        >>> mp = musicxml.xmlToM21.MeasureParser()
        >>> from xml.etree.ElementTree import fromstring as EL

        <note> tags store their staff numbers in a <staff> tag's text:

        >>> mp.getStaffNumber(EL('<note><staff>3</staff></note>'))
        3

        If there is no <staff> tag, notes return the special NO_STAFF_ASSIGNED value
        (which is, for now, just a fancy alias for 0!)

        >>> el = EL('<note><pitch><step>C</step><octave>4</octave></pitch></note>')
        >>> NO_STAFF_ASSIGNED = musicxml.xmlToM21.NO_STAFF_ASSIGNED
        >>> NO_STAFF_ASSIGNED
        0
        >>> mp.getStaffNumber(el) == NO_STAFF_ASSIGNED
        True

        Other objects, such as keys, clefs, and various layouts, however,
        store their staff numbers in a `number` attribute.

        >>> mp.getStaffNumber(EL('<key number="2"/>'))
        2

        If there is no number for most objects, such as keys and time signatures,
        it means that the object affects all staves (makes sense for a time signature, no?).
        Hence they are treated as NO_STAFF_ASSIGNED

        >>> mp.getStaffNumber(EL('<key/>')) == NO_STAFF_ASSIGNED
        True


        Clef, staff-layout, and staff-details objects, however, use a missing number
        to mean staff 1.

        >>> mp.getStaffNumber(EL('<clef/>'))
        1

        Passing in None or an int is allowed.

        >>> mp.getStaffNumber(None) == NO_STAFF_ASSIGNED
        True
        >>> mp.getStaffNumber(1)
        1

        Deprecation notice: getting staff number from a string is deprecated
            and will be removed in v11 (this sort of lazy conversion is frowned upon).

        OMIT_FROM_DOCS

        Stop dealing with and documenting this silliness in v11

        >>> mp.getStaffNumber('2')
        2
        N)r   rý  r!   rã   Ústaff)rw  rò  ró  r	   r   rñ  Ú	transposerñ   )rw  rò  r	   rô   )rr   rR   rB   r¬  r`   r[   r*   r:   rE   rz   rS   rv   )r|   r`   ÚstaffObjectÚ	staffTextr®  Úk_strs         r=   ÚgetStaffNumberzMeasureParser.getStaffNumber¿	  sX  € õx �h¥Ñ$Ô$ð 	%ØˆOÝ˜¥#Ñ&Ô&ð 	%Ý�x‘=”=Ð ØÐÝ$Ð$ØŒlˆð Ð=Ð=Ð=ðØ&Ÿmšm¨GÑ4Ô4�ØÐ*Ø +Ô 0�IØ Ð,Ø%ŸOšOÑ-Ô-˜Ý" 1™vœv˜øøÝ"¥I­zÐ:ð ð ð Ø�ðøøøå$Ð$Øð "ð "ð "ðØ Ÿš XÑ.Ô.�àÐ$Ý˜u™:œ:Ð%ð %øå�z­>Ð:ð ð ð Ø�ðøøøàð ð ð ð �qÝ$Ð$å$Ð$s%   ÁAB ÂB/Â.B/Â>%C% Ã%C?Ã>C?ÚmxObjectOrNumberúint | ET.Element | Noner}   úbase.Music21ObjectrÇ  c                ó¶   — | j         }t          |t          ¦  «        r|}n|                      |¦  «        }||vrg ||<   ||                              |¦  «         dS )a³  
        Utility routine for importing musicXML objects;
        here, we store a reference to the music21 object in a dictionary,
        where keys are the staff values. Staff values may be None, 1, 2, etc.

        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.addToStaffReference(1, note.Note('C5'))
        >>> MP.addToStaffReference(2, note.Note('D3'))
        >>> MP.addToStaffReference(2, note.Note('E3'))
        >>> len(MP.staffReference)
        2
        >>> list(sorted(MP.staffReference.keys()))
        [1, 2]
        >>> MP.staffReference[1]
        [<music21.note.Note C>]
        >>> MP.staffReference[2]
        [<music21.note.Note D>, <music21.note.Note E>]

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> mxNote = EL('<note><staff>1</staff></note>')
        >>> MP.addToStaffReference(mxNote, note.Note('F5'))
        >>> MP.staffReference[1]
        [<music21.note.Note C>, <music21.note.Note F>]

        No staff reference.

        >>> mxNote = EL('<note />')
        >>> MP.addToStaffReference(mxNote, note.Note('G4'))
        >>> len(MP.staffReference)
        3
        >>> MP.staffReference[0]
        [<music21.note.Note G>]
        N)r¡  rr   rR   r  rÃ   )r{   r  r}   r¡  r�  s        r=   ÚaddToStaffReferencez!MeasureParser.addToStaffReference*
  so   € ðL Ô,ˆÝÐ&­Ñ,Ô,ð 	=Ø'ˆHˆHà×*Ò*Ð+;Ñ<Ô<ˆHØ˜>Ð)Ð)Ø')ˆN˜8Ñ$Ø�xÔ ×'Ò'¨	Ñ2Ô2Ð2Ð2Ð2r?   ÚstaffSourcec                óh   — |                       ||¦  «         | j                             ||¦  «         dS )ax  
        runs addToStaffReference and then insertCore (which will do opFracs, so no need to do
        so before here)

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> mxNote = EL('<note><staff>1</staff></note>')

        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.insertCoreAndRef(1.0, mxNote, note.Note('F5'))

        This routine leaves MP.stream in an unusable state, because
        it runs insertCore.  Thus, before querying the stream we need to run at end:

        >>> MP.stream.coreElementsChanged()
        >>> MP.stream.show('text')
        {1.0} <music21.note.Note F>
        N)r!  r&   r:  )r{   Úoffsetr"  r}   s       r=   ÚinsertCoreAndRefzMeasureParser.insertCoreAndRefY
  s8   € ð. 	× Ò  ¨iÑ8Ô8Ð8ØŒ×Ò˜v yÑ1Ô1Ð1Ð1Ð1r?   c                ó°  — | j                              d¦  «        D ]}|                      |¦  «         Œ|                      ¦   «          |                      ¦   «          t          | j         ¦  «        | _        t          | j        ¦  «        D ]I\  }}|| _        |j	        | j
        v r/| j
        |j	                 }|�t          | |¦  «        } ||¦  «         ŒJ| j        r7| j                             ¦   «         j        D ]}|r|                     ¦   «          Œ| j                             ¦   «          | j        d         dk    r| j        d         dk    rd| _        d S d S d S )NÚprintr  rô   r!   r   T)ra  r<  ÚxmlPrintÚparseMeasureAttributesÚupdateVoiceInformationr?  r  r’  r  r`   ÚmusicDataMethodsÚgetattrre  r&   Úiterr—  rK  r  rÁ  )r{   rÕ   rL  r@   ÚmethNameÚmethÚvs          r=   r&  zMeasureParser.parses
  st  € ð ”~×-Ò-¨gÑ6Ô6ð 	#ð 	#ˆGØ�MŠM˜'Ñ"Ô"Ð"Ð"ð 	×#Ò#Ñ%Ô%Ð%Ø×#Ò#Ñ%Ô%Ð%Ý!% d¤nÑ!5Ô!5ˆÔÝ! $Ô"8Ñ9Ô9ð 	 ð 	 ‰HˆAˆuØˆDŒOØŒy˜DÔ1Ð1Ð1ØÔ0°´Ô;�ØÐ'Ý" 4¨Ñ2Ô2�DØ�D˜‘K”K�KøàŒ>ð 	,Ø”[×%Ò%Ñ'Ô'Ô.ð ,ð ,�Øð ,ð ×)Ò)Ñ+Ô+Ð+øØŒ×'Ò'Ñ)Ô)Ð)àÔ! &Ô)¨QÒ.Ð.ØÔ)¨&Ô1°QÒ6Ð6à#'ˆDÔ Ð Ð ð /Ð.Ø6Ð6r?   r@   rÆ  c                óì   — |                      d¦  «        }t          |¦  «        x}rMt          | j        t	          |¦  «        | j        z  z
  ¦  «        | _        t          | j        d¦  «        | _        dS dS )a7  
        Parse a backup tag by changing :attr:`offsetMeasureNote`.

        A floor of 0.0 is enforced in case of float rounding issues.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.divisions = 100
        >>> MP.offsetMeasureNote = 1.875

        >>> mxBackup = EL('<backup><duration>100</duration></backup>')
        >>> MP.xmlBackup(mxBackup)
        >>> MP.offsetMeasureNote
        0.875

        >>> MP.xmlBackup(mxBackup)
        >>> MP.offsetMeasureNote
        0.0
        r   r8  N)r[   rG   r   ró   rQ   r  r¼  )r{   r@   Ú
mxDurationÚdurationTexts       r=   rõ  zMeasureParser.xmlBackup“
  s…   € ð( —Z’Z 
Ñ+Ô+ˆ
Ý'¨
Ñ3Ô3Ð3ˆ<ð 	FÝ%+¨DÔ,BÝ.3°LÑ.AÔ.AÀDÄNÑ.Rñ-Sñ &Tô &TˆDÔ"õ
 &)¨Ô)?ÀÑ%EÔ%EˆDÔ"Ð"Ð"ð	Fð 	Fr?   c                óÆ  — |                      d¦  «        }t          |¦  «        x}rºt          t          |¦  «        | j        z  ¦  «        }| j        rq| j        j        re| j        j        j        rTt          j        |¬¦  «        }d|j	        _
        |                      ||¦  «         |                      ||¦  «         || _        t          | j        |z   ¦  «        | _        dS dS )zL
        Parse a forward tag by changing :attr:`offsetMeasureNote`.
        r   ©rÆ  TN)r[   rG   r   rQ   r  rZ  r  r!   rÂ  r'   rœ   r!  ÚinsertInMeasureOrVoicerd  ró   )r{   r@   r2  r3  Úchangerç  s         r=   rö  zMeasureParser.xmlForward°
  sî   € ð —Z’Z 
Ñ+Ô+ˆ
Ý'¨
Ñ3Ô3Ð3ˆ<ð 	MÝ�E ,Ñ/Ô/°$´.Ñ@ÑAÔAˆFà”ð 7ØœÔ*ð7àœÔ*ÔAð7õ ”I¨FÐ3Ñ3Ô3�Ø,0�”Ô)Ø×(Ò(¨°Ñ2Ô2Ð2Ø×+Ò+¨E°1Ñ5Ô5Ð5ð 67�Ô2õ &,¨DÔ,BÀVÑ,KÑ%LÔ%LˆDÔ"Ð"Ð"ð'	Mð 	Mr?   rÕ   c                ó2  ‡‡— ˆfd„}ˆfd„} |¦   «         } |¦   «         }‰                      d¦  «        du}| j        }|du r+|                      ‰¦  «        }|                     d|¦  «         |du s|du r+|                      ‰¦  «        }	|                     d|	¦  «         |du ry| j        Šˆfd„‰                     d¦  «        D ¦   «         }
|
D ]5}|�|j        €Œ|                      dt          |j        ¦  «        |¦  «         Œ6| j         
                    ¦   «          ‰                      d	¦  «        }|�bt          j        t          j        |j        ¦  «        }|j        |_        t          j        ¦   «         }|                      ||¦  «         ||_        dS dS )
zå
        <print> handles changes in pages, numbering, layout,
        etc. so can generate PageLayout, SystemLayout, or StaffLayout
        objects.

        Should also be able to set measure attributes on `self.stream`
        c                 ó–   •— ‰                       d¦  «        dvrdS ‰                       d¦  «        �dS ‰                      d¦  «        �dS dS )NrÌ   ©Nr›   TrÎ   rÏ   F©rv   r[   ©rÕ   s   €r=   ÚhasPageLayoutz-MeasureParser.xmlPrint.<locals>.hasPageLayoutÒ
  sR   ø€ Ø�{Š{˜:Ñ&Ô&¨lÐ:Ð:Ø�tØ�{Š{˜=Ñ)Ô)Ð5Ø�tØ�|Š|˜MÑ*Ô*Ð6Ø�tØ�5r?   c                 óh   •— ‰                       d¦  «        dvrdS ‰                      d¦  «        �dS dS )Nrå   r:  Træ   Fr;  r<  s   €r=   ÚhasSystemLayoutz/MeasureParser.xmlPrint.<locals>.hasSystemLayoutÛ
  s;   ø€ Ø�{Š{˜<Ñ(Ô(°Ð<Ð<Ø�tØ�|Š|˜OÑ,Ô,Ð8Ø�tØ�5r?   rw  NTr8  Fc                ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )ro   ÚmxÚslFuncs     €r=   ú
<listcomp>z*MeasureParser.xmlPrint.<locals>.<listcomp>ñ
  s!   ø€ ÐMÐMÐM b�v�v˜b‘z”zÐMÐMÐMr?   zmeasure-numbering)r[   r&   rØ   rÊ  rë   rú   r^  rö   r%  rR   rK  r“  r”  r'   ÚStreamStyler*   ÚmeasureNumberingr�  r�   ÚmeasureNumberStyle)r{   rÕ   r=  r?  ÚaddPageLayoutÚaddSystemLayoutÚaddStaffLayoutrÎ  ÚplÚslÚstlListÚstlÚmxMeasureNumberingÚm_styler‹  rB  s    `             @r=   r(  zMeasureParser.xmlPrintÊ
  sè  øø€ ð	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð &˜™œˆØ)˜/Ñ+Ô+ˆØ Ÿš nÑ5Ô5¸TÐAˆð ŒKˆØ˜DÐ Ð Ø×*Ò*¨7Ñ3Ô3ˆBØ�HŠH�S˜"ÑÔÐØ˜dÐ"Ð" m°uÐ&<Ð&<Ø×,Ò,¨WÑ5Ô5ˆBØ�HŠH�S˜"ÑÔÐØ˜TÐ!Ð!àÔ5ˆFØMÐMÐMÐM¨G×,<Ò,<¸^Ñ,LÔ,LÐMÑMÔMˆGð ð Fð F�Ø�; #¤/Ð"9ØØ×%Ò% c­3¨s¬Ñ+?Ô+?ÀÑEÔEÐEÐEØŒK×+Ò+Ñ-Ô-Ð-à$Ÿ\š\Ð*=Ñ>Ô>ÐØÐ)õ ”f�UÔ.°´Ñ8Ô8ˆGØ'9Ô'>ˆGÔ$Ý”Ñ"Ô"ˆBØ×#Ò#Ð$6¸Ñ;Ô;Ð;à)+ˆGÔ&Ð&Ð&ð *Ð)r?   ÚmxNotec                ó*  — 	 | j         | j        dz            }|j        dk    r|                     d¦  «        �d}nd}n# t          $ r d}Y nw xY wd}d}d}|                     d¦  «        �d}|                     d¦  «        �d}|r]d}|                     d	¦  «        }|�D|j        }t          |t          ¦  «        r!	 t          |¦  «        }n# t          $ r Y nw xY w|| _
        |du rOd}	| j                             |¦  «         |                     d
¦  «        D ]}
| j                             |
¦  «         Œn]|du r/|du r+| j        dxx         dz  cc<   |                      |¦  «        }	n*| j        dxx         dz  cc<   |                      |¦  «        }	|du r�t$          j        rt          |	t(          j        ¦  «        sJ ‚|                      |	|                     d
¦  «        ¦  «         |                      ||	¦  «         |                      ||	¦  «         |	j        j        }|	| _        | j        rÃ|du r¿|                      | j        ¦  «        }|                      || j        ¦  «         |                      | j        d         |¦  «         | j        D ]/}|                     d	¦  «        �|                      ||¦  «          nŒ0|                      ||¦  «         g | _        g | _        |j        }|| _        t;          | j        |z   ¦  «        | _        d| _        dS )a4  
        Handles everything for creating a Note or Rest or Chord

        Does not actually return the note, but sets self.nLast to the note.

        This routine uses coreInserts for speed, so it can leave either
        `self.stream` or a `Voice` object within `self.stream` in an unstable state.
        rô   r!   r   NTFr8  r  ÚvoiceÚlyricr   ) r  r  r`   r[   Ú
IndexErrorr*   rr   rB   rR   rS   r  r  rÃ   r<  r  r  ÚxmlToSimpleNoteÚ	xmlToRestr“  rÄ  r!   rf  ÚupdateLyricsFromListr!  r6  r   rÆ  r  Ú
xmlToChordr   ró   rd  )r{   rP  Ú	mxObjNextÚnextNoteIsChordÚisChordÚisRestÚoffsetIncrementÚvoiceOfChordÚvIndexÚnÚmxLyricrÈ   Ú
thisMxNotes                r=   rô  zMeasureParser.xmlToNote	  s…  € ð	$ØÔ.¨t¬ÀÑ/BÔCˆIØŒ} Ò&Ð&¨9¯>ª>¸'Ñ+BÔ+BÐ+NØ"&��à"'�øøÝð 	$ð 	$ð 	$Ø#ˆOˆOˆOð	$øøøð ˆØˆð 58ˆà�;Š;�vÑÔÐ*ØˆFØ�;Š;�wÑÔÐ+ØˆGð ð 
	(ØˆGØ!Ÿ;š; wÑ/Ô/ˆLØÐ'Ø'3Ô'8�Ý˜f¥cÑ*Ô*ð ðÝ!$ V¡¤˜˜øÝ%ð ð ð Ø˜ðøøøà!'�”à�dˆ?ˆ?ØˆAØŒO×"Ò" 6Ñ*Ô*Ð*à!Ÿ>š>¨'Ñ2Ô2ð 1ð 1�ØÔ ×'Ò'¨Ñ0Ô0Ð0Ð0ð1à˜ÐÐ &¨E / /ØÔ! &Ð)Ð)Ô)¨QÑ.Ð)Ð)Ñ)Ø×$Ò$ VÑ,Ô,ˆAˆAàÔ! &Ð)Ð)Ô)¨QÑ.Ð)Ð)Ñ)Ø—’˜vÑ&Ô&ˆAà�eÐÐÝŒð 7Ý! !¥TÔ%5Ñ6Ô6Ð6Ð6Ð6à×%Ò% a¨¯ª¸Ñ)@Ô)@ÑAÔAÐAØ×$Ò$ V¨QÑ/Ô/Ð/Ø×'Ò'¨°Ñ2Ô2Ð2ØœjÔ6ˆOØˆDŒJð
 Œ?ð 	˜°%Ð7Ð7Ø—’ ¤Ñ0Ô0ˆAà×%Ò% a¨Ô)9Ñ:Ô:Ð:Ø×$Ò$ T¤_°QÔ%7¸Ñ;Ô;Ð;Ø"œoð 7ð 7�
à—?’? 7Ñ+Ô+Ð7Ø×/Ò/°
¸AÑ>Ô>Ð>Ø�Eð 8ð ×+Ò+¨F°AÑ6Ô6Ð6à ˆDŒOØ!ˆDÔàœoˆOØˆDŒJõ "(¨Ô(>ÀÑ(PÑ!QÔ!QˆÔØ-1ˆÔ*Ð*Ð*s!   ‚:= ½AÁAÂ;C Ã
CÃCr  úlist[ET.Element]úchord.ChordBasec                ó*  — g }|D ],}|                      |                      |d¬¦  «        ¦  «         Œ-t          d„ |D ¦   «         ¦  «        rt          j        |¦  «        }nt          j        |¦  «        }|r0|d         j        |_        t          j	        ¦   «         |d         _        t          ¦   «         }t          ¦   «         }d„ }t          ||¬¦  «        D �]!}|                     ¦   «         }	|	D ]}
|
                     ||¦  «         Œ|j        D ]�}t          |¦  «        |v rŒ|j                              |¦  «         t!          |t          j        t          j        t          j        f¦  «        s"|                     t          |¦  «        ¦  «         Œ‚|j        D ]P}t          |¦  «        |v rŒ|j                              |¦  «         |                     t          |¦  «        ¦  «         ŒQg |_        g |_        �Œ#| j                             |¦  «         |S )aë  
        Given a list of mxNotes, fill the necessary parameters

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.divisions = 10080

        >>> qnDuration = r'<duration>7560</duration><type>quarter</type>'

        >>> a = EL('<note>'
        ...        + '<pitch><step>A</step><octave>3</octave></pitch>'
        ...        + qnDuration
        ...        + '</note>')
        >>> b = EL('<note><chord/>'
        ...        + '<pitch><step>B</step><octave>3</octave></pitch>'
        ...        + qnDuration
        ...        + '</note>')
        >>> c = MP.xmlToChord([a, b])
        >>> len(c.pitches)
        2
        >>> c.pitches[0]
        <music21.pitch.Pitch A3>
        >>> c.pitches[1]
        <music21.pitch.Pitch B3>
        >>> c.duration
        <music21.duration.Duration unlinked type:quarter quarterLength:0.75>

        >>> a = EL('<note><pitch><step>A</step><octave>3</octave></pitch>'
        ...        + qnDuration
        ...        + '<notehead>diamond</notehead></note>')
        >>> c = MP.xmlToChord([a, b])
        >>> c.getNotehead(c.pitches[0])
        'diamond'

        >>> a = EL('<note><unpitched><display-step>A</display-step>'
        ...        + '<display-octave>3</display-octave></unpitched>'
        ...        + qnDuration
        ...        + '<notehead>diamond</notehead></note>')
        >>> MP.xmlToChord([a, b])
        <music21.percussion.PercussionChord [unpitched[A3] B3]>
        F©ÚfreeSpannersc              3  óD   K  — | ]}|                      d ¦  «        duV — ŒdS )Ú	unpitchedN)r[   )ro   rP  s     r=   rq   z+MeasureParser.xmlToChord.<locals>.<genexpr>š  s3   è è € ÐMÐM¸ˆv�{Š{˜;Ñ'Ô'¨tÐ3ÐMÐMÐMÐMÐMÐMr?   r   c                ól   — t          | d¦  «        r| j        j        n|                      ¦   «         j        S )Nr#   )r–   r#   ÚpsÚdisplayPitchÚmidi)rp   s    r=   ú<lambda>z*MeasureParser.xmlToChord.<locals>.<lambda>¬  s*   € ­'°!°WÑ*=Ô*=ÐX˜AœGœJ˜JÀ1Ç>Â>ÑCSÔCSÔCX€ r?   r   )rÃ   rU  Úanyr"   ÚPercussionChordr   ÚChordÚbeamsr   ÚBeamsr�  r±  ÚgetSpannerSitesÚreplaceSpannedElementr   r`  rr   Ú	FingeringÚStringIndicationÚFretIndicationrg   r   r  Ú#freePendingSpannedElementAssignment)r{   r  ÚnotesrP  rÈ   ÚseenArticulationsÚseenExpressionsÚsortKeyr`  ÚssrW  ÚartÚexps                r=   rX  zMeasureParser.xmlToChordj  s)  € ðV ˆØ ð 	Kð 	KˆFØ�LŠL˜×-Ò-¨fÀ5Ð-ÑIÔIÑJÔJÐJÐJõ ÐMÐMÀ*ÐMÑMÔMÑMÔMð 	#ÝÔ*¨5Ñ1Ô1ˆAˆAå”˜EÑ"Ô"ˆAð ð 	*Ø˜A”h”nˆAŒGÝ!œZ™\œ\ˆE�!ŒHŒNõ  ™EœEÐÝ™%œ%ˆàXÐXˆå˜ 7Ð+Ñ+Ô+ð 	ñ 	ˆAØ×"Ò"Ñ$Ô$ˆBàð /ð /�Ø×(Ò(¨¨AÑ.Ô.Ð.Ð.Ø”ð 5ð 5�Ý˜‘9”9Ð 1Ð1Ð1ØØ”×&Ò& sÑ+Ô+Ð+Ý! #­Ô(?Ý(5Ô(FÝ(5Ô(Dð(Fñ Gô Gð 5ð &×)Ò)­$¨s©)¬)Ñ4Ô4Ð4øØ”}ð /ð /�Ý˜‘9”9 Ð/Ð/ØØ”×$Ò$ SÑ)Ô)Ð)Ø×#Ò#¥D¨¡I¤IÑ.Ô.Ð.Ð.à ˆAŒOØˆAŒM‰MàÔ×>Ò>¸qÑAÔAÐAØˆr?   Túnote.Note | note.Unpitchedc                óJ  — |                       |¦  «        }|                     d¦  «        }|€1t          j        |¬¦  «        }|                      ||j        ¦  «         n+t          j        |¬¦  «        }|                      ||¦  «         |                     d¦  «        }|r|  	                    |¦  «        |_
        |                     d¦  «        }|��|j                             ¦   «         |_        |j        rjt          j        ¦   «         }|                      ||¦  «         |                      ||¦  «         t'          j        t          j        |j        ¦  «        }	||	_        |                     d¦  «        }
|
�|                      ||
¦  «         |                      |||¬¦  «        S )aD  
        Translate a MusicXML <note> (without <chord/>)
        to a :class:`~music21.note.Note`.

        The `spannerBundle` parameter can be a list or a Stream
        for storing and processing Spanner objects.

        if freeSpanners is False then pending spanners will not be freed.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> MP.divisions = 10080

        >>> mxNote = EL('<note pizzicato="yes"><pitch><step>D</step>'
        ...             '<alter>-1</alter><octave>6</octave></pitch>'
        ...             '<duration>7560</duration>'
        ...             '<type>eighth</type><dot/></note>')

        >>> n = MP.xmlToSimpleNote(mxNote)
        >>> n
        <music21.note.Note D->
        >>> n.octave
        6
        >>> n.duration
        <music21.duration.Duration 0.75>
        >>> n.articulations
        [<music21.articulations.Pizzicato>]

        >>> beams = EL('<beam>begin</beam>')
        >>> mxNote.append(beams)
        >>> n = MP.xmlToSimpleNote(mxNote)
        >>> n.beams
        <music21.beam.Beams <music21.beam.Beam 1/start>>

        >>> stem = EL('<stem>up</stem>')
        >>> mxNote.append(stem)
        >>> n = MP.xmlToSimpleNote(mxNote)
        >>> n.stemDirection
        'up'

        # TODO: beams over rests?
        ri  Nr   r   ÚstemÚnoteheadrf  )ÚxmlToDurationr[   r!   ÚNoteÚ
xmlToPitchr#   Ú	UnpitchedÚxmlToUnpitchedr<  Ú
xmlToBeamsrr  r*   r:   ÚstemDirectionr…  r'   rs   r¨   r¦   r“  r”  Ú	NoteStyleÚ	stemStyleÚxmlNoteheadÚxmlNoteToGeneralNoteHelper)r{   rP  rg  ÚdÚmxUnpitchedr`  ÚbeamListÚmxStemr�  Úthis_note_styleÚ
mxNoteheads              r=   rU  zMeasureParser.xmlToSimpleNoteÇ  s„  € ðZ ×Ò˜vÑ&Ô&ˆð —k’k +Ñ.Ô.ˆØÐå”	 1Ð%Ñ%Ô%ˆAØ�OŠO˜F A¤GÑ,Ô,Ð,Ð,å”¨Ð*Ñ*Ô*ˆAØ×Ò ¨QÑ/Ô/Ð/à—>’> &Ñ)Ô)ˆØð 	0Ø—o’o hÑ/Ô/ˆAŒGà—’˜VÑ$Ô$ˆØÐØ$œk×/Ò/Ñ1Ô1ˆAŒOàŒ}ð 6Ý!œK™MœM�	Ø—’˜f iÑ0Ô0Ð0Ø× Ò  ¨Ñ3Ô3Ð3Ý"#¤&­¬¸!¼'Ñ"BÔ"B�Ø,5�Ô)ð —[’[ Ñ,Ô,ˆ
àÐ!Ø×Ò˜Q 
Ñ+Ô+Ð+ð ×.Ò.¨q°&À|Ð.ÑTÔTÐTr?   ÚmxBeamc                óÔ  — |€t          j        ¦   «         }n|}|                      ||¦  «         |                      ||dd¦  «         t	          |j        t          ¦  «        r|j                             ¦   «         }nd}|dk    rd|_        nY|dk    rd|_        nK|dk    rd|_        n=|dk    rd	|_        d
|_	        n(|dk    rd	|_        d|_	        nt          d|› d�¦  «        ‚|€|S dS )au  
        given an mxBeam object return a :class:`~music21.beam.Beam` object

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxBeam = EL('<beam>begin</beam>')
        >>> a = MP.xmlToBeam(mxBeam)
        >>> a.type
        'start'

        >>> mxBeam = EL('<beam>continue</beam>')
        >>> a = MP.xmlToBeam(mxBeam)
        >>> a.type
        'continue'

        >>> mxBeam = EL('<beam>end</beam>')
        >>> a = MP.xmlToBeam(mxBeam)
        >>> a.type
        'stop'

        >>> mxBeam = EL('<beam>forward hook    </beam>')
        >>> a = MP.xmlToBeam(mxBeam)
        >>> a.type
        'partial'
        >>> a.direction
        'right'

        >>> mxBeam = EL('<beam>backward hook</beam>')
        >>> a = MP.xmlToBeam(mxBeam)
        >>> a.type
        'partial'
        >>> a.direction
        'left'

        >>> mxBeam = EL('<beam>crazy</beam>')
        >>> a = MP.xmlToBeam(mxBeam)
        Traceback (most recent call last):
        music21.musicxml.xmlObjects.MusicXMLImportException:
             unexpected beam type encountered (crazy)
        NÚfanÚbeginra  ÚcontinueÚendrb  zforward hookÚpartialrÞ   zbackward hookrÝ   z"unexpected beam type encountered (ú))r   ÚBeamr¨   r„   rr   r*   rB   r:   r`  rã   r/   )r{   r–  rÑ   ÚbeamOutÚmxTypes        r=   Ú	xmlToBeamzMeasureParser.xmlToBeam  s  € ðV ÐÝ”i‘k”kˆGˆGàˆGð 	�Š�f˜gÑ&Ô&Ð&Ø×Ò ¨°¸Ñ>Ô>Ð>å�f”k¥3Ñ'Ô'ð 	Ø”[×&Ò&Ñ(Ô(ˆFˆFàˆFà�WÒÐØ"ˆGŒLˆLØ�zÒ!Ð!Ø%ˆGŒLˆLØ�uŠ_ˆ_Ø!ˆGŒLˆLØ�~Ò%Ð%Ø$ˆGŒLØ 'ˆGÔÐØ�Ò&Ð&Ø$ˆGŒLØ &ˆGÔÐå)Ð*XÈvÐ*XÐ*XÐ*XÑYÔYÐYàÐØˆNð Ðr?   c                óÚ   — |€t          j        ¦   «         }n|}t          |¦  «        D ]>\  }}|                      |¦  «        }|dz   |_        |j                             |¦  «         Œ?|€|S dS )aÏ  
        given a list of mxBeam objects, sets the beamsList

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxBeam1 = EL('<beam>begin</beam>')
        >>> mxBeam2 = EL('<beam>begin</beam>')
        >>> mxBeamList = [mxBeam1, mxBeam2]
        >>> b = MP.xmlToBeams(mxBeamList)
        >>> b
        <music21.beam.Beams <music21.beam.Beam 1/start>/<music21.beam.Beam 2/start>>
        Nrô   )r   rs  r’  r¡  rñ   Ú	beamsListrÃ   )r{   Ú
mxBeamListrÑ   ÚbeamsOutrL  r–  ÚbeamObjs          r=   rŠ  zMeasureParser.xmlToBeamsh  s€   € ð ÐÝ”z‘|”|ˆHˆHàˆHå" :Ñ.Ô.ð 	/ð 	/‰IˆAˆvØ—n’n VÑ,Ô,ˆGØ ™UˆGŒNØÔ×%Ò% gÑ.Ô.Ð.Ð.àÐØˆOð Ðr?   c                ó\  — |j         dvr|j         |_        |                     d¦  «        }|�t          j        |¦  «        |_        |                     d¦  «        �|                     d¦  «        |j        _        |                     d¦  «        }|�t          j        |¦  «        |_        dS dS )a  
        Set notehead information from the mxNotehead object

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> n = note.Note()
        >>> nh = EL('<notehead color="#FF0000" filled="no" parentheses="yes">'
        ...         'diamond</notehead>')

        >>> MP.xmlNotehead(n, nh)
        >>> n.notehead
        'diamond'
        >>> n.noteheadFill
        False
        >>> n.noteheadParenthesis
        True
        >>> n.style.color
        '#FF0000'
        )rD   NÚfilledNrª   Úparentheses)	r*   r„  rv   r,   rx   ÚnoteheadFillr'   rª   ÚnoteheadParenthesis)r{   r`  r•  ÚnhfÚnhps        r=   rŽ  zMeasureParser.xmlNotehead„  s¡   € ð, Œ? *Ð,Ð,Ø#œˆAŒJØ�nŠn˜XÑ&Ô&ˆØˆ?Ý'Ô6°sÑ;Ô;ˆAŒNà�>Š>˜'Ñ"Ô"Ð.Ø&ŸNšN¨7Ñ3Ô3ˆAŒGŒMð �nŠn˜]Ñ+Ô+ˆØˆ?Ý$.Ô$=¸cÑ$BÔ$BˆAÔ!Ð!Ð!ð ˆ?r?   c                ó  — t           }|€t          j        ¦   «         }n|}|j        dk    r|}n|                     d¦  «        }|€|S  |||dd¦  «          |||ddt
          ¬¦  «         |                     d¦  «        }d}t          |¦  «        x}rt          |¦  «        }|                     d¦  «        }	d}
t          |	¦  «        x}r|}
|
�o	 |                      |	¦  «        }||_	        d|j	        _
        |�.||j        k    r#|                     dt          |¦  «        ¦  «         nf# t          j        $ r Y nUw xY w|�O	 t          j        |¦  «        |_	        n(# t          j        $ r t          d	|› d
|› �¦  «        ‚w xY wd|j	        _
        |S )aq  
        Given a MusicXML Note object, set this Pitch object to its values.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> b = EL('<note><pitch><step>E</step><alter>-1</alter>'
        ...        '<octave>3</octave></pitch></note>')
        >>> a = MP.xmlToPitch(b)
        >>> print(a)
        E-3

        Conflicting alter and accidental -- alter is still stored, but name is :

        >>> b = EL('<note><pitch><step>E</step><alter>-1</alter><octave>3</octave></pitch>'
        ...        '<accidental>sharp</accidental></note>')
        >>> a = MP.xmlToPitch(b)
        >>> print(a)
        E#3
        >>> a.fullName
        'E-sharp in octave 3'

        >>> a.accidental.alter
        -1.0

        >>> a.accidental.name
        'sharp'

        >>> a.accidental.modifier
        '#'
        Nr#   ÚstepÚoctaverW   ÚalterÚ
accidentalTzincorrect accidental z for pitch F)rc   r#   ÚPitchr`   r[   rR   rG   rQ   ÚxmlToAccidentalr²  ÚdisplayStatusr±  ÚsetAttributeIndependentlyÚAccidentalExceptionÚ
Accidentalr/   )r{   rP  rÑ   rá   rT  ÚmxPitchÚmxAlterÚaccAlterÚ	alterTextÚmxAccidentalÚmxAccidentalNameÚaccidentalTextÚaccObjs                r=   r‡  zMeasureParser.xmlToPitch¨  sì  € õ@ (ˆØÐÝ”‘”ˆAˆAàˆAàŒ:˜Ò Ð ØˆGˆGà—k’k 'Ñ*Ô*ˆGØˆØ�àˆˆQ�˜ Ñ(Ô(Ð(ØˆˆQ�˜ 8µsÐ;Ñ;Ô;Ð;Ø—,’,˜wÑ'Ô'ˆØˆÝ$ WÑ-Ô-Ð-ˆ9ð 	(Ý˜YÑ'Ô'ˆHà—{’{ <Ñ0Ô0ˆØÐÝ)¨,Ñ7Ô7Ð7ˆ>ð 	.ð  .ÐàÐ'ð
Ø×-Ò-¨lÑ;Ô;�Ø%�”Ø-1�”Ô*àÐ'¨H¸¼Ò,DÐ,DØ×4Ò4°W½eÀH¹o¼oÑNÔNÐNøøåÔ,ð ð ð à�ðøøøð Ð!ðFÝ$Ô/°Ñ9Ô9�”�øÝÔ,ð Fð Fð FÝ-ØD¨HÐDÐDÀÐDÐDñFô Fð FðFøøøð */ˆAŒLÔ&àˆs   ÃAD' Ä'D9Ä8D9Ä?E Å%E>r‘  rÑ   únote.Unpitched | Noneúnote.Unpitchedc                ó  — |€t          j        ¦   «         }n|}|                     d¦  «        }|                     d¦  «        }t          |¦  «        x}r||_        t          |¦  «        x}rt          |¦  «        |_        |S )aÎ  
        Set `displayStep` and `displayOctave` from `mxUnpitched`.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.divisions = 10080

        >>> mxNote = EL('<note><duration>7560</duration><type>eighth</type></note>')
        >>> unpitched = EL('<unpitched>'
        ...                '<display-step>E</display-step>'
        ...                '<display-octave>5</display-octave>'
        ...                '</unpitched>')
        >>> mxNote.append(unpitched)
        >>> n = MP.xmlToSimpleNote(mxNote)
        >>> n.displayStep
        'E'
        >>> n.displayOctave
        5
        >>> n.displayPitch().midi
        76
        Núdisplay-stepúdisplay-octave)r!   rˆ  r[   rG   ÚdisplaySteprR   ÚdisplayOctave)r{   r‘  rÑ   ÚunpÚmxDisplayStepÚmxDisplayOctaveÚdisplayStepTextÚdisplayOctaveTexts           r=   r‰  zMeasureParser.xmlToUnpitchedú  s�   € ð4 ÐÝ”.Ñ"Ô"ˆCˆCàˆCà#×(Ò(¨Ñ8Ô8ˆØ%×*Ò*Ð+;Ñ<Ô<ˆÝ*¨=Ñ9Ô9Ð9ˆ?ð 	.Ø-ˆCŒOÝ ,¨_Ñ =Ô =Ð=Ðð 	7Ý #Ð$5Ñ 6Ô 6ˆCÔàˆ
r?   r½  úpitch.Accidental | Noneúpitch.Accidentalc                ó
  — |€t          j        ¦   «         }n|}	 t          |¦  «                             ¦   «         }n# t          $ r |cY S w xY w|| j        v r| j        |         }n|}|                     |d¬¦  «         |                      ||¦  «         |                     d¦  «        }|                     d¦  «        }|dk    r|dk    rd|_	        n|dk    rd|_	        n|dk    rd|_	        |  
                    ||¦  «         |S )am  
        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> a = EL('<accidental parentheses="yes">sharp</accidental>')
        >>> b = MP.xmlToAccidental(a)
        >>> b.name
        'sharp'
        >>> b.alter
        1.0
        >>> b.displayStyle
        'parentheses'

        >>> a = EL('<accidental>half-flat</accidental>')
        >>> b = pitch.Accidental()
        >>> unused = MP.xmlToAccidental(a, b)
        >>> b.name
        'half-flat'
        >>> b.alter
        -0.5

        >>> a = EL('<accidental bracket="yes">sharp</accidental>')
        >>> b = MP.xmlToAccidental(a)
        >>> b.displayStyle
        'bracket'

        >>> a = EL('<accidental bracket="yes" parentheses="yes">sharp</accidental>')
        >>> b = MP.xmlToAccidental(a)
        >>> b.displayStyle
        'both'
        NT)ÚallowNonStandardValuer©  Úbracketr½   Úboth)r#   r¸  rG   ÚlowerrE   rÿ   r�  r¤   rv   ÚdisplayStylerÊ   )r{   r½  rÑ   ÚaccÚmxNamer~  r©  rÑ  s           r=   r´  zMeasureParser.xmlToAccidental"  sD  € ðH ÐÝÔ"Ñ$Ô$ˆCˆCàˆCð	Ý! ,Ñ/Ô/×5Ò5Ñ7Ô7ˆFˆFøÝð 	ð 	ð 	ØˆJˆJˆJð	øøøð �TÔ/Ð/Ð/ØÔ-¨fÔ5ˆDˆDàˆDð 	�Š�¨DˆÑ1Ô1Ð1Ø×Ò˜<¨Ñ-Ô-Ð-ð #×&Ò& }Ñ5Ô5ˆØ×"Ò" 9Ñ-Ô-ˆØ˜%ÒÐ G¨uÒ$4Ð$4Ø%ˆCÔÐØ˜EÒ!Ð!Ø,ˆCÔÐØ˜ÒÐØ(ˆCÔð 	×Ò˜,¨Ñ,Ô,Ð,àˆ
s   š!< ¼AÁ
Ac                ó¨  — |                       |¦  «        }t          j        |¬¦  «        }|                     d¦  «        }|€t	          d¦  «        ‚|                     d¦  «        }|dk    r6t          |                     d¦  «        ¦  «        x}r|dv rd	| _        d	|_        | j	        r| j	         
                    |¦  «         |                     d
¦  «        }t          |¦  «        x}rÕ|                     d¦  «        }	t          |	¦  «        x}
r||
                     ¦   «         z  }t          j        |¦  «        }|                      |¦  «        pd}	 | j        |         }|�t!          |t"          j        ¦  «        st"          j        }n
|j        dz   }n# t*          $ r t"          j        }Y nw xY w|j        |z
  |_        |                      ||¦  «        S )aa  
        Takes a <note> tag that has been shown to have a <rest> tag in it
        and return a rest.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.divisions = 10

        >>> mxr = EL('<note><rest/><duration>5</duration><type>eighth</type></note>')
        >>> r = MP.xmlToRest(mxr)
        >>> r
        <music21.note.Rest eighth>
        >>> r.duration.quarterLength
        0.5

        Rests that have display-step and display-octave get converted to rests
        with `stepShift` set.  For instance, this rest appears where G4 normally is:

        >>> mxr_positioned = EL(
        ...     '<note><rest>'
        ...     '<display-step>G</display-step>'
        ...     '<display-octave>4</display-octave>'
        ...     '</rest>'
        ...     '<duration>5</duration><type>eighth</type></note>'
        ... )
        >>> r = MP.xmlToRest(mxr_positioned)
        >>> r
        <music21.note.Rest eighth>

        A rest normally lies at B4 in treble clef, so G4 is shifted down two steps.

        >>> r.stepShift
        -2

        Note that clef context matters.  If the last clef for the staff were BassClef
        this would be a very high clef.  (Rests without a `<staff>` set read the clef
        from staff number 1, or treble clef if no pitch clef has been assigned).

        If the last clef for staff 1 were bass clef, this would be a very high rest.

        >>> MP.lastClefs[1] = clef.BassClef()
        >>> MP.xmlToRest(mxr_positioned).stepShift
        10

        Test full measure rest defined with measure="yes" and a duration indicating
        four quarter notes:

        >>> mxr = EL('<note><rest measure="yes"/><duration>40</duration></note>')
        >>> r = MP.xmlToRest(mxr)
        >>> MP.fullMeasureRest
        True

        Note that here set `r`'s `.fullMeasure` to True or always because it has no type.

        >>> r.fullMeasure
        True

        Same goes for rests which define type of whole (or breve), regardless of duration:

        >>> mxr = EL('<note><rest measure="yes"/><duration>40</duration><type>whole</type></note>')
        >>> r = MP.xmlToRest(mxr)
        >>> MP.fullMeasureRest
        True
        >>> r.fullMeasure
        True

        But a rest that defines `measure="yes"` but has a type other than whole or breve
        will set MeasureParser to fullMeasureRest but not set fullMeasure = True
        on the music21 Rest object itself because pickup measures often use
        measure="yes" in Finale, but display as quarter rests, etc.
        See https://github.com/w3c-cg/musicxml/issues/478

        >>> mxr = EL('<note><rest measure="yes"/><duration>10</duration>'
        ...          '<type>quarter</type></note>')
        >>> r = MP.xmlToRest(mxr)
        >>> MP.fullMeasureRest
        True
        >>> r.fullMeasure
        'auto'

        OMIT_FROM_DOCS

        Check that the `<staff>` element for rests is properly read.

        >>> MP2 = musicxml.xmlToM21.MeasureParser()
        >>> MP2.divisions = 10
        >>> MP2.lastClefs[1] = clef.BassClef()
        >>> MP2.lastClefs[2] = clef.AltoClef()

        >>> staff2 = EL('<staff>2</staff>')
        >>> mxr_positioned.append(staff2)
        >>> r = MP2.xmlToRest(mxr_positioned)

        From treble is -2, but +6 for treble to alto clef conversion = 4

        >>> r.stepShift
        4
        r   r  Nz@do not call xmlToRest on a <note> unless it contains a rest tag.r]  r½   r`  r¶  TrÄ  rÅ  rô   é   )r…  r!   rÂ  r[   r/   rv   rG   rÁ  rÇ  rZ  rê  r:   r#   r³  r  r  rr   r	   Ú	PitchClefÚTREBLE_MID_LINE_DNNÚ
lowestLinerA  ÚdiatonicNoteNumÚ	stepShiftr�  )r{   ÚmxRestr�  rç  Ú	mxRestTagÚisFullMeasureÚrTypeÚdsÚds_textÚdoÚdo_textÚtempPÚ	restStaffÚccÚ	ccMidLines                  r=   rV  zMeasureParser.xmlToResti  sè  € ðH ×Ò˜vÑ&Ô&ˆÝŒI˜qÐ!Ñ!Ô!ˆØ—K’K Ñ'Ô'ˆ	ØÐÝ)ð +Cñ Dô Dð Dà!Ÿš iÑ0Ô0ˆØ˜EÒ!Ð!å)¨&¯+ª+°fÑ*=Ô*=Ñ>Ô>Ð>�Eð %À5ÐL^ÐC^ÐC^à'+�Ô$Ø $�”ð Œ;ð 	1ØŒK×-Ò-¨aÑ0Ô0Ð0à�^Š^˜NÑ+Ô+ˆÝ" 2Ñ&Ô&Ð&ˆ7ð 	<Ø—’Ð 0Ñ1Ô1ˆBÝ& rÑ*Ô*Ð*ˆwð +Ø˜7Ÿ=š=™?œ?Ñ*�å”K Ñ(Ô(ˆEð ×+Ò+¨FÑ3Ô3Ð8°qˆIð5Ø”^ IÔ.�Ø�:¥Z°µD´NÑ%CÔ%C�:Ý $Ô 8�I�Ià "¤°Ñ 1�IøøÝð 5ð 5ð 5å Ô4�	�	�	ð5øøøð  Ô/°)Ñ;ˆAŒKà×.Ò.¨q°&Ñ9Ô9Ð9s   ÅA F ÆF,Æ+F,c                óÞ  — | j         }|du r|                     |¦  «         |                      ||¦  «         |                      ||¦  «         |                     d¦  «        }|�%|j        st          |¦  «        dz  }||j        _        |                     d¦  «        dk    r+|j	         
                    t          j        ¦   «         ¦  «         |                     d¦  «        }d}|�Id}|                     d	¦  «        }	|	€t          j        |d
¦  «         |                      ||j        ¦  «         |                     d	¦  «        }
|
�|                      |
|dd¦  «         |                     d¦  «        �|                      |¦  «        |_        |du r|                      ||¦  «        }|                     d¦  «        }|D ]}|                      ||¦  «         Œ|                      ||¦  «         |S )a‘  
        Combined function to work on all <note> tags, where n can be
        a Note or Rest.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> n = note.Note()
        >>> mxNote = EL('<note color="silver"></note>')
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> n = MP.xmlNoteToGeneralNoteHelper(n, mxNote)
        >>> n.style.color
        'silver'
        Tr   Ng¨mÐ�Ú}?Ú	pizzicator½   ÚgraceFr`  z<type>eighth</type>ÚsizeÚnoteSizer+   Ú	notations)r  ry  r¤   rž   rv   r\  rQ   ÚvolumeÚvelocityScalarr   rÃ   Ú	Pizzicator[   r%  Ú
SubElementr…  r   r„   ÚxmlToTier+   ÚxmlGraceToGracer<  ÚxmlNotationsrÊ   )r{   r`  rP  rg  r  ÚdynamPercentageÚ
dynamFloatÚmxGraceÚisGraceÚ	graceTyper   ÚmxNotationsÚmxNs                r=   r�  z(MeasureParser.xmlNoteToGeneralNoteHelper÷  s  € ð Ô*ˆØ˜4ÐÐØ×=Ò=¸aÑ@Ô@Ð@ð 	×Ò˜6 1Ñ%Ô%Ð%ð 	×Ò˜F AÑ&Ô&Ð&ð !Ÿ*š* ZÑ0Ô0ˆØÐ&¨q¬xÐ&Ý˜Ñ/Ô/°:Ñ>ˆJØ&0ˆAŒHÔ#ð �:Š:�kÑ"Ô" eÒ+Ð+ØŒO×"Ò"¥=Ô#:Ñ#<Ô#<Ñ=Ô=Ð=ð —+’+˜gÑ&Ô&ˆØˆàÐØˆGØŸš FÑ+Ô+ˆIØÐ õ ”˜fÐ&;Ñ<Ô<Ð<Ø×Ò˜v q¤zÑ2Ô2Ð2ð —’˜VÑ$Ô$ˆØÐØ×#Ò# F¨A¨v°zÑBÔBÐBà�;Š;�uÑÔÐ)Ø—M’M &Ñ)Ô)ˆAŒEð
 �dˆ?ˆ?Ø×$Ò$ W¨aÑ0Ô0ˆAð —n’n [Ñ1Ô1ˆØð 	&ð 	&ˆCØ×Ò˜c 1Ñ%Ô%Ð%Ð%à×Ò˜& !Ñ$Ô$Ð$àˆr?   c                óÜ  — d}d}|€d}n|}| j         }|                     d¦  «        }|�9t          |j                             ¦   «         ¦  «        }t          ||z  ¦  «        }	nd}	|                     d¦  «        }
t          |
¦  «        x}rct          |¦  «        }d}t          | 	                    d¦  «        ¦  «        }|                     d	¦  «        }|�|  
                    |¦  «        }nd}nd}d
}|�.t          j        |	¬¦  «        }|j        |_        |j        |_        nt          j        |	¬¦  «        }|s¯t          j        ||¦  «        }|j        |	k    r|s|€|ndS |�1|                     ¦   «          d|_        |                     |¦  «         nt          j        |¬¦  «        }|D ]}|                     |¦  «         Œt)          |j        |	d¬¦  «        sd|_        |	|_        |€|S dS )aÜ  
        Translate a `MusicXML` <note> object's
        <duration>, <type>, <dot>, tuplets, etc.
        to a music21 :class:`~music21.duration.Duration` object.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> MP.divisions = 10080

        >>> mxNote = EL('<note><pitch><step>D</step>'
        ...             '<alter>-1</alter><octave>6</octave></pitch>'
        ...             '<duration>7560</duration>'
        ...             '<type>eighth</type><dot/></note>')

        >>> c = duration.Duration()
        >>> MP.xmlToDuration(mxNote, c)
        >>> c
        <music21.duration.Duration 0.75>
        >>> c.quarterLength
        0.75
        >>> c.type
        'eighth'
        >>> c.dots
        1

        If the `<duration>` doesn't match the `<type>` and `<dots>`,
        an unlinked duration is created so that `.quarterLength` agrees with
        `<duration>` but the notated types can still be represented.

        Create a second dot on `mxNote` and parse again, observing the identical
        `quarterLength`:

        >>> from xml.etree.ElementTree import SubElement
        >>> unused = SubElement(mxNote, 'dot')
        >>> c2 = MP.xmlToDuration(mxNote)
        >>> c2
        <music21.duration.Duration unlinked type:eighth quarterLength:0.75>
        >>> c2.quarterLength
        0.75
        >>> c2.type
        'eighth'
        >>> c2.dots
        2

        Grace note durations will be converted later to GraceDurations:

        >>> mxDuration = mxNote.find('duration')
        >>> mxNote.remove(mxDuration)
        >>> mxGrace = SubElement(mxNote, 'grace')
        >>> MP.xmlToDuration(mxNote, inputM21=c2)
        >>> c2
        <music21.duration.Duration unlinked type:eighth quarterLength:0.0>
        >>> gn1 = note.Note(duration=c2)
        >>> gn2 = MP.xmlGraceToGrace(mxGrace, gn1)
        >>> gn2.duration
        <music21.duration.GraceDuration unlinked type:eighth quarterLength:0.0>
        r   r   Nr   r8  r`  FÚdotútime-modificationTr5  )ÚdurationTuplegH¯¼šò×z>)Úabs_tol)r  r[   rQ   r*   r:   r   rG   rO   Úlenr<  ÚxmlToTupletsr   ÚDurationÚ
componentsrÉ  ÚdurationTupleFromTypeDotsrÆ  ÚclearÚaddDurationTupleÚappendTupletr   Úlinked)r{   rP  rÑ   ÚnumDotsrÉ  r�  r  r2  ÚnoteDivisionsÚqLenr   ÚtypeStrÚdurationTypeÚforceRawÚmxTimeModificationÚdurRawÚdtÚtups                     r=   r…  zMeasureParser.xmlToDurationS  s0  € ðx ˆØˆàÐØˆAˆAàˆAà”Nˆ	Ø—[’[ Ñ,Ô,ˆ
ØÐ!Ý! *¤/×"7Ò"7Ñ"9Ô"9Ñ:Ô:ˆMÝ˜-¨)Ñ3Ñ4Ô4ˆDˆDàˆDà—’˜VÑ$Ô$ˆÝ" 6Ñ*Ô*Ð*ˆ7ð 	Ý-¨gÑ6Ô6ˆLØˆHõ ˜&Ÿ.š.¨Ñ/Ô/Ñ0Ô0ˆGð "(§¢Ð-@Ñ!AÔ!AÐà!Ð-Ø×+Ò+¨FÑ3Ô3��ð ��ð  ˆLØˆHð ˆ=åÔ&°TÐ:Ñ:Ô:ˆFØ!Ô,ˆAŒLØœˆAŒIˆIõ Ô!°Ð5Ñ5Ô5ˆAàð 	'ÝÔ3°LÀ'ÑJÔJˆBØÔ  DÒ(Ð(°'Ð(ð %Ð,�q�q°$Ð6Øˆ}Ø—’‘	”	�	Ø�”	Ø×"Ò" 2Ñ&Ô&Ð&Ð&åÔ%°BÐ7Ñ7Ô7�àð $ð $�Ø—’˜sÑ#Ô#Ð#Ð#õ ˜1œ?¨D¸$Ð?Ñ?Ô?ð 'Ø �”Ø"&�”àÐØˆHð Ðr?   c                ó’  — |                      ¦   «         }|                     d¦  «        dv rd|j        _        nd|j        _        	 t	          |                     d¦  «        ¦  «        dz  |j        _        n# t          $ r Y nw xY w	 t	          |                     d¦  «        ¦  «        dz  |j        _        n# t          $ r Y nw xY w|S )z–
        Given a completely formed, non-grace Note or Chord that should become one
        create and return a m21 grace version of the same.
        Úslash)r½   NTFzsteal-time-previouséd   zsteal-time-following)ÚgetGracerv   r   r  rR   ÚstealTimePreviousrz   ÚstealTimeFollowing)r{   rù  ÚnoteOrChordr­  s       r=   rõ  zMeasureParser.xmlGraceToGraceÙ  sä   € ð
 ×#Ò#Ñ%Ô%ˆØ�;Š;�wÑÔ =Ð0Ð0Ø"&ˆDŒMÔÐà"'ˆDŒMÔð	Ý.1°'·+²+Ð>SÑ2TÔ2TÑ.UÔ.UÐX[Ñ.[ˆDŒMÔ+Ð+øÝð 	ð 	ð 	ØˆDð	øøøð	Ý/2°7·;²;Ð?UÑ3VÔ3VÑ/WÔ/WÐZ]Ñ/]ˆDŒMÔ,Ð,øÝð 	ð 	ð 	ØˆDð	øøøð
 ˆs$   Á/A6 Á6
BÂBÂ/B7 Â7
CÃCrü  r`  únote.GeneralNotec                ó   ‡— |                      d¦  «        }|dk    rdŠndŠˆfd„}d„ } ||d¦  «        D ]>}|                      |¦  «        } ||¦  «         |�|j                             |¦  «         Œ? ||d	¦  «        D ]>}|                      |¦  «        } ||¦  «         |�|j                             |¦  «         Œ?|                     d
¦  «        D ]†}t          j        ¦   «         }	 ||	¦  «         |                      ||	¦  «         |                      d¦  «        }
|
�|
|	_	        t          |¦  «        x}r||	_        |j                             |	¦  «         Œ‡dD �]}|                     |¦  «        D �]}d}|dk    rd}n|                      d¦  «        pd}|                      d¦  «        }|€/t          j        |¦  «        }|j                             |¦  «         Œk| j                             t          j        |d¦  «        }|r&t!          j        t          j        |d         ¦  «        }n6t          j        |¬¦  «        }||_        | j                             |¦  «         |                     |¦  «         �Œ�Œ d} ||d¦  «        D �]*}|j        t*          j        v s|j        dk    ry|                      ||¬¦  «        }|� |j        dk    r|                     |¦  «          ||¦  «         |                      ||¦  «         |�|}|j                             |¦  «         Œš|j        dk    rC|                      ||t          j        ¦  «        } ||¦  «         |                      ||¦  «         Œè|j        dk    r7|                      ||¦  «        } ||¦  «         |                      ||¦  «         �Œ,|                      ||¦  «         dS )a  
        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxNotations = EL('<notations>'
        ...                   '<fermata type="upright">angled</fermata>'
        ...                 '</notations>')
        >>> n = note.Note()
        >>> MP.xmlNotations(mxNotations, n)
        >>> n.expressions
        [<music21.expressions.Fermata>]
        >>> n.expressions[0].type
        'upright'
        >>> n.expressions[0].shape
        'angled'
        rš   r›   TFc                ó(   •— ‰sd S d| j         _        d S )NT)r'   rœ   )r"  Ú
hideObjects    €r=   ÚoptionalHideObjectz6MeasureParser.xmlNotations.<locals>.optionalHideObject  s    ø€ Øð Ø�Ø*.ˆCŒIÔ'Ð'Ð'r?   c                óT   — |                       |¦  «        }t          j        |¦  «        S rn   )r<  r
   ÚflattenList)rA  r~  r<  s      r=   Úflattenz+MeasureParser.xmlNotations.<locals>.flatten  s$   € Ø—j’j Ñ&Ô&ˆGÝÔ% gÑ.Ô.Ð.r?   Ú	technicalNr   Úfermatar`  )Ú
arpeggiateúnon-arpeggiateÚnormalr(  znon-arpeggiorã   rñ   r   )ÚarpeggioTypeÚ	ornamentsúaccidental-mark©ÚmostRecentOrnamentz	wavy-lineÚtremolo)rv   ÚxmlTechnicalToArticulationr   rÃ   ÚxmlToArticulationr<  r   ÚFermatarÊ   r`  rG   ÚshapeÚArpeggioMarkr  ÚgetByClassIdLocalCompleterG  r“  r”  ÚidLocalr°  r`   r,   ÚORNAMENT_MARKSÚxmlOrnamentToExpressionÚresolveOrnamentalPitchesÚxmlOneSpannerÚTrillExtensionÚxmlToTremoloÚxmlNotationsToSpanners)r{   rü  r`  ÚprintObjectValuer!  r$  r@   ÚtechnicalObjÚarticulationObjr&  ÚfermataTypeÚnotationTextÚ	tagSearchr*  ÚidFoundÚarpeggioÚsbÚarpeggioSpannerr.  r­  ÚtrillExtObjÚtremr   s                         @r=   rö  zMeasureParser.xmlNotationsò  sw  ø€ ð& 'Ÿ?š?¨>Ñ:Ô:ÐØ˜tÒ#Ð#ØˆJˆJàˆJð	/ð 	/ð 	/ð 	/ð 	/ð	/ð 	/ð 	/ð �W˜[¨+Ñ6Ô6ð 	5ð 	5ˆEØ×:Ò:¸5ÑAÔAˆLØÐ˜|Ñ,Ô,Ð,ØÐ'Ø”×&Ò& |Ñ4Ô4Ð4øà�W˜[¨/Ñ:Ô:ð 	8ð 	8ˆEØ"×4Ò4°UÑ;Ô;ˆOØÐ˜Ñ/Ô/Ð/ØÐ*Ø”×&Ò& Ñ7Ô7Ð7øð !×(Ò(¨Ñ3Ô3ð 
	*ð 
	*ˆEÝ!Ô)Ñ+Ô+ˆGØÐ˜wÑ'Ô'Ð'Ø×Ò˜k¨7Ñ3Ô3Ð3àŸ)š) FÑ+Ô+ˆKØÐ&Ø*�”Ý+¨EÑ2Ô2Ð2ˆ|ð -Ø ,�”ØŒM× Ò  Ñ)Ô)Ð)Ð)ð :ð 	:ñ 	:ˆIà$×,Ò,¨YÑ7Ô7ð :ñ :�Ø$,�ØÐ 0Ò0Ð0Ø#1�L�Là#(§9¢9¨[Ñ#9Ô#9Ð#E¸X�LØ$)§I¢I¨hÑ$7Ô$7�Ø�?Ý*Ô7¸ÑEÔE�HØ”M×(Ò(¨Ñ2Ô2Ð2Ð2àÔ+×EÒEÝ#Ô7¸À%ñIô I�Bàð Cå*+¬&µÔ1PÐRTÐUVÔRWÑ*XÔ*X˜˜å*5Ô*IÐWcÐ*dÑ*dÔ*d˜Ø29˜Ô/ØÔ*×1Ò1°/ÑBÔBÐBØ#×6Ò6°qÑ9Ô9Ð9Ñ9ñ):ð, 9=ÐØ�W˜[¨+Ñ6Ô6ð 	5ñ 	5ˆEØŒy�JÔ5Ð5Ð5¸¼ÐFWÒ9WÐ9WØ×3Ò3ØÐ.@ð 4ñ ô �ð &Ð1°e´iÐCTÒ6TÐ6Tà&×?Ò?ÀÑBÔBÐBØ"Ð" 4Ñ(Ô(Ð(Ø×!Ò! +¨tÑ4Ô4Ð4ØÐ#Ø)-Ð&Ø”M×(Ò(¨Ñ.Ô.Ð.øà”˜kÒ)Ð)à"×0Ò0°¸½;Ô;UÑVÔV�Ø"Ð" ;Ñ/Ô/Ð/Ø×!Ò! +¨{Ñ;Ô;Ð;Ð;à”˜iÒ'Ð'Ø×(Ò(¨°Ñ2Ô2�Ø"Ð" 4Ñ(Ô(Ð(Ø×!Ò! +¨tÑ4Ô4Ð4ùð 	×#Ò# K°Ñ3Ô3Ð3Ð3Ð3r?   c                óð  — |j         }|t          j        v �r>t          j        |         ¦   «         }t          ||¦  «         |dk    r|                      ||¦  «         |dv r#t          |¦  «        rt          |¦  «        |_        |dv r9	 t          |j        ¦  «        |_	        n# t          t          f$ r
}Y d}~nd}~ww xY w|dk    r|                      ||¦  «         |dv rA|                     d¦  «        �,t          j        |                     d¦  «        ¦  «        |_        |dk    r|                      ||¦  «         |                      ||¦  «         |S t$                               d	|› d
|› d�¦  «         dS )ac  
        Convert an mxArticulationMark to a music21.articulations.Articulation
        object or one of its subclasses.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxTech = EL('<down-bow placement="below"/>')
        >>> a = MP.xmlTechnicalToArticulation(mxTech)
        >>> a
        <music21.articulations.DownBow>
        >>> a.placement
        'below'

        Fingering might have substitution or alternate

        >>> mxTech = EL('<fingering substitution="yes">5</fingering>')
        >>> f = MP.xmlTechnicalToArticulation(mxTech)
        >>> f
        <music21.articulations.Fingering 5>
        >>> f.substitution
        True
        >>> f.alternate
        False

        FingerNumbers get converted to ints if possible

        >>> f.fingerNumber
        5

        >>> mxTech = EL('<fingering alternate="yes">4-3</fingering>')
        >>> f = MP.xmlTechnicalToArticulation(mxTech)
        >>>
        <music21.articulations.Fingering 4-3>
        >>> f.alternate
        True
        >>> f.fingerNumber
        '4-3'
        Ú	fingering)Úhandbellzother-technical)ÚfretÚstringNÚharmonic)ÚheelÚtoeÚsubstitutionÚbendúCannot translate r³  r´  )r`   r,   ÚTECHNICAL_MARKSÚsynchronizeIdsÚhandleFingeringrG   ÚdisplayTextrR   r*   rñ   rS   rz   ÚsetHarmonicrv   rx   rR  ÚsetBendr¸   rB  rC  )r{   r@   r`   ÚtechÚ
unused_errs        r=   r0  z(MeasureParser.xmlTechnicalToArticulationj  sž  € ðP ŒiˆØ•*Ô,Ð,Ñ,ÝÔ-¨cÔ2Ñ4Ô4ˆDÝ˜5 $Ñ'Ô'Ð'Ø�kÒ!Ð!Ø×$Ò$ T¨5Ñ1Ô1Ð1ØÐ5Ð5Ð5½,ÀuÑ:MÔ:MÐ5õ $0°Ñ#6Ô#6�Ô ØÐ(Ð(Ð(ðÝ"% e¤j¡/¤/�D”K�KøÝ"¥IÐ.ð ð ð Ø�D�D�D�Døøøøðøøøà�jÒ Ð Ø× Ò  ¨Ñ-Ô-Ð-Ø�oÐ%Ð%Ø—9’9˜^Ñ,Ô,Ð8Ý(2Ô(AÀ%Ç)Â)ÈNÑB[ÔB[Ñ(\Ô(\�DÔ%Ø�fŠ}ˆ}Ø—’˜U DÑ)Ô)Ð)ð ×Ò˜e TÑ*Ô*Ð*ØˆKå×#Ò#Ð$I¸Ð$IÐ$IÀÐ$IÐ$IÐ$IÑJÔJÐJØ�4s   ÂB" Â"B=Â8B=c                óV  — |                      d¦  «        }|�2|j        �+t          j        t	          |j        ¦  «        ¦  «        |_        |                      d¦  «        �d|_        |                      d¦  «        �|                      d¦  «        j        |_        |                      d¦  «        �z	 t	          |                      d¦  «                             d¦  «        ¦  «        }t          || j
        z  ¦  «        |_        dS # t          t          f$ r}d|_        Y d}~dS d}~ww xY wdS )	aL  
        Gets the bend amplitude from the bend-alter tag,
        then optional pre-bend and with-bar tags are processed,
        as well as release which is converted from divisions to music21 time.

        Called from xmlTechnicalToArticulation

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxTech = EL('<bend><bend-alter>2</bend-alter></bend>')
        >>> a = MP.xmlTechnicalToArticulation(mxTech)
        >>> a
        <music21.articulations.FretBend 0>
        >>> a.bendAlter.semitones
        2
        >>> a.release

        >>> a.withBar

        >>> a.preBend
        False

        >>> mxTech = EL('<bend><bend-alter>-2</bend-alter><pre-bend/></bend>')
        >>> a = MP.xmlTechnicalToArticulation(mxTech)
        >>> a.bendAlter.semitones
        -2
        >>> a.preBend
        True

        >>> mxTech = EL('<bend><bend-alter>-2</bend-alter><release offset="1"/></bend>')
        >>> a = MP.xmlTechnicalToArticulation(mxTech)
        >>> a.bendAlter.semitones
        -2
        >>> a.release
        Fraction(1, 10080)

        >>> mxTech = EL('<bend><bend-alter>-1</bend-alter><with-bar>dip</with-bar></bend>')
        >>> a = MP.xmlTechnicalToArticulation(mxTech)
        >>> a.bendAlter.semitones
        -1
        >>> a.withBar
        'dip'
        z
bend-alterNzpre-bendTzwith-barÚreleaser$  r8  )r[   r*   r   ÚIntervalrQ   Ú	bendAlterÚpreBendÚwithBarrv   r   r  r^  rS   rz   )r{   ÚmxhrS  r±  r  r\  s         r=   rZ  zMeasureParser.setBend´  s  € ðZ —’˜Ñ&Ô&ˆØÐØŒzÐ%Ý!)Ô!2µ5¸¼Ñ3DÔ3DÑ!EÔ!E�”Ø�8Š8�JÑÔÐ+ØˆDŒLØ�8Š8�JÑÔÐ+ØŸ8š8 JÑ/Ô/Ô4ˆDŒLØ�8Š8�IÑÔÐ*ð#Ý! #§(¢(¨9Ñ"5Ô"5×"9Ò"9¸(Ñ"CÔ"CÑDÔD�	Ý% i°$´.Ñ&@ÑAÔA�”��øÝ¥	Ð*ð #ð #ð #Ø"�”������øøøøð#øøøð	 +Ð*s   Â0AD ÄD&ÄD!Ä!D&c                ó,  — |                       d¦  «        �d|_        n|                       d¦  «        �d|_        |                       d¦  «        �	d|_        dS |                       d¦  «        �	d|_        dS |                       d¦  «        �	d	|_        dS dS )
a—  
        From the artificial or natural tag (or no tag) and
        zero or one of base-pitch, sounding-pitch, touching-pitch,
        sets .harmonicType and .pitchType on an articulations.Harmonic object

        Called from xmlTechnicalToArticulation

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxTech = EL('<harmonic><artificial/><sounding-pitch/></harmonic>')
        >>> a = MP.xmlTechnicalToArticulation(mxTech)
        >>> a
        <music21.articulations.StringHarmonic>

        >>> a.harmonicType
        'artificial'
        >>> a.pitchType
        'sounding'
        Ú
artificialNÚnaturalz
base-pitchr1   zsounding-pitchÚsoundingztouching-pitchÚtouching)r[   ÚharmonicTypeÚ	pitchType)rc  Úharms     r=   rY  zMeasureParser.setHarmonicð  sœ   € ð, �8Š8�LÑ!Ô!Ð-Ø ,ˆDÔÐØ�XŠX�iÑ Ô Ð,Ø )ˆDÔà�8Š8�LÑ!Ô!Ð-Ø#ˆDŒNˆNˆNØ�XŠXÐ&Ñ'Ô'Ð3Ø'ˆDŒNˆNˆNØ�XŠXÐ&Ñ'Ô'Ð3Ø'ˆDŒNˆNˆNð 4Ð3r?   c                ó˜  — |j         |_        	 t          |j        ¦  «        |_        n# t          t          f$ r
}Y d}~nd}~ww xY w|                     d¦  «        �,t          j        |                     d¦  «        ¦  «        |_        |                     d¦  «        �.t          j        |                     d¦  «        ¦  «        |_	        dS dS )zP
        A few specialized functions for dealing with fingering objects
        NrR  Ú	alternate)
r*   ÚfingerNumberrR   rS   rz   rv   r,   rx   rR  rm  )r{   r[  r@   r\  s       r=   rW  zMeasureParser.handleFingering  sÅ   € ð "œJˆÔð	Ý # DÔ$5Ñ 6Ô 6ˆDÔÐøÝ�IÐ&ð 	ð 	ð 	ØˆDˆDˆDˆDøøøøð	øøøà�9Š9�^Ñ$Ô$Ð0Ý *Ô 9¸%¿)º)ÀNÑ:SÔ:SÑ TÔ TˆDÔØ�9Š9�[Ñ!Ô!Ð-Ý'Ô6°u·y²yÀÑ7MÔ7MÑNÔNˆDŒNˆNˆNð .Ð-s   Ž( ¨A¾Ac                ó  — |j         }|t          j        v rÔt          j        |         ¦   «         }t          ||¦  «         |                      ||¦  «         |                      ||¦  «         |dk    r|                     d¦  «        }|�||_        nX|dv r|                      ||¦  «         n=|dk    rt          |¦  «        x}r||_
        n|dk    rt          |¦  «        x}r||_        |S t                               d|› d|› d	�¦  «         dS )
a.  
        Return an articulation from an mxObj, setting placement

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxArt = EL('<spiccato placement="above"/>')
        >>> a = MP.xmlToArticulation(mxArt)
        >>> a
        <music21.articulations.Spiccato>
        >>> a.placement
        'above'

        >>> mxArt = EL('<doit dash-length="2" default-x="5" default-y="2" '
        ...            'line-shape="curved" line-type="dashed" space-length="1" />')
        >>> a = MP.xmlToArticulation(mxArt)
        >>> a
        <music21.articulations.Doit>
        >>> a.placement is None
        True
        >>> a.style.dashLength
        2
        >>> a.style.absoluteX
        5
        >>> a.style.lineShape
        'curved'
        zstrong-accentr`  N)ÚdoitÚfalloffÚplopÚscoopzbreath-markzother-articulationrT  r³  r´  )r`   r,   ÚARTICULATION_MARKSrV  r¤   r¸   rv   ÚpointDirectionr˜   rG   r¬  rX  rB  rC  )r{   r@   r`   r@  ru  Ú
breathTextÚ	otherTexts          r=   r1  zMeasureParser.xmlToArticulation   s;  € ð8 ŒiˆØ•*Ô/Ð/Ð/Ý(Ô;¸CÔ@ÑBÔBˆOÝ˜5 /Ñ2Ô2Ð2à×Ò˜u oÑ6Ô6Ð6Ø×Ò˜e _Ñ5Ô5Ð5ð �oÒ%Ð%Ø!&§¢¨6Ñ!2Ô!2�Ø!Ð-Ø5C�OÔ2øØÐ<Ð<Ð<Ø×!Ò! %¨Ñ9Ô9Ð9Ð9Ø˜Ò%Ð%½ÀeÑ9LÔ9LÐ+L¨:Ð%Ø)3�Ô&Ð&ØÐ,Ò,Ð,½|ÈEÑ?RÔ?RÐ2R°)Ð,Ø.7�Ô+à"Ð"å×#Ò#Ð$I¸Ð$IÐ$IÀÐ$IÐ$IÐ$IÑJÔJÐJØ�4r?   r-  r.  úexpressions.Ornament | Nonec               ó¢  — |j         }|dk    r•|€dS |                      |¦  «        }d|_        t          |t          j        ¦  «        r,|                     dd¦  «        }|dk    r||_        n5||_        n-t          |t          j	        t          j
        f¦  «        r||_        dS 	 |dv r&t          j        |         t          j        ¬¦  «        }nC|d	v r&t          j        |         t          j        ¬¦  «        }nt          j        |         ¦   «         }n# t"          $ r Y dS w xY w|                      ||¦  «         |                      ||¦  «         |S )
aL  
        Convert mxOrnament into a music21 ornament.

        This only processes non-spanner ornaments.
        Many mxOrnaments are spanners: these are handled elsewhere.

        Returns None if it cannot be converted or is not defined, or if the
        mxObj is an accidental-mark (in which case the accidental is placed
        in the mostRecentOrnament instead).

        Return an articulation from an mxObj, setting placement

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxOrn = EL('<inverted-turn placement="above" font-size="24"/>')
        >>> a = MP.xmlOrnamentToExpression(mxOrn)
        >>> a
        <music21.expressions.InvertedTurn>
        >>> a.placement
        'above'
        >>> a.style.fontSize
        24

        If it can't be converted, return None

        >>> mxOrn = EL('<crazy-slide placement="above"/>')
        >>> a = MP.xmlOrnamentToExpression(mxOrn)
        >>> a is None
        True

        If it is 'accidental-mark', add to mostRecentOrnament, and return None

        >>> turn = expressions.Turn()
        >>> turn.lowerAccidental is None
        True
        >>> turn.upperAccidental is None
        True
        >>> mxOrn = EL('<accidental-mark placement="below">flat</accidental-mark>')
        >>> a = MP.xmlOrnamentToExpression(mxOrn, mostRecentOrnament=turn)
        >>> a is None
        True
        >>> turn.lowerAccidental
        <music21.pitch.Accidental flat>
        >>> turn.upperAccidental is None
        True

        Not supported currently: 'vertical-turn'
        r,  NTr·   ÚaboveÚbelow)zdelayed-turnzdelayed-inverted-turn)Údelay)Úturnzinverted-turn)r`   r´  rµ  rr   r   ÚTurnrv   ÚlowerAccidentalÚupperAccidentalÚGeneralMordentÚTrillr²  r,   r7  r   ÚDEFAULT_DELAYÚNO_DELAYrA  r¤   r¸   )r{   r@   r.  r`   Úaccidr·   Úorns          r=   r8  z%MeasureParser.xmlOrnamentToExpressionU  sv  € ðn ŒiˆØÐ#Ò#Ð#Ø!Ð)Ø�tà&*×&:Ò&:¸5Ñ&AÔ&AˆEØ"&ˆEÔåÐ,­kÔ.>Ñ?Ô?ð 	6ð "'§¢¨;¸Ñ!@Ô!@�	Ø Ò'Ð'Ø9>Ð&Ô6Ð6à9>Ð&Ô6Ð6ÝÐ.µÔ1KÍ[ÔM^Ð0_Ñ`Ô`ð 6Ø05Ð"Ô-Ø�4ð	ØÐ?Ð?Ð?Ý Ô/°Ô4½=Ô;VÐWÑWÔW��ØÐ1Ð1Ð1Ý Ô/°Ô4½=Ô;QÐRÑRÔR��å Ô/°Ô4Ñ6Ô6�øøÝð 	ð 	ð 	Ø�4�4ð	øøøà×Ò˜5 #Ñ&Ô&Ð&à×Ò˜% Ñ%Ô%Ð%Øˆ
s   Â$A-D Ä
D ÄD r�  ú
int | NoneÚtotalOffsetúOffsetQL | Nonec                ó  — | j         }g }|�t          |¦  «        }|j        dk    �r'|                     d¦  «        }|dk    rt          j        }n9|dk    rt          j        }n&|dk    rt          j        }nt          d|› d�¦  «        ‚|dk    rJ|  	                    |d|d	¬
¦  «        }| 
                    |¦  «         | j                             |d¦  «         nv|                     d¦  «        }	| j                             d|	d¦  «        }
	 |
d         }n# t          $ r t          d¦  «        ‚w xY wd	|_        |�|                     |¦  «         |j        dv �r|                     d¦  «        }|                     d¦  «        }	|dk    rßt#          j        ¦   «         }|	|_        |j        dk    rd|_        d|_        n_|                     d¦  «        }|�t-          |¦  «        |_        |                     d¦  «        |_        |                     d¦  «        |_        | j         
                    |¦  «         | 
                    |¦  «         | j                             |d¦  «         �n|dk    rõ	 | j                             d|	d¦  «        d         }n9# t          $ r, t1          j        d|j        z   dz   t4          d¬¦  «         g cY S w xY wd	|_        |j        dk    rd|_        d|_        n_|                     d¦  «        |_        |                     d¦  «        }|�t-          |¦  «        |_        |                     d¦  «        |_        |�|                     |¦  «         nt          d|› �¦  «        ‚|j        dk    �rm|                     d¦  «        }|                     d ¦  «        }|                     d¦  «        }	|d!v r�t#          j        ¦   «         }d|_        |d"k    r
d#}d$|_        n	d"}d%|_        |	|_        |pd&|f|_         | j         
                    |¦  «         | 
                    |¦  «         | j                             |d¦  «         nš|d'v r„| j                             d(|	d¦  «        }
	 |
d         }n# t          $ r t          d)¦  «        ‚w xY w|d*k    r| j                             |d¦  «         n1d	|_        |�|                     |¦  «         nt          d+|› �¦  «        ‚|j        d,k    �r|                     d¦  «        }|                     d-¦  «        }|                     d.¦  «        }|                     d/¦  «        }|                     d¦  «        }	|d0v rõtC          j"        ¦   «         }|	|_        || j#        |<   |dk    rtB          j$        j%        |_&        n|d1k    rtB          j$        j'        |_&        |d2k    rtB          j(        j        |_)        n"|d3k    s|d2k    rtB          j(        j*        |_)        |d2k    rd	|_+        | j         
                    |¦  «         | 
                    |¦  «         | j                             |d¦  «         �n¬|d4v �r•| j                             d5|	d¦  «        }
	 |
d         }n# t          $ r t          d6¦  «        ‚w xY w|d*k    r�n\|d7k    rAtC          j,        ¦   «         }|  -                    |||¦  «         |                     |¦  «         �n|d8k    r’| j#                             |d¦  «        }|j)        tB          j(        j*        k    r||k    rtB          j(        j.        |_)        n½tC          j/        ¦   «         }|  -                    |||¦  «         |                     |¦  «         n}|d9k    r@tC          j0        ¦   «         }|  -                    |||¦  «         |                     |¦  «         n7|dk    rd	|_        |�|                     |¦  «         nt          d:|› �¦  «        ‚|S );a  
        Some spanners, such as MusicXML wedge, bracket, dashes, pedal,
        and ottava are encoded as MusicXML directions.

        :param mxObj: the specific direction element (e.g. <wedge>).
        :param staffKey: staff number (required for <pedal>)
        :param totalOffset: offset in measure of this direction (required for <pedal>)

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> n1 = note.Note('D4')
        >>> MP.nLast = n1

        >>> len(MP.spannerBundle)
        0
        >>> mxDirectionType = EL('<wedge type="crescendo" number="2"/>')
        >>> retList = MP.xmlDirectionTypeToSpanners(mxDirectionType)
        >>> retList
        [<music21.dynamics.Crescendo>]

        >>> len(MP.spannerBundle)
        1
        >>> sp = MP.spannerBundle[0]
        >>> sp
        <music21.dynamics.Crescendo>

        >>> mxDirectionType2 = EL('<wedge type="stop" number="2"/>')
        >>> retList = MP.xmlDirectionTypeToSpanners(mxDirectionType2)

        retList is empty because nothing new has been added.

        >>> retList
        []

        >>> len(MP.spannerBundle)
        1
        >>> sp = MP.spannerBundle[0]
        >>> sp
        <music21.dynamics.Crescendo <music21.note.Note D>>

        >>> mxDirection = EL('<direction place="below"/>')
        >>> mxDirectionType = EL('<pedal type="sostenuto" sign="yes" number="2"/>')
        >>> retList = MP.xmlDirectionTypeToSpanners(mxDirectionType, 1, 0.5)
        >>> retList
        [<music21.expressions.PedalMark>]
        >>> pedalMark = retList[0]
        >>> pedalMark.pedalType
        <PedalType.Sostenuto>
        >>> pedalMark.pedalForm
        <PedalForm.Symbol>

        >>> mxDirectionType1a = EL('<pedal type="resume" line="yes" number="2"/>')
        >>> retList = MP.xmlDirectionTypeToSpanners(mxDirectionType1a, 1, 0.5)
        >>> retList
        []
        >>> pedalMark.pedalForm
        <PedalForm.SymbolLine>

        >>> mxDirectionType2 = EL('<pedal type="change" line="yes" number="2"/>')
        >>> retList = MP.xmlDirectionTypeToSpanners(mxDirectionType2, 1, 1.0)
        >>> retList
        []

        >>> mxDirectionType3 = EL('<pedal type="discontinue" line="yes" number="2"/>')
        >>> retList = MP.xmlDirectionTypeToSpanners(mxDirectionType3, 1, 2.0)
        >>> retList
        []

        >>> mxDirectionType4 = EL('<pedal type="resume" line="yes" number="2"/>')
        >>> retList = MP.xmlDirectionTypeToSpanners(mxDirectionType4, 1, 3.5)
        >>> retList
        []

        >>> mxDirectionType5 = EL('<pedal type="stop" line="yes" number="2"/>')
        >>> retList = MP.xmlDirectionTypeToSpanners(mxDirectionType5, 1, 4.0)
        >>> retList
        []
        >>> pedalMark.getFirst()
        <music21.expressions.PedalBounce at 1.0>
        >>> pedalMark.getLast() is n1
        True
        >>> MP.stream.elements
        (<music21.expressions.PedalBounce at 1.0>, <music21.expressions.PedalGapStart at 2.0>,
        <music21.expressions.PedalGapEnd at 3.5>)
        NÚwedger`  Ú	crescendoÚ
diminuendorb  zUnknown type, r´  T©ÚallowDuplicateIdsrf  rñ   ÚDynamicWedgeFr   zError in getting DynamicWedges)rÑ  Údashesra  r‘  ÚnoneÚdashedz
end-lengthzline-endr”   ÚLinezLine <z> stop without startr<  r=  z"unidentified mxType of mxBracket: úoctave-shiftrí  )ÚupÚdownr–  r—  r{  rz  é   )rš  rb  r  zError in getting Ottavarš  z%unidentified mxType of octave-shift: ÚpedalÚabbreviatedÚlineÚsign)ra  Ú	sostenutor�  r½   r›   )rš  rb  ÚdiscontinueÚresumer7  Ú	PedalMarkzError in getting PedalMarkrž  rŸ  r7  zunidentified mxType of pedal: )1r  r   r`   rv   r   Ú	CrescendoÚ
Diminuendor�  r/   r:  rÃ   r  Ú"setPendingSpannedElementAssignmentr5  rT  rH  r°  r%   r”  r6  Ú	startTickr•   rQ   ÚstartHeightrA  rB  r0   ÚendTickÚ	endHeightr  Útransposingr·   r`  r   r   r  Ú	PedalTypeÚSustainÚ	pedalTypeÚ	SostenutoÚ	PedalFormÚ	pedalFormÚSymbolrš  ÚPedalGapStartr%  Ú
SymbolLineÚPedalGapEndÚPedalBounce)r{   r@   r�  rˆ  Ú
targetLastÚ
returnListÚmTypeÚspClassrW  rD  Úspbr   ÚheightÚmxSizeÚm21TypeÚmxAbbreviatedÚmxLineÚmxSignÚpgStartÚpedalStartOffsetÚpgEndÚpbs                         r=   ÚxmlDirectionTypeToSpannersz(MeasureParser.xmlDirectionTypeToSpanners®  s›  € ðx ”Zˆ
Øˆ
àÐ"Ý  Ñ-Ô-ˆKàŒ9˜ÒÑØ—I’I˜fÑ%Ô%ˆEØ˜Ò#Ð#Ý7?Ô7I��Ø˜,Ò&Ð&Ý"Ô-��Ø˜&’�Ý"Ô/��å-Ð.G¸uÐ.GÐ.GÐ.GÑHÔHÐHà˜ŠˆØ×'Ò'¨¨t°WÐPTÐ'ÑUÔU�Ø×!Ò! "Ñ%Ô%Ð%ØÔ"×EÒEÀbÈ-ÑXÔXÐXÐXàŸ)š) HÑ-Ô-�ØÔ(×BÒBØ" G¨Uñ4ô 4�ðTØ˜Qœ�B�BøÝ!ð Tð Tð TÝ1Ð2RÑSÔSÐSðTøøøà$(�Ô!àÐ)Ø×)Ò)¨*Ñ5Ô5Ð5àŒ9Ð-Ð-Ñ-Ø—Y’Y˜vÑ&Ô&ˆFØ—i’i Ñ)Ô)ˆGØ˜Ò Ð Ý”\‘^”^�Ø$�”
Ø”9 Ò(Ð(Ø#)�B”LØ"*�B”K�Kà"ŸYšY |Ñ4Ô4�FØÐ)Ý).¨v©¬˜œØ#(§9¢9¨ZÑ#8Ô#8�B”LØ"'§)¢)¨KÑ"8Ô"8�B”KàÔ"×)Ò)¨"Ñ-Ô-Ð-Ø×!Ò! "Ñ%Ô%Ð%ð Ô"×EÒEÀbÈ-ÑXÔXÐXÑXØ˜6Ò!Ð!ð
ØÔ+×EÒEØ ¨ñ0ô 0Ø01ô3�B�Bøõ "ð ð ð Ý”MØ  5¤9Ñ,Ð/EÑEÝ'Ø#$ðñ ô ð ð
 �I�I�Iðøøøð %)�Ô!à”9 Ò(Ð(Ø!'�B”JØ"*�B”K�Kà!&§¢¨:Ñ!6Ô!6�B”JØ"ŸYšY |Ñ4Ô4�FØÐ)Ý',¨V¡}¤}˜œØ"'§)¢)¨KÑ"8Ô"8�B”Kð Ð)Ø×)Ò)¨*Ñ5Ô5Ð5øå-Ð.[ÐSYÐ.[Ð.[Ñ\Ô\Ð\àŒ9˜Ò&Ñ&Ø—Y’Y˜vÑ&Ô&ˆFØ—Y’Y˜vÑ&Ô&ˆFØ—i’i Ñ)Ô)ˆGØ˜Ð'Ð'Ý”^Ñ%Ô%�ð "'�”Ø˜T’>�>à$�Gà#*�B”L�Là"�GØ#*�B”LØ$�”
Ø!˜; Q¨Ð0�”ØÔ"×)Ò)¨"Ñ-Ô-Ð-Ø×!Ò! "Ñ%Ô%Ð%ØÔ"×EÒEÀbÈ-ÑXÔXÐXÐXØÐ/Ð/Ð/ØÔ(×BÒBØ˜g uñô �ðMØ˜Qœ�B�BøÝ!ð Mð Mð MÝ1Ð2KÑLÔLÐLðMøøøà˜ZÒ'Ð'ØÔ&×IÒIÈ"ÈmÑ\Ô\Ð\Ð\à(,�BÔ%Ø!Ð-Ø×-Ò-¨jÑ9Ô9Ð9øå-Ð.^ÐV\Ð.^Ð.^Ñ_Ô_Ð_àŒ9˜ÒÑØ—Y’Y˜vÑ&Ô&ˆFØ!ŸIšI mÑ4Ô4ˆMØ—Y’Y˜vÑ&Ô&ˆFØ—Y’Y˜vÑ&Ô&ˆFà—i’i Ñ)Ô)ˆGØÐ/Ð/Ð/Ý Ô*Ñ,Ô,�Ø$�”
Ø.9�Ô'¨Ñ+à˜WÒ$Ð$Ý#.Ô#8Ô#@�B”L�LØ˜{Ò*Ð*Ý#.Ô#8Ô#B�B”Là˜U’?�?Ý#.Ô#8Ô#=�B”L�LØ˜t’^�^ v°¢ Ý#.Ô#8Ô#?�B”Là  EÒ)Ð)Ø%)�B”NàÔ"×)Ò)¨"Ñ-Ô-Ð-Ø×!Ò! "Ñ%Ô%Ð%ØÔ"×EÒEÀbÈ-ÑXÔXÐXÑXØÐRÐRÑRØÔ(×BÒBØ ¨%ñô �ðPØ˜Qœ�B�BøÝ!ð Pð Pð PÝ1Ð2NÑOÔOÐOðPøøøà˜ZÒ'Ð'ñ à˜}Ò,Ð,å)Ô7Ñ9Ô9�GØ×)Ò)¨+°xÀÑIÔIÐIØ×)Ò)¨'Ñ2Ô2Ð2Ñ2Ø˜xÒ'Ð'ð
 7;Ô6M×6QÒ6QÐRTÐVZÑ6[Ô6[Ð$Øœ­Ô(=Ô(DÒDÐDØ 0°KÒ ?Ð ?Ý'2Ô'<Ô'G˜œ˜õ !,Ô 7Ñ 9Ô 9˜Ø×-Ò-¨k¸8ÀUÑKÔKÐKØ×-Ò-¨eÑ4Ô4Ð4Ð4Ø˜xÒ'Ð'å$Ô0Ñ2Ô2�BØ×)Ò)¨+°xÀÑDÔDÐDØ×)Ò)¨"Ñ-Ô-Ð-Ð-Ø˜vÒ%Ð%Ø(,�BÔ%Ø!Ð-Ø×-Ò-¨jÑ9Ô9Ð9øå-Ð.WÈvÐ.WÐ.WÑXÔXÐXàÐs6   Ä
D ÄD-É."J Ê3KËKÑ4Q= Ñ=RÙ=Z ÚZ c                ó¤  — |                      d¦  «        D ]’}|                      ||t          j        ¦  «        }|                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||d¦  «         |                      ||¦  «         Œ“|                      d¦  «        D ]#}|                      ||t          j
        ¦  «         Œ$|                      d¦  «        D ]#}|                      ||t          j        ¦  «         Œ$dD ]²}|                      |¦  «        D ]š}|                      ||t          j        ¦  «        }|dk    rd|_        |                      ||¦  «         |                     d¦  «        s|dk    rd	|_        d	|j        _        |                      ||¦  «         t%          ||¦  «         Œ›Œ³d S )
NÚslur)zbezier-offsetzbezier-offset2zbezier-xzbezier-yz	bezier-x2z	bezier-y2ztechnical/hammer-onztechnical/pull-off)Ú	glissandoÚsliderÇ  Ú
continuousr”   Úsolid)r<  r:  r%   ÚSlurr˜   r¦   r¸   r„   r¨   r   ÚHammerOnÚPullOffÚ	GlissandoÚ	slideTyperv   r•   r'   r¤   rV  )r{   rü  r`  r@   rÅ  rC  Úglisss          r=   r=  z$MeasureParser.xmlNotationsToSpannersÕ  s
  € ð !×(Ò(¨Ñ0Ô0ð 	'ð 	'ˆEØ×%Ò% e¨Qµ´Ñ=Ô=ˆDØ×Ò˜e TÑ*Ô*Ð*Ø×Ò˜U DÑ)Ô)Ð)Ø×Ò˜e TÑ*Ô*Ð*à×#Ò# EØ$(ð%?ñ&ô &ð &ð �MŠM˜% Ñ&Ô&Ð&Ð&à ×(Ò(Ð)>Ñ?Ô?ð 	Að 	AˆEØ×Ò˜u a­Ô)?Ñ@Ô@Ð@Ð@à ×(Ò(Ð)=Ñ>Ô>ð 	@ð 	@ˆEØ×Ò˜u a­Ô)>Ñ?Ô?Ð?Ð?à/ð 	-ð 	-ˆIØ$×,Ò,¨YÑ7Ô7ð -ð -�Ø×*Ò*¨5°!µWÔ5FÑGÔG�Ø Ò'Ð'Ø&2�E”OØ×!Ò! %¨Ñ/Ô/Ð/Ø—y’y Ñ-Ô-ð 3°)¸wÒ2FÐ2FØ%,�E”NØ+2�E”KÔ(ð ×"Ò" 5¨%Ñ0Ô0Ð0Ý˜u eÑ,Ô,Ð,Ð,ð-ð	-ð 	-r?   c                ó†  — |                      d¦  «        }d}|dv rd}	 t          |j                             ¦   «         ¦  «        }n# t          t
          f$ r d}Y nw xY w|du r6t          j        ¦   «         }||_        |j         	                    |¦  «         |S |  
                    ||t          j        ¦  «        }||_        |S )z‡
        Converts an mxTremolo to either an expression to be added to n.expressions
        or to a spanner, returning either.
        r`  T)ra  rb  Fé   )rv   rR   r*   r:   rS   rE   r   ÚTremoloÚnumberOfMarksrÃ   r:  ÚTremoloSpanner)r{   Ú	mxTremolor`  ÚtremoloTypeÚisSingleÚnumMarksrÙ  ÚtremSpans           r=   r<  zMeasureParser.xmlToTremoloú  sÛ   € ð  —m’m FÑ+Ô+ˆØˆØÐ+Ð+Ð+ØˆHð	Ý˜9œ>×/Ò/Ñ1Ô1Ñ2Ô2ˆHˆHøÝ�NÐ+ð 	ð 	ð 	àˆHˆHˆHð	øøøð �tÐÐÝÔ$Ñ&Ô&ˆBØ'ˆBÔØŒM× Ò  Ñ$Ô$Ð$ØˆIà×)Ò)¨)°Q½Ô8RÑSÔSˆHØ%-ˆHÔ"ØˆOs   Ÿ&A ÁAÁAFrŽ  c               óÚ  — |                      d¦  «        }| j                             ||d¦  «        }|r|du r	|d         }nI |¦   «         }||_        |                      d¦  «        }|�||_        | j                             |¦  «         |�|                     |¦  «         |                      d¦  «        dk    rd|_        n)|                      d¦  «        d	k    rt          ||¦  «         |S )
z¿
        Some spanner types do not have an id necessarily, we allow duplicates of them
        if allowDuplicateIds is True. Wedges are one.

        Returns the new spanner created.
        rñ   Fr   r·   Nr`  rb  Tra  )	rv   r  r5  r6  r·   rÃ   r°  rH  rV  )	r{   r@   rt  ÚspannerClassr�  rD  rF  Úsur·   s	            r=   r:  zMeasureParser.xmlOneSpanner  s  € ð —)’)˜HÑ%Ô%ˆð Ô×9Ò9¸,ÈÐQVÑWÔWˆØð 	*Ð# uÐ,Ð,ð �A”ˆBˆBà�‘”ˆBØ ˆBŒJØŸ	š	 +Ñ.Ô.ˆIØÐ$à(�”ØÔ×%Ò% bÑ)Ô)Ð)ð ÐØ×!Ò! &Ñ)Ô)Ð)ð �9Š9�VÑÔ Ò&Ð&Ø $ˆBÔÐà�YŠY�vÑÔ 'Ò)Ð)Ý˜5 "Ñ%Ô%Ð%àˆ	r?   c                ó  — t          j        ¦   «         }|                     d¦  «        }|sdS g }|D ]I}|                     d¦  «        }|�|                     |¦  «         Œ/t
                               d¦  «         ŒJt          |¦  «        dk    r|d         |_        n,d|v rd|v rd	|_        nt
                               d
|g¦  «         | 	                    d¦  «        }|�¨|                     d¦  «        }|r‘|d         }	t          |	|¦  «         |	                     d¦  «        }
|
�|
dk    r|
|_        |	                     d¦  «        }|�||_        n6|d                              d¦  «        }|dk    rd|_        n|dk    rd|_        |S )aG  
        Translate a MusicXML <note> with <tie> SubElements
        :class:`~music21.tie.Tie` object

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        Create the incomplete part of a Note.

        >>> mxNote = EL('<note><tie type="start" />'
        ...             '<notations>'
        ...             '<tied line-type="dotted" placement="below" type="start" />'
        ...             '</notations></note>')
        >>> m21Tie = MP.xmlToTie(mxNote)
        >>> m21Tie.type
        'start'
        >>> m21Tie.style
        'dotted'
        >>> m21Tie.placement
        'below'

        Same thing but with orientation instead of placement, which both get mapped to
        placement in Tie objects

        >>> mxNote = EL('<note><tie type="start" />'
        ...             '<notations>'
        ...             '<tied line-type="dotted" orientation="over" type="start" />'
        ...             '</notations></note>')
        >>> tieObj = MP.xmlToTie(mxNote)
        >>> tieObj.placement
        'above'
        r+   Nr`  z'found tie element without required typerô   r   rb  ra  rš  zPfound unexpected arrangement of multiple tie types when importing from musicxml:rï  Útiedr”   Úwavyr·   ÚorientationÚoverrz  Úunderr{  )r+   ÚTier<  rv   rÃ   rB  rC  r  r`  r[   rV  r'   r·   )r{   rP  ÚtieObjÚallTiesÚ
typesFoundÚmxTieÚ	foundTyperü  Ú
mxTiedListÚ	firstTiedÚtieStyler·   rà  s                r=   rô  zMeasureParser.xmlToTie:  sÇ  € õD ”‘”ˆØ—.’. Ñ'Ô'ˆØð 	Ø�4àˆ
Øð 	Sð 	SˆEØŸ	š	 &Ñ)Ô)ˆIØÐ$Ø×!Ò! )Ñ,Ô,Ð,Ð,å×'Ò'Ð(QÑRÔRÐRÐRåˆz‰?Œ?˜aÒÐØ$ Qœ-ˆFŒKˆKØ�zÐ!Ð! g°Ð&;Ð&;Ø$ˆFŒKˆKå×#Ò#ð.Ø/9ð;ñ<ô <ð <ð —k’k +Ñ.Ô.ˆØÐ"Ø$×,Ò,¨VÑ4Ô4ˆJØð 3Ø& qœM�	Ý˜y¨&Ñ1Ô1Ð1à$Ÿ=š=¨Ñ5Ô5�ØÐ'¨H¸Ò,>Ð,>Ø#+�F”LØ%ŸMšM¨+Ñ6Ô6�	ØÐ(Ø'0�FÔ$Ð$à",¨Q¤-×"3Ò"3°MÑ"BÔ"B�KØ" fÒ,Ð,Ø+2˜Ô(Ð(Ø$¨Ò/Ð/Ø+2˜Ô(Øˆr?   úlist[duration.Tuplet]c                óà  — t          j        ¦   «         }|                     d¦  «        }|€t          d¦  «        ‚t          } |||ddt
          ¬¦  «          |||ddt
          ¬¦  «         |                     d	¦  «        }t          |¦  «        x}r|}n"t          |                     d
¦  «        ¦  «        }t          |¦  «        }t          | 	                    d¦  «        ¦  «        }	| 
                    ||	¦  «         |                     d¦  «        }
|
€
|| j        d<   |                     ¦   «         }|}dgdz  }t          ¦   «         }t          ¦   «         }|
��§|
 	                    d¦  «        }|D �]Ž}|                     d
¦  «        }|                     d¦  «        }|�t          |¦  «        nd}|dk    rR| j        |         �D| j        |         }||v r	|�d|_        |                     |¦  «         |                     |¦  «         Œ˜|                     d¦  «        }|                     d¦  «        }|�|€t#          j        |¦  «        }�n;t          j        ¦   «         } |||ddt
          ¬¦  «          |||ddt
          ¬¦  «         |                     d¦  «        }|�h|j        x}�_|                     ¦   «         }t          |¦  «        }t          | 	                    d¦  «        ¦  «        }t          j        ||¦  «        |_        |                     d¦  «        }|�h|j        x}�_|                     ¦   «         }t          |¦  «        }t          | 	                    d¦  «        ¦  «        }t          j        ||¦  «        |_        t1          j        t0          j        d         dz  |¦  «        |_        |                     d¦  «        }|�t7          j        |¦  «        |_        |                     d¦  «        }|�|dk    rd|_        |€d|_        n|�|dk    rd|_        |                     d¦  «        } | �| d k    r|j        �dnd
|_        n(|�&|dk    r |j        �dnd
|_        |j        �dnd
|_        |                     d!¦  «        }!|!�|!d"k    rd#|_        t1          j        t0          j        d$         |                     d%¦  «        ¦  «        |_         |||<   ||                     ¦   «         z  }|| j        |<   �Œ�tC          dt          | j        ¦  «        ¦  «        D ]Z}"| j        |"         }#|#€Œ|#|v rŒt#          j        |#¦  «        }$|"|v rd|$_        nd|$_        ||$                     ¦   «         z  }|$||"<   Œ[|dk    rPtE          j#        |¦  «        }%t          j        |%j$        |%j%        ¦  «        }&|j        |&_        |j        |&_        |&|d&<   |D ]}'d| j        |'<   Œd'„ |D ¦   «         }|S )(a=  
        Given an mxNote, based on mxTimeModification
        and mxTuplet objects, return a list of Tuplet objects

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxNote = EL('<note><type>16th</type>'
        ...             '<time-modification><actual-notes>5</actual-notes>'
        ...             '<normal-notes>4</normal-notes></time-modification></note>')
        >>> tups = MP.xmlToTuplets(mxNote)
        >>> tups
        [<music21.duration.Tuplet 5/4/16th>]

        >>> mxNote = EL('<note><type>eighth</type>'
        ...             '<time-modification><actual-notes>5</actual-notes>'
        ...             '<normal-notes>3</normal-notes>'
        ...             '<normal-type>16th</normal-type><normal-dot /><normal-dot />'
        ...             '</time-modification></note>')
        >>> tup = MP.xmlToTuplets(mxNote)
        >>> tup
        [<music21.duration.Tuplet 5/3/16th>]
        >>> tup[0].durationNormal
        DurationTuple(type='16th', dots=2, quarterLength=0.4375)
        r   Nz.Note without time-modification in xmlToTupletszactual-notesÚnumberNotesActualrW   znormal-notesÚnumberNotesNormalznormal-typer`  z
normal-dotrï  r   r˜  Útupletrñ   rô   rb  Ú	startStopztuplet-actualztuplet-normalztuplet-numberztuplet-typez
tuplet-dot)ra  rb  rñ  FrÑ  zshow-numberr’  FrÒ  z	show-typeÚactualr“   ÚcurvedrÅ  )rz  r{  r·   r8  c                ó   — g | ]}|®|‘ŒS rn   r   )ro   r  s     r=   rC  z.MeasureParser.xmlToTuplets.<locals>.<listcomp>7  s   € ÐIÐIÐI ¸¸˜¸¸¸r?   )&r   ÚTupletr[   r/   rc   rR   rG   rO   r  r<  ÚsetDurationTyper  ÚtupletMultiplierr�  rv   r`  rg   r{  r|  r*   r:   r  ÚdurationActualÚdurationNormalr“  r”  ÚLiteralr,   rx   rÑ  ÚtupletActualShowÚtupletNormalShowr·   ÚrangeÚ	fractionsÚFractionÚdenominatorÚ	numerator)(r{   rP  r  r  rá   ÚmxNormalTypeÚnormalTypeTextÚmusicXMLNormalTypeÚdurationNormalTyper  rü  Ú!remainingTupletAmountToAccountForÚ
timeModTupÚreturnTupletsÚremoveFromActiveTupletsÚtupletsToStopÚ	mxTupletsÚmxTupletÚthis_tuplet_typeÚtupletNumberStrÚtupletIndexÚactiveTÚmxTupletActualÚmxTupletNormalÚmxActualTypeÚxmlActualTypeÚdurTyperÈ  ÚmxNormalTypeTextÚxmlNormalTypeÚbracketMaybeÚ
showNumberÚshowTypeÚ	lineShaperL  Ú
thisActiveÚthisActiveCopyÚremainderFractionÚremainderTupletÚtupletIndexToRemoves(                                           r=   r  zMeasureParser.xmlToTupletsŠ  s�  € õ6 ŒoÑÔˆØ#Ÿ[š[Ð)<Ñ=Ô=ÐØÐ%Ý)Ð*ZÑ[Ô[Ð[õ (ˆØˆˆSÐ$ nÐ6IÕUXÐYÑYÔYÐYØˆˆSÐ$ nÐ6IÕUXÐYÑYÔYÐYà)×.Ò.¨}Ñ=Ô=ˆå)¨,Ñ7Ô7Ð7ˆ>ð 	CØ!/ÐÐå!-¨f¯kªk¸&Ñ.AÔ.AÑ!BÔ!BÐå/Ð0BÑCÔCÐÝÐ(×0Ò0°Ñ>Ô>Ñ?Ô?ˆà×ÒÐ.°Ñ8Ô8Ð8à—k’k +Ñ.Ô.ˆØÐØ$'ˆDÔ˜qÑ!ð -0×,@Ò,@Ñ,BÔ,BÐ)Øˆ
à59°F¸Q±JˆÝ"%¡%¤%Ðõ ™œˆàÑ"Ø#×+Ò+¨HÑ5Ô5ˆIØ%ð J6ñ J6�Ø#+§<¢<°Ñ#7Ô#7Ð Ø"*§,¢,¨xÑ"8Ô"8�à6EÐ6Q�c /Ñ2Ô2Ð2ÐWX�à# vÒ-Ð-ØÔ)¨+Ô6ÐBØ"&Ô"4°[Ô"A˜Ø" mÐ3Ð3¸Ð8KØ+6˜GœLØ/×3Ò3°KÑ@Ô@Ð@Ø%×)Ò)¨+Ñ6Ô6Ð6Øà!)§¢¨Ñ!?Ô!?�Ø!)§¢¨Ñ!?Ô!?�Ø!Ð)¨^Ð-Cõ œ-¨
Ñ3Ô3�C‘Cå"œ/Ñ+Ô+�CØ�D˜˜nØ(Ð*=ÍðNñ Nô Nð Nà�D˜˜nØ(Ð*=ÍðNñ Nô Nð Nð $2×#6Ò#6°}Ñ#EÔ#E�LØ$Ð0Ø2>Ô2CÐ!C Ð PØ(5×(;Ò(;Ñ(=Ô(=˜Ý"4°]Ñ"CÔ"C˜Ý" <×#7Ò#7¸Ñ#EÔ#EÑFÔF˜Ý-5Ô-OÐPWÐY]Ñ-^Ô-^˜Ô*à#1×#6Ò#6°}Ñ#EÔ#E�LØ$Ð0Ø5AÔ5FÐ!FÐ!1Ð SØ(8×(>Ò(>Ñ(@Ô(@˜Ý"4°]Ñ"CÔ"C˜Ý" <×#7Ò#7¸Ñ#EÔ#EÑFÔF˜Ý-5Ô-OÐPWÐY]Ñ-^Ô-^˜Ô*õ œ6¥!¤)Ð,OÔ"PÐQUÑ"UØ"2ñ4ô 4�”ð  (Ÿ|š|¨IÑ6Ô6�ØÐ+Ý",Ô";¸LÑ"IÔ"I�C”Kà%Ÿ\š\¨-Ñ8Ô8�
ØÐ)¨j¸FÒ.BÐ.BØ+/�CÔ(Ø#Ð+Ø&+˜œøØÐ+°
¸fÒ0DÐ0DØ+3�CÔ(à#Ÿ<š<¨Ñ4Ô4�ØÐ'¨H¸Ò,@Ð,@Ø58Ô5IÐ5U¨6¨6Ð[a�CÔ(Ð(ØÐ+°
¸fÒ0DÐ0DØ58Ô5IÐ5U¨6¨6Ð[a�CÔ(Ø58Ô5IÐ5U¨6¨6Ð[a�CÔ(à$ŸLšL¨Ñ6Ô6�	ØÐ(¨Y¸(Ò-BÐ-BØ"(�C”Kå !¤¥q¤yÐ1AÔ'BÀHÇLÂLÐQ\ÑD]ÔD]Ñ ^Ô ^�”Ø-0�˜kÑ*Ø1°S×5IÒ5IÑ5KÔ5KÑKÐ1Ø25�Ô" ;Ñ/Ñ/õ �q�#˜dÔ0Ñ1Ô1Ñ2Ô2ð 	.ð 	.ˆAØÔ+¨AÔ.ˆJØÐ!ØØ˜]Ð*Ð*ØÝ!œ]¨:Ñ6Ô6ˆNØ�MÐ!Ð!Ø&,�Ô#Ð#à&*�Ô#Ø-°×1PÒ1PÑ1RÔ1RÑRÐ-Ø-ˆM˜!ÑÐð -°Ò1Ð1Ý )Ô 2Ð3TÑ UÔ UÐÝ&œoÐ.?Ô.KØ.?Ô.IñKô KˆOà-7Ô-FˆOÔ*Ø-7Ô-FˆOÔ*Ø /ˆM˜"Ñð $;ð 	;ð 	;Ðà6:ˆDÔÐ2Ñ3Ð3àIÐI¨ÐIÑIÔIˆàÐr?   c                ó¦   — d}|D ]K}|                       |¦  «        }|€Œ|j        dk    r||_        |j                             |¦  «         |dz  }ŒLdS )a\  
        Takes a list of <lyric> elements and update the
        note's lyrics from that list.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxLyric1 = EL('<lyric><text>Hi</text><elision/><text>There</text></lyric>')
        >>> mxLyric2 = EL('<lyric><text>Bye</text></lyric>')
        >>> n = note.Note()
        >>> MP.updateLyricsFromList(n, [mxLyric1, mxLyric2])
        >>> n.lyrics
        [<music21.note.Lyric number=1 syllabic=composite text='Hi There'>,
         <music21.note.Lyric number=2 text='Bye'>]
        rô   Nr   )Ú
xmlToLyricrñ   ÚlyricsrÃ   )r{   r`  Ú	lyricListÚcurrentLyricNumberra  ÚlyricObjs         r=   rW  z"MeasureParser.updateLyricsFromList;  ss   € ð" ÐØ ð 	$ð 	$ˆGØ—’ wÑ/Ô/ˆHØÐØØŒ !Ò#Ð#Ø"4�”ØŒH�OŠO˜HÑ%Ô%Ð%Ø !Ñ#ÐÐð	$ð 	$r?   únote.Lyric | Nonec                óÒ  — |€t          j        ¦   «         }n|}|                     d¦  «        }|                     d¦  «        }|                     d¦  «        }|s|€|S dS t          |¦  «        dk    re|d         j        }|�|                     ¦   «         |_        	 |d         j                             ¦   «         |_        nì# t          t          f$ r Y nÙw xY wg |_	        t          |¦  «        D ]¾\  }}	t          j        ¦   «         }
|j	                             |
¦  «         |	j        �|	j                             ¦   «         |
_        	 ||         }|j                             ¦   «         |
_        |dk    r||dz
           }|j        }|€d}||
_        Œ¢# t          t          t          f$ r Y Œ»w xY w|                     d¦  «        }	 t          |¦  «        }||_        n'# t"          t          f$ r d|_        |�||_        Y nw xY w|                     d	¦  «        }|�||_        |                      ||d
d¦  «         |                      ||¦  «         |                      ||¦  «         |€|S dS )aG  
        Translate a MusicXML <lyric> tag to a
        music21 :class:`~music21.note.Lyric` object or return None if no Lyric object
        should be created (empty lyric tags, for instance)

        If inputM21 is a :class:`~music21.note.Lyric` object, then the values of the
        mxLyric are transferred there and nothing returned.

        Otherwise, a new `Lyric` object is created and returned.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxLyric = EL('<lyric number="4" color="red">'
        ...              '<syllabic>single</syllabic>'
        ...              '<text>word</text></lyric>')
        >>> lyricObj = note.Lyric()
        >>> MP.xmlToLyric(mxLyric, lyricObj)
        >>> lyricObj
        <music21.note.Lyric number=4 syllabic=single text='word'>
        >>> lyricObj.style.color
        'red'

        Non-numeric MusicXML lyric "number"s are converted to identifiers:

        >>> mxLyric.set('number', 'part2verse1')
        >>> l2 = MP.xmlToLyric(mxLyric)
        >>> l2
        <music21.note.Lyric number=0 identifier='part2verse1' syllabic=single text='word'>

        Multiple texts can be created and result in composite lyrics

        >>> mxBianco = EL('<lyric>'
        ...               '<syllabic>end</syllabic>'
        ...               '<text>co</text>'
        ...               '<elision>_</elision>'
        ...               '<syllabic>single</syllabic>'
        ...               '<text>e</text>'
        ...               '</lyric>')
        >>> bianco = MP.xmlToLyric(mxBianco)
        >>> bianco
        <music21.note.Lyric number=0 syllabic=composite text='co_e'>
        >>> bianco.components
        [<music21.note.Lyric number=1 syllabic=end text='co'>,
         <music21.note.Lyric number=1 syllabic=single text='e'>]
        Nr*   ÚsyllabicÚelisionrô   r   rD   rñ   r~  )r†   r·   rš   )r†   r·   rœ   )r!   ÚLyricr<  r  r*   r:   r)  rS   rT  r  r’  rÃ   ÚelisionBeforerE   rv   rR   rñ   rz   Ú
identifierr„   r¨   r¦   )r{   ra  rÑ   ÚlyÚtext_elementsÚsyllabic_elementsÚelision_elementsÚelement_textrL  ÚmxTextÚ	componentÚ
mxSyllabicÚ	mxElisionÚelision_textrñ   r-  s                   r=   r"  zMeasureParser.xmlToLyricV  s¸  € ð` ÐÝ”‘”ˆBˆBàˆBð  Ÿš¨Ñ/Ô/ˆØ#ŸOšO¨JÑ7Ô7ÐØ"Ÿ?š?¨9Ñ5Ô5Ðàð 	àÐØ�	Ø�4åˆ}ÑÔ Ò"Ð"à(¨Ô+Ô0ˆLØÐ'Ø&×,Ò,Ñ.Ô.�”ðØ/°Ô2Ô7×=Ò=Ñ?Ô?�”�øÝ¥
Ð+ð ð ð Ø�ðøøøð ˆBŒMÝ& }Ñ5Ô5ð ð ‘	��6Ý œJ™LœL�	Ø”×$Ò$ YÑ/Ô/Ð/Ø”;Ð*Ø%+¤[×%6Ò%6Ñ%8Ô%8�I”Nðð "3°1Ô!5�JØ)3¬×)>Ò)>Ñ)@Ô)@�IÔ&à˜A’v�vØ$4°Q¸±UÔ$;˜	ð (1¤~˜Ø'Ð/Ø+-˜LØ2>˜	Ô/øøÝ"¥JµÐ?ð ð ð Ø�Dðøøøð —’˜XÑ&Ô&ˆð		'Ý˜‘[”[ˆFØˆBŒIˆIøÝ�:Ð&ð 	'ð 	'ð 	'ð ˆBŒIØÐ!Ø &�”øøð	'øøøð —[’[ Ñ(Ô(ˆ
ØÐ!Ø&ˆBŒMà×Ò ¨Ø HØ Mñ	Oô 	Oð 	Oð 	�Š�g˜rÑ"Ô"Ð"Ø×Ò˜ "Ñ%Ô%Ð%àÐØˆIð Ðs7   Â$C ÃCÃCÅA	FÆF*Æ)F*ÇG Ç!G>Ç=G>c                óî   — | j         }| j        s|                     | j        |¦  «         dS |                     d¦  «        }|                      |¦  «        }|�|}|                     | j        |¦  «         dS )zä
        Adds an object to a measure or a voice.  Needs a note element (obviously)
        but also mxNote to get the voice.  Uses coreInsert and thus leaves insertStream
        on the inner voice in an unusable state.
        NrR  )r&   re  r:  ró   r[   ÚfindM21VoiceFromXmlVoice)r{   Ú	mxElementr¹  ÚinsertStreamÚmxVoiceÚ	thisVoices         r=   r6  z$MeasureParser.insertInMeasureOrVoiceß  sƒ   € ð ”{ˆØŒ~ð 	Ø×#Ò# DÔ$:¸BÑ?Ô?Ð?ØˆFà—.’. Ñ)Ô)ˆð
 ×1Ò1°'Ñ:Ô:ˆ	ØÐ Ø$ˆLØ×Ò Ô 6¸Ñ;Ô;Ð;Ð;Ð;r?   r<  ústream.Voice | Nonec                ó  — | j         }t          |¦  «        r<t          |¦  «        }	 t          |¦  «        | _        n># t          $ r
 || _        Y n+w xY w| j        }|€t          j        dt          d¬¦  «         d}d}|| j        v r| j        |         }nìt          |¦  «        | j        v r| j        t          |¦  «                 }n»t          |¦  «        | j        v r| j        t          |¦  «                 }nŠt          j        d|›d�t          d¬¦  «         t          j        dt          | j        ¦  «        › �t          d¬¦  «         t          j        d	t          |j        ¦  «        › d
|j        › �t          d¬¦  «         |S )zJ
        Find the stream.Voice object from a <voice> tag or None.
        NzmCannot put in an element with a missing voice tag when no previous voice tag was given.  Assuming voice 1... r<  r=  rô   zCannot find voice z; putting outside of voices.zCurrent voiceIds: zCurrent voices: z in m. )r&   rG   rR   r  rS   rA  rB  r0   r  rB   r?  r—  rñ   )r{   r<  rÎ  ÚuseVoicer=  s        r=   r9  z&MeasureParser.findM21VoiceFromXmlVoiceô  s°  € ð ŒKˆå˜Ñ Ô ð 	Ý# GÑ,Ô,ˆHð*Ý!$ X¡¤�”�øÝð *ð *ð *Ø!)�”��ð*øøøð ”~ˆHØÐÝ”ð Oå#°ð3ñ 3ô 3ð 3ð �à'+ˆ	Ø�t”Ð&Ð&Øœ¨Ô1ˆIˆIÝ�‰]Œ]˜dœoÐ-Ð-Øœ­¨H©¬Ô6ˆIˆIÝ�‰]Œ]˜dœoÐ-Ð-Øœ­¨H©¬Ô6ˆIˆIåŒMØM XÐMÐMÐMÝ¨Að/ñ /ô /ð /õ ŒMØ<¥T¨$¬/Ñ%:Ô%:Ð<Ð<Ý¨Að/ñ /ô /ð /õ ŒMØD¥4¨¬¡>¤>ÐDÐD¸!¼(ÐDÐDÝ¨Að/ñ /ô /ð /ð Ðs   §< ¼AÁAÚ	mxBarlinec                óò  — | j         }|                     d¦  «        }|�|                      |¦  «        }n|                      |¦  «        }|                     d¦  «        }|��D| j                             t          j        ¦  «                             d¦  «        }|s/t          j        |¦  «        }| j         	                    |¦  «         n|d         }| 
                    |¦  «         |                     d¦  «        dk    rˆ|                     d¦  «        }	 ||_        n# t          j        $ r
 d	|_        Y nw xY w|j        }	|	�E|	|_        t!          j        d
|	¦  «        }
|
r't%          |
                     d	¦  «        ¦  «        |_        |                     d¦  «        dv rd|_        |j        dk    r	||_        dS |j        dk    r	||_        dS |                     ¦   «          | 	                    |¦  «         dS )zu
        Handles everything for putting a barline into a Stream
        and updating repeat characteristics.
        r$   NÚendingFr   r`  ra  rñ   rô   z
^(\d+)\.?$)rb  rž  TrÝ   rÞ   )r&   r[   ÚxmlToRepeatÚxmlToBarliner  rF  r%   rq  rI  rÃ   r°  rv   rñ   ÚSpannerExceptionr*   ÚoverrideDisplayÚreÚmatchrR   ÚgrouprH  ÚlocationÚleftBarlineÚrightBarlinerK  )r{   rA  rÎ  ÚmxRepeatObjr   ÚmxEndingObjÚ
rbSpannersÚrbÚmxNumberÚendingNumberTextÚoverrideNumbers              r=   rû  zMeasureParser.xmlBarline  s  € ð
 ŒKˆà—n’n XÑ.Ô.ˆØÐ"Ø×&Ò& yÑ1Ô1ˆGˆGà×'Ò'¨	Ñ2Ô2ˆGð  —n’n XÑ.Ô.ˆØÑ"ð Ô+×6Ò6ÝÔ%ñô ç!Ò! %Ñ(Ô(ð ð ð 
)åÔ*¨1Ñ-Ô-�ØÔ"×)Ò)¨"Ñ-Ô-Ð-Ð-ð
   ”]�à×%Ò% aÑ(Ô(Ð(à�Š˜vÑ&Ô&¨'Ò1Ð1Ø&Ÿ?š?¨8Ñ4Ô4�ð"Ø (�B”I�IøÝÔ/ð "ð "ð "Ø !�B”I�I�Ið"øøøð $/Ô#3Ð Ø#Ð/Ø)9�BÔ&Ý%'¤X¨mÐ=MÑ%NÔ%N�NØ%ð AÝ$'¨×(<Ò(<¸QÑ(?Ô(?Ñ$@Ô$@˜œ	ð �Š˜vÑ&Ô&Ð*AÐAÐAØ$(�Ô!ð Ô˜vÒ%Ð%à#ˆAŒMˆMˆMØÔ Ò(Ð(à$ˆAŒNˆNˆNà×!Ò!Ñ#Ô#Ð#Ø�HŠH�WÑÔÐÐÐs   ÄD ÄD7Ä6D7c                óÒ  — |€t          j        ¦   «         }n|}t          } |||dd¦  «         |                      ||¦  «         |                     d¦  «        }|�||_        nd|_        |                     d¦  «        }|€t          j        d¦  «        ‚|                     d¦  «        }|€t          d	¦  «        ‚| 	                    ¦   «         d
k    rd|_
        n5| 	                    ¦   «         dk    rd|_
        nt          j        d|¦  «        ‚|                     d¦  «        �>	 t          |                     d¦  «        ¦  «        |_        n# t           j        $ r Y nw xY w|€|S dS )a§  
        Given an mxBarline (not an mxRepeat object) with repeatObj as a parameter,
        file the necessary parameters and return a bar.Repeat() object

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxBarline = EL('<barline><bar-style>light-heavy</bar-style>'
        ...                '<repeat direction="backward"/></barline>')
        >>> r = MP.xmlToRepeat(mxBarline)
        >>> r
        <music21.bar.Repeat direction=end>

        Test that the music21 type for a backwards repeat is called "final"
        (because it resembles a final barline) even though the musicxml style
        is called light-heavy.

        >>> r.type
        'final'
        >>> r.direction
        'end'

        Test that a forward repeat with times doesn't raise an exception, and
        that the resulting Repeat doesn't have times set.

        >>> mxStartBarline = EL('<barline><bar-style>light-heavy</bar-style>'
        ...                     '<repeat direction="forward" times="2"/></barline>')
        >>> rs = MP.xmlToRepeat(mxStartBarline)
        >>> rs
        <music21.bar.Repeat direction=start>
        Nú	bar-styler`  rK  rÞ   r$   zPattempting to create a Repeat from an MusicXML bar that does not define a repeatrã   z!Repeat sign direction is requiredrý  ra  Úbackwardr›  z"cannot handle mx direction format:Útimes)r   ÚRepeatrc   rÊ   rv   rK  r[   ÚBarExceptionr/   rÓ  rã   rR   rX  )r{   rA  rÑ   rç  rá   rK  ÚmxRepeatÚmxDirections           r=   rD  zMeasureParser.xmlToRepeatj  s”  € ðB ÐÝ”
‘”ˆAˆAàˆAå'ˆØˆˆQ�	˜;¨Ñ/Ô/Ð/Ø×Ò˜) QÑ'Ô'Ð'ð —=’= Ñ,Ô,ˆØÐØ!ˆAŒJˆJà ˆAŒJà—>’> (Ñ+Ô+ˆØÐÝÔ"ð $Iñ Jô Jð Jð —l’l ;Ñ/Ô/ˆàÐÝ)Ð*MÑNÔNÐNà×ÒÑÔ )Ò+Ð+Ø!ˆAŒKˆKØ×ÒÑ Ô  JÒ.Ð.ØˆAŒKˆKåÔ"Ð#GÈÑUÔUÐUà�<Š<˜Ñ Ô Ð,ðå˜hŸlšl¨7Ñ3Ô3Ñ4Ô4�”�øÝÔ#ð ð ð à�ðøøøð ÐØˆHð Ðs   Ä&'E ÅE ÅE c                ó´   — |€t          j        ¦   «         }n|}t          } |||dd¦  «         |                     d¦  «        }|�||_        nd|_        |€|S dS )a7  
        Given an mxBarline, fill the necessary parameters

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxBarline = EL('<barline location="right">'
        ...                '<bar-style>light-light</bar-style>'
        ...                '</barline>')
        >>> b = MP.xmlToBarline(mxBarline)
        >>> b
        <music21.bar.Barline type=double>
        >>> b.type  # music21.type is different from musicxml.style
        'double'
        >>> b.location
        'right'
        NrV  r`  rK  rÞ   )r   ÚBarlinerc   rv   rK  )r{   rA  rÑ   Úbrá   rK  s         r=   rE  zMeasureParser.xmlToBarline¹  sq   € ð& ÐÝ”‘”ˆAˆAàˆAå'ˆØˆˆQ�	˜;¨Ñ/Ô/Ð/Ø—=’= Ñ,Ô,ˆØÐØ!ˆAŒJˆJà ˆAŒJàÐØˆHð Ðr?   c                ó˜   — |                       |¦  «        }|                      |¦  «        }|                      | j        |z   ||¦  «         dS )z\
        Create a ChordSymbol object and insert it to the core and staff reference.
        N)ÚxmlToChordSymbolÚxmlToOffsetr%  ró   )r{   Ú	mxHarmonyÚhÚchordOffsets       r=   rù  zMeasureParser.xmlHarmonyÜ  s[   € ð
 ×!Ò! )Ñ,Ô,ˆØ×&Ò& yÑ1Ô1ˆØ×Ò˜dÔ4°{ÑBØ'¨ñ	,ô 	,ð 	,ð 	,ð 	,r?   rc  úDharmony.ChordSymbol | harmony.NoChord | tablature.ChordWithFretBoardc                óÔ  — d}d}d}d}d}|                      d¦  «        }t          |¦  «        x}r|}|                      d¦  «        }	|                      d¦  «        }
|
�…|
                      d¦  «        }|€t          d¦  «        ‚t          j        |j        ¦  «        }|
                      d¦  «        }|�/|j        x}�&t          j        t          |¦  «        ¦  «        |_        |                      d	¦  «        }t          |¦  «        x}rt          |¦  «        }|rUt          j        r|€J ‚|t          j        v rt          j        |         }|                     d
¦  «        pd}|dk    r|dk    s|}|                      d¦  «        }|�Ÿ|                      d¦  «        }t          j        r|€J ‚|j        }|dv r|                     d
¦  «        }|�Xt          j        |¦  «        }|                      d¦  «        }|�-t          |j        ¦  «        }t          j        |¦  «        |_        |	�t          j        }n|dk    rt          j        }nt          j        } ||||||¬¦  «        }t&          }|€ |||dd¦  «         |                     d¦  «        }|D ]z}t          j        ¦   «         } |||ddt          ¬¦  «         |j        €t          d¦  «        ‚ |||ddt          ¬¦  «          |||dd¦  «         |                     |d¬¦  «         Œ{|                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |	�	 |S )aä  
        Convert a <harmony> tag to a harmony.ChordSymbol object:

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> elStr = '<harmony><root><root-step>D</root-step><root-alter>-1</root-alter>'
        >>> elStr += '</root><kind>major-seventh</kind></harmony>'
        >>> mxHarmony = EL(elStr)

        >>> cs = MP.xmlToChordSymbol(mxHarmony)
        >>> cs
        <music21.harmony.ChordSymbol D-maj7>

        >>> cs.figure
        'D-maj7'

        >>> cs.pitches
        (<music21.pitch.Pitch D-3>,
         <music21.pitch.Pitch F3>,
         <music21.pitch.Pitch A-3>,
         <music21.pitch.Pitch C4>)

        >>> cs.root()
        <music21.pitch.Pitch D-3>

        TODO: this is very classically-oriented.  Make more Jazz/Rock like possible/default?.

        >>> mxHarmony.find('kind').text = 'major-sixth'
        >>> cs = MP.xmlToChordSymbol(mxHarmony)
        >>> cs
        <music21.harmony.ChordSymbol D-6>

        >>> cs.figure
        'D-6'

        >>> cs.pitches
        (<music21.pitch.Pitch D-3>, <music21.pitch.Pitch F3>,
         <music21.pitch.Pitch A-3>, <music21.pitch.Pitch B-3>)

        >>> cs.root()
        <music21.pitch.Pitch D-3>
        NrD   ÚkindÚframeÚbassz	bass-stepzbass-step missingz
bass-alterÚ	inversionr*   r’  Úrootz	root-steprZ   z
root-alter)rj  rl  rk  rh  ÚkindStrÚfunctionÚromanNumeralÚdegreezdegree-valuerW   zdegree-value missingzdegree-alterr   zdegree-typeÚmodTypeT)ÚupdatePitches)r[   rG   r/   r#   r³  r*   r¸  rQ   r²  rR   r“  rÄ  r   ÚCHORD_ALIASESrv   r(   ÚChordWithFretBoardÚNoChordÚChordSymbolrc   r<  ÚChordStepModificationrp  ÚaddChordStepModificationrÊ   r¤   rž   r¸   )r{   rc  r_  rç  rk  Ú	chordKindÚchordKindStrÚmxKindÚ
mxKindTextÚmxFrameÚmxBassÚbassStepÚmxBassAlterr¼  ÚmxInversionÚinversionTextÚmxRootÚmxRSÚrootTextÚmxRootAlterÚ
alterFloatÚcs_classÚcsrá   Ú	mxDegreesÚmxDegreeÚhds                              r=   ra  zMeasureParser.xmlToChordSymbolæ  sË  € ðf #ˆØ"ˆØ"ˆ	Øˆ	Øˆà—’ Ñ'Ô'ˆÝ% fÑ-Ô-Ð-ˆ:ð 	#Ø"ˆIà—.’. Ñ)Ô)ˆà$-§N¢N°6Ñ$:Ô$:ˆØÐà—{’{ ;Ñ/Ô/ˆHØÐÝ-Ð.AÑBÔBÐBå”˜HœMÑ*Ô*ˆAà Ÿ+š+ lÑ3Ô3ˆKØÐ&¸Ô9IÐ,I¨IÐ+Vå$Ô/µ°iÑ0@Ô0@ÑAÔA�”ð  —n’n [Ñ1Ô1ˆÝ(¨Ñ5Ô5Ð5ˆ=ð 	+õ ˜MÑ*Ô*ˆIð ð 	*ÝŒð *ØÐ)Ð)Ð)à�GÔ1Ð1Ð1Ý#Ô1°)Ô<�	ØŸš FÑ+Ô+Ð1¨rˆJØ "Ò$Ð$¨°fÒ)<Ð)<Ø)�ð —’ Ñ'Ô'ˆØÐØ—;’;˜{Ñ+Ô+ˆDÝŒð (ØÐ'Ð'Ð'à”yˆHØ˜:Ð%Ð%ØŸ8š8 FÑ+Ô+�àÐ#Ý”K Ñ)Ô)�Ø$Ÿkšk¨,Ñ7Ô7�ØÐ*å!& {Ô'7Ñ!8Ô!8�JÝ#(Ô#3°JÑ#?Ô#?�A”Lð
 ÐÝ Ô3ˆHˆHØ˜&Ò Ð Ý”ˆHˆHåÔ*ˆHàˆXØØØØØ ð
ñ 
ô 
ˆõ (ˆØˆ>àˆD��Y 
¨NÑ;Ô;Ð;à×%Ò% hÑ/Ô/ˆ	Ø!ð 	@ð 	@ˆHÝÔ.Ñ0Ô0ˆBØˆD��X˜~¨xÅ3ÐGÑGÔGÐGØŒyÐ Ý-Ð.DÑEÔEÐEàˆD��X˜~¨zÅSÐIÑIÔIÐIØˆD��X˜}¨iÑ8Ô8Ð8Ø×'Ò'¨¸$Ð'Ñ?Ô?Ð?Ð?à×Ò˜) RÑ(Ô(Ð(Ø×Ò˜9 bÑ)Ô)Ð)Ø×Ò˜I rÑ*Ô*Ð*ð 	×Ò˜) RÑ(Ô(Ð(ð ÐØð ˆ	r?   c                ó�  — |                       |¦  «        }t          || j        z   ¦  «        }|                      |¦  «        }d}|                     d¦  «        D ],}|D ]'}|                      ||||¦  «         |j        dk    rd}Œ(Œ-|s<|                     d¦  «        D ](}d|j        vrŒ|                      ||||¦  «          dS dS dS )z’
        convert a <direction> tag to one or more expressions, metronome marks, etc.
        and add them to the core and staffReference.
        Fzdirection-typeÚ	metronomeTrÿ  r)   N)	rb  rQ   ró   r  r<  ÚsetDirectionInDirectionTyper`   r…  ÚsetSound)	r{   r\  ÚoffsetDirectionrˆ  r�  Úmetronome_addedÚ	mxDirTypeÚmxSpecificDirectionTagÚmxSounds	            r=   r÷  zMeasureParser.xmlDirection‘  s*  € ð ×*Ò*¨;Ñ7Ô7ˆÝ˜O¨dÔ.DÑDÑEÔEˆð
 ×&Ò& {Ñ3Ô3ˆàˆð %×,Ò,Ð-=Ñ>Ô>ð 	+ð 	+ˆIØ*3ð +ð +Ð&Ø×0Ò0Ð1GØ1<Ø19Ø1<ñ>ô >ð >ð *Ô-°Ò<Ð<Ø&*�Oøð+ð ð 		Ø&×.Ò.¨wÑ7Ô7ð ð �Ø '¤.Ð0Ð0Øà—’˜gØ)Ø&Ø)ñ+ô +ð +ð ��ð		ð 		ðð r?   ÚmxDirr\  rQ   c                ó–  — |j         }|dk    r |D ]}|                      |||||¦  «         Œd S |dv r³	 |                      |||¦  «        }n;# t          $ r.}t	          j        d|› d|› �t          d¬¦  «         g }Y d }~nd }~ww xY w|D ]Z}	|                      ||	¦  «         |                      ||	¦  «         |  	                    ||	¦  «         |  
                    ||	¦  «         Œ[d S |dv r‚|dk    rt          j        ¦   «         }
nt          j        ¦   «         }
t          ||
¦  «         |                      ||
¦  «         |                      |||
¦  «         |  
                    ||
¦  «         d S |d	k    rV|                      |¦  «        }t#          ||d
d
¦  «         |                      |||¦  «         |  
                    ||¦  «         d S |dk    r[|                      |¦  «        }|                      ||d
¦  «         |                      |||¦  «         |  
                    ||¦  «         d S |dk    r›|                      |¦  «        }t#          ||d
d
¦  «         |                     ¦   «         }|�/|                      |||¦  «         |  
                    ||¦  «         d S |                      |||¦  «         |  
                    ||¦  «         d S d S )Nr   )r‹  rÑ  r‘  r•  r™  zCould not import z: r<  r=  )ÚcodaÚsegnor™  rŽ  r·   Ú	rehearsalÚwords)r`   ÚsetDynamicsDirectionrÃ  r/   rA  rB  r0   r¦   r¸   r˜   rÊ   r$   ÚSegnoÚCodarV  r%  ÚxmlToTempoIndicationrÓ   ÚxmlToRehearsalMarkr„   ÚxmlToTextExpressionÚgetRepeatExpression)r{   r–  r\  r�  rˆ  r`   ÚmxDynÚspannerListÚexceprW  rX  ÚmmÚrm_genÚtextExpressionÚrepeatExpressions                  r=   r�  z)MeasureParser.setDirectionInDirectionType¼  sm  € ð( ŒiˆØ�*ÒÐð ð \ð \�Ø×)Ò)¨%°¸ÀXÈ{Ñ[Ô[Ð[Ð[ð\ð \ð ÐKÐKÐKð!Ø"×=Ò=Ø˜8 [ñô ��øõ +ð !ð !ð !Ý”Ð@°#Ð@Ð@¸Ð@Ð@Å/Ð^_Ð`Ñ`Ô`Ð`Ø ������øøøøð!øøøð "ð 3ð 3�Ø× Ò  ¨Ñ+Ô+Ð+Ø×!Ò! %¨Ñ,Ô,Ð,Ø×!Ò! %¨Ñ,Ô,Ð,Ø×!Ò! +¨rÑ2Ô2Ð2Ð2ð	3ð 3ð Ð%Ð%Ð%à�gŠ~ˆ~Ý”\‘^”^��å”[‘]”]�å˜5 "Ñ%Ô%Ð%Ø×Ò˜U BÑ'Ô'Ð'Ø×!Ò! +¨x¸Ñ<Ô<Ð<Ø×Ò˜k¨2Ñ.Ô.Ð.Ð.Ð.à�KÒÐØ×*Ò*¨5Ñ1Ô1ˆBå% b¨+°{ÀKÑPÔPÐPØ×!Ò! +¨x¸Ñ<Ô<Ð<Ø×Ò˜k¨2Ñ.Ô.Ð.Ð.Ð.à�KÒÐØ×,Ò,¨UÑ3Ô3ˆFØ×#Ò# K°¸ÑEÔEÐEØ×!Ò! +¨x¸Ñ@Ô@Ð@Ø×Ò˜k¨6Ñ2Ô2Ð2Ð2Ð2à�GŠ^ˆ^Ø!×5Ò5°eÑ<Ô<ˆNõ & n°kÀ;ÐP[Ñ\Ô\Ð\à-×AÒAÑCÔCÐØÐ+ð ×%Ò% k°8Ð=MÑNÔNÐNØ×!Ò! +Ð/?Ñ@Ô@Ð@Ð@Ð@ð ×%Ò% k°8¸^ÑLÔLÐLØ×!Ò! +¨~Ñ>Ô>Ð>Ð>Ð>ð! ˆ^s   ³A Á
BÁ$A>Á>Br£  c                óR  — |j         }|dk    r |j        r|j                             ¦   «         }t          j        |¦  «        }t          ||¦  «         t          ||dd¦  «         |                      |||¦  «         |                      ||¦  «         |  	                    ||¦  «         dS )zN
        Add a single dynamic element to the core and staffReference.
        zother-dynamicr·   N)
r`   r*   r:   r   rl  rV  rÓ   r%  r¦   rÊ   )r{   r–  r£  r\  r�  rˆ  Úm21DynamicTextr�  s           r=   rœ  z"MeasureParser.setDynamicsDirection  s®   € ð œˆØ˜_Ò,Ð,°´Ð,Ø"œZ×-Ò-Ñ/Ô/ˆNåÔ˜^Ñ,Ô,ˆå�u˜aÑ Ô Ð Ý! ! [°+¸{ÑKÔKÐKà×Ò˜k¨8°QÑ7Ô7Ð7Ø×Ò˜ Ñ"Ô"Ð"Ø×Ò˜+ qÑ)Ô)Ð)Ð)Ð)r?   c                óx   — t          |¦  «        }t          j        |¦  «        }|                      ||¦  «         |S )aŒ  
        Given an `mxWords`, create a :class:`~music21.expression.TextExpression`
        and set style attributes, fonts, position, etc.

        Calls `setTextFormatting`, which calls `setPrintStyleAlign`.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> m = EL('<words default-y="17" font-family="Courier" '
        ...           'font-style="italic" relative-x="-6">a tempo</words>')
        >>> te = MP.xmlToTextExpression(m)
        >>> te.content
        'a tempo'
        >>> te.style.relativeX
        -6
        >>> te.style.fontFamily
        ['Courier']
        )rG   r   ÚTextExpressionr‘   )r{   ÚmxWordsÚwordTextÚtes       r=   r¡  z!MeasureParser.xmlToTextExpression)  s<   € õ2   Ñ(Ô(ˆÝÔ'¨Ñ1Ô1ˆØ×Ò˜w¨Ñ+Ô+Ð+Øˆ	r?   c                óx   — t          |¦  «        }t          j        |¦  «        }|                      ||¦  «         |S )z?
        Return a rehearsal mark from a rehearsal tag.
        )rG   r   ÚRehearsalMarkr‘   )r{   ÚmxRehearsalÚrehearsalTextrX  s       r=   r   z MeasureParser.xmlToRehearsalMarkG  s<   € õ % [Ñ1Ô1ˆÝÔ& }Ñ5Ô5ˆØ×Ò˜{¨BÑ/Ô/Ð/Øˆ	r?   c                óÌ  — g }g }d}|D ]ã}|j         }|dk    r?t          |j        ¦  «        }t          j        |¬¦  «        }|                     |¦  «         ŒN|dk    r"|€t          d¦  «        ‚|xj        dz  c_        Œv|dk    rg|j        }	|	�^|	                     ¦   «         dk    rF	 |                     t          j
        t          |	¦  «        ¦  «        ¦  «         ŒÓ# t          $ r Y Œßw xY wŒät          |¦  «        dk    rPt          j        ¦   «         }
t          |¦  «        d	k     rt          d
¦  «        ‚|d         |
_        |d         |
_        n4t          j        ¦   «         }
|r|d         |
_        |r|d         |
_        |�	 |                     d¦  «        }|�|dk    rd|
_        t/          ||
¦  «         |                      ||
¦  «         |                      ||
¦  «         |
S )aO  
        Given an mxMetronome, convert to either a TempoIndication subclass,
        either a tempo.MetronomeMark or tempo.MetricModulation.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> m = EL('<metronome><per-minute>125</per-minute>'
        ...        '<beat-unit>half</beat-unit></metronome>')
        >>> MP.xmlToTempoIndication(m)
        <music21.tempo.MetronomeMark Half=125>

        Metric modulation:

        >>> m = EL('<metronome><beat-unit>long</beat-unit><beat-unit>32nd</beat-unit>'
        ...        '<beat-unit-dot/></metronome>')
        >>> MP.xmlToTempoIndication(m)
        <music21.tempo.MetricModulation
         <music21.tempo.MetronomeMark Imperfect Longa=None>=<music21.tempo.MetronomeMark
                   Dotted 32nd=None>>
        Nz	beat-unit)r`  zbeat-unit-dotz-encountered metronome components out of orderrô   z
per-minuterD   r<  zYfound incompletely specified musicxml metric modulation: fewer than two durations definedr   r©  r½   T)r`   rO   r*   r   r  rÃ   r/   rÈ  r:   r
   ry   rQ   rS   r  r)   ÚMetricModulationÚoldReferentÚnewReferentÚMetronomeMarkrñ   Úreferentrv   r©  rV  rž   r¦   )r{   ÚmxMetronomer®  Ú	durationsÚnumbersÚdActiver@   r`   r  ÚperMinr¦  Úparens               r=   rŸ  z"MeasureParser.xmlToTempoIndicationP  s   € ð. ˆ	ØˆàˆØ ð 	ð 	ˆEØ”)ˆCØ�kÒ!Ð!Ý1°%´*Ñ=Ô=�Ý"Ô+°Ð>Ñ>Ô>�Ø× Ò  Ñ)Ô)Ð)Ð)Ø˜Ò'Ð'Ø�?Ý1Ð2aÑbÔbÐbØ�” Ñ!�”�à˜Ò$Ð$ð œ�ØÐ%¨&¯,ª,©.¬.¸BÒ*>Ð*>ðØŸš¥vÔ'=½eÀF¹m¼mÑ'LÔ'LÑMÔMÐMÐMøÝ%ð ð ð Ø˜ðøøøøõ ˆy‰>Œ>˜AÒÐÝÔ'Ñ)Ô)ˆBå�9‰~Œ~ Ò!Ð!Ý-ð9ñ:ô :ð :ð
 ' qœ\ˆBŒNØ& qœ\ˆBŒNˆNõ Ô$Ñ&Ô&ˆBØð 'Ø# AœJ�”	Øð +Ø'¨œl�”àÐ"Øà—’ Ñ.Ô.ˆØÐØ˜Š~ˆ~Ø!%�”å�{ BÑ'Ô'Ð'à×Ò˜K¨Ñ,Ô,Ð,Ø×Ò˜ bÑ)Ô)Ð)Øˆ	s   Â'4CÃ
C)Ã(C)c                ó¼   — 	 t          |                     d¦  «        j                             ¦   «         ¦  «        }n# t          t
          f$ r Y dS w xY w|| j        z  S )ax  
        Finds an <offset> inside the mxObj and returns it as
        a music21 offset (in quarterLengths)

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.divisions = 40
        >>> off = EL('<direction><offset>100</offset></direction>')
        >>> MP.xmlToOffset(off)
        2.5

        Returns a float, not fraction, since the inserts will later convert to a Fraction
        if need be.

        >>> MP.divisions = 30
        >>> off = EL('<direction><offset>10</offset></direction>')
        >>> MP.xmlToOffset(off)
        0.33333...
        r$  r8  )rQ   r[   r*   r:   rS   rE   r  )r{   r@   r$  s      r=   rb  zMeasureParser.xmlToOffset¢  se   € ð(	Ý˜5Ÿ:š: hÑ/Ô/Ô4×:Ò:Ñ<Ô<Ñ=Ô=ˆFˆFøÝ�NÐ+ð 	ð 	ð 	Ø�3�3ð	øøøà˜œÑ&Ð&s   ‚9< ¼AÁAc                ó~  — | j                              d¦  «        }t          j        |¦  «        r!t          j        j        j        | j        _        n t          j        j        j	        | j        _        |  
                    ¦   «          | j                              d¦  «        }|�t          |¦  «        }|| j        _        dS dS )a  
        parses the attributes of the <measure> tag.  Not the
        <attributes> tag inside the measure tag.

        calls parseMeasureNumbers(), and gets the width from the width tag.

        # TODO: non-controlling
        # may need to do a format/unit conversion?
        ÚimplicitÚwidthN)ra  rv   r,   rx   r&   ÚenumsÚ
ShowNumberÚNEVERr  ÚDEFAULTÚparseMeasureNumbersrV   ÚlayoutWidth)r{   rÃ  rÄ  s      r=   r)  z$MeasureParser.parseMeasureAttributes¼  s¦   € ð ”>×%Ò% jÑ1Ô1ˆÝÔ$ XÑ.Ô.ð 	EÝ%+¤\Ô%<Ô%BˆDŒKÔ"Ð"å%+¤\Ô%<Ô%DˆDŒKÔ"à× Ò Ñ"Ô"Ð"Ø”×"Ò" 7Ñ+Ô+ˆØÐÝ" 5Ñ)Ô)ˆEØ&+ˆDŒKÔ#Ð#Ð#ð Ðr?   c                ó   — d| _         || _        |D ]¦}|j        }|| j        v r't	          | | j        |         ¦  «        } ||¦  «         Œ9|dk    r't          t          |j        ¦  «        ¦  «        | _        Œf|dk    rt          |j        ¦  «        | _
        Œ†|dk    r|                      |¦  «        | _        Œ§|                      || j        ¦  «         | j        �$| j        | j        _        | j        | j        _        dS dS )aæ  
        Parses a single attributes tag (mxAttributes) and sets

        self.attributesAreInternal to False,
        self.activeAttributes to mxAttributes,
        self.parent.activeAttributes to mxAttributes
        and then runs the appropriate attributeTagsToMethods for
        the attribute.

        Also sets `self.divisions` for the current divisions
        (along with self.parent.lastDivisions)
        and `self.transposition` and
        to the current transpose.
        Fr  r½  r  N)r
  r
  r`   ÚattributeTagsToMethodsr,  r   rQ   r*   r  rR   r½  ÚxmlTransposeToIntervalr¾  rÊ   r&   rZ  r  )r{   ÚmxAttributesÚmxSubr`   r/  s        r=   rø  z MeasureParser.parseAttributesTagÒ  s  € ð &+ˆÔ"Ø ,ˆÔØ!ð 	Hð 	HˆEØ”)ˆCà�dÔ1Ð1Ð1Ý˜t TÔ%@ÀÔ%EÑFÔF�Ø��U‘”��à˜Ò#Ð#Ý!'­¨e¬jÑ(9Ô(9Ñ!:Ô!:�”�ð ˜’�Ý! %¤*™oœo�”�Ø˜Ò#Ð#Ø%)×%@Ò%@ÀÑ%GÔ%G�Ô"øð 	×Ò˜,¨¬Ñ4Ô4Ð4àŒ;Ð"Ø(,¬ˆDŒKÔ%Ø+/Ô+@ˆDŒKÔ(Ð(Ð(ð #Ð"r?   c                ó*  — d}|                      d¦  «        }|�t          |j        ¦  «        }d}|                      d¦  «        }|�t          |j        ¦  «        }d}|                      d¦  «        }|�1t          |j        ¦  «        dz  }|dt          |j        ¦  «        z  z  }|�—|�•|dk     r|dz
  }n|dz   }	 t          j        |||z   ¦  «        }	n¯# t          j        $ rX |dk     r|t          |dz  dz  ¦  «        z
  dz
  }n|t          |dz  dz  ¦  «        z
  dz   }t          j        |||z   ¦  «        }	Y nIw xY w|�t          j        ||z   ¦  «        }	n+|�t          j        |¦  «        }	nt          j        d	¦  «        }	t          ||	¦  «         |	S )
a  
        Convert a MusicXML Transpose object to a music21 Interval object.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> t = EL('<transpose><diatonic>-1</diatonic>'
        ...        '<chromatic>-2</chromatic></transpose>')
        >>> MP.xmlTransposeToInterval(t)
        <music21.interval.Interval M-2>

        >>> t = EL('<transpose><diatonic>-5</diatonic>'
        ...        '<chromatic>-9</chromatic></transpose>')
        >>> MP.xmlTransposeToInterval(t)
        <music21.interval.Interval M-6>

        Not mentioned in MusicXML XSD but supported in (Finale; MuseScore): octave-change
        refers to both diatonic and chromatic, so we will deal:

        >>> t = EL('<transpose id="x"><diatonic>-1</diatonic><chromatic>-2</chromatic>'
        ...        '<octave-change>-1</octave-change></transpose>')
        >>> inv = MP.xmlTransposeToInterval(t)
        >>> inv
        <music21.interval.Interval M-9>
        >>> inv.id
        'x'
        NÚdiatonicÚ	chromaticr   zoctave-changeé   rù  rô   ÚP1)	r[   rR   r*   r   ÚintervalFromGenericAndChromaticÚIntervalExceptionr_  ÚGenericIntervalrV  )
r{   ÚmxTransposeÚdiatonicStepÚ
mxDiatonicÚchromaticStepÚmxChromaticÚoctaveChangeÚmxOctaveChangeÚdiatonicActualr­  s
             r=   rÍ  z$MeasureParser.xmlTransposeToIntervalü  s÷  € ð: ˆà ×%Ò% jÑ1Ô1ˆ
ØÐ!Ý˜zœÑ/Ô/ˆLàˆØ!×&Ò& {Ñ3Ô3ˆØÐ"Ý Ô 0Ñ1Ô1ˆMàˆØ$×)Ò)¨/Ñ:Ô:ˆØÐ%Ý˜~Ô2Ñ3Ô3°bÑ8ˆLØ˜A¥ NÔ$7Ñ 8Ô 8Ñ8Ñ8ˆLð Ð#¨Ð(Að ˜aÒÐØ!-°Ñ!1��à!-°Ñ!1�ð^ÝÔ?ÀØ@MÐP\Ñ@\ñ^ô ^��øåÔ-ð 	^ð 	^ð 	^ð   !Ò#Ð#Ø&2µS¸ÈÑ9IÈBÑ9NÑ5OÔ5OÑ&OÐSTÑ%T�N�Nà&2µS¸ÈÑ9IÈBÑ9NÑ5OÔ5OÑ&OÐSTÑ%T�NåÔ?ÀØ@MÐP\Ñ@\ñ^ô ^���ð	^øøøð Ð&ÝÔ$ ]°\Ñ%AÑBÔBˆDˆDØÐ%ÝÔ+¨LÑ9Ô9ˆDˆDåÔ$ TÑ*Ô*ˆDå�{ DÑ)Ô)Ð)àˆs   Â;C ÃA$D;Ä:D;c                óp   — |                       |¦  «        }|�|                      | j        ||¦  «         dS dS )z™
        Creates a TimeSignature using xmlToTimeSignature and inserts it into
        the stream if it is appropriate to do so (now always yes.)
        N)ÚxmlToTimeSignaturer%  ró   )r{   ÚmxTimerÙ  s      r=   rì  z!MeasureParser.handleTimeSignatureR  sD   € ð
 ×$Ò$ VÑ,Ô,ˆØˆ>Ø×!Ò! $Ô"8¸&À"ÑEÔEÐEÐEÐEð ˆ>r?   râ  ú4meter.TimeSignature | meter.SenzaMisuraTimeSignaturec                ór  — |                      d¦  «        }|�t          j        |j        ¦  «        S g }g }|D ]k}|j        dk    r#|                     t          |¦  «        ¦  «         Œ0|j        dk    r#|                     t          |¦  «        ¦  «         Œ^|j        dk    r nŒld„ t          ||¦  «        D ¦   «         }t          |¦  «        dk    rG	 t          j	        |d         ¦  «        }nf# t          j
        $ r t          d	|d         › �¦  «        ‚w xY wt          j	        ¦   «         }|                     d
                     |¦  «        ¦  «         |                      ||¦  «         |                      ||¦  «         |                     d¦  «        }|€n!|dv r||_        n|dk    rd|_        n|dk    r	 |S )as  
        Returns a TimeSignature or SenzaMisuraTimeSignature (for senza-misura)
        from a <time> block.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxTime = EL('<time><beats>3</beats><beat-type>8</beat-type></time>')
        >>> MP.xmlToTimeSignature(mxTime)
        <music21.meter.TimeSignature 3/8>

        >>> mxTime = EL('<time symbol="common"><beats>4</beats>'
        ...             '<beat-type>4</beat-type></time>')
        >>> MP.xmlToTimeSignature(mxTime).symbol
        'common'

        Multiple times give a combined meter

        >>> mxTime = EL('<time><beats>3</beats><beat-type>8</beat-type>'
        ...             '<beats>4</beats><beat-type>4</beat-type></time>')
        >>> MP.xmlToTimeSignature(mxTime)
        <music21.meter.TimeSignature 3/8+4/4>

        Music21 separates into two parts

        >>> mxTime = EL('<time><beats>3+2</beats><beat-type>8</beat-type></time>')
        >>> ts32 = MP.xmlToTimeSignature(mxTime)
        >>> ts32
        <music21.meter.TimeSignature 3/8+2/8>

        Senza Misura gives a special music21 time signature subclass

        >>> mxSenza = EL('<time><senza-misura>0</senza-misura></time>')
        >>> MP.xmlToTimeSignature(mxSenza)
        <music21.meter.SenzaMisuraTimeSignature 0>

        Small Duration Time Signatures are supported

        >>> mxTime = EL('<time><beats>3</beats><beat-type>32</beat-type></time>')
        >>> MP.xmlToTimeSignature(mxTime)
        <music21.meter.TimeSignature 3/32>

        >>> mxTime = EL('<time><beats>3</beats><beat-type>64</beat-type></time>')
        >>> MP.xmlToTimeSignature(mxTime)
        <music21.meter.TimeSignature 3/64>

        >>> mxTime = EL('<time><beats>3</beats><beat-type>128</beat-type></time>')
        >>> MP.xmlToTimeSignature(mxTime)
        <music21.meter.TimeSignature 3/128>
        zsenza-misuraNÚbeatsz	beat-typeÚinterchangeablec                ó"   — g | ]\  }}|› d |› �‘ŒS )ú/r   )ro   ÚnumÚdenoms      r=   rC  z4MeasureParser.xmlToTimeSignature.<locals>.<listcomp>¡  s*   € ÐPÐPÐP¡J C¨�#ÐÐ˜ÐÐÐPÐPÐPr?   rô   r   zCannot process time signature ú+r¬  )r
   Úcutzsingle-numberr)  r!   Tzdotted-note)r[   r   ÚSenzaMisuraTimeSignaturer*   r`   rÃ   rG   ru   r  rp  ÚMeterExceptionr/   Úloadrl  r�   rž   rv   r¬  ÚsymbolizeDenominator)	r{   râ  ÚisSenzaMisuraÚ
numeratorsÚdenominatorsÚ
beatOrTypeÚmsgrÙ  r¬  s	            r=   rá  z MeasureParser.xmlToTimeSignature[  sù  € ðn Ÿš NÑ3Ô3ˆØÐ$ÝÔ1°-Ô2DÑEÔEÐEàˆ
ØˆØ ð 	ð 	ˆJØŒ~ Ò(Ð(Ø×!Ò!¥,¨zÑ":Ô":Ñ;Ô;Ð;Ð;Ø” ;Ò.Ð.Ø×#Ò#¥L°Ñ$<Ô$<Ñ=Ô=Ð=Ð=Ø”Ð#4Ò4Ð4Ø�ð 5ð QÐPµ#°jÀ,Ñ2OÔ2OÐPÑPÔPˆõ ˆs‰8Œ8�qŠ=ˆ=ð?ÝÔ(¨¨Q¬Ñ0Ô0��øÝÔ'ð ?ð ?ð ?Ý-Ø=°S¸´VÐ=Ð=ñ?ô ?ð ?ð?øøøõ Ô$Ñ&Ô&ˆBØ�GŠG�C—H’H˜S‘M”MÑ"Ô"Ð"ð 	×Ò ¨Ñ+Ô+Ð+Ø×Ò˜F BÑ'Ô'Ð'ð
 —’˜HÑ%Ô%ˆØˆ>ØØÐCÐCÐCØˆBŒIˆIØ�vÒÐØ&*ˆBÔ#Ð#Ø�}Ò$Ð$Øð ˆ	s   ÃC, Ã,(Dú	clef.Clefc                ó¦   — |                       |¦  «        }|                      | j        ||¦  «         |                      |¦  «        }|| j        |<   |S )aØ  
        Convert a `<clef>` tag to a music21.clef.Clef object, append it to the
        core, and set self.lastClefs for the staff number.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.lastClefs
        {}

        >>> mxAltoClef = EL('<clef number="2"><sign>C</sign><line>3</line></clef>')
        >>> altoClef = MP.handleClef(mxAltoClef)
        >>> altoClef
        <music21.clef.AltoClef>

        The MeasureParser (together with its parent PartParser) keeps track of the
        current clef for each staff in a shared dictionary called `.lastClefs`.

        >>> MP.lastClefs
        {2: <music21.clef.AltoClef>}
        >>> MP.lastClefs[2] is altoClef
        True

        The dictionary is shared with the parent PartParser.

        >>> MP.parent.lastClefs is MP.lastClefs
        True

        Per MusicXML standard, a clef without a number is interpreted as being for staff 1

        >>> mxClefBC = EL('<clef><sign>F</sign><line>4</line></clef>')
        >>> bc = MP.handleClef(mxClefBC)
        >>> bc
        <music21.clef.BassClef>

        >>> MP.lastClefs
        {2: <music21.clef.AltoClef>, 1: <music21.clef.BassClef>}

        Changed in v10.5 -- Fixed bug where clefs without number were applied to all staves
            rather than correct MusicXML interpretation of staff 1.  Returns the clef created.
            There is no longer a default treble clef for NO_STAFF_ASSIGNED.
        )Ú	xmlToClefr%  ró   r  r  )r{   ÚmxClefÚclefObjÚstaffNumberStrOrNones       r=   rí  zMeasureParser.handleClefÂ  sY   € ðV —.’. Ñ(Ô(ˆØ×Ò˜dÔ4°f¸gÑFÔFÐFð  $×2Ò2°6Ñ:Ô:ÐØ/6ˆŒÐ+Ñ,Øˆr?   c                ó6  — |                      d¦  «        j                             ¦   «         }|                     ¦   «         dv rt	          j        |¦  «        }n•|                      d¦  «        }|�|j                             ¦   «         }n|dk    rd}nd}|                      d¦  «        }|�(	 t          |j        ¦  «        }n# t          $ r d	}Y nw xY wd	}t	          j        ||z   |¦  «        }|                      ||¦  «         |  	                    ||¦  «         |S )
a�  
        Returns a music21 Clef object from an mxClef element.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> mxClef = EL('<clef><sign>G</sign><line>2</line></clef>')

        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.xmlToClef(mxClef)
        <music21.clef.TrebleClef>

        >>> mxClef = EL('<clef><sign>G</sign><line>2</line>'
        ...             '<clef-octave-change>-1</clef-octave-change></clef>')
        >>> MP.xmlToClef(mxClef)
        <music21.clef.Treble8vbClef>

        >>> mxClef = EL('<clef><sign>TAB</sign></clef>')
        >>> MP.xmlToClef(mxClef)
        <music21.clef.TabClef>
        rœ  )Útabr"   r’  Újianpur›  NÚGÚ2Ú4zclef-octave-changer   )
r[   r*   r:   rÓ  r	   ÚclefFromStringrR   rS   r¤   rž   )r{   rù  rœ  rú  r½  r›  rÞ  rÝ  s           r=   rø  zMeasureParser.xmlToClefõ  s.  € ð* �{Š{˜6Ñ"Ô"Ô'×-Ò-Ñ/Ô/ˆØ�:Š:‰<Œ<ÐBÐBÐBÝÔ)¨$Ñ/Ô/ˆGˆGà—[’[ Ñ(Ô(ˆFØÐ!Ø”{×(Ò(Ñ*Ô*��Ø˜’�Ø��à�Ø#Ÿ[š[Ð)=Ñ>Ô>ˆNØÐ)ð%Ý#& ~Ô':Ñ#;Ô#;�L�LøÝ!ð %ð %ð %Ø#$�L�L�Lð%øøøð  !�ÝÔ)¨$°©+°|ÑDÔDˆGð 	×Ò˜6 7Ñ+Ô+Ð+Ø×Ò˜F GÑ,Ô,Ð,àˆs   Â,C ÃCÃCc                óh   — |                       |¦  «        }|                      | j        ||¦  «         dS )zW
        convert mxKey to a Key or KeySignature and run insertCoreAndRef on it
        N)ÚxmlToKeySignaturer%  ró   )r{   ÚmxKeyÚkeySigs      r=   rî  z MeasureParser.handleKeySignature)  s8   € ð ×'Ò'¨Ñ.Ô.ˆØ×Ò˜dÔ4°e¸VÑDÔDÐDÐDÐDr?   r  úkey.KeySignaturec                óÚ  — |                      d¦  «        €|                      |¦  «        }n}t          j        ¦   «         }t          } |||ddt
          ¬¦  «         |                      d¦  «        }|�7|j        }|dvr,	 |                     |¦  «        }n# t          j	        $ r Y nw xY w|  
                    ||¦  «         |                      ||¦  «         |                      ||¦  «         |S )a&  
        Returns either a KeySignature (traditional or non-traditional)
        or a Key object based on whether fifths and mode is present.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> mxKey = EL('<key><fifths>-4</fifths></key>')

        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.xmlToKeySignature(mxKey)
        <music21.key.KeySignature of 4 flats>

        >>> mxKey = EL('<key><fifths>-4</fifths><mode>minor</mode></key>')
        >>> MP.xmlToKeySignature(mxKey)
        <music21.key.Key of f minor>

        Invalid modes get ignored and returned as KeySignature objects, not keys.

        >>> mxKey = EL('<key><fifths>-4</fifths><mode>crazy</mode></key>')
        >>> MP.xmlToKeySignature(mxKey)
        <music21.key.KeySignature of 4 flats>
        ÚfifthsNÚsharpsrW   ÚmoderZ   )r[   ÚnonTraditionalKeySignaturer   rn  rc   rR   r*   ÚasKeyr   ÚMusic21ExceptionÚmxKeyOctavesr¤   rž   )r{   r  Úksrá   Ú	mxKeyModeÚ	modeValues         r=   r  zMeasureParser.xmlToKeySignature0  s  € ð0 �:Š:�hÑÔÐ'Ø×0Ò0°Ñ7Ô7ˆBˆBåÔ!Ñ#Ô#ˆBÝ+ˆDØˆD��U˜H h½#Ð>Ñ>Ô>Ð>àŸ
š
 6Ñ*Ô*ˆIØÐ$Ø%œN�	Ø JÐ.Ð.ðØŸXšX iÑ0Ô0˜˜øÝ'Ô8ð ð ð Ø˜ðøøøà×Ò˜% Ñ$Ô$Ð$Ø×Ò˜5 "Ñ%Ô%Ð%Ø×Ò˜E 2Ñ&Ô&Ð&àˆ	s   Á>B ÂB&Â%B&c                ó|  — |                      d¦  «        }|sdS t          j        |j        ¦  «        }|D ]}|                     d¦  «        }|dk    rŒ|                     d¦  «        }	 |t          |¦  «        dz
           }n# t          t          f$ r Y Œ`w xY wt          |j        ¦  «        }	|	|_	        Œ€||_        dS )aü  
        process the <key-octave> tags to potentially change a key signature
        to a non-standard key signature.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> mxKey = EL('<key><fifths>-4</fifths>'
        ...            '<key-octave number="1">3</key-octave>'
        ...            '<key-octave number="2">4</key-octave>'
        ...            '<key-octave number="4">3</key-octave>'
        ...            '</key>')

        >>> ks = key.KeySignature(-4)
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.mxKeyOctaves(mxKey, ks)
        >>> ks.alteredPitches
        [<music21.pitch.Pitch B-3>,
         <music21.pitch.Pitch E-4>,
         <music21.pitch.Pitch A->,
         <music21.pitch.Pitch D-3>]
        z
key-octaveNÚcancelr½   rñ   rô   )
r<  r{  r|  ÚalteredPitchesrv   rR   rT  rS   r*   r°  )
r{   r  r  Ú
keyOctavesr  ÚmxKeyOctaver  Ú
pitchIndexÚalteredPitchÚoctaveToSets
             r=   r  zMeasureParser.mxKeyOctaves]  sÛ   € ð. —]’] <Ñ0Ô0ˆ
Øð 	ØˆFåœ rÔ'8Ñ9Ô9ˆà%ð 	.ð 	.ˆKØ —_’_ XÑ.Ô.ˆFà˜ŠˆØØ$Ÿš¨Ñ2Ô2ˆJðØ-­c°*©o¬oÀÑ.AÔB��øÝ¥
Ð+ð ð ð Ø�ðøøøå˜kÔ.Ñ/Ô/ˆKØ"-ˆLÔÐà*ˆÔÐÐs   Á)BÂBÂBc                óª  — t          |¦  «        }d}g }g }g }|D ]›}|j        }|dk    r|dk    r|                     d¦  «         |dk    r|                     |j        ¦  «         nN|dk    r(|                     t	          |j        ¦  «        ¦  «         n |dk    r|                     |j        ¦  «         |}Œœt          |¦  «        t          |¦  «        k     r|                     d¦  «         t          |¦  «        t          |¦  «        k    rt          d¦  «        ‚t          j        d¬¦  «        }	g }
t          |||¦  «        D ]‰\  }}}t          j        |¦  «        }|�?|| j        v r| j        |         }n|}t          j        |¦  «        |_        ||j        _        nt          j        |¦  «        |_        |
                     |¦  «         ŒŠ|
|	_        |	S )aj  
        Returns a KeySignature object that represents a nonTraditional Key Signature

        called by xmlToKeySignature if <fifths> is not present.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()

        >>> mxKey = EL('<key><key-step>E</key-step><key-alter>-1</key-alter></key>')
        >>> MP.nonTraditionalKeySignature(mxKey)
        <music21.key.KeySignature of pitches: [E-]>

        Should be the same:

        >>> MP.xmlToKeySignature(mxKey)
        <music21.key.KeySignature of pitches: [E-]>

        Works with key-accidental also:

        >>> mxKey = EL('<key><key-step>G</key-step><key-alter>1</key-alter>'
        ...            '<key-accidental>sharp</key-accidental></key>')
        >>> MP.nonTraditionalKeySignature(mxKey)
        <music21.key.KeySignature of pitches: [G#]>
        Nz	key-alterzkey-stepzkey-accidentalz;For non traditional signatures each step must have an alter)r
  )r?  r`   rÃ   r*   rQ   r  r/   r   rn  ru   r#   r³  rÿ   r¸  r²  r±  r  )r{   r  ÚchildrenÚlastTagÚstepsÚaltersÚaccidentalsrÈ   r`   r  r  r¯  r±  r²  rT  ÚaccidentalNames                   r=   r  z(MeasureParser.nonTraditionalKeySignature‰  sù  € õ4 ˜‘;”;ˆàˆØˆØˆØˆàð 
	ð 
	ˆAØ”%ˆCØ˜+Ò%Ð%¨#°Ò*;Ð*;Ø×"Ò" 4Ñ(Ô(Ð(Ø�jÒ Ð Ø—’˜QœVÑ$Ô$Ð$Ð$Ø˜Ò#Ð#Ø—’�e A¤F™mœmÑ,Ô,Ð,Ð,ØÐ(Ò(Ð(Ø×"Ò" 1¤6Ñ*Ô*Ð*ØˆGˆGåˆ{ÑÔ�c &™kœkÒ)Ð)Ø×Ò˜tÑ$Ô$Ð$Ýˆu‰:Œ:�˜V™œÒ$Ð$Ý)ØMñOô Oð Oõ Ô TÐ*Ñ*Ô*ˆàˆÝ'*¨5°&¸+Ñ'FÔ'Fð 	%ð 	%Ñ#ˆD�%˜Ý”˜DÑ!Ô!ˆAØÐ%Ø Ô!;Ð;Ð;Ø%)Ô%?À
Ô%K�N�Nà%/�NÝ$Ô/°Ñ?Ô?�”Ø%*�”Ô"Ð"å$Ô/°Ñ6Ô6�”à×!Ò! !Ñ$Ô$Ð$Ð$à*ˆÔØˆ	r?   c                ó"  — |                      d¦  «        }|�t          |¦  «        }nd}|| j        f}| j                              |d¦  «        }|                      ||¬¦  «        }|€(|                      | j        ||¦  «         || j        |<   dS dS )aò  
        StaffDetails (staff-details) handles attributes about
        the staff itself -- its size, number of lines, tuning,
        frets, etc.

        It is different from StaffLayout (staff-layout) which
        only handles relationship of one staff to another (the
        distance)

        Rather than returning a StaffLayout object,
        it adds it to self.staffLayoutObjects checking
        to see if there is already an incomplete
        StaffLayout object for this staff.
        rñ   Nrô   )Úm21staffLayout)rv   rR   ró   rò   ÚxmlStaffLayoutFromStaffDetailsr%  )r{   Ú	mxDetailsrö   ÚlayoutObjectKeyÚexistingStaffLayoutObjectÚnewStaffLayoutObjects         r=   rï  z MeasureParser.handleStaffDetailsÐ  s·   € ð&  —m’m HÑ-Ô-ˆØÐ"Ý˜kÑ*Ô*ˆKˆKàˆKà&¨Ô(>Ð?ˆØ$(Ô$;×$?Ò$?ÀÐQUÑ$VÔ$VÐ!Ø#×BÒBØØ4ð  Cñ  
ô  
Ðð %Ð,Ø×!Ò! $Ô"8¸)ÐEYÑZÔZÐZØ7KˆDÔ# OÑ4Ð4Ð4ð -Ð,r?   r#  úlayout.StaffLayout | Nonec                ól  — t           }|st          j        ¦   «         }n|}|                     d¦  «        }|�t	          |¦  «        |_        |                     d¦  «        }|dk    s|du rd|_        n|dk    s|du rd|_         |||dt          ¬	¦  «         |                     d
¦  «        }|�n	 |j         	                    ¦   «         }t          j                             |¦  «        |_        n/# t          $ r" t          j        d|› �t"          d¬¦  «         Y nw xY w |||dt$          ¬	¦  «         |s|S dS )aÄ  
        Returns a new StaffLayout object from staff-details or sets attributes on an existing one

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> mxDetails = EL('<details number="2" print-object="no">'
        ...                '<staff-size>21.2</staff-size><staff-lines>4</staff-lines>'
        ...                '</details>')
        >>> stl = MP.xmlStaffLayoutFromStaffDetails(mxDetails)
        >>> stl.staffSize
        21.2
        >>> stl.staffLines
        4
        >>> stl.staffNumber
        2
        >>> stl.hidden
        True

        `staffType` defaults to Regular:

        >>> stl.staffType
        <StaffType.REGULAR: 'regular'>
        >>> mxDetails2 = EL('<details number="2"><staff-type>cue</staff-type></details>')
        >>> MP.xmlStaffLayoutFromStaffDetails(mxDetails2, m21staffLayout=stl)
        >>> stl.staffType
        <StaffType.CUE: 'cue'>
        rñ   Nrš   r›   FTr½   zstaff-linesrW   z
staff-typez(Got an incorrect staff-type in details: r<  r=  z
staff-size)rc   r   rõ   rv   rR   rö   Úhiddenr[   r*   r:   r&   rÅ  Ú	StaffTypeÚ	staffTyperS   rA  rB  r0   rV   )	r{   r%  r#  rá   rM  rö   ÚstaffPrintedÚmxStaffTyper  s	            r=   r$  z,MeasureParser.xmlStaffLayoutFromStaffDetailsô  sƒ  € õB (ˆàð 	!ÝÔ$Ñ&Ô&ˆCˆCà ˆCð  —m’m HÑ-Ô-ˆØÐ"Ý! +Ñ.Ô.ˆCŒOØ —}’} ^Ñ4Ô4ˆØ˜4ÒÐ <°5Ð#8Ð#8ØˆCŒJˆJØ˜UÒ"Ð" l°dÐ&:Ð&:ØˆCŒJð
 	ˆˆS�)˜]µcÐ:Ñ:Ô:Ð:ð  —n’n \Ñ2Ô2ˆØÐ"ðØ*Ô/×5Ò5Ñ7Ô7�Ý &¤× 6Ò 6°wÑ ?Ô ?�”�øÝð ð ð Ý”ØL¸{ÐLÐLÝ#Ø ðñ ô ð ð ð ðøøøð 	ˆˆS�)˜\µ^ÐDÑDÔDÐDð ð 	ØˆJð	ð 	s   Â/=C- Ã-)DÄDc                óD  — |                      d¦  «        }|�†| j        ��t          |j        ¦  «        | j        _        t          j        ¦   «         }|                     d¦  «        }|dk    rd|_        nd|_        || j        _	        |  
                    ||¦  «         dS dS dS )a!  
        measure + multi-measure repeats, slashed repeats, etc.

        But currently only multiMeasure rests are supported.

        Each of these applies to the entire measure, so there's
        no need to insert into the stream.

        Does not support multiple staves yet.
        zmultiple-restNzuse-symbolsr½   TF)r[   rZ  rR   r*   r  r%   ÚMultiMeasureRestrv   Ú
useSymbolsr  r§   )r{   ÚmxMeasureStyleÚmxMultiRestÚ
mmrSpannerr2  s        r=   rð  z MeasureParser.handleMeasureStyle@  s¨   € ð %×)Ò)¨/Ñ:Ô:ˆØÐ" t¤{Ð'>Ý58¸Ô9IÑ5JÔ5JˆDŒKÔ2Ý Ô1Ñ3Ô3ˆJØ$Ÿš¨Ñ7Ô7ˆJØ˜UÒ"Ð"Ø(,�
Ô%Ð%à(-�
Ô%Ø8BˆDŒKÔ5à�LŠL˜ jÑ1Ô1Ð1Ð1Ð1ð #Ð"Ð'>Ð'>r?   c                óì  — |€!| j         �| j                              d¦  «        }| j        }| j        r| j        j        }| j        j        }nd}d}|€d}d}nt          j        |¦  «        \  }}|dvrt          |¦  «        |_	        |dvr||_
        |�J|j
        dk    r?|j	        |dz   k    r1|j
        t          |j	        ¦  «        z   }|�||z   }||_	        ||_
        |j	        | _        |j
        | _
        dS )a@  
        Gets the measure number from the 'number' attribute of the
        <measure> tag.  (Or, for testing, from the mNumRaw
        argument).  Sets MeasureParser.stream.number and possibly
        MeasureParser.stream.numberSuffix

        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.parseMeasureNumbers('5')
        >>> MP.stream.number
        5

        Sets not only `stream.number`, but also `MeasureParser.measureNumber` and
        `MeasureParser.numberSuffix`

        >>> MP.parseMeasureNumbers('44b')
        >>> MP.stream.number
        44
        >>> MP.stream.numberSuffix
        'b'
        >>> MP.measureNumber
        44
        >>> MP.numberSuffix
        'b'

        >>> MP.parseMeasureNumbers('X1')
        >>> MP.stream.number
        1
        >>> MP.stream.numberSuffix
        'X'
        Nrñ   rD   rZ   ÚXrô   )ra  rv   r&   rZ  r  r  r
   ÚgetNumFromStrrR   rñ   r×  rB   rº  )r{   ÚmNumRawrÎ  ÚlastMNumÚlastMSuffixÚmNumÚmSuffixÚ	newSuffixs           r=   rÉ  z!MeasureParser.parseMeasureNumbers^  s  € ð> ˆ?˜tœ~Ð9à”n×(Ò(¨Ñ2Ô2ˆGàŒKˆØŒ;ð 	Ø”{Ô4ˆHØœ+Ô6ˆKˆKàˆHØˆKàˆ?ØˆDØˆGˆGå"Ô0°Ñ9Ô9‰MˆD�'ð �zÐ!Ð!Ý˜4‘y”yˆAŒHØ˜*Ð$Ð$Ø$ˆAŒNð ÐØŒ~ Ò$Ð$¨¬°XÀ±\Ò)AÐ)AØœN­S°´©]¬]Ñ:�	ØÐ*Ø +¨iÑ 7�IØ#�”Ø!*�”àœXˆÔØœNˆÔÐÐr?   c                óø  — | j         }dD ]Z}|                     |¦  «        D ]B}|                     d¦  «        }t          |¦  «        x}r| j                             |¦  «         ŒCŒ[t          | j        ¦  «        dk    r}t          | j        ¦  «        D ]F}t          j	        ¦   «         }||_
        | j                             d|¦  «         || j        |j
        <   ŒGd| _        | j                             ¦   «          dS dS )am  
        Finds all the "voice" information in <note> and <forward> tags and updates the set of
        `.voiceIndices` to be a set of all the voice texts, and if there is
        more than one voice in the measure, sets `.useVoices` to True
        and creates a voice for each.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.mxMeasure = EL('<measure><note><voice>1</voice></note></measure>')
        >>> MP.updateVoiceInformation()

        Puts a set object in `.voiceIndices`

        >>> MP.voiceIndices
        {'1'}
        >>> MP.useVoices
        False

        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.mxMeasure = EL('<measure><note><voice>1</voice></note>'
        ...                   '<note><voice>2</voice></note></measure>')
        >>> MP.updateVoiceInformation()
        >>> sorted(list(MP.voiceIndices))
        ['1', '2']
        >>> MP.useVoices
        True
        >>> len(MP.stream)
        2
        >>> list(MP.stream.getElementsByClass(stream.Voice))
        [<music21.stream.Voice 1>, <music21.stream.Voice 2>]
        >>> MP = musicxml.xmlToM21.MeasureParser()
        >>> MP.mxMeasure = EL('<measure><note><voice>1</voice></note>'
        ...                   '<forward><voice>2</voice></forward></measure>')
        >>> MP.updateVoiceInformation()
        >>> sorted(list(MP.voiceIndices))
        ['1', '2']
        >>> MP.useVoices
        True
        >>> len(MP.stream)
        2
        >>> list(MP.stream.getElementsByClass(stream.Voice))
        [<music21.stream.Voice 1>, <music21.stream.Voice 2>]
        )r!   rý  rR  rô   r8  TN)ra  r<  r[   rG   r	  rg   r  r±  r&   ÚVoicer7  r:  r  re  rK  )r{   ÚmxmrC  ÚmxnrR  r_  r0  s          r=   r*  z$MeasureParser.updateVoiceInformation¢  s  € ðZ ŒnˆØ,ð 	2ð 	2ˆIØ—{’{ 9Ñ-Ô-ð 2ð 2�ØŸš Ñ)Ô)�Ý)¨%Ñ0Ô0Ð0�6ð 2ØÔ%×)Ò)¨&Ñ1Ô1Ð1øð2õ ˆtÔ Ñ!Ô! AÒ%Ð%Ý  Ô!2Ñ3Ô3ð *ð *�Ý”L‘N”N�Ø�”Ø”×&Ò& s¨AÑ.Ô.Ð.Ø()�” ¤Ñ%Ð%Ø!ˆDŒNàŒK×+Ò+Ñ-Ô-Ð-Ð-Ð-ð &Ð%r?   rñ  )ra  rA   rZ  r  )r|   r  r6   rR   )r  r  r}   r  r6   rÇ  )r"  r  r}   r  r6   rÇ  )r@   rÆ  )rÕ   rÆ  )rP  rÆ  r6   rÇ  )r  rc  r6   rd  )T)r6   r�  rn   )r–  rÆ  )r‘  rÆ  rÑ   rÁ  r6   rÂ  )r½  rÆ  rÑ   rÍ  r6   rÎ  )rü  rÆ  r`  r  )r.  rx  )r@   rÆ  r�  r‡  rˆ  r‰  )rP  rÆ  r6   rì  )r6   r'  )r<  rA   r6   r>  )rA  rÆ  r6   rÇ  )rc  rÆ  r6   rf  )r–  rÆ  r\  rÆ  r�  rR   rˆ  rQ   )
r–  rÆ  r£  rÆ  r\  rÆ  r�  rR   rˆ  rQ   )r@   rÆ  r6   rQ   )râ  rÆ  r6   rã  )r6   rö  )r  rÆ  r6   r  )r#  r)  r6   r)  )Jrû   rü   rý   rþ   rÌ  r+  r  ró  r  r!  r%  r&  rõ  rö  r(  rô  rX  rU  r¡  rŠ  rŽ  r‡  r‰  r´  rV  r�  r…  rõ  rö  r0  rZ  rY  rW  r1  r8  rÃ  r=  r<  r:  rô  r  rW  r"  r6  r9  rû  rD  rE  rù  ra  r÷  r�  rœ  r¡  r   rŸ  rb  r)  rø  rÍ  rì  rá  rí  rø  rî  r  r  r  rï  r$  rð  rÉ  r*  rô  rõ  s   @r=   r¹  r¹  E	  sj  ø€ € € € € ðð ð, &ØØ#Ø-Ø-ðð Ðð ØØØ#Ø*ØØØØØØØðð Ðð" /3Ø+/ðKYð KYð KYð KYð KYð KYð KYðZ ðf%ð f%ð f%ñ „\ðf%ðT-3ð -3ð -3ð -3ð^2ð 2ð 2ð 2ð4(ð (ð (ð@Fð Fð Fð Fð:Mð Mð Mð Mð4:,ð :,ð :,ð :,ð~_2ð _2ð _2ð _2ðB[ð [ð [ð [ðzQUð QUð QUð QUð QUðjJð Jð Jð Jð JðXð ð ð ð8"Cð "Cð "CðHPð Pð Pð Pðj )-ð&ð &ð &ð &ð &ðV +/ðEð Eð Eð Eð EðNL:ð L:ð L:ð\Ið Ið Ið IðxDð Dð Dð DðLð ð ð2v4ð v4ð v4ð v4ðpHð Hð HðT:#ð :#ð :#ðx ð(ð (ñ „\ð(ðBOð Oð Oð3ð 3ð 3ðr 9=ð	Wð Wð Wð Wð Wð Wðx "Ø%)ð	eð eð eð eð eðN	#-ð #-ð #-ðJð ð ð6 OTð #ð #ð #ð #ð #ðJNð Nð Nð`oð oð oð oðb$ð $ð $ð6Gð Gð Gð Gð GðR<ð <ð <ð. $(ð)ð )ð )ð )ð )ðVIð Ið Ið IðVMð Mð Mð Mð^!ð !ð !ð !ðF,ð ,ð ,ðið ið ið iðV'ð 'ð 'ðVS?ð S?ð S?ð S?ðj*ð *ð *ð *ð0ð ð ð<ð ð ðPð Pð Pð Pðd'ð 'ð 'ð 'ð4,ð ,ð ,ð,(Að (Að (AðTTð Tð TðlFð Fð Fðeð eð eð eðN1ð 1ð 1ð 1ðf2ð 2ð 2ðhEð Eð Eð+ð +ð +ð +ðZ*+ð *+ð *+ðXEð Eð EðN!Lð !Lð !LðN 37ðJð Jð Jð Jð JðX2ð 2ð 2ð<B+ð B+ð B+ð B+ðH>.ð >.ð >.ð >.ð >.ð >.ð >.r?   r¹  Ú__main__)r4   r5   r6   r5   )r@   rA   r6   rB   )rH   rB   r6   rB   rn   )rd   re   )dÚ
__future__r   r{  rþ  r-  r  Úmathr   rH  Útypingr“  rA  Úxml.etree.ElementTreer)  ÚElementTreer%  Úmusic21r   r   r   r   r	   r
   r   r   r   Úmusic21.common.enumsr   r   Úmusic21.common.numberToolsr   r   r   r   r   r   r   r   r   r   r   r   r   Úmusic21.midi.percussionr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Úmusic21.musicxmlr,   r-   Úmusic21.musicxml.xmlSoundParserr.   Úmusic21.musicxml.xmlObjectsr/   r0   ÚsynchronizeIdsToM21rV  ÚsetM21AttributeFromAttributerÓ   rÄ  r1   Úmusic21.common.typesr2   ÚdictrR   r?  ÚMusic21Objectr¨  ÚEnvironmentrB  r¬  Ú
propertiesÚALL_NAMESPACE_NAMESÚALL_UNIQUE_NAMESÚALL_MUSIC21_WORK_IDSr3   Ú__annotations__r>   rG   rO   rV   rc   ri   rk   r  r
  r[  r¹  rû   ÚmainTestr   r?   r=   ú<module>r\     sÇ  ðð #Ð "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø $Ð $Ð $Ð $Ð $Ð $Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø PÐ PÐ PÐ PÐ PÐ PÐ PÐ PàÔ,€Ø#Ô@Ð à„?ð =ØÐÐÐÐÐØ-Ð-Ð-Ð-Ð-Ð-ð ˜c 4¨Ô(:Ô#;Ð;Ô<Ðà&ˆ{Ô&Ð':Ñ;Ô;€ð Ð ð  $˜tØÔÔ+ØÔÔ*ñ+àÔÔ.ñ/ñ ô  Ð ð ð ð ñ ðð ð ð ð"ð "ð "ð "ðLð ð ð ð<ð ð ð25)ÐQUð 5)ð 5)ð 5)ð 5)ð 5)ðn	#ð 	#ð 	#ð 	#ðOð Oð Oð Oð Oñ Oô Oð Oðd.ð .ð .ð .ð .ñ .ô .ð .ð2Lð Lð Lð Lð L�}ñ Lô Lð Lð`B6ð B6ð B6ð B6ð B6�ñ B6ô B6ð B6ðL[B.ð [B.ð [B.ð [B.ð [B.�M =ñ [B.ô [B.ð [B.ðBE ˆzÒÐØ€N€N€NØ€GÔÑÔÐÐÐð Ðr?   