§
    ƒØj* ã                  ód  — d Z ddlmZ g d¢ZddlmZ ddlZddlZddl	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  ej        d¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ d¦  «        Z G d„ dej        ¦  «        Z G d„ d¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z  G d„ d ej        ¦  «        Z! G d!„ d"e	j"        ¦  «        Z#e gZ$e%d#k    rddl
Z
 e
j&        e#¦  «         dS dS )$aë  
**N.B. in Dec. 2014 MuseData access was removed from music21 because the rights conflicted with
access computationally from music21.  This module is retained for anyone who has such access,
however it is completely untested now and errors cannot and will not be fixed.**

Objects and resources for processing MuseData.

MuseData conversion from a file or URL to a :class:`~music21.stream.Stream` is available through
the music21 converter module's :func:`~music21.converter.parse` function.

>>> #_DOCS_SHOW from music21 import *
>>> #_DOCS_SHOW abcScore = converter.parse('d:/data/musedata/myScore.stage2')

Low level MuseData conversion is facilitated by the objects in this module and
:func:`music21.musedata.translate.museDataToStreamScore`.
é    )Úannotations)ÚMuseDataDirectoryÚMuseDataExceptionÚMuseDataFileÚMuseDataMeasureÚMuseDataMeasureIteratorÚMuseDataPartÚMuseDataRecordÚMuseDataRecordIteratorÚMuseDataWorkÚ	base12_26Úbase40Ú	translate)ÚIterableN)Úenvironment)Úexceptions21)r   )r   )r   )Úcommon)Úprebase)ÚOffsetQLÚmusedatac                  ó   — e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© ó    úŽ/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/musedata/__init__.pyr   r   C   s   € € € € € Ø€Dr   r   c                  ó”   — e Zd ZdZ	 	 dd d„Zd!d	„Zd
„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd"d#d„Zd„ Zd„ Zd„ Zd$d„Zd„ Zd„ Zd„ Zd„ ZdS )%r
   zp
    Object for extracting data from a Note or other related record, or a
    single line of musedata data.
    Ú NÚsrcÚstrc                óz   — || _         || _        | j        �| j        j        j        | _        nd | _        i | _        d S ©N)r    ÚparentÚstageÚ_cache©Úselfr    r$   s      r   Ú__init__zMuseDataRecord.__init__M   s=   € ð ˆŒØˆŒàŒ;Ð"àœÔ+Ô1ˆDŒJˆJàˆDŒJà+-ˆŒˆˆr   ÚreturnÚboolc                ó:   — | j         r| j         d         dk    rdS dS )a  
        Return a boolean if this record is a rest.

        >>> mdr = musedata.MuseDataRecord('D4     1        s     d  ]]')
        >>> mdr.isRest()
        False
        >>> mdr = musedata.MuseDataRecord('measure 1       A')
        >>> mdr.isRest()
        False
        r   ÚrTF©r    ©r(   s    r   ÚisRestzMuseDataRecord.isRest^   s(   € ð Œ8ð 	˜œ œ sÒ*Ð*Ø�4Øˆur   c                óÌ   — | j         dk    r-t          | j        ¦  «        dk    r| j        d         dk    rdS dS t          | j        ¦  «        dk    r| j        d         dk    rdS dS )a   
        Return a boolean if this record is tied.

        >>> mdr = musedata.MuseDataRecord('D4     8-       h     d        -')
        >>> mdr.isTied()
        True

        >>> mdr = musedata.MuseDataRecord('C4     1        s     u  [[')
        >>> mdr.isTied()
        False
        é   é   ú-TFé   ©r%   Úlenr    r/   s    r   ÚisTiedzMuseDataRecord.isTiedm   si   € ð Œ:˜Š?ˆ?Ý�4”8‰}Œ}˜qÒ Ð  T¤X¨a¤[°CÒ%7Ð%7Ø�tØ�5å�4”8‰}Œ}˜qÒ Ð  T¤X¨a¤[°CÒ%7Ð%7Ø�tØ�5r   c                ó6   — | j         r| j         d         dv rdS dS )Nr   ÚABCDEFGTFr.   r/   s    r   ÚisNotezMuseDataRecord.isNote‚   s&   € ØŒ8ð 	˜œ œ yÐ0Ð0Ø�4Øˆur   c                óz   — t          | j        ¦  «        dk    r"| j        d         dk    r| j        d         dv rdS dS )z’
        Chords are specified as additional note records following a main chord tone.
        The blank space defines this as chord tone.
        r2   r   ú r:   TF©r7   r    r/   s    r   ÚisChordzMuseDataRecord.isChord‡   sA   € õ ˆtŒx‰=Œ=˜1ÒÐ ¤¨!¤°Ò!3Ð!3¸¼À¼ÀyÐ8PÐ8PØ�4Øˆur   c                ó6   — | j         r| j         d         dv rdS dS )Nr   ÚcgTFr.   r/   s    r   ÚisCueOrGracezMuseDataRecord.isCueOrGrace‘   s&   € ØŒ8ð 	˜œ œ tÐ+Ð+Ø�4Øˆur   c                ó`   — t          | j        ¦  «        dk    r| j        dd…         dk    rdS dS )ze
        >>> mdr = musedata.MuseDataRecord('back   4')
        >>> mdr.isBack()
        True
        é   r   ÚbackTFr>   r/   s    r   ÚisBackzMuseDataRecord.isBack–   s5   € õ ˆtŒx‰=Œ=˜AÒÐ $¤(¨1¨Q¨3¤-°6Ò"9Ð"9Ø�4Øˆur   c                óš  — |                       ¦   «         r(| j        dd…                              ¦   «         d         }n_|                      ¦   «         s|                      ¦   «         r(| j        dd…                              ¦   «         d         }nt          d¦  «        ‚|d         g}d|v r|                     d¦  «         nMd|v r|                     d¦  «         n3d|v r|                     d¦  «         nd	|v r|                     d
¦  «         t          j        |¦  «        \  }}|                     |¦  «         d 	                    |¦  «        S )aQ  

        >>> mdr = musedata.MuseDataRecord('Ef4    1        s     d  ==')
        >>> mdr.isNote()
        True
        >>> mdr._getPitchParameters()
        'E-4'

        >>> mdr = musedata.MuseDataRecord('F#4    1        s #   d  ==')
        >>> mdr.isNote()
        True
        >>> mdr._getPitchParameters()
        'F#4'
        r   Nr2   z4cannot get pitch parameters from this kind of recordú#z##Úfr4   Úffz--r   )
r;   r    ÚsplitrB   r?   r   Úappendr   ÚgetNumFromStrÚjoin)r(   ÚdataÚpStrÚnumbersÚjunks        r   Ú_getPitchParametersz"MuseDataRecord._getPitchParameters    sE  € ð �;Š;‰=Œ=ð 	\Ø”8˜A˜B˜B”<×%Ò%Ñ'Ô'¨Ô*ˆDˆDØ×ÒÑ Ô ð 	\ D§L¢L¡N¤Nð 	\Ø”8˜A˜B˜B”<×%Ò%Ñ'Ô'¨Ô*ˆDˆDå#Ð$ZÑ[Ô[Ð[à�Q”ˆyˆØ�$ˆ;ˆ;Ø�KŠK˜ÑÔÐÐØ�Tˆ\ˆ\Ø�KŠK˜ÑÔÐÐØ�Dˆ[ˆ[Ø�KŠK˜ÑÔÐÐØ�Tˆ\ˆ\Ø�KŠK˜ÑÔÐõ Ô,¨TÑ2Ô2‰ˆ�Ø�Š�GÑÔÐà�wŠw�t‰}Œ}Ðr   c                óB  — ddl m} t          | j        ¦  «        dk    rdS | j        d         }d}|dk    r|                     d¦  «        }nÃ|dk    r|                     d¦  «        }n§|d	k    r|                     d
¦  «        }n‹|dk    r|                     d¦  «        }no|dk    r|                     d¦  «        }nS|dk    r|                     d¦  «        }n7|dk    r|                     d¦  «        }n|dk    r|                     d
¦  «        }|�d|_        d|_        |S )a  
        Return a music21 Accidental object for the representation.

        >>> mdr = musedata.MuseDataRecord('Ef4    1        s     d  ==')
        >>> mdr._getAccidentalObject()
        >>> mdr = musedata.MuseDataRecord('F#4    1        s #   d  ==')
        >>> mdr._getAccidentalObject()
        <music21.pitch.Accidental sharp>
        >>> mdr._getAccidentalObject().displayStatus == True
        True
        >>> mdr = musedata.MuseDataRecord('F#4    1        s ')
        >>> mdr._getAccidentalObject() is None
        True
        r   ©Úpitché   NrH   ÚsharpÚnÚnaturalrI   ÚflatÚxzdouble-sharpÚXú&zdouble-flatÚSÚFÚalwaysT)Úmusic21rV   r7   r    Ú
AccidentalÚdisplayTypeÚdisplayStatus)r(   rV   rO   Úaccs       r   Ú_getAccidentalObjectz#MuseDataRecord._getAccidentalObjectÆ   sI  € ð  	"Ð!Ð!Ð!Ð!Ð!ÝˆtŒx‰=Œ=˜BÒÐØ�4àŒx˜Œ|ˆØˆØ�3Š;ˆ;Ø×"Ò" 7Ñ+Ô+ˆCˆCØ�SŠ[ˆ[Ø×"Ò" 9Ñ-Ô-ˆCˆCØ�SŠ[ˆ[Ø×"Ò" 6Ñ*Ô*ˆCˆCØ�SŠ[ˆ[Ø×"Ò" >Ñ2Ô2ˆCˆCØ�SŠ[ˆ[à×"Ò" >Ñ2Ô2ˆCˆCØ�SŠ[ˆ[Ø×"Ò" =Ñ1Ô1ˆCˆCØ�SŠ[ˆ[à×"Ò" 7Ñ+Ô+ˆCˆCØ�SŠ[ˆ[à×"Ò" 6Ñ*Ô*ˆCð ˆ?ð 'ˆCŒOØ $ˆCÔØˆ
r   c                óP  — ddl m} |                      ¦   «         }|                     |¦  «        }| j        dk    r|S |                      ¦   «         }|j        �d|j        _        |�|                      ¦   «         |_        |j        � |  	                    ¦   «         rd|j        _        |S )a›  
        Get the Pitch object defined by this record. This may be a note, chord, or grace pitch.

        >>> mdr = musedata.MuseDataRecord('Ef4    1        s     d  ==')
        >>> p = mdr.getPitchObject()
        >>> p.nameWithOctave
        'E-4'
        >>> mdr = musedata.MuseDataRecord('F#4    1        s #   d  ==')
        >>> p = mdr.getPitchObject()
        >>> p.nameWithOctave
        'F#4'
        >>> p.accidental.displayStatus
        True

        Double sharps were giving octave problems.

        >>> mdr = musedata.MuseDataRecord('F##5   2        e x   d')
        >>> p = mdr.getPitchObject()
        >>> p.nameWithOctave
        'F##5'
        r   rU   r2   NFT)
rb   rV   rS   ÚPitchr%   rg   Ú
accidentalre   Ú_accidentalÚhasCautionaryAccidental)r(   rV   ÚppÚprf   s        r   ÚgetPitchObjectzMuseDataRecord.getPitchObjectø   s±   € ð. 	"Ð!Ð!Ð!Ð!Ð!Ø×%Ò%Ñ'Ô'ˆØ�KŠK˜‰OŒOˆàŒ:˜Š?ˆ?àˆHð ×+Ò+Ñ-Ô-ˆCð Œ|Ð'ð .3�”Ô*ØˆØ $× 9Ò 9Ñ ;Ô ;�”àŒ|Ð'¨D×,HÒ,HÑ,JÔ,JÐ'Ø-1�”Ô*ð ˆHr   ÚdivisionsPerQuarterNoteú
int | Noner   c                ó  — | j         dk    rt          | j        dd…         ¦  «        }nt          | j        dd…         ¦  «        }| j        dd…         }|dk    r[	 t          |¦  «        }|d|z  z  }t          d| j        z   d	z   ¦  «         n(# t          $ r t          d| j        z   d
z   ¦  «        ‚w xY w| j        �| j        j                             ¦   «         }n|�|}nt          d¦  «        ‚t          j	        ||z  ¦  «        S )a  
        Gets the quarterLength of the note given the prevailing divisionsPerQuarterNote

        Here there is one division:

        >>> mdr = musedata.MuseDataRecord('Ef4    1        s     d  ==')
        >>> mdr.getQuarterLength(4)
        0.25
        >>> mdr.getQuarterLength(8)
        0.125

        >>> mdr = musedata.MuseDataRecord('Ef4    6        s     d  ==')
        >>> mdr.getQuarterLength(4)
        1.5

        >>> mdr = musedata.MuseDataRecord('back   4')
        >>> mdr.getQuarterLength(4)
        1.0
        r2   é   r3   r5   rD   r=   éd   zError in parsing: z>
   Column 5 must be blank. Parsing as a part of the divisionsz
   Column 5 must be blank.NzMcannot access parent container of this record to obtain divisions per quarter)
r%   Úintr    ÚprintÚ
ValueErrorr   r$   ÚgetDivisionsPerQuarterNoter   ÚopFrac)r(   rp   Ú	divisionsÚshouldBeBlankÚdivHundredsÚdpqs         r   ÚgetQuarterLengthzMuseDataRecord.getQuarterLength)  sP  € ð( Œ:˜Š?ˆ?Ý˜DœH Q q SœMÑ*Ô*ˆIˆIå˜DœH Q q SœMÑ*Ô*ˆIàœ  1 œˆØ˜CÒÐðVÝ! -Ñ0Ô0�Ø˜S ;Ñ.Ñ.�	ÝÐ*Øœñ!àYñZñ [ô [ð [ð [øõ ð Vð Vð VÝ'Ø(¨4¬8Ñ3Ð6TÑTñVô Vð VðVøøøð
 Œ;Ð"Ø”+Ô$×?Ò?ÑAÔAˆCˆCØ$Ð0Ø)ˆCˆCå#ð %Hñ Iô Ið IåŒ}˜Y¨™_Ñ-Ô-Ð-s   Á1B Â%B2c                óœ   — | j         dk    rd S t          | j        ¦  «        dk    r&| j        d         dk    rdS | j        d         dk    rdS dS )Nr2   é   ú.ú:é   r   r6   r/   s    r   ÚgetDotszMuseDataRecord.getDotsX  sV   € ØŒ:˜Š?ˆ?Ø�4å�4”8‰}Œ}˜rÒ!Ð!Ø”8˜B”< 3Ò&Ð&Ø˜1Ø”8˜B”< 3Ò&Ð&Ø˜1Ø�1r   c                ó´   — d}| j         dk    rdS t          | j        ¦  «        dk     rdS | j        dd…         }d„ |                     d¦  «        D ¦   «         }|S )zÏ
        Return lyrics as a list.

        >>> mdr = musedata.MuseDataRecord('D4     2        e     u                    con-')
        >>> mdr.stage = 2
        >>> mdr.getLyrics()
        ['con-']
        Nr2   é,   é+   c                ó6   — g | ]}|                      ¦   «         ‘ŒS r   )Ústrip)Ú.0r\   s     r   ú
<listcomp>z,MuseDataRecord.getLyrics.<locals>.<listcomp>€  s    € Ð6Ð6Ð6 !�A—G’G‘I”IÐ6Ð6Ð6r   ú|)r%   r7   r    rK   )r(   rO   Úraws      r   Ú	getLyricszMuseDataRecord.getLyricsn  sd   € ð ˆØŒ:˜Š?ˆ?Ø�4õ �4”8‰}Œ}˜rÒ!Ð!Ø�tØ”(˜2˜3˜3”-ˆCà6Ð6 s§y¢y°¡~¤~Ð6Ñ6Ô6ˆDØˆr   c                ór   — | j         dk    rdS | j        dd…         }|dk    rdS |                     ¦   «         S )a™  
        Return complete span of characters defining beams.

        >>> mdr = musedata.MuseDataRecord('E2     1        s     u  =')
        >>> mdr.getBeams()
        '='
        >>> mdr = musedata.MuseDataRecord('E2     1        s     u  ]')
        >>> mdr.getBeams()
        ']'
        >>> mdr = musedata.MuseDataRecord('E2     4        q     u')
        >>> mdr.getBeams() is None
        True

        r2   Né   é   r   )r%   r    Úrstrip©r(   rO   s     r   ÚgetBeamszMuseDataRecord.getBeamsƒ  s?   € ð Œ:˜Š?ˆ?Ø�4à”8˜B˜r˜E”?ˆDØ�rŠzˆzØ�tà—;’;‘=”=Ð r   ú
str | Nonec                ó¤  — 	 | j         d         S # t          $ r Y nw xY wt          | j        ¦  «        dk     rd}nŒg }d}|dk    r[|t          | j        ¦  «        k     rC|                     | j        |         ¦  «         |dz  }|dk    r|t          | j        ¦  «        k     °Cd                     |¦  «                             ¦   «         }|| j         d<   |S )aÊ  
        Return an articulation string or None

        >>> mdr = musedata.MuseDataRecord('C4    12        e     u  [      .p')
        >>> mdr._getAdditionalNotations()
        '.p'

        >>> mdr = musedata.MuseDataRecord('C4    12        e     u  =      .')
        >>> mdr._getAdditionalNotations()
        '.'

        >>> mdr = musedata.MuseDataRecord('G4    24        q     u        (')
        >>> mdr._getAdditionalNotations()
        '('
        Ú_getAdditionalNotationsr‘   Né*   r2   r   )r&   ÚKeyErrorr7   r    rL   rN   r‰   )r(   rO   Ú	data_listÚis       r   r—   z&MuseDataRecord._getAdditionalNotationsž  sé   € ð"	Ø”;Ð8Ô9Ð9øÝð 	ð 	ð 	ØˆDð	øøøõ ˆtŒx‰=Œ=˜2ÒÐØˆDˆDð ˆIØˆAØ�r’'�'˜a¥# d¤h¡-¤-Ò/Ð/Ø× Ò  ¤¨!¤Ñ-Ô-Ð-Ø�Q‘�ð �r’'�'˜a¥# d¤h¡-¤-Ò/Ð/ð —7’7˜9Ñ%Ô%×+Ò+Ñ-Ô-ˆDØ15ˆŒÐ-Ñ.Øˆs   ‚ �
›c                ó6  — ddl m} g }|                      ¦   «         }|€|S |D �]t}|dk    r(|                     |                     ¦   «         ¦  «         Œ1|dk    r(|                     |                     ¦   «         ¦  «         Œ_|dk    r(|                     |                     ¦   «         ¦  «         Œ�|dk    r(|                     |                     ¦   «         ¦  «         Œ»|dk    r(|                     |                     ¦   «         ¦  «         Œé|d	k    r)|                     |                     ¦   «         ¦  «         �Œ|d
k    r)|                     | 	                    ¦   «         ¦  «         �ŒG|dk    r'|                     | 
                    ¦   «         ¦  «         �Œv|S )aµ  
        Return a list of 0 or more music21 Articulation objects

        >>> mdr = musedata.MuseDataRecord('C4    12        e     u  [      .p')
        >>> mdr.getArticulationObjects()
        [<music21.articulations.Staccato>]

        >>> mdr = musedata.MuseDataRecord('C4    12        e     u  [      .p>')
        >>> mdr.getArticulationObjects()
        [<music21.articulations.Staccato>, <music21.articulations.Accent>]

        r   )ÚarticulationsNÚAÚVú>r�   Ú_ú=r›   ú,)rb   r�   r—   rL   ÚStrongAccentÚAccentÚStaccatoÚTenutoÚDetachedLegatoÚSpiccatoÚ
BreathMark)r(   r�   ÚpostrO   Úchars        r   ÚgetArticulationObjectsz%MuseDataRecord.getArticulationObjectsÂ  s˜  € ð 	*Ð)Ð)Ð)Ð)Ð)ØˆØ×+Ò+Ñ-Ô-ˆØˆ<ØˆKØð 	8ñ 	8ˆDØ�sŠ{ˆ{à—’˜M×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ð9Ø˜’�à—’˜M×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ð9Ø˜’�à—’˜M×0Ò0Ñ2Ô2Ñ3Ô3Ð3Ð3Ø˜’�Ø—’˜M×2Ò2Ñ4Ô4Ñ5Ô5Ð5Ð5Ø˜’�Ø—’˜M×0Ò0Ñ2Ô2Ñ3Ô3Ð3Ð3Ø˜’�Ø—’˜M×8Ò8Ñ:Ô:Ñ;Ô;Ð;Ñ;Ø˜’�Ø—’˜M×2Ò2Ñ4Ô4Ñ5Ô5Ð5Ñ5Ø˜’�Ø—’˜M×4Ò4Ñ6Ô6Ñ7Ô7Ð7ùØˆr   c                ó  — ddl m} g }|                      ¦   «         }|€|S |D ]ç}|dk    r(|                     |                     ¦   «         ¦  «         Œ0|dk    r(|                     |                     ¦   «         ¦  «         Œ^|dk    r(|                     |                     ¦   «         ¦  «         ŒŒ|dk    r(|                     |                     ¦   «         ¦  «         Œº|dk    r'|                     |                     ¦   «         ¦  «         Œè|S )	a‰  
        Return a list of 0 or more music21 Articulation objects

        >>> mdr = musedata.MuseDataRecord('C4    12        e     u  [      t')
        >>> mdr.getExpressionObjects()
        [<music21.expressions.Trill>]

        >>> mdr = musedata.MuseDataRecord('C4    12        e     u  [      .p>F')
        >>> mdr.getExpressionObjects()
        [<music21.expressions.Fermata>]

        r   )ÚexpressionsNr`   ÚEÚtr-   ÚM)rb   r¯   r—   rL   ÚFermataÚTrillÚTurnÚMordent)r(   r¯   r«   rO   r¬   s        r   ÚgetExpressionObjectsz#MuseDataRecord.getExpressionObjectsê  s  € ð 	(Ð'Ð'Ð'Ð'Ð'ØˆØ×+Ò+Ñ-Ô-ˆØˆ<ØˆKàð 	3ð 	3ˆDØ�sŠ{ˆ{à—’˜K×/Ò/Ñ1Ô1Ñ2Ô2Ð2Ð2Ø˜’�à—’˜K×/Ò/Ñ1Ô1Ñ2Ô2Ð2Ð2Ø˜’�Ø—’˜K×-Ò-Ñ/Ô/Ñ0Ô0Ð0Ð0Ø˜’�Ø—’˜K×,Ò,Ñ.Ô.Ñ/Ô/Ð/Ð/Ø˜’�Ø—’˜K×/Ò/Ñ1Ô1Ñ2Ô2Ð2øØˆr   c                óª  — ddl m} g }|                      ¦   «         }|€|S d}|D �],}|                     |¦  «        }|dk     rŒ|d|…         ||t	          |¦  «        z   d…         z   }|dv r)|                     |                     |¦  «        ¦  «         Œq|dk    r)|                     |                     d¦  «        ¦  «         Œ |dk    r)|                     |                     d	¦  «        ¦  «         ŒÏ|d
k    r)|                     |                     d	¦  «        ¦  «         Œþ|dk    r(|                     |                     d	¦  «        ¦  «         �Œ.|S )a~  
        Return a list of 0 or more music21 Dynamic objects

        >>> mdr = musedata.MuseDataRecord('C5    12        e     u         ff')
        >>> mdr.getDynamicObjects()
        [<music21.dynamics.Dynamic ff>]

        >>> mdr = musedata.MuseDataRecord('E4    48        h     u        (pp')
        >>> mdr.getDynamicObjects()
        [<music21.dynamics.Dynamic pp>]
        r   )ÚdynamicsN)ÚpppÚfffrm   rJ   ÚfpÚmpÚmfrn   rI   ÚmÚZÚZpÚR)	rº   r»   rm   rJ   rn   rI   r½   r¾   r¼   r¿   r½   rÀ   ÚsfrÁ   rÂ   )rb   r¹   r—   Úfindr7   rL   ÚDynamic)r(   r¹   r«   rO   ÚtargetsÚtargetÚposs          r   ÚgetDynamicObjectsz MuseDataRecord.getDynamicObjects  su  € ð 	%Ð$Ð$Ð$Ð$Ð$ØˆØ×+Ò+Ñ-Ô-ˆØˆ<ØˆKð3ˆð ð 	4ñ 	4ˆFØ—)’)˜FÑ#Ô#ˆCØ�QŠwˆwØà˜˜˜”:  S­3¨v©;¬;Ñ%6Ð%7Ð%7Ô 8Ñ8ˆDàÐOÐOÐOØ—’˜H×,Ò,¨VÑ4Ô4Ñ5Ô5Ð5Ð5Ø˜3’�Ø—’˜H×,Ò,¨TÑ2Ô2Ñ3Ô3Ð3Ð3Ø˜3’�Ø—’˜H×,Ò,¨TÑ2Ô2Ñ3Ô3Ð3Ð3Ø˜4’�Ø—’˜H×,Ò,¨TÑ2Ô2Ñ3Ô3Ð3Ð3Ø˜3’�Ø—’˜H×,Ò,¨TÑ2Ô2Ñ3Ô3Ð3ùàˆr   c                óB   — |                       ¦   «         }|€dS d|v rdS dS )aU  
        Return a boolean if this note has a cautionary accidental.

        >>> mdr = musedata.MuseDataRecord('F5     3        t n   d  ==[   (+')
        >>> mdr.hasCautionaryAccidental()
        True

        >>> mdr = musedata.MuseDataRecord('C4    12        e     u  [')
        >>> mdr.hasCautionaryAccidental()
        False

        NFú+T)r—   r“   s     r   rl   z&MuseDataRecord.hasCautionaryAccidental5  s2   € ð ×+Ò+Ñ-Ô-ˆØˆ<Ø�5Ø�$ˆ;ˆ;Ø�4Øˆur   )r   N)r    r!   )r*   r+   r#   )rp   rq   r*   r   )r*   r•   )r   r   r   Ú__doc__r)   r0   r8   r;   r?   rB   rF   rS   rg   ro   r~   r„   rŽ   r”   r—   r­   r·   rÉ   rl   r   r   r   r
   r
   H   si  € € € € € ðð ð Øð.ð .ð .ð .ð .ð"ð ð ð ðð ð ð*ð ð ð
ð ð ðð ð ð
ð ð ð$ð $ð $ðL0ð 0ð 0ðd/ð /ð /ðb-.ð -.ð -.ð -.ð -.ð^	ð 	ð 	ð,ð ð ð*!ð !ð !ð6"ð "ð "ð "ðH&ð &ð &ðP ð  ð  ðD'ð 'ð 'ðRð ð ð ð r   r
   c                  ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )r   z;
    Create MuseDataRecord objects on demand, in order
    c                ó0   — || _         d| _        || _        d S ©Nr   )r    Úindexr$   r'   s      r   r)   zMuseDataRecordIterator.__init__R  s   € ØˆŒØˆŒ
ØˆŒˆˆr   c                ó   — | S r#   r   r/   s    r   Ú__iter__zMuseDataRecordIterator.__iter__W  ó   € Øˆr   c                óÆ   — | j         t          | j        ¦  «        k    rt          ¦   «         ‚t	          | j        | j                  | j        ¦  «        }| xj         dz  c_         |S ©Nr2   )rÐ   r7   r    ÚStopIterationr
   r$   ©r(   Úmdrs     r   Ú__next__zMuseDataRecordIterator.__next__Z  sO   € ØŒ:�˜TœX™œÒ&Ð&Ý‘/”/Ð!å˜TœX d¤jÔ1°4´;Ñ?Ô?ˆØˆ
Œ
�a‰ˆ
Œ
Øˆ
r   N©r   r   r   rÌ   r)   rÒ   rÙ   r   r   r   r   r   M  sK   € € € € € ðð ðð ð ð
ð ð ðð ð ð ð r   r   c                  óD   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ ZdS )r   aç  
    A MuseDataMeasure is an abstraction of the data contained within a measure definitions.

    This needs to be an object to gracefully handle the following cases.
    Some Measures do not have any notes, for example, and the end of encoding where a
    final bar line is defined. Some measures do not have numbers or barlin definitions,
    such as pickup notes. Some measures define barline characteristics.
    Backup and forward presumably only is contained within a measure.
    Nc                ól   — |€g }|| _         || _        | j        �| j        j        | _        d S d | _        d S r#   )r    r$   r%   r'   s      r   r)   zMuseDataMeasure.__init__p  s=   € Øˆ;ØˆCàˆŒàˆŒàŒ;Ð"àœÔ*ˆDŒJˆJˆJàˆDŒJˆJˆJr   c                ó   — dS )Nzsize={len(self.src)}r   r/   s    r   Ú_reprInternalzMuseDataMeasure._reprInternal~  s   € Ø%Ð%r   c                óp  — ddl m} | j        d                              ¦   «         }|d         dk    rd}|dd…         }|dk    rd}nD|d	k    rd	}n;|d
k    rd}n2|dv rd}n+|dk    rd}n"|dk    rd}n|dv rd}nt	          d|› �¦  «        ‚|                     |¦  «        }t          |¦  «        dk    rƒ|dd…                              ¦   «         dk    rc|dd…                              ¦   «         }d|v r d}|                     d¬¦  «        }||_        n#d|v rd}|                     d¬¦  «        }||_        |S )z�
        Return a configured music21 bar object. This can be used with the current
        Measure or applied to a previous Measure.
        r   )Úbarr¿   Úmeasurer2   r3   ÚeasureÚregularÚdottedÚdoublezlight-light)Úheavy1Úheavyrç   Úheavy2zlight-heavyÚheavy3zheavy-light)Úheavy4Úheave4zheavy-heavyz$cannot process bar data definition: é   Nr   z:|Úend)Ú	directionz|:Ústart)	rb   rà   r    r‰   r   ÚBarliner7   ÚRepeatÚtype)r(   rà   rO   ÚdataBarÚbarlineTypeÚblÚdataFlagÚunused_repeatForms           r   ÚgetBarObjectzMuseDataMeasure.getBarObject�  s•  € ð 	 ÐÐÐÐÐàŒx˜Œ{× Ò Ñ"Ô"ˆà�Œ7�cŠ>ˆ>ØˆDà�q˜�s”)ˆà�hÒÐØ#ˆKˆKØ˜Ò Ð Ø"ˆKˆKØ˜Ò Ð Ø'ˆKˆKØÐ+Ð+Ð+Ø!ˆKˆKØ˜Ò Ð Ø'ˆKˆKØ˜Ò Ð Ø'ˆKˆKØÐ,Ð,Ð,Ø'ˆKˆKå#Ð$TÈ7Ð$TÐ$TÑUÔUÐUà�[Š[˜Ñ%Ô%ˆõ ˆt‰9Œ9�rŠ>ˆ>˜d 2 3 3œiŸošoÑ/Ô/°2Ò5Ð5Ø˜B˜C˜C”y—’Ñ(Ô(ˆHØ�xÐÐØ$(Ð!Ø—Z’Z¨%�ZÑ0Ô0�Ø%�”�Ø˜Ð!Ð!Ø$(Ð!Ø—Z’Z¨'�ZÑ2Ô2�Ø%�”Øˆ	r   c                ó’  — ddl m} | j        d                              ¦   «         }|d         dk    rd}d}t	          |¦  «        dk    r7|dd…                              ¦   «         d	k    rt          j        |¦  «        \  }}|                     ¦   «         }|                      ¦   «         |_	        |d	k    rt          |¦  «        |_        |S )
zO
        Return a configured music21 :class:`~music21.stream.Measure`.
        r   )Ústreamr¿   rá   Ú1é	   r5   Nr   )rb   rú   r    r‰   r7   r   rM   ÚMeasurerø   ÚleftBarlineru   Únumber)r(   rú   rO   ÚmNumberrR   r¿   s         r   ÚgetMeasureObjectz MuseDataMeasure.getMeasureObject±  sÆ   € ð 	#Ð"Ð"Ð"Ð"Ð"àŒx˜Œ{× Ò Ñ"Ô"ˆà�Œ7�cŠ>ˆ>ØˆDð ˆÝˆt‰9Œ9˜Š>ˆ>˜d 1 2 2œhŸnšnÑ.Ô.°"Ò4Ð4Ý"Ô0°Ñ6Ô6‰MˆG�Tà�NŠNÑÔˆð ×)Ò)Ñ+Ô+ˆŒð �bŠ=ˆ=Ý˜7‘|”|ˆAŒHØˆr   c                ó8   — | j         D ]}|r|d         dv r dS ŒdS )z:
        Return True of if this Measure has Notes
        r   Ú
ABCDEFGrgcTFr.   ©r(   Úlines     r   ÚhasNoteszMuseDataMeasure.hasNotesË  s8   € ð ”Hð 	ð 	ˆDØð ˜˜Qœ <Ð/Ð/Ø�t�tøØˆur   c                óN   — | j         D ]}|r|                     d¦  «        r dS ŒdS )zš
        Return True of if this Measure defines one or more 'back' indication.

        Note: this does not instantiate MuseDataRecord instances.
        rE   TF©r    Ú
startswithr  s     r   Ú	hasVoiceszMuseDataMeasure.hasVoicesÔ  s=   € ð ”Hð 	ð 	ˆDØð ˜Ÿš¨Ñ/Ô/ð Ø�t�tøØˆur   c                ó,   — t          | j        | ¦  «        S ©zJ
        Iterating over this part returns MuseDataMeasure objects
        )r   r    r/   s    r   rÒ   zMuseDataMeasure.__iter__ß  s   € õ & d¤h°Ñ5Ô5Ð5r   c                ó    — t          | ¦  «        S )zX
        Return a list of all records stored in this measure as MuseDataRecord.
        ©Úlistr/   s    r   Ú
getRecordszMuseDataMeasure.getRecordså  ó   € õ �D‰zŒzÐr   ©NN)r   r   r   rÌ   r)   rÞ   rø   r  r  r
  rÒ   r  r   r   r   r   r   e  sœ   € € € € € ðð ðð ð ð ð&ð &ð &ð.ð .ð .ð`ð ð ð4ð ð ð	ð 	ð 	ð6ð 6ð 6ðð ð ð ð r   r   c                  ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )r   z<
    Create MuseDataMeasure objects on demand, in order
    c                ó>   — || _         || _        d| _        || _        d S rÏ   )r    Ú
boundariesrÐ   r$   )r(   r    r  r$   s       r   r)   z MuseDataMeasureIterator.__init__ò  s"   € ØˆŒØ$ˆŒØˆŒ
ØˆŒˆˆr   c                ó   — | S r#   r   r/   s    r   rÒ   z MuseDataMeasureIterator.__iter__ø  rÓ   r   c                óð   — | j         t          | j        ¦  «        k    rt          ¦   «         ‚| j        | j                  \  }}t	          | j        ||dz   …         | j        ¦  «        }| xj         dz  c_         |S rÕ   )rÐ   r7   r  rÖ   r   r    r$   )r(   rï   rí   Úmdms       r   rÙ   z MuseDataMeasureIterator.__next__û  si   € ØŒ:�˜Tœ_Ñ-Ô-Ò-Ð-Ý‘/”/Ð!Ø”_ T¤ZÔ0‰
ˆˆså˜dœh u¨S°1©W }Ô5°t´{ÑCÔCˆØˆ
Œ
�a‰ˆ
Œ
Øˆ
r   NrÚ   r   r   r   r   r   í  sK   € € € € € ðð ðð ð ðð ð ðð ð ð ð r   r   c                  óÜ   — e Zd ZdZd%d„Zd„ Zd„ Zd„ Zd„ Z	 	 d&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„ Zd„ Zd„ Z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S )*r	   z;
    A MuseData part is defined by collection of lines
    Nc                óú   — |€g }|| _         g | _        d | _        d | _        || _        | j        € | j         r|                      ¦   «         | _        | j        dk    r!|                      | j         ¦  «        | _         d S d S rÕ   )r    Ú_measureBoundariesÚ_divisionsPerQuarterÚ_divisionsPerQuarterNoter%   Ú_determineStageÚ_scrubStage1)r(   r    r%   s      r   r)   zMuseDataPart.__init__  s…   € Øˆ;ØˆCàˆŒð #%ˆÔØ$(ˆÔ!ð )-ˆÔ%àˆŒ
ØŒ:Ð $¤(ÐØ×-Ò-Ñ/Ô/ˆDŒJØŒ:˜Š?ˆ?Ø×(Ò(¨¬Ñ2Ô2ˆDŒHˆHˆHð ˆ?r   c                ó   — dS ©Nr   r   r/   s    r   rÞ   zMuseDataPart._reprInternal   ó   € Øˆrr   c                óJ   — | j         D ]}|                     d¦  «        r dS ŒdS )zÂ
        Determine the stage of this file. This is done by looking for an
        attributes record starting with a $; if not found, it is stage 1. if it is found
        it is stage 2.
        ú$rƒ   r2   r  )r(   Ú	attributes     r   r  zMuseDataPart._determineStage#  s<   € ð œð 	ð 	ˆIØ×#Ò# CÑ(Ô(ð Ø�q�qðàˆqr   c                óÀ   — t          |¦  «        dk    rt          d¦  «        ‚d}g }|D ]4}|r|                     ¦   «         dk    rŒd}|                     |¦  «         Œ5|S )z¢
        Some stage1 files start with a leading line of space.
        This needs to be removed, as each line matters. Provide a list of character lines.
        r2   zcannot scrub empty sourceTr   F)r7   r   r‰   rL   )r(   r    Úcheckr«   r  s        r   r  zMuseDataPart._scrubStage1.  sx   € õ
 ˆs‰8Œ8�qŠ=ˆ=Ý#Ð$?Ñ@Ô@Ð@àˆØˆàð 	ð 	ˆDØð "Ø—:’:‘<”< 2Ò%Ð%Øà!�EØ�KŠK˜ÑÔÐÐØˆr   c                óÈ  — g }||v rÈ|                      |¦  «        t          |¦  «        z   }|t          |¦  «        k     r�||                              ¦   «         r|                     ||         ¦  «         nB||                              ¦   «         rn'||         dv r|                     ||         ¦  «         nn|dz  }|t          |¦  «        k     °�d                     |¦  «        S )aÒ  

        >>> mdp = musedata.MuseDataPart()
        >>> mdp._getDigitsFollowingTag('junk WK#:2345', 'WK#:')
        '2345'
        >>> mdp._getDigitsFollowingTag('junk WK#: 2345 junk', 'WK#:')
        '2345'
        >>> mdp._getDigitsFollowingTag('$ K:-3   Q:4   T:3/4   C:22', 'Q:')
        '4'
        >>> mdp._getDigitsFollowingTag('$ K:-3   Q:4   T:3/4   C:22', 'T:')
        '3/4'
        >>> mdp._getDigitsFollowingTag('$ K:-3   Q:4', 'T:')
        ''
        z-/r2   r   )rÄ   r7   ÚisdigitrL   ÚisspacerN   )r(   r  Útagr«   r›   s        r   Ú_getDigitsFollowingTagz#MuseDataPart._getDigitsFollowingTagB  sØ   € ð ˆØ�$ˆ;ˆ;Ø—	’	˜#‘”¥ S¡¤Ñ)ˆAØ•c˜$‘i”i’-�-Ø˜”7—?’?Ñ$Ô$ð Ø—K’K  Q¤Ñ(Ô(Ð(Ð(Ø˜!”W—_’_Ñ&Ô&ð ØØ˜!”W �_�_Ø—K’K  Q¤Ñ(Ô(Ð(Ð(àØ�Q‘�ð •c˜$‘i”i’-�-ð �wŠw�t‰}Œ}Ðr   Fc                ó’  — |s(|                      ¦   «         }|                      ¦   «         }g }||v �r|                     |¦  «        t          |¦  «        z   }|t          |¦  «        k     rÊ||                              ¦   «         r|                     ||         ¦  «         n|||                              ¦   «         r|sn_||                              ¦   «         r|r|                     ||         ¦  «         n'||         dv r|                     ||         ¦  «         nn|dz  }|t          |¦  «        k     °Êd                     |¦  «        S )zª

        >>> mdp = musedata.MuseDataPart()
        >>> mdp._getAlphasFollowingTag('Group memberships: sound, score', 'Group memberships:')
        'sound,score'
        r£   r2   r   )ÚlowerrÄ   r7   ÚisalpharL   r*  rN   )r(   r  r+  Ú	keepSpaceÚkeepCaser«   r›   s          r   Ú_getAlphasFollowingTagz#MuseDataPart._getAlphasFollowingTag`  s7  € ð ð 	Ø—:’:‘<”<ˆDØ—)’)‘+”+ˆCØˆØ�$ˆ;‰;Ø—	’	˜#‘”¥ S¡¤Ñ)ˆAØ•c˜$‘i”i’-�-Ø˜”7—?’?Ñ$Ô$ð 	Ø—K’K  Q¤Ñ(Ô(Ð(Ð(Ø˜!”W—_’_Ñ&Ô&ð ¨yð ØØ˜!”W—_’_Ñ&Ô&ð ¨9ð Ø—K’K  Q¤Ñ(Ô(Ð(Ð(Ø˜!”W �^�^Ø—K’K  Q¤Ñ(Ô(Ð(Ð(àØ�Q‘�ð •c˜$‘i”i’-�-ð �wŠw�t‰}Œ}Ðr   c                óê   — | j         dk    rH| j        d         dd…                              ¦   «         }d|v r|                     d¦  «        d         }|S |                      | j        d         d¦  «        S )aP  
        Returns a String not an int, representing an opus number

        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getWorkNumber()
        '581'
        r2   r   é   r£   rD   zWK#:)r%   r    r‰   rK   r,  r“   s     r   ÚgetWorkNumberzMuseDataPart.getWorkNumber|  so   € ð Œ:˜Š?ˆ?ð ”8˜A”;˜q ˜sÔ#×)Ò)Ñ+Ô+ˆDØ�dˆ{ˆ{Ø—z’z #‘” qÔ)�ØˆKà×.Ò.¨t¬x¸¬{¸FÑCÔCÐCr   c                ó¨   — | j         dk    r'| j        d         dd…                              ¦   «         S |                      | j        d         d¦  «        S )a7  
        Returns a string, not an int.

        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getMovementNumber()
        '3'
        r2   r4  NrD   zMV#:)r%   r    r‰   r,  r/   s    r   ÚgetMovementNumberzMuseDataPart.getMovementNumber’  sK   € ð Œ:˜Š?ˆ?à”8˜A”;˜q˜r˜r”?×(Ò(Ñ*Ô*Ð*à×.Ò.¨t¬x¸¬{¸FÑCÔCÐCr   c                ó®   — | j         dk    rdS |                      ¦   «         }|                      |ddd¬¦  «        }|dk    rdS |                     ¦   «         S )a�  
        The directive field is generally used to store tempo indications.
        This indication, however, is frequently not provided.

        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getDirective() is None
        True
        r2   NzD:T)r0  r1  r   )r%   Ú_getAttributesRecordr2  r‰   )r(   r  Úalphass      r   ÚgetDirectivezMuseDataPart.getDirective£  sf   € ð Œ:˜Š?ˆ?à�4à×,Ò,Ñ.Ô.ˆDØ×0Ò0°°tÀtØ:>ð 1ñ @ô @ˆFà˜Š|ˆ|Ø�tà—|’|‘~”~Ð%r   c                ó   — | j         dk    rgg }| j        d         | j        d         | j        d         fD ])}|                     |                     ¦   «         ¦  «         Œ*d                     |¦  «        S | j        d         S )u”  
        Return the source (original print encoding) for the score.

        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '03.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getSource()
        'Breitkopf & HÃ¤rtel, Vol. 13'

        Note that the publisher is HÃ¤rtel. MuseData predates the standardization
        of encoding as UTF-8, so many
        MuseData files are in Windows (ISO-8859-1) encodings.
        Music21 tries first
        in utf-8 and if there are errors will try again in ISO-8859-1, and if it
        fails it will try to read ignoring any errors (leaving "Hrtel").
        In this case, both UTF-8 and ISO-8859-1 support this character (Latin-1 space
        in Unicode).

        If you know the encoding you can pass that to MuseDataWork or MuseDataFile.
        It is not yet a property you can specify in converter.

        >>> mdw = musedata.MuseDataWork()
        >>> mdw.encoding = 'ISO-8859-1'
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getSource()
        'Breitkopf & HÃ¤rtel, Vol. 13'
        r2   rƒ   é   rD   r   rs   )r%   r    rL   r‰   rN   )r(   rO   r  s      r   Ú	getSourcezMuseDataPart.getSource»  su   € ð: Œ:˜Š?ˆ?àˆDØœ !œ d¤h¨q¤k°4´8¸A´;Ð?ð *ð *�Ø—’˜DŸJšJ™LœLÑ)Ô)Ð)Ð)à—7’7˜4‘=”=Ð à”8˜A”;Ðr   c                óp   — | j         dk    r| j        d                              ¦   «         S | j        d         S )aN  
        For stage 1 just gets the catalogue number

        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getWorkTitle()
        'Clarinet Quintet'
        r2   r   r4  ©r%   r    r‰   r/   s    r   ÚgetWorkTitlezMuseDataPart.getWorkTitleâ  s3   € ð Œ:˜Š?ˆ?à”8˜A”;×$Ò$Ñ&Ô&Ð&à”8˜A”;Ðr   c                ó6   — | j         dk    rdS | j        d         S )a  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getMovementTitle()
        'Trio II'
        r2   Nr3   )r%   r    r/   s    r   ÚgetMovementTitlezMuseDataPart.getMovementTitleó  s    € ð Œ:˜Š?ˆ?Ø�4à”8˜A”;Ðr   c                óZ   — | j         dk    rdS | j        d                              ¦   «         S )a  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getPartName()
        'Clarinet in A'
        r2   Nr5   r@  r/   s    r   ÚgetPartNamezMuseDataPart.getPartName  s,   € ð Œ:˜Š?ˆ?Ø�4à”8˜A”;×$Ò$Ñ&Ô&Ð&r   c                ó  — | j         dk    rg S |                      | j        d         d¦  «        }g }|                     d¦  «        D ]A}|                     ¦   «         dk    r'|                     |                     ¦   «         ¦  «         ŒB|S )a!  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getGroupMemberships()
        ['sound', 'score']
        r2   é
   zgroup memberships:r£   r   )r%   r2  r    rK   r‰   rL   )r(   r�   r«   Úentrys       r   ÚgetGroupMembershipsz MuseDataPart.getGroupMemberships  s‡   € ð Œ:˜Š?ˆ?ØˆIà×-Ò-¨d¬h°r¬lØ.BñDô DˆCàˆDØŸš 3™œð /ð /�Ø—;’;‘=”= BÒ&Ð&Ø—K’K §¢¡¤Ñ.Ô.Ð.øØˆKr   Úscorec                ó¨  — | j         dk    r3t          | j        d                              d¦  «        d         ¦  «        S d}d}| j        |                              d¦  «        s^| j        |         }|                     |¦  «        r|                      |d¦  «        }n%|dz  }| j        |                              d¦  «        ¯^|€dS t          |¦  «        S )	a  
        >>> fp1 = str(common.getSourceFilePath() /'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getGroupMembershipsTotal()
        5
        r2   rs   r=   r   é   Nr$  Úof)r%   ru   r    rK   r	  r,  ©r(   Ú
membershipr›   r�   r  s        r   ÚgetGroupMembershipsTotalz%MuseDataPart.getGroupMembershipsTotal#  sÑ   € ð Œ:˜Š?ˆ?å�t”x ”{×(Ò(¨Ñ-Ô-¨aÔ0Ñ1Ô1Ð1àˆAØˆCØ”h˜q”k×,Ò,¨SÑ1Ô1ð Ø”x ”{�Ø—?’? :Ñ.Ô.ð Ø×5Ò5°d¸DÑAÔA�CØØ�Q‘�ð ”h˜q”k×,Ò,¨SÑ1Ô1ð ð ˆ{Ø�tå˜3‘x”x�r   c                óŽ  — | j         dk    r&| j        d                              d¦  «        d         S d}d}| j        |                              d¦  «        s^| j        |         }|                     |¦  «        r|                      |d¦  «        }n%|dz  }| j        |                              d¦  «        ¯^|€dS t          |¦  «        S )a  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getGroupMembershipNumber()
        1
        r2   rs   r=   rL  Nr$  Úpart)r%   r    rK   r	  r,  ru   rN  s        r   ÚgetGroupMembershipNumberz%MuseDataPart.getGroupMembershipNumber=  sÉ   € ð Œ:˜Š?ˆ?à”8˜A”;×$Ò$ SÑ)Ô)¨!Ô,Ð,àˆAØˆCØ”h˜q”k×,Ò,¨SÑ1Ô1ð Ø”x ”{�Ø—?’? :Ñ.Ô.ð Ø×5Ò5°d¸FÑCÔC�CØØ�Q‘�ð ”h˜q”k×,Ò,¨SÑ1Ô1ð ð ˆ{Ø�tå˜3‘x”x�r   c                óH  — | j         dk    rD| j        d                              ¦   «         dz   | j        d                              ¦   «         z   }|S d}| j        |                              d¦  «        s%|dz  }| j        |                              d¦  «        ¯%| j        |         S )a£  
        The attributes record is not in a fixed position,
        but is the first line that starts with a $.

        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0]._getAttributesRecord()
        '$  K:0   Q:6   T:3/4   X:-11   C:4'
        r2   r4  r=   r3   rL  r$  )r%   r    r‰   r	  )r(   Úrecordr›   s      r   r9  z!MuseDataPart._getAttributesRecordW  s›   € ð Œ:˜Š?ˆ?à”X˜a”[×&Ò&Ñ(Ô(¨3Ñ.°´¸!´×1BÒ1BÑ1DÔ1DÑDˆFàˆMàˆAØ”h˜q”k×,Ò,¨SÑ1Ô1ð Ø�Q‘�ð ”h˜q”k×,Ò,¨SÑ1Ô1ð à”8˜A”;Ðr   c                óÖ   — |                       ¦   «         }| j        dk    r(t          |                     d¦  «        d         ¦  «        S t          |                      |d¦  «        ¦  «        S )a  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                   / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getKeyParameters()
        0
        r2   r=   zK:©r9  r%   ru   rK   r,  r  s     r   ÚgetKeyParameterszMuseDataPart.getKeyParametersn  s]   € ð ×(Ò(Ñ*Ô*ˆØŒ:˜Š?ˆ?Ý�t—z’z #‘” qÔ)Ñ*Ô*Ð*õ �t×2Ò2°4¸Ñ>Ô>Ñ?Ô?Ð?r   c                ó\   — ddl m} |                     |                      ¦   «         ¦  «        S )a;  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getKeySignature()
        <music21.key.KeySignature of no sharps or flats>
        r   )Úkey)rb   rZ  ÚKeySignaturerX  )r(   rZ  s     r   ÚgetKeySignaturezMuseDataPart.getKeySignature~  s6   € ð 	 ÐÐÐÐÐØ×Ò × 5Ò 5Ñ 7Ô 7Ñ8Ô8Ð8r   c                ó¬  — |                       ¦   «         }| j        dk    rQt          |                     d¦  «        d         ¦  «        }t          |                     d¦  «        d         ¦  «        }nJ|                      |d¦  «                             d¦  «        \  }}t          |¦  «        t          |¦  «        }}|dk    r|dk    s|dk    rdS |› d|› �S )	a  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                   / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getTimeSignatureParameters()
        '3/4'
        r2   r=   rD   rs   zT:ú/r   z4/4rW  )r(   r  rY   Úds       r   ÚgetTimeSignatureParametersz'MuseDataPart.getTimeSignatureParametersŠ  sÈ   € ð ×(Ò(Ñ*Ô*ˆØŒ:˜Š?ˆ?Ý�D—J’J˜s‘O”O AÔ&Ñ'Ô'ˆAÝ�D—J’J˜s‘O”O AÔ&Ñ'Ô'ˆAˆAð ×.Ò.¨t°TÑ:Ô:×@Ò@ÀÑEÔE‰DˆAˆqÝ�q‘6”6�3˜q™6œ6ˆqˆAð �ŠFˆF�q˜A’v�v ! q¢& &Ø�5à�:�:˜!�:�:Ðr   c                ó\   — ddl m} |                     |                      ¦   «         ¦  «        S )a3  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getTimeSignatureObject()
        <music21.meter.TimeSignature 3/4>
        r   )Úmeter)rb   rb  ÚTimeSignaturer`  )r(   rb  s     r   ÚgetTimeSignatureObjectz#MuseDataPart.getTimeSignatureObject¢  s6   € ð 	"Ð!Ð!Ð!Ð!Ð!Ø×"Ò" 4×#BÒ#BÑ#DÔ#DÑEÔEÐEr   c                óž   — | j         dk    rdS |                      ¦   «         }|                      |d¦  «        }|dk    rdS t          |¦  «        S )a  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0]._getNumberOfStaves()
        1
        r2   zS:r   )r%   r9  r,  ru   ©r(   r  r�   s      r   Ú_getNumberOfStaveszMuseDataPart._getNumberOfStaves®  sS   € ð Œ:˜Š?ˆ?à�1à×,Ò,Ñ.Ô.ˆDà×-Ò-¨d°DÑ9Ô9ˆCØ�bŠyˆyØ�qå˜3‘x”x�r   c                ó¬  — |                       ¦   «         }| j        dk    r|                     d¦  «        d         }|gS g }|                      |d¦  «        }|dk    r|                     |¦  «         |dk    r]t          d|                      ¦   «         dz   ¦  «        D ]7}|                      |d|› d�¦  «        }|dk    r|                     |¦  «         Œ8|S )a  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                   / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0]._getClefParameters()
        ['4']
        r2   r=   r5   zC:r   ÚCr‚   )r9  r%   rK   r,  rL   Úrangerg  )r(   r  rO   r«   r�   r›   s         r   Ú_getClefParameterszMuseDataPart._getClefParametersÃ  så   € ð ×(Ò(Ñ*Ô*ˆàŒ:˜Š?ˆ?ð —:’:˜c‘?”? 1Ô%ˆDØ�6ˆMð ˆDØ×-Ò-¨d°DÑ9Ô9ˆCØ�bŠyˆyØ—’˜CÑ Ô Ð Ø�bŠyˆyå˜q $×"9Ò"9Ñ";Ô";¸aÑ"?Ñ@Ô@ð )ð )�AØ×5Ò5°d¸HÀ¸H¸H¸HÑEÔE�CØ˜b’y�yØŸš CÑ(Ô(Ð(øØˆKr   r2   c                ó’  — | j         dk    rdS |                      ¦   «         |dz
           }t          t          |¦  «        ¦  «        }ddlm} |dk    r|                     ¦   «         S |dk    r|                     ¦   «         S |dk    r|                     ¦   «         S |dk    r| 	                    ¦   «         S |d	k    r| 
                    ¦   «         S |d
k    r|                     ¦   «         S |dk    r|                     ¦   «         S |dk    r|                     ¦   «         S |dk    r|                     ¦   «         S |dk    r|                     ¦   «         S |dk    r|                     ¦   «         S |dk    r|                     ¦   «         S |dk    r|                     ¦   «         S |dk    r|                     ¦   «         S t)          d|¦  «        ‚)aa  
        Return a music21 clef object based on a two character clef definition.

        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getClefObject().sign
        'G'
        r2   Nr   )ÚclefÚ5Ú4Ú34Ú64Ú3Ú11Ú12Ú13Ú14Ú15Ú22Ú23Ú52Ú82zcannot determine clef from:)r%   rk  r!   ru   rb   rm  ÚFrenchViolinClefÚ
TrebleClefÚTreble8vbClefÚTreble8vaClefÚGSopranoClefÚCBaritoneClefÚ	TenorClefÚAltoClefÚMezzoSopranoClefÚSopranoClefÚBassClefÚFBaritoneClefÚBass8vbClefÚBass8vaClefr   )r(   ÚvoiceÚcharPairrm  s       r   ÚgetClefObjectzMuseDataPart.getClefObjectå  sê  € ð Œ:˜Š?ˆ?Ø�4ð ×.Ò.Ñ0Ô0°¸±Ô;ˆHå�3˜x™=œ=Ñ)Ô)ˆHØ$Ð$Ð$Ð$Ð$Ð$à˜3ŠˆØ×,Ò,Ñ.Ô.Ð.Ø˜S’�Ø—’Ñ(Ô(Ð(à˜TÒ!Ð!Ø×)Ò)Ñ+Ô+Ð+Ø˜TÒ!Ð!Ø×)Ò)Ñ+Ô+Ð+Ø˜S’�Ø×(Ò(Ñ*Ô*Ð*à˜TÒ!Ð!Ø×)Ò)Ñ+Ô+Ð+Ø˜TÒ!Ð!Ø—~’~Ñ'Ô'Ð'Ø˜TÒ!Ð!Ø—}’}‘”Ð&Ø˜TÒ!Ð!Ø×,Ò,Ñ.Ô.Ð.Ø˜TÒ!Ð!Ø×'Ò'Ñ)Ô)Ð)à˜TÒ!Ð!Ø—}’}‘”Ð&Ø˜TÒ!Ð!Ø×)Ò)Ñ+Ô+Ð+à˜TÒ!Ð!Ø×'Ò'Ñ)Ô)Ð)Ø˜TÒ!Ð!Ø×'Ò'Ñ)Ô)Ð)å'Ð(EÀxÑPÔPÐPr   c                óž   — |                       ¦   «         }| j        dk    rdS |                      |d¦  «        }|dk    rdS t          |¦  «        S )aP  
        Get the transposition, if defined, from the Metadata header.

        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> fp2 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '02.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.addFile(fp2)
        >>> mdw.getParts()[0]._getTranspositionParameters()
        -11
        >>> mdw.getParts()[1]._getTranspositionParameters() is None
        True
        r2   NzX:r   )r9  r%   r,  ru   rf  s      r   Ú_getTranspositionParametersz(MuseDataPart._getTranspositionParameters  sS   € ð  ×(Ò(Ñ*Ô*ˆØŒ:˜Š?ˆ?Ø�4à×-Ò-¨d°DÑ9Ô9ˆCØ�bŠyˆyØ�tå˜3‘x”x�r   c                óZ   — |                       ¦   «         }|€dS t          j        |¦  «        S )a/  
        If this part defines a transposition, return a corresponding Interval object.

        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> fp2 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '02.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.addFile(fp2)
        >>> mdw.getParts()[0].getTranspositionIntervalObject()
        <music21.interval.Interval m-3>
        N)rŽ  r   Úbase40DeltaToInterval)r(   Úargss     r   ÚgetTranspositionIntervalObjectz+MuseDataPart.getTranspositionIntervalObject6  s0   € ð ×/Ò/Ñ1Ô1ˆØˆ<Ø�4åÔ/°Ñ5Ô5Ð5r   c                óN  — | j         €˜|                      ¦   «         }| j        dk    rQt          |                     d¦  «        d         ¦  «        }|                      ¦   «         }||j        j        z  | _         n(t          |                      |d¦  «        ¦  «        | _         | j         S )a  
        >>> fp1 = (common.getSourceFilePath() / 'musedata' / 'testPrimitive'
        ...                    / 'test01' / '01.md')
        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addFile(fp1)
        >>> mdw.getParts()[0].getDivisionsPerQuarterNote()
        6
        Nr2   r=   rƒ   zQ:)	r  r9  r%   ru   rK   rd  ÚbarDurationÚquarterLengthr,  )r(   r  rO   Útss       r   rx   z'MuseDataPart.getDivisionsPerQuarterNoteK  sŸ   € ð Ô(Ð0à×,Ò,Ñ.Ô.ˆDàŒz˜QŠˆå˜4Ÿ:š: c™?œ?¨1Ô-Ñ.Ô.�Ø×0Ò0Ñ2Ô2�ð 15°r´~Ô7SÑ0S�Ô-Ð-õ
 14Ø×/Ò/°°dÑ;Ô;ñ1=ô 1=�Ô-ð Ô,Ð,r   c                óÐ  — |€| j         }g }g }d}t          |¦  «        dz
  }| j        dk    rHt          |¦  «        D ]/\  }}|                     d¦  «        r|                     |¦  «         Œ0|d         }nfd}t          |¦  «        D ]T\  }}|                     d¦  «        r|dz  }Œ |dk    r|€|}|                     d¦  «        r|                     |¦  «         ŒUd}	|d         |k    r\t          |¦  «        dk    r |                     |d         |f¦  «         d}	nK|                     |d         |d         dz
  f¦  «         d}	n"|                     ||d         dz
  f¦  «         d}	|	�}t          |	t          |¦  «        ¦  «        D ]_}|t          |¦  «        dz
  k    r|                     ||         |f¦  «         Œ6|                     ||         ||dz            dz
  f¦  «         Œ`|S )a´  

        >>> mdp = musedata.MuseDataPart()
        >>> mdp.stage is None
        True
        >>> mdp._getMeasureBoundaryIndices(['$', 'A', 'B', 'm', 'C', 'm', 'D'])
        [(1, 2), (3, 4), (5, 6)]
        >>> mdp._getMeasureBoundaryIndices(['$', 'm', 'B', 'C', 'm', 'D', 'E', 'm', 'F', 'D'])
        [(1, 3), (4, 6), (7, 9)]
        >>> mdp._getMeasureBoundaryIndices(['$', 'B', 'C', 'm', 'D', 'E'])
        [(1, 2), (3, 5)]
        Nr2   r¿   r   r$  )r    r7   r%   Ú	enumerater	  rL   rj  )
r(   r    r  ÚmIndicesÚfirstPostAttributesIndexÚ	lastIndexr›   r  ÚmAttributeRecordCountÚstartIterIndexs
             r   Ú_getMeasureBoundaryIndicesz'MuseDataPart._getMeasureBoundaryIndicesk  s9  € ð ˆ;Ø”(ˆCØˆ
ØˆØ#'Ð Ý˜‘H”H˜q‘Lˆ	àŒ:˜Š?ˆ?å$ S™>œ>ð 'ð '‘��4Ø—?’? 3Ñ'Ô'ð 'Ø—O’O AÑ&Ô&Ð&øà'/°¤{Ð$Ð$ð %&Ð!å$ S™>œ>ð 'ð '‘��4Ø—?’? 3Ñ'Ô'ð Ø)¨QÑ.Ð)ØØ(¨1Ò,Ð,Ð1IÐ1QØ/0Ð,à—?’? 3Ñ'Ô'ð 'Ø—O’O AÑ&Ô&Ð&øð ˆØ�AŒ;Ð2Ò2Ð2Ý�8‰}Œ} Ò!Ð!Ø×!Ò! 8¨A¤;°	Ð":Ñ;Ô;Ð;Ø!%��à×!Ò! 8¨A¤;°¸´¸a±Ð"@ÑAÔAÐAØ!"��ð ×ÒÐ7¸À!¼Àq¹ÐIÑJÔJÐJØˆNàÐ%Ý˜>­3¨x©=¬=Ñ9Ô9ð Jð J�à�˜H™œ¨Ñ)Ò)Ð)Ø×%Ò% x°¤{°IÐ&>Ñ?Ô?Ð?Ð?à×%Ò% x°¤{°H¸QÀ¹U´OÀaÑ4GÐ&HÑIÔIÐIÐIàÐr   c                ój   — |                       ¦   «         | _        |                      ¦   «         | _        dS )z¡
        After setting the source string, this method must be called to configure
        the _measureNumberToLine method and set additional attributes.
        N)rx   r  rž  r  r/   s    r   ÚupdatezMuseDataPart.update­  s2   € ð
 %)×$CÒ$CÑ$EÔ$EˆÔ!Ø"&×"AÒ"AÑ"CÔ"CˆÔÐÐr   c                ó8   — t          | j        | j        | ¦  «        S r  )r   r    r  r/   s    r   rÒ   zMuseDataPart.__iter__µ  s   € õ ' t¤x°Ô1HÈ$ÑOÔOÐOr   c                ó    — t          | ¦  «        S )z_
        Return a list of all measures stored in this part as MuseDataMeasure objects.
        r  r/   s    r   ÚgetMeasureszMuseDataPart.getMeasures»  r  r   r  )FF)rJ  )r2   r#   )#r   r   r   rÌ   r)   rÞ   r  r  r,  r2  r5  r7  r;  r>  rA  rC  rE  rI  rP  rS  r9  rX  r\  r`  rd  rg  rk  rŒ  rŽ  r’  rx   rž  r   rÒ   r£  r   r   r   r	   r	     s5  € € € € € ðð ð3ð 3ð 3ð 3ð(ð ð ð	ð 	ð 	ðð ð ð(ð ð ð< ;@Ø(-ðð ð ð ð8Dð Dð Dð,Dð Dð Dð"&ð &ð &ð0%ð %ð %ðNð ð ð"ð ð ð'ð 'ð 'ðð ð ð( ð  ð  ð  ð4 ð  ð  ð  ð4ð ð ð.@ð @ð @ð 
9ð 
9ð 
9ðð ð ð0
Fð 
Fð 
Fð ð  ð  ð* ð  ð  ðD5Qð 5Qð 5Qð 5Qðn ð  ð  ð46ð 6ð 6ð*-ð -ð -ð@@ð @ð @ð @ðDDð Dð DðPð Pð Pðð ð ð ð r   r	   c                  ó8   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd	„ Z	d
S )r   a  
    A MuseDataFile file may describe one or more MuseDataPart;
    a Score might need multiple files for complete definition.
    A MuseDataFile object can be created from a string.

    When read, one or more MuseDataPart objects are created and stored on self.parts.
    r*   ÚNonec                ó>   — g | _         d | _        d | _        d| _        d S ©Nzutf-8)ÚpartsÚfilenameÚfileÚencodingr/   s    r   r)   zMuseDataFile.__init__Ë  s"   € Ø)+ˆŒ
à"&ˆŒØ%)ˆŒ	Ø$ˆŒˆˆr   c                ó   — dS r!  r   r/   s    r   rÞ   zMuseDataFile._reprInternalÒ  r"  r   c                ó>   — t          |d¦  «        | _        || _        d S )NÚrb)Úopenrª  r©  )r(   r¼   s     r   r¯  zMuseDataFile.openÕ  s   € õ ˜˜T‘N”NˆŒ	ØˆŒˆˆr   c                óâ   — | j                              ¦   «         }	 |                     | j        ¦  «        }n&# t          $ r |                     dd¦  «        }Y nw xY w|                      |¦  «        S )Nz
ISO-8859-1Úignore)rª  ÚreadÚdecoder«  ÚUnicodeDecodeErrorÚreadstr)r(   ÚfileContentss     r   r²  zMuseDataFile.readÛ  sz   € à”y—~’~Ñ'Ô'ˆð	GØ'×.Ò.¨t¬}Ñ=Ô=ˆLˆLøÝ!ð 	Gð 	Gð 	GØ'×.Ò.¨|¸XÑFÔFˆLˆLˆLð	Gøøøà�|Š|˜LÑ)Ô)Ð)s   ›6 ¶ AÁAc                ó8   — | j                              ¦   «          d S r#   )rª  Úcloser/   s    r   r¸  zMuseDataFile.closeä  s   € ØŒ	�ŠÑÔÐÐÐr   c                ó  — d}g }|                      d¦  «        }t          |¦  «        D ]ß\  }}|                     d¦  «        r|rd}Œd}Œ"|rŒ%|r|d         dk    rŒ4|                     d¦  «        s|                     d¦  «        rVt          |¦  «        d	k    rg }Œtt	          |¦  «        }|                     ¦   «          | j                             |¦  «         g }Œ´|                     d
¦  «        rŒÊ|                     |¦  «         ŒàdS )zC
        Read a string, dividing it into individual parts.
        Fú
r^   Tr   ú@z/ENDÚENDr2   z/eofN)rK   r˜  r	  r7   r	   r   r¨  rL   )r(   Ú	input_strÚcommentToggleÚlinesÚsrcLinesr›   r  Úmdps           r   rµ  zMuseDataFile.readstrç  s8  € ð ˆàˆØ—?’? 4Ñ(Ô(ˆå  Ñ*Ô*ð !	#ð !	#‰GˆAˆtð �Š˜sÑ#Ô#ð Ø ð Ø$)�MØà$(�MØàð #ØØð #˜$˜qœ' Sš.˜.Øà—’ Ñ(Ô(ð #¨D¯OªO¸EÑ,BÔ,Bð #õ �u‘:”: ’?�?Ø�EØÝ" 5Ñ)Ô)�à—
’
‘”�Ø”
×!Ò! #Ñ&Ô&Ð&Ø��à—’ Ñ(Ô(ð #Øà—’˜TÑ"Ô"Ð"Ð"ðC!	#ð !	#r   N©r*   r¥  )
r   r   r   rÌ   r)   rÞ   r¯  r²  r¸  rµ  r   r   r   r   r   Ã  s}   € € € € € ðð ð%ð %ð %ð %ðð ð ðð ð ð*ð *ð *ðð ð ð-#ð -#ð -#ð -#ð -#r   r   c                  ó.   — e Zd ZdZdd„Zdd„Zd„ Zd	„ Zd
S )r   z4
    A work might consist of one or more files.
    r*   r¥  c                ó"   — g | _         d| _        d S r§  )Úfilesr«  r/   s    r   r)   zMuseDataWork.__init__  s   € Ø)+ˆŒ
Ø$ˆŒˆˆr   r¼   ústr | Iterable[str]c                óZ  — t          j        |¦  «        st          j        t          |¦  «        }|g}n|}|D ]s}t          ¦   «         }| j        |_        |                     |¦  «         |                     ¦   «          | 	                    ¦   «          | j
                             |¦  «         ŒtdS )zr
        Open and read this file path or list of paths as MuseDataFile objects
        and set self.files
        N)r   Ú
isIterabler±   Úcastr!   r   r«  r¯  r²  r¸  rÅ  rL   )r(   r¼   Ú	fp_singleÚfpListÚfpInnerÚmdfs         r   ÚaddFilezMuseDataWork.addFile!  s¤   € õ Ô  Ñ$Ô$ð 	Ýœ�s B™œˆIØ�[ˆFˆFàˆFàð 	#ð 	#ˆGÝ‘.”.ˆCØœ=ˆCŒLà�HŠH�WÑÔÐØ�HŠH‰JŒJˆJØ�IŠI‰KŒKˆKØŒJ×Ò˜cÑ"Ô"Ð"Ð"ð	#ð 	#r   c                ó¾   — t          j        |¦  «        s|g}n|}|D ]?}t          ¦   «         }|                     |¦  «         | j                             |¦  «         Œ@dS )a  
        Add a string representation acting like a part file

        >>> mdw = musedata.MuseDataWork()
        >>> mdw.addString('WK#:581       MV#:3c\nBreitkopf & Hartel, Vol. 13\n'
        ...               'Clarinet Quintet\n'
        ...               'Trio II\n'
        ...               '$  K:0   Q:6   T:3/4   X:-11   C:4\n'
        ...               'C5     3        e     d  [     (&0p\n'
        ...               'E5     3        e     d  ]')

        # TODO: Okay, so what? did we test this or demo anything?
        N)r   rÈ  r   rµ  rÅ  rL   )r(   r½  ÚstrListÚ
thisStringrÍ  s        r   Ú	addStringzMuseDataWork.addString6  sr   € õ" Ô  Ñ+Ô+ð 	 Ø �kˆGˆGàˆGà!ð 	#ð 	#ˆJÝ‘.”.ˆCØ�KŠK˜
Ñ#Ô#Ð#ØŒJ×Ò˜cÑ"Ô"Ð"Ð"ð	#ð 	#r   c                ó\   — g }| j         D ]!}|j        D ]}|                     |¦  «         ŒŒ"|S )z�
        Get all parts contained in all files associated with this work.
        A list of MuseDataPart objects that were created in a MuseDataFile.
        )rÅ  r¨  rL   )r(   r«   rÍ  rÁ  s       r   ÚgetPartszMuseDataWork.getPartsS  sJ   € ð ˆØ”:ð 	!ð 	!ˆCØ”yð !ð !�Ø—’˜CÑ Ô Ð Ð ð!àˆr   NrÂ  )r¼   rÆ  r*   r¥  )r   r   r   rÌ   r)   rÎ  rÒ  rÔ  r   r   r   r   r     sd   € € € € € ðð ð%ð %ð %ð %ð#ð #ð #ð #ð*#ð #ð #ð:ð ð ð ð r   r   c                  ó,   — e Zd ZdZd„ Zd„ Zd„ Zdd„ZdS )r   a\  
    This class manages finding musedata files stored in a directory,
    comparing file names and examining subdirectories to determine which files are parts.

    Once found, a MuseDataWork, or a list of paths, can be returned

    A directory, or a list of file path stubs, such as that obtained within a zip file,
    can both be provided.
    c                óL   — g | _         i | _        |                      |¦  «         d S r#   )ÚpathsÚgroupsÚ_prepareGroups)r(   Ú	dirOrLists     r   r)   zMuseDataDirectory.__init__m  s*   € ØˆŒ
ØˆŒà×Ò˜IÑ&Ô&Ð&Ð&Ð&r   c                ó  — g }t          j        |¦  «        r|}n‡t          j                             |¦  «        rXt          t          j        |¦  «        ¦  «        D ]5}|                     t          j                             ||¦  «        ¦  «         Œ6nt          d|¦  «        ‚|D ]r}t          j         
                    |¦  «        \  }}|                      |¦  «        sŒ:t          j        |¦  «        \  }}|dk    rŒX| j                             |¦  «         Œsg }t          | j        ¦  «        dk    r·t          | j        ¦  «        D ]n\  }	}t          j         
                    |¦  «        \  }}t          j        |¦  «        \  }}|dk    r*|                     d¦  «        r|                     |	¦  «         Œo|                     ¦   «          |D ]}	| j                             |	¦  «         Œn	 | j                             ¦   «          d S )Nz*cannot get files from the following entityr   r2   Ús)r   rÈ  ÚosÚpathÚisdirÚsortedÚlistdirrL   rN   r   rK   ÚisMusedataFilerM   r×  r7   r˜  r	  ÚreverseÚpopÚsort)
r(   rÚ  ÚallPathsÚfnr¼   Úunused_directoryÚnumStrÚ	nonNumStrÚpopListr›   s
             r   rÙ  z MuseDataDirectory._prepareGroupss  s
  € ð ˆõ Ô˜YÑ'Ô'ð 	]ð !ˆHˆHõ ŒW�]Š]˜9Ñ%Ô%ð 	]õ �RœZ¨	Ñ2Ô2Ñ3Ô3ð =ð =�Ø—’¥¤§¢¨Y¸Ñ ;Ô ;Ñ<Ô<Ð<Ð<ð=õ $Ð$PÐR[Ñ\Ô\Ð\àð 		&ð 		&ˆBÝ#%¤7§=¢=°Ñ#4Ô#4Ñ Ð˜bØ×&Ò& rÑ*Ô*ð ØÝ &Ô 4°RÑ 8Ô 8ÑˆF�Ià˜Š|ˆ|Øà”
×!Ò! "Ñ%Ô%Ð%Ð%ð ˆÝˆtŒz‰?Œ?˜QÒÐÝ" 4¤:Ñ.Ô.ð &ð &‘��2Ý')¤w§}¢}°RÑ'8Ô'8Ñ$Ð  "å$*Ô$8¸Ñ$<Ô$<Ñ!�˜	Ø˜R’<�< I×$8Ò$8¸Ñ$=Ô$=�<Ø—N’N 1Ñ%Ô%Ð%øØ�OŠOÑÔÐØð "ð "�Ø”
—’˜qÑ!Ô!Ð!Ð!ð"ð ð 	Œ
�ŠÑÔÐÐÐr   c                ó�  — t           j                             |¦  «        \  }}|                     d¦  «        rdS |                     d¦  «        rdS |                     d¦  «        s^|                     d¦  «        sI|                     t           j        ¦  «        s*|                     d¦  «        s|                     d¦  «        rdS dS )	Nz.mdTÚmchanFz.pyr^  r�   z	.svn-base)rÝ  rÞ  rK   Úendswithr	  Úsep)r(   r¼   Ú
unused_dirrç  s       r   râ  z MuseDataDirectory.isMusedataFile³  sÃ   € õ
 œŸš rÑ*Ô*‰ˆ
�BØ�;Š;�uÑÔð 
	Ø�4Ø�]Š]˜7Ñ#Ô#ð 	Ø�5à�kŠk˜%Ñ Ô ð 	Ø—’˜SÑ!Ô!ð	à—’�RœVÑ$Ô$ð	ð —’˜sÑ#Ô#ð	ð —’˜[Ñ)Ô)ð		ð
 �5Øˆtr   Nc                ó   — | j         S )z:
        Return sorted paths for a group, or None
        )r×  )r(   Úgroups     r   ÚgetPathszMuseDataDirectory.getPathsÆ  s   € ð
 ŒzÐr   r#   )r   r   r   rÌ   r)   rÙ  râ  ró  r   r   r   r   r   b  s`   € € € € € ðð ð'ð 'ð 'ð<ð <ð <ð@ð ð ð&ð ð ð ð ð r   r   c                  ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚTestc                ó�  — t          t          j        ¦   «         dz  dz  ¦  «        }t          ¦   «         }t          j                             |d¦  «        }dD ]7}t          j                             ||¦  «        }|                     |¦  «         Œ8|                     ¦   «         }|  	                    t          |¦  «        d¦  «         |  	                    |d         j        d         d¦  «         |  	                    |d         j        d	         d
¦  «         |  	                    |d         j        d         d¦  «         |  	                    |d         j        d	         d¦  «         |  	                    |d         j        d         d¦  «         |  	                    |d         j        d	         d¦  «         |  	                    |d         j        d         d¦  «         |  	                    |d         j        d	         d¦  «         |  	                    |d         j        d         d¦  «         |  	                    |d         j        d	         d¦  «         t          d¦  «        D �]‰}|  	                    ||                              ¦   «         d¦  «         |  	                    ||                              ¦   «         d¦  «         |                      ||                              ¦   «                              d¦  «        ¦  «         |  	                    ||                              ¦   «         d¦  «         |  	                    ||                              ¦   «         d¦  «         |  	                    ||                              ¦   «         ddg¦  «         |  	                    ||                              d¦  «        d¦  «         |  	                    ||                              d¦  «        d¦  «         �Œ‹|  	                    |d                              d¦  «        d¦  «         |  	                    |d                              d¦  «        d¦  «         |  	                    |d                              d¦  «        d¦  «         |  	                    |d                              d¦  «        d¦  «         |  	                    |d                              d¦  «        d¦  «         |  	                    |d                              d¦  «        d¦  «         |  	                    |d                              d¦  «        d¦  «         |  	                    |d                              d¦  «        d¦  «         |  	                    |d                              d¦  «        d¦  «         |  	                    |d                              d¦  «        d¦  «         |  	                    |d                              ¦   «         d¦  «         |  	                    |d                              ¦   «         d¦  «         |  	                    |d                              ¦   «         d¦  «         d S )Nr   ÚtestPrimitiveÚtest01)z01.mdz02.mdz03.mdz04.mdz05.mdrs   r   rD   zWK#:581       MV#:3cé   zscore: part 1 of 5r2   zscore: part 2 of 5rƒ   zscore: part 3 of 5r=  zscore: part 4 of 5zscore: part 5 of 5Ú581rr  Ú	BreitkopfzClarinet QuintetzTrio IIÚsoundrJ  z3/4r4  )r!   r   ÚgetSourceFilePathr   rÝ  rÞ  rN   rÎ  rÔ  ÚassertEqualr7   r    rj  r5  r7  Ú
assertTruer>  r	  rA  rC  rI  rP  rS  rX  r`  rx   )r(   r¼   ÚmdwÚdirLibrç  ÚmdpObjsr›   s          r   ÚtestLoadFromFilezTest.testLoadFromFileð  s\  € Ý•Ô)Ñ+Ô+¨jÑ8¸?ÑJÑKÔKˆå‰nŒnˆå”—’˜b (Ñ+Ô+ˆØ?ð 	ð 	ˆBÝ”—’˜f bÑ)Ô)ˆBð �KŠK˜‰OŒOˆOˆOà—,’,‘.”.ˆØ×Ò�˜W™œ qÑ)Ô)Ð)à×Ò˜ œœ¨Ô*Ð,BÑCÔCÐCØ×Ò˜ œœ¨Ô+Ð-AÑBÔBÐBà×Ò˜ œœ¨Ô*Ð,BÑCÔCÐCØ×Ò˜ œœ¨Ô+Ð-AÑBÔBÐBà×Ò˜ œœ¨Ô*Ð,BÑCÔCÐCØ×Ò˜ œœ¨Ô+Ð-AÑBÔBÐBà×Ò˜ œœ¨Ô*Ð,BÑCÔCÐCØ×Ò˜ œœ¨Ô+Ð-AÑBÔBÐBà×Ò˜ œœ¨Ô*Ð,BÑCÔCÐCØ×Ò˜ œœ¨Ô+Ð-AÑBÔBÐBõ �q‘”ð 
	Nñ 
	NˆAØ×Ò˜W QœZ×5Ò5Ñ7Ô7¸Ñ?Ô?Ð?Ø×Ò˜W QœZ×9Ò9Ñ;Ô;¸SÑAÔAÐAØ�OŠO˜G AœJ×0Ò0Ñ2Ô2×=Ò=¸kÑJÔJÑKÔKÐKØ×Ò˜W QœZ×4Ò4Ñ6Ô6Ð8JÑKÔKÐKØ×Ò˜W QœZ×8Ò8Ñ:Ô:¸IÑFÔFÐFà×Ò˜W QœZ×;Ò;Ñ=Ô=ÀÈÐ?QÑRÔRÐRà×Ò˜W QœZ×@Ò@ÀÑIÔIÈ1ÑMÔMÐMØ×Ò˜W QœZ×@Ò@ÀÑIÔIÈ1ÑMÔMÐMÑMà×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIØ×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIØ×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIØ×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIØ×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIØ×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIà×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIØ×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIØ×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIØ×Ò˜ œ×<Ò<¸WÑEÔEÀqÑIÔIÐIà×Ò˜ œ×4Ò4Ñ6Ô6¸Ñ:Ô:Ð:Ø×Ò˜ œ×>Ò>Ñ@Ô@À%ÑHÔHÐHØ×Ò˜ œ×>Ò>Ñ@Ô@À!ÑDÔDÐDÐDÐDr   c                óv   — t          t          j        ¦   «         dz  dz  dz  ¦  «        }t          |¦  «        }d S )Nr   r÷  rø  )r!   r   rý  r   )r(   ÚfpDirÚ
unused_mdds      r   ÚtestMuseDataDirectoryzTest.testMuseDataDirectoryG  s;   € õ •FÔ,Ñ.Ô.°Ñ;¸oÑMÐPXÑXÑYÔYˆå& uÑ-Ô-ˆ
ˆ
ˆ
r   c                ó‚  — t          d¦  «        }d|_        |                      |                     ¦   «         dg¦  «         t          d¦  «        }d|_        |                      |                     ¦   «         dg¦  «         t          d¦  «        }d|_        |                      |                     ¦   «         ddg¦  «         d S )Nz/D4     2        e     u                    con-rƒ   zcon-z,F#4    2        e     u                    aÚaz0F#4    2        e     u                    a | bÚb)r
   r%   rþ  rŽ   r×   s     r   ÚtestGetLyricszTest.testGetLyricsh  s©   € ÝÐNÑOÔOˆØˆŒ	Ø×Ò˜Ÿš™œ¨6¨(Ñ3Ô3Ð3åÐKÑLÔLˆØˆŒ	Ø×Ò˜Ÿš™œ¨3¨%Ñ0Ô0Ð0åÐOÑPÔPˆØˆŒ	Ø×Ò˜Ÿš™œ¨3°¨*Ñ5Ô5Ð5Ð5Ð5r   N)r   r   r   r  r  r  r   r   r   rõ  rõ  Ð  sG   € € € € € ð@9Eð 9Eð 9Eðn.ð .ð .ðB6ð 6ð 6ð 6ð 6r   rõ  Ú__main__)'rÌ   Ú
__future__r   Ú__all__Úcollections.abcr   rÝ  Útypingr±   Úunittestrb   r   r   Úmusic21.musedatar   r   r   r   r   Úmusic21.common.typesr   ÚEnvironmentÚenvironLocalÚMusic21Exceptionr   ÚProtoM21Objectr
   r   r   r   r	   r   r   r   ÚTestCaserõ  Ú
_DOC_ORDERr   ÚmainTestr   r   r   ú<module>r     s?  ððð ð  #Ð "Ð "Ð "Ð "Ð "ðð ð €ð %Ð $Ð $Ð $Ð $Ð $Ø 	€	€	€	Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø &Ð &Ð &Ð &Ð &Ð &Ø #Ð #Ð #Ð #Ð #Ð #Ø &Ð &Ð &Ð &Ð &Ð &à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )à&ˆ{Ô& zÑ2Ô2€ð	ð 	ð 	ð 	ð 	˜Ô5ñ 	ô 	ð 	ð
@ð @ð @ð @ð @�WÔ+ñ @ô @ð @ðJð ð ð ð ñ ô ð ð0Dð Dð Dð Dð D�gÔ,ñ Dô Dð DðPð ð ð ð ñ ô ð ð4x
ð x
ð x
ð x
ð x
�7Ô)ñ x
ô x
ð x
ðxQ#ð Q#ð Q#ð Q#ð Q#�7Ô)ñ Q#ô Q#ð Q#ðjFð Fð Fð Fð F�7Ô)ñ Fô Fð FðTið ið ið ið i˜Ô.ñ iô ið ið\c6ð c6ð c6ð c6ð c6ˆ8Ôñ c6ô c6ð c6ðh ˆ^€
ð ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   