§
    „ØjãÄ  ã                  ó”  — d Z 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m	Z	 ddlm
Z
 ddlmZ ddlmZ  e
j        d	¦  «        Z ej        d
¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        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!¦  «        Z" G d „ d!e!¦  «        Z# G d"„ d#e!¦  «        Z$ G d$„ d%e$¦  «        Z% G d&„ d'e$¦  «        Z& G d(„ d)e$¦  «        Z' G d*„ d+e$¦  «        Z( G d,„ d-e(¦  «        Z) G d.„ d/e(¦  «        Z* G d0„ d1e$¦  «        Z+ G d2„ d3e$¦  «        Z, G d4„ d5e$¦  «        Z- G d6„ d7e$¦  «        Z. G d8„ d9e$¦  «        Z/ G d:„ d;e$¦  «        Z0 G d<„ d=e0¦  «        Z1 G d>„ d?e0¦  «        Z2 G d@„ dAe0¦  «        Z3 G dB„ dCe$¦  «        Z4 G dD„ dEe4¦  «        Z5 G dF„ dGe4¦  «        Z6 G dH„ dI¦  «        Z7 G dJ„ dKej         ¦  «        Z8 G dL„ dMej9        ¦  «        Z:e;dNk    rddlZ ej<        e:¦  «         dS dS )Oz·
Translation routines for roman numeral analysis text files, as defined
and demonstrated by Dmitri Tymoczko, Mark Gotham, Michael Scott Cuthbert,
and Christopher Ariza in ISMIR 2019.
é    )ÚannotationsN)Úcommon)Úexceptions21)Úenvironment)Úkey)ÚprebasezromanText.rtObjectszm[0-9]+[a-h]*-*[0-9]*[a-h]*z	var[0-9]+zvar([A-Z]+)z\?\([A-Ga-g]+[b#]*:z\?\)[A-Ga-g]+[b#]*:?z[A-Ga-g]+[b#]*;:z[A-Ga-g]+[b#]*:z	KS-?[0-7]zb[1-9.]+z\|\|:z:\|\|z(NC|N.C.|nc)c                  ó   — e Zd ZdS )ÚRomanTextExceptionN©Ú__name__Ú
__module__Ú__qualname__© ó    ú�/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/romanText/rtObjects.pyr
   r
   5   ó   € € € € € Ø€Dr   r
   c                  ó   — e Zd ZdS )ÚRTTokenExceptionNr   r   r   r   r   r   9   r   r   r   c                  ó   — e Zd ZdS )ÚRTHandlerExceptionNr   r   r   r   r   r   =   r   r   r   c                  óz   — e 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„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚRTTokenaÆ  
    Stores each linear, logical entity of a RomanText.

    A multi-pass parsing procedure is likely necessary, as RomanText permits
    variety of groupings and markings.

    >>> rtt = romanText.rtObjects.RTToken('||:')
    >>> rtt
    <music21.romanText.rtObjects.RTToken '||:'>

    A standard RTToken returns `False` for all the following.

    >>> rtt.isComposer() or rtt.isTitle() or rtt.isPiece()
    False
    >>> rtt.isAnalyst() or rtt.isProofreader()
    False
    >>> rtt.isTimeSignature() or rtt.isKeySignature() or rtt.isNote()
    False
    >>> rtt.isForm() or rtt.isPedal() or rtt.isMeasure() or rtt.isWork()
    False
    >>> rtt.isMovement() or rtt.isVersion() or rtt.isAtom()
    False
    Ú c                ó"   — || _         d| _        d S ©Nr   )ÚsrcÚ
lineNumber©Úselfr   s     r   Ú__init__zRTToken.__init__\   s   € ØˆŒØˆŒˆˆr   c                ó*   — t          | j        ¦  «        S ©N)Úreprr   ©r   s    r   Ú_reprInternalzRTToken._reprInternal`   s   € Ý�D”H‰~Œ~Ðr   c                ó   — dS ©NFr   r$   s    r   Ú
isComposerzRTToken.isComposerc   ó   € Øˆur   c                ó   — dS r'   r   r$   s    r   ÚisTitlezRTToken.isTitlef   r)   r   c                ó   — dS r'   r   r$   s    r   ÚisPiecezRTToken.isPiecei   r)   r   c                ó   — dS r'   r   r$   s    r   Ú	isAnalystzRTToken.isAnalystl   r)   r   c                ó   — dS r'   r   r$   s    r   ÚisProofreaderzRTToken.isProofreadero   r)   r   c                ó   — dS r'   r   r$   s    r   ÚisTimeSignaturezRTToken.isTimeSignaturer   r)   r   c                ó   — dS r'   r   r$   s    r   ÚisKeySignaturezRTToken.isKeySignatureu   r)   r   c                ó   — dS r'   r   r$   s    r   ÚisNotezRTToken.isNotex   r)   r   c                ó   — dS )z/
        Occasionally found in header.
        Fr   r$   s    r   ÚisFormzRTToken.isForm{   s	   € ð ˆur   c                ó   — dS r'   r   r$   s    r   Ú	isMeasurezRTToken.isMeasure�   r)   r   c                ó   — dS r'   r   r$   s    r   ÚisPedalzRTToken.isPedal„   r)   r   c                ó   — dS r'   r   r$   s    r   ÚisWorkzRTToken.isWork‡   r)   r   c                ó   — dS r'   r   r$   s    r   Ú
isMovementzRTToken.isMovementŠ   r)   r   c                ó   — dS r'   r   r$   s    r   Ú	isVersionzRTToken.isVersion�   r)   r   c                ó   — dS )zh
        Atoms are any untagged data; generally only found inside a
        measure definition.
        Fr   r$   s    r   ÚisAtomzRTToken.isAtom�   s	   € ð
 ˆur   N©r   )r   r   r   Ú__doc__r    r%   r(   r+   r-   r/   r1   r3   r5   r7   r9   r;   r=   r?   rA   rC   rE   r   r   r   r   r   C   s"  € € € € € ðð ð0ð ð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ð ð r   r   c                  ó~   ‡ — e Zd ZdZdˆ fd„	Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ÚRTTaggedaÿ  
    In romanText, some data elements are tags, that is a tag name, a colon,
    optional whitespace, and data. In non-RTTagged elements, there is just
    data.

    All tagged tokens are subclasses of this class. Examples are:

        Title: Die Jahrzeiten
        Composer: Fanny Mendelssohn

    >>> rtTag = romanText.rtObjects.RTTagged('Title: Die Jahrzeiten')
    >>> rtTag.tag
    'Title'
    >>> rtTag.data
    'Die Jahrzeiten'
    >>> rtTag.isTitle()
    True
    >>> rtTag.isComposer()
    False
    r   c                ó4  •— t          ¦   «                              |¦  «         d| _        d| _        d|v r\|                     d¦  «        }|d |…                              ¦   «         | _        ||dz   d …                              ¦   «         | _        d S || _        d S )Nr   ú:é   )Úsuperr    ÚtagÚdataÚfindÚstrip)r   r   ÚiFirstÚ	__class__s      €r   r    zRTTagged.__init__®   s‹   ø€ Ý‰Œ×Ò˜ÑÔÐàˆŒØˆŒ	Ø�#ˆ:ˆ:Ø—X’X˜c‘]”]ˆFØ˜7˜F˜7”|×)Ò)Ñ+Ô+ˆDŒHà˜F Q™J˜K˜KÔ(×.Ò.Ñ0Ô0ˆDŒIˆIˆIàˆDŒIˆIˆIr   c                óD   — | j                              ¦   «         dk    rdS dS )a3  
        True is the tag represents a composer.

        >>> rth = romanText.rtObjects.RTTagged('Composer: Claudio Monteverdi')
        >>> rth.isComposer()
        True
        >>> rth.isTitle()
        False
        >>> rth.isWork()
        False
        >>> rth.data
        'Claudio Monteverdi'
        ÚcomposerTF©rN   Úlowerr$   s    r   r(   zRTTagged.isComposer»   s%   € ð Œ8�>Š>ÑÔ˜zÒ)Ð)Ø�4Øˆur   c                óD   — | j                              ¦   «         dk    rdS dS )a(  
        True if tag represents a title, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('Title: This is a title.')
        >>> tag.isTitle()
        True

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isTitle()
        False
        ÚtitleTFrV   r$   s    r   r+   zRTTagged.isTitleÍ   ó%   € ð Œ8�>Š>ÑÔ˜wÒ&Ð&Ø�4Øˆur   c                óD   — | j                              ¦   «         dk    rdS dS )a(  
        True if tag represents a piece, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('Piece: This is a piece.')
        >>> tag.isPiece()
        True

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isPiece()
        False
        ÚpieceTFrV   r$   s    r   r-   zRTTagged.isPieceÝ   rZ   r   c                óD   — | j                              ¦   «         dk    rdS dS )a4  
        True if tag represents an analyst, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('Analyst: This is an analyst.')
        >>> tag.isAnalyst()
        True

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isAnalyst()
        False
        ÚanalystTFrV   r$   s    r   r/   zRTTagged.isAnalystí   s%   € ð Œ8�>Š>ÑÔ˜yÒ(Ð(Ø�4Øˆur   c                ó@   — | j                              ¦   «         dv rdS dS )aF  
        True if tag represents a proofreader, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('Proofreader: This is a proofreader.')
        >>> tag.isProofreader()
        True

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isProofreader()
        False
        )Úproofreaderzproof readerTFrV   r$   s    r   r1   zRTTagged.isProofreaderý   s&   € ð Œ8�>Š>ÑÔÐ>Ð>Ð>Ø�4Øˆur   c                ó@   — | j                              ¦   «         dv rdS dS )až  
        True if tag represents a time signature, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('TimeSignature: This is a time signature.')
        >>> tag.isTimeSignature()
        True

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isTimeSignature()
        False

        TimeSignature header data can be found intermingled with measures.
        )Útimesignatureztime signatureTFrV   r$   s    r   r3   zRTTagged.isTimeSignature  s&   € ð Œ8�>Š>ÑÔÐBÐBÐBØ�4Øˆur   c                ó@   — | j                              ¦   «         dv rdS dS )a‘  
        True if tag represents a key signature, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('KeySignature: This is a key signature.')
        >>> tag.isKeySignature()
        True
        >>> tag.data
        'This is a key signature.'

        KeySignatures are a type of tagged data found outside of measures,
        such as "Key Signature: -1" meaning one flat.

        Key signatures are generally numbers representing the number of sharps (or
        negative for flats).  Non-standard key signatures are not supported.

        >>> tag = romanText.rtObjects.RTTagged('KeySignature: -3')
        >>> tag.data
        '-3'

        music21 supports one legacy key signature type: `KeySignature: Bb` which
        represents a one-flat signature.  Important to note: no other key signatures
        of this type are supported.  (For instance, `KeySignature: Ab` has no effect)

        >>> tag = romanText.rtObjects.RTTagged('KeySignature: Bb')
        >>> tag.data
        'Bb'

        Testing that `.isKeySignature` returns `False` for non-key signatures:

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isKeySignature()
        False

        N.B.: this is not the same as a key definition found inside a
        Measure. These are represented by RTKey rtObjects, defined below, and are
        not RTTagged rtObjects, but RTAtom subclasses.
        )Úkeysignaturezkey signatureTFrV   r$   s    r   r5   zRTTagged.isKeySignature  s'   € ðL Œ8�>Š>ÑÔÐ@Ð@Ð@Ø�4à�5r   c                óD   — | j                              ¦   «         dk    rdS dS )a#  
        True if tag represents a note, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('Note: This is a note.')
        >>> tag.isNote()
        True

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isNote()
        False
        ÚnoteTFrV   r$   s    r   r7   zRTTagged.isNoteJ  ó%   € ð Œ8�>Š>ÑÔ˜vÒ%Ð%Ø�4Øˆur   c                óD   — | j                              ¦   «         dk    rdS dS )a#  
        True if tag represents a form, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('Form: This is a form.')
        >>> tag.isForm()
        True

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isForm()
        False
        ÚformTFrV   r$   s    r   r9   zRTTagged.isFormZ  rg   r   c                ó@   — | j                              ¦   «         dv rdS dS )a(  
        True if tag represents a pedal, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('Pedal: This is a pedal.')
        >>> tag.isPedal()
        True

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isPedal()
        False
        )ÚpedalTFrV   r$   s    r   r=   zRTTagged.isPedalj  s%   € ð Œ8�>Š>ÑÔ˜yÐ(Ð(Ø�4Øˆur   c                óD   — | j                              ¦   «         dk    rdS dS )aÅ  
        True if tag defines the version of RomanText standard used,
        otherwise False.

        Pieces without the tag are defined to conform to RomanText 1.0,
        the version described in the ISMIR publication.

        >>> rth = romanText.rtObjects.RTTagged('RTVersion: 1.0')
        >>> rth.isTitle()
        False
        >>> rth.isVersion()
        True
        >>> rth.tag
        'RTVersion'
        >>> rth.data
        '1.0'
        Ú	rtversionTFrV   r$   s    r   rC   zRTTagged.isVersionz  s%   € ð$ Œ8�>Š>ÑÔ˜{Ò*Ð*Ø�4à�5r   c                ó@   — | j                              ¦   «         dv rdS dS )a·  
        True if tag represents a work, otherwise False.

        The "work" is not defined as a header tag, but is used to represent
        all tags, often placed after Composer, for the work or pieces designation.

        >>> rth = romanText.rtObjects.RTTagged('Work: BWV232')
        >>> rth.isWork()
        True
        >>> rth.tag
        'Work'
        >>> rth.data
        'BWV232'

        For historical reasons, the tag 'Madrigal' also designates a work.

        >>> rth = romanText.rtObjects.RTTagged('Madrigal: 4.12')
        >>> rth.isTitle()
        False
        >>> rth.isWork()
        True
        >>> rth.tag
        'Madrigal'
        >>> rth.data
        '4.12'
        )ÚworkÚmadrigalTFrV   r$   s    r   r?   zRTTagged.isWork‘  s&   € ð6 Œ8�>Š>ÑÔÐ3Ð3Ð3Ø�4à�5r   c                óD   — | j                              ¦   «         dk    rdS dS )a7  
        True if tag represents a movement, otherwise False.

        >>> tag = romanText.rtObjects.RTTagged('Movement: This is a movement.')
        >>> tag.isMovement()
        True

        >>> tag = romanText.rtObjects.RTTagged('Nothing: Nothing at all.')
        >>> tag.isMovement()
        False
        ÚmovementTFrV   r$   s    r   rA   zRTTagged.isMovement±  s%   € ð Œ8�>Š>ÑÔ˜zÒ)Ð)Ø�4Øˆur   c                ó8   — | j                              ¦   «         dv S )zô
        True if tag represents a configuration setting for setting vi/vio/VI in minor

        >>> tag = romanText.rtObjects.RTTagged('Sixth Minor: Flat')
        >>> tag.isSixthMinor()
        True
        >>> tag.data
        'Flat'
        )Ú
sixthminorzsixth minorrV   r$   s    r   ÚisSixthMinorzRTTagged.isSixthMinorÁ  s   € ð Œx�~Š~ÑÔÐ#@Ð@Ð@r   c                ó8   — | j                              ¦   «         dv S )a  
        True if tag represents a configuration setting for setting vii/viio/VII in minor

        >>> tag = romanText.rtObjects.RTTagged('Seventh Minor: Courtesy')
        >>> tag.isSeventhMinor()
        True
        >>> tag.data
        'Courtesy'
        )Úseventhminorzseventh minorrV   r$   s    r   ÚisSeventhMinorzRTTagged.isSeventhMinorÍ  s   € ð Œx�~Š~ÑÔÐ#DÐDÐDr   rF   )r   r   r   rG   r    r(   r+   r-   r/   r1   r3   r5   r7   r9   r=   rC   r?   rA   ru   rx   Ú__classcell__©rS   s   @r   rI   rI   ˜   s4  ø€ € € € € ðð ð*ð ð ð ð ð ðð ð ð$ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð$)ð )ð )ðVð ð ð ð ð ð ð ð ð ð ð ð.ð ð ð@ð ð ð 
Að 
Að 
Að
Eð 
Eð 
Eð 
Eð 
Eð 
Eð 
Er   rI   c                  óB   ‡ — e Zd ZdZd	ˆ fd„	Zd„ Zd„ Zd„ Zd„ Zd„ Z	ˆ xZ
S )
Ú	RTMeasurea  
    In RomanText, measures are given one per line and always start with 'm'.

    For instance:

        m4 i b3 v b4 VI
        m5 b2 g: IV b4 V
        m6 i
        m7 D: V

    Measure ranges can be used and copied, such as:

        m8-m9=m4-m5

    RTMeasure objects can also define variant readings for a measure:

        m1     ii
        m1var1 ii b2 ii6 b3 IV

    Variants are not part of the tag, but are read into an attribute.

    Endings are indicated by a single letter after the measure number, such as
    "a" for first ending.

    >>> rtm = romanText.rtObjects.RTMeasure('m15a V6 b1.5 V6/5 b2 I b3 viio6')
    >>> rtm.data
    'V6 b1.5 V6/5 b2 I b3 viio6'
    >>> rtm.number
    [15]
    >>> rtm.repeatLetter
    ['a']
    >>> rtm.isMeasure()
    True

    r   c                óì   •— t          ¦   «                              |¦  «         d| _        d| _        g | _        g | _        d | _        d | _        d| _        g | _	        |r|  
                    |¦  «         d S d S )Nr   F)rM   r    rN   rO   ÚnumberÚrepeatLetterÚvariantNumberÚvariantLetterÚisCopyDefinitionÚatomsÚ_parseAttributes)r   r   rS   s     €r   r    zRTMeasure.__init__ÿ  s…   ø€ Ý‰Œ×Ò˜ÑÔÐàˆŒØˆŒ	ØˆŒØˆÔØ!ˆÔð "ˆÔà %ˆÔàˆŒ
àð 	'Ø×!Ò! #Ñ&Ô&Ð&Ð&Ð&ð	'ð 	'r   c                ó,  — d|v r|                      d¦  «        \  }}||g}n|g}g }g }|D ]f}t          j        |¦  «        \  }}	|                     t	          |¦  «        ¦  «         |	                     dd¦  «        }	|                     |	¦  «         Œg||fS )a.  
        Return the number of numbers as a list, as well as any repeat
        indications.

        >>> rtm = romanText.rtObjects.RTMeasure()
        >>> rtm._getMeasureNumberData('m77')
        ([77], [''])
        >>> rtm._getMeasureNumberData('m123b-432b')
        ([123, 432], ['b', 'b'])
        ú-Úmr   )Úsplitr   ÚgetNumFromStrÚappendÚintÚreplace)
r   r   ÚmnStartÚmnEndÚprocr~   r   ÚmnÚnumStrÚalphaStrs
             r   Ú_getMeasureNumberDatazRTMeasure._getMeasureNumberData  s°   € ð �#ˆ:ˆ:Ø ŸYšY s™^œ^‰NˆG�UØ˜UÐ#ˆDˆDà�5ˆDØˆØˆØð 	*ð 	*ˆBå%Ô3°BÑ7Ô7ÑˆF�HØ�MŠM�#˜f™+œ+Ñ&Ô&Ð&à×'Ò'¨¨RÑ0Ô0ˆHØ×Ò Ñ)Ô)Ð)Ð)Ø�|Ð#Ð#r   c                ó˜  — t                                |¦  «        }|€t          d|› �¦  «        ‚|                     ¦   «         }|d |…                              ¦   «         }|| _        ||d …                              ¦   «         }|                      |¦  «        \  | _        | _        t                               |¦  «        }|�u| 
                    d¦  «        }t          t          j        |¦  «        d         ¦  «        | _        ||                     ¦   «         d …                              ¦   «         | _        n|| _        t                                |¦  «        }|�O| 
                    d¦  «        }|| _        ||                     ¦   «         d …                              ¦   «         | _        | j                             d¦  «        r	d| _        d S d S )Nzfound no measure tag: r   rL   ú=T)ÚreMeasureTagÚmatchr   ÚendrQ   rN   r“   r~   r   Ú	reVariantÚgroupr‹   r   r‰   r€   rO   ÚreVariantLetterr�   Ú
startswithr‚   )r   r   ÚgÚiEndÚrawTagÚrawDataÚvarStrs          r   r„   zRTMeasure._parseAttributes/  s�  € å×Ò˜sÑ#Ô#ˆØˆ9Ý$Ð%C¸cÐ%CÐ%CÑDÔDÐDØ�uŠu‰wŒwˆØ�U�d�U”×!Ò!Ñ#Ô#ˆØˆŒØ�d�e�e”*×"Ò"Ñ$Ô$ˆð *.×)CÒ)CÀFÑ)KÔ)KÑ&ˆŒ�TÔ&õ �OŠO˜GÑ$Ô$ˆØˆ=Ø—W’W˜Q‘Z”ZˆFÝ!$¥VÔ%9¸&Ñ%AÔ%AÀ!Ô%DÑ!EÔ!EˆDÔØ §¢¡¤  Ô)×/Ò/Ñ1Ô1ˆDŒIˆIàˆDŒIÝ×!Ò! 'Ñ*Ô*ˆØˆ=Ø—W’W˜Q‘Z”ZˆFØ!'ˆDÔØ §¢¡¤  Ô)×/Ò/Ñ1Ô1ˆDŒIàŒ9×Ò Ñ$Ô$ð 	)Ø$(ˆDÔ!Ð!Ð!ð	)ð 	)r   c                ó¦   — t          | j        ¦  «        dk    rt          | j        d         ¦  «        }n| j        d         › d| j        d         › �}|S )NrL   r   r†   )Úlenr~   Ústr)r   Ú	numberStrs     r   r%   zRTMeasure._reprInternalM  sQ   € ÝˆtŒ{ÑÔ˜qÒ Ð Ý˜DœK¨œNÑ+Ô+ˆIˆIàœ; qœ>Ð<Ð<¨D¬K¸¬NÐ<Ð<ˆIØÐr   c                ó   — dS ©NTr   r$   s    r   r;   zRTMeasure.isMeasureT  ó   € Øˆtr   c                ó†   — | j                              dd¦  «                             ¦   «         }|                      |¦  «        S )aÔ  
        If this measure defines a copy operation, return two lists defining
        the measures to copy; the second list has the repeat data.

        >>> rtm = romanText.rtObjects.RTMeasure('m35-36 = m29-30')
        >>> rtm.number
        [35, 36]
        >>> rtm.getCopyTarget()
        ([29, 30], ['', ''])

        >>> rtm = romanText.rtObjects.RTMeasure('m4 = m1')
        >>> rtm.number
        [4]
        >>> rtm.getCopyTarget()
        ([1], [''])
        r•   r   )rO   rŒ   rQ   r“   )r   r    s     r   ÚgetCopyTargetzRTMeasure.getCopyTargetW  s;   € ð$ ”)×#Ò# C¨Ñ,Ô,×2Ò2Ñ4Ô4ˆØ×)Ò)¨'Ñ2Ô2Ð2r   rF   )r   r   r   rG   r    r“   r„   r%   r;   rª   ry   rz   s   @r   r|   r|   Ú  s“   ø€ € € € € ð"ð "ðH'ð 'ð 'ð 'ð 'ð 'ð&$ð $ð $ð:)ð )ð )ð<ð ð ðð ð ð3ð 3ð 3ð 3ð 3ð 3ð 3r   r|   c                  ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )ÚRTAtoma�  
    In RomanText, definitions of chords, phrases boundaries, open/close
    parenthesis, beat indicators, etc. appear within measures (RTMeasure
    objects). These individual elements will be called Atoms, as they are data
    that is not tagged.

    Each atom store a reference to its container (normally an RTMeasure).

    >>> chordIV = romanText.rtObjects.RTAtom('IV')
    >>> beat4 = romanText.rtObjects.RTAtom('b4')
    >>> beat4
    <music21.romanText.rtObjects.RTAtom 'b4'>
    >>> beat4.isAtom()
    True

    However, see RTChord, RTBeat, etc. which are subclasses of RTAtom
    specifically for storing chords, beats, etc.
    r   Nc                óX   •— t          ¦   «                              |¦  «         || _        d S r"   )rM   r    Ú	container©r   r   r®   rS   s      €r   r    zRTAtom.__init__�  s&   ø€ å‰Œ×Ò˜ÑÔÐØ"ˆŒˆˆr   c                ó   — dS r§   r   r$   s    r   rE   zRTAtom.isAtom†  r¨   r   ©r   N)r   r   r   rG   r    rE   ry   rz   s   @r   r¬   r¬   m  sV   ø€ € € € € ðð ð&#ð #ð #ð #ð #ð #ð
ð ð ð ð ð ð r   r¬   c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚRTChordz×
    An RTAtom subclass that defines a chord.  Also contains a reference to
    the container.

    >>> chordIV = romanText.rtObjects.RTChord('IV')
    >>> chordIV
    <music21.romanText.rtObjects.RTChord 'IV'>
    r   Nc                óh   •— t          ¦   «                              ||¦  «         d | _        d | _        d S r"   ©rM   r    ÚoffsetÚquarterLengthr¯   s      €r   r    zRTChord.__init__–  ó4   ø€ Ý‰Œ×Ò˜˜iÑ(Ô(Ð(ð ˆŒà!ˆÔÐÐr   r±   ©r   r   r   rG   r    ry   rz   s   @r   r³   r³   Œ  sG   ø€ € € € € ðð ð"ð "ð "ð "ð "ð "ð "ð "ð "ð "r   r³   c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )Ú	RTNoChordaØ  
    An RTAtom subclass that defines absence of a chord.  Also contains a
    reference to the container.

    >>> chordNC = romanText.rtObjects.RTNoChord('NC')
    >>> chordNC
    <music21.romanText.rtObjects.RTNoChord 'NC'>

    >>> rth = romanText.rtObjects.RTHandler()
    >>> rth.tokenizeAtoms('nc NC N.C.')
    [<music21.romanText.rtObjects.RTNoChord 'nc'>,
     <music21.romanText.rtObjects.RTNoChord 'NC'>,
     <music21.romanText.rtObjects.RTNoChord 'N.C.'>]
    r   Nc                óh   •— t          ¦   «                              ||¦  «         d | _        d | _        d S r"   rµ   r¯   s      €r   r    zRTNoChord.__init__¯  r¸   r   r±   r¹   rz   s   @r   r»   r»   Ÿ  sG   ø€ € € € € ðð ð"ð "ð "ð "ð "ð "ð "ð "ð "ð "r   r»   c                  ó   — e Zd ZdZd„ Zd„ ZdS )ÚRTBeatzá
    An RTAtom subclass that defines a beat definition.  Also contains a
    reference to the container.

    >>> beatFour = romanText.rtObjects.RTBeat('b4')
    >>> beatFour
    <music21.romanText.rtObjects.RTBeat 'b4'>
    c                óÊ  — | j                              dd¦  «        }|                     d¦  «        }t          |d         ¦  «        }t	          |¦  «        dk    rt          j        d|d         z   ¦  «        }nd}t	          |¦  «        dk    rnt          d|d         z   ¦  «        }t          |t          ¦  «        rt          j
                             |¦  «        }|j        }t          j        d||z  z  ¦  «        }nd}t	          |¦  «        d	k    r:t                               d
| j         › �g¦  «         t!          d| j         › �¦  «        ‚t          j        ||z   |z   ¦  «        }|S )a  
        Gets the beat number as a float or fraction. Time signature independent

        >>> RTB = romanText.rtObjects.RTBeat

        Simple ones:

        >>> RTB('b1').getBeatFloatOrFrac()
        1.0
        >>> RTB('b2').getBeatFloatOrFrac()
        2.0

        etc.

        with easy float:

        >>> RTB('b1.5').getBeatFloatOrFrac()
        1.5
        >>> RTB('b1.25').getBeatFloatOrFrac()
        1.25

        with harder:

        >>> RTB('b1.33').getBeatFloatOrFrac()
        Fraction(4, 3)

        >>> RTB('b2.66').getBeatFloatOrFrac()
        Fraction(8, 3)

        >>> RTB('b1.2').getBeatFloatOrFrac()
        Fraction(6, 5)

        A third digit of 0.5 adds 1/2 of 1/DENOM of before.  Here DENOM is 3 (in 5/3) so
        we add 1/6 to 5/3 to get 11/6:

        >>> RTB('b1.66').getBeatFloatOrFrac()
        Fraction(5, 3)

        >>> RTB('b1.66.5').getBeatFloatOrFrac()
        Fraction(11, 6)

        Similarly 0.25 adds 1/4 of 1/DENOM, to get 21/12 or 7/4 or 1.75:

        >>> RTB('b1.66.25').getBeatFloatOrFrac()
        1.75

        And 0.75 adds 3/4 of 1/DENOM to get 23/12:

        >>> RTB('b1.66.75').getBeatFloatOrFrac()
        Fraction(23, 12)

        A weird way of writing 'b1.5':

        >>> RTB('b1.33.5').getBeatFloatOrFrac()
        1.5
        Úbr   ú.r   rL   ç        é   g      ð?é   zgot unexpected beat: zcannot handle specification: )r   rŒ   rˆ   r‹   r£   r   ÚaddFloatPrecisionÚfloatÚ
isinstanceÚ	fractionsÚFractionÚ
from_floatÚdenominatorÚopFracÚenvironLocalÚ
printDebugr   )	r   ÚbeatStrÚpartsÚmainBeatÚfracPartÚfracPartDivisorÚdenomÚfracBeatFracÚbeats	            r   ÚgetBeatFloatOrFraczRTBeat.getBeatFloatOrFracÂ  sI  € ðr ”(×"Ò" 3¨Ñ+Ô+ˆð —’˜cÑ"Ô"ˆÝ�u˜Q”x‘=”=ˆÝˆu‰:Œ:˜Š>ˆ>ÝÔ/°°e¸A´h±Ñ?Ô?ˆHˆHàˆHåˆu‰:Œ:˜Š>ˆ>Ý# C¨%°¬(¡NÑ3Ô3ˆOÝ˜(¥EÑ*Ô*ð CÝ$Ô-×8Ò8¸ÑBÔB�ØÔ(ˆEÝ!œ=¨¨u°Ñ/FÑ)GÑHÔHˆLˆLàˆLåˆu‰:Œ:˜Š>ˆ>Ý×#Ò#Ð%G¸T¼XÐ%GÐ%GÐ$HÑIÔIÐIÝ"Ð#MÀ4Ä8Ð#MÐ#MÑNÔNÐNåŒ}˜X¨Ñ0°<Ñ?Ñ@Ô@ˆØˆr   c                óÖ   — |                       ¦   «         }	 |                     |¦  «        }n=# t          j        $ r+ t                               d| j        › d|› �g¦  «         d}Y nw xY w|S )a  
        Given a time signature, return the offset position specified by this
        beat.

        >>> rtb = romanText.rtObjects.RTBeat('b1.5')
        >>> rtb.getOffset(meter.TimeSignature('3/4'))
        0.5
        >>> rtb.getOffset(meter.TimeSignature('6/8'))
        0.75
        >>> rtb.getOffset(meter.TimeSignature('2/2'))
        1.0

        >>> rtb = romanText.rtObjects.RTBeat('b2')
        >>> rtb.getOffset(meter.TimeSignature('3/4'))
        1.0
        >>> rtb.getOffset(meter.TimeSignature('6/8'))
        1.5

        >>> rtb = romanText.rtObjects.RTBeat('b1.66')
        >>> rtb.getOffset(meter.TimeSignature('6/8'))
        1.0
        >>> rtc = romanText.rtObjects.RTBeat('b1.66.5')
        >>> rtc.getOffset(meter.TimeSignature('6/8'))
        1.25
        zbad beat specification: z in a meter of rÂ   )r×   ÚgetOffsetFromBeatr   ÚTimeSignatureExceptionrÍ   rÎ   r   )r   ÚtimeSignaturerÖ   Úposts       r   Ú	getOffsetzRTBeat.getOffset  s�   € ð4 ×&Ò&Ñ(Ô(ˆð	Ø ×2Ò2°4Ñ8Ô8ˆDˆDøÝÔ2ð 	ð 	ð 	Ý×#Ò#ð<Ø”8ð<ð <Ø,9ð<ð <ð%ñ ô ð ð ˆDˆDˆDð	øøøð ˆs   –, ¬7A&Á%A&N)r   r   r   rG   r×   rÝ   r   r   r   r¾   r¾   ¸  s@   € € € € € ðð ðQð Qð Qðf'ð 'ð 'ð 'ð 'r   r¾   c                  ó"   — e Zd ZdZdZd„ Zd„ ZdS )ÚRTKeyTypeAtoma9  
    RTKeyTypeAtoms contain utility functions for all Key-type tokens, i.e.
    RTKey, RTAnalyticKey, but not KeySignature.

    >>> gMinor = romanText.rtObjects.RTKeyTypeAtom('g;:')
    >>> gMinor
    <music21.romanText.rtObjects.RTKeyTypeAtom 'g;:'>
    >>> gMinor.getKey()
    <music21.key.Key of g minor>
    ú;:c                ó�   — | j                              | j        ¦  «        }t          j        |¦  «        }t          j        |¦  «        S )z?
        This returns a Key, not a KeySignature object
        )r   ÚrstripÚfooterStripr   Ú"convertKeyStringToMusic21KeyStringÚKey©r   ÚmyKeys     r   ÚgetKeyzRTKeyTypeAtom.getKeyL  s8   € ð ”—’ Ô 0Ñ1Ô1ˆÝÔ6°uÑ=Ô=ˆÝŒw�u‰~Œ~Ðr   c                ó\   — |                       ¦   «         }t          j        |j        ¦  «        S )z,
        Get a KeySignature object.
        )rè   r   ÚKeySignatureÚsharpsræ   s     r   ÚgetKeySignaturezRTKeyTypeAtom.getKeySignatureT  s$   € ð —’‘”ˆÝÔ ¤Ñ-Ô-Ð-r   N)r   r   r   rG   rã   rè   rì   r   r   r   rß   rß   ?  sC   € € € € € ð	ð 	ð €Kðð ð ð.ð .ð .ð .ð .r   rß   c                  ó   — e Zd ZdZdZdS )ÚRTKeyaë  
    An RTKey(RTAtom) defines both a change in KeySignature and a change
    in the analyzed Key.

    They are defined by ";:" after the Key.

    >>> gMinor = romanText.rtObjects.RTKey('g;:')
    >>> gMinor
    <music21.romanText.rtObjects.RTKey 'g;:'>
    >>> gMinor.getKey()
    <music21.key.Key of g minor>

    >>> bMinor = romanText.rtObjects.RTKey('bb;:')
    >>> bMinor
    <music21.romanText.rtObjects.RTKey 'bb;:'>
    >>> bMinor.getKey()
    <music21.key.Key of b- minor>
    >>> bMinor.getKeySignature()
    <music21.key.KeySignature of 5 flats>

    >>> eFlatMajor = romanText.rtObjects.RTKey('Eb;:')
    >>> eFlatMajor
    <music21.romanText.rtObjects.RTKey 'Eb;:'>
    >>> eFlatMajor.getKey()
    <music21.key.Key of E- major>
    rà   N©r   r   r   rG   rã   r   r   r   rî   rî   \  s   € € € € € ðð ð4 €K€K€Kr   rî   c                  ó   — e Zd ZdZdZdS )ÚRTAnalyticKeya  
    An RTAnalyticKey(RTKeyTypeAtom) only defines a change in the key
    being analyzed.  It does not in itself create a :class:`~music21.key.Key`
    object.

    >>> gMinor = romanText.rtObjects.RTAnalyticKey('g:')
    >>> gMinor
    <music21.romanText.rtObjects.RTAnalyticKey 'g:'>
    >>> gMinor.getKey()
    <music21.key.Key of g minor>

    >>> bMinor = romanText.rtObjects.RTAnalyticKey('bb:')
    >>> bMinor
    <music21.romanText.rtObjects.RTAnalyticKey 'bb:'>
    >>> bMinor.getKey()
    <music21.key.Key of b- minor>

    rK   Nrï   r   r   r   rñ   rñ   z  s   € € € € € ðð ð$ €K€K€Kr   rñ   c                  ó   — e Zd ZdZd„ ZdS )ÚRTKeySignatureah  
    An RTKeySignature(RTAtom) only defines a change in the KeySignature.
    It does not in itself create a :class:`~music21.key.Key` object, nor
    does it change the analysis taking place.

    The number after KS defines the number of sharps (negative for flats).

    >>> gMinor = romanText.rtObjects.RTKeySignature('KS-2')
    >>> gMinor
    <music21.romanText.rtObjects.RTKeySignature 'KS-2'>
    >>> gMinor.getKeySignature()
    <music21.key.KeySignature of 2 flats>

    >>> aMajor = romanText.rtObjects.RTKeySignature('KS3')
    >>> aMajor.getKeySignature()
    <music21.key.KeySignature of 3 sharps>
    c                ób   — t          | j        dd …         ¦  «        }t          j        |¦  «        S )NrÃ   )r‹   r   r   rê   )r   Ú	numSharpss     r   rì   zRTKeySignature.getKeySignature£  s*   € Ý˜œ   œÑ%Ô%ˆ	ÝÔ 	Ñ*Ô*Ð*r   N)r   r   r   rG   rì   r   r   r   ró   ró   �  s-   € € € € € ðð ð$+ð +ð +ð +ð +r   ró   c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚRTOpenParensz¢
    A simple open parenthesis Atom with a sensible default

    >>> romanText.rtObjects.RTOpenParens('(')
    <music21.romanText.rtObjects.RTOpenParens '('>
    ú(Nc                óL   •— t          ¦   «                              ||¦  «         d S r"   ©rM   r    r¯   s      €r   r    zRTOpenParens.__init__°  ó#   ø€ Ý‰Œ×Ò˜˜iÑ(Ô(Ð(Ð(Ð(r   )rø   Nr¹   rz   s   @r   r÷   r÷   ¨  óG   ø€ € € € € ðð ð)ð )ð )ð )ð )ð )ð )ð )ð )ð )r   r÷   c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚRTCloseParensz¥
    A simple close parenthesis Atom with a sensible default

    >>> romanText.rtObjects.RTCloseParens(')')
    <music21.romanText.rtObjects.RTCloseParens ')'>
    ú)Nc                óL   •— t          ¦   «                              ||¦  «         d S r"   rú   r¯   s      €r   r    zRTCloseParens.__init__¼  rû   r   )rÿ   Nr¹   rz   s   @r   rþ   rþ   ´  rü   r   rþ   c                  ó   — e Zd ZdZd„ ZdS )ÚRTOptionalKeyOpena—  
    Marks the beginning of an optional Key area which does not
    affect the roman numeral analysis.  (For instance, it is
    possible to analyze in Bb major, while remaining in g minor)

    >>> possibleKey = romanText.rtObjects.RTOptionalKeyOpen('?(Bb:')
    >>> possibleKey
    <music21.romanText.rtObjects.RTOptionalKeyOpen '?(Bb:'>
    >>> possibleKey.getKey()
    <music21.key.Key of B- major>
    c                ó"  — | j         dk    rt          j        d¦  «        S | j                              dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }t          j        |¦  «        S )Nz?(b:rÀ   r†   rK   r   ú?rø   ©r   r   rå   rŒ   ©r   ÚkeyStrs     r   rè   zRTOptionalKeyOpen.getKeyÍ  s{   € àŒ8�vÒÐÝ”7˜3‘<”<Ðà”X×%Ò% c¨3Ñ/Ô/ˆFØ—^’^ C¨Ñ,Ô,ˆFØ—^’^ C¨Ñ,Ô,ˆFØ—^’^ C¨Ñ,Ô,ˆFå”7˜6‘?”?Ð"r   N©r   r   r   rG   rè   r   r   r   r  r  À  s-   € € € € € ð
ð 
ð
#ð 
#ð 
#ð 
#ð 
#r   r  c                  ó   — e Zd ZdZd„ ZdS )ÚRTOptionalKeyClosea•  
    Marks the end of an optional Key area which does not affect the roman
    numeral analysis.

    For example, it is possible to analyze in Bb major, while remaining in g
    minor.

    >>> possibleKey = romanText.rtObjects.RTOptionalKeyClose('?)Bb:')
    >>> possibleKey
    <music21.romanText.rtObjects.RTOptionalKeyClose '?)Bb:'>
    >>> possibleKey.getKey()
    <music21.key.Key of B- major>
    c                ó  — | j         dv rt          j        d¦  «        S | j                              dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }t          j        |¦  «        S )N)z?)b:z?)brÀ   r†   rK   r   r  rÿ   r  r  s     r   rè   zRTOptionalKeyClose.getKeyé  s{   € àŒ8�Ð&Ð&Ý”7˜3‘<”<Ðà”X×%Ò% c¨3Ñ/Ô/ˆFØ—^’^ C¨Ñ,Ô,ˆFØ—^’^ C¨Ñ,Ô,ˆFØ—^’^ C¨Ñ,Ô,ˆFå”7˜6‘?”?Ð"r   Nr  r   r   r   r
  r
  Ú  s-   € € € € € ðð ð
#ð 
#ð 
#ð 
#ð 
#r   r
  c                  ó   — e Zd ZdZdS )ÚRTPhraseMarkerz¦
    A Phrase Marker:

    >>> rtPhraseMarker = romanText.rtObjects.RTPhraseMarker('')
    >>> rtPhraseMarker
    <music21.romanText.rtObjects.RTPhraseMarker ''>
    N©r   r   r   rG   r   r   r   r  r  ö  s   € € € € € ðð ð ð r   r  c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚRTPhraseBoundaryzˆ
    >>> phrase = romanText.rtObjects.RTPhraseBoundary('||')
    >>> phrase
    <music21.romanText.rtObjects.RTPhraseBoundary '||'>
    ú||Nc                óL   •— t          ¦   «                              ||¦  «         d S r"   rú   r¯   s      €r   r    zRTPhraseBoundary.__init__  rû   r   )r  Nr¹   rz   s   @r   r  r     óG   ø€ € € € € ðð ð)ð )ð )ð )ð )ð )ð )ð )ð )ð )r   r  c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚRTEllisonStartz„
    >>> phrase = romanText.rtObjects.RTEllisonStart('|*')
    >>> phrase
    <music21.romanText.rtObjects.RTEllisonStart '|*'>
    ú|*Nc                óL   •— t          ¦   «                              ||¦  «         d S r"   rú   r¯   s      €r   r    zRTEllisonStart.__init__  rû   r   )r  Nr¹   rz   s   @r   r  r    r  r   r  c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚRTEllisonStopz‚
    >>> phrase = romanText.rtObjects.RTEllisonStop('*|')
    >>> phrase
    <music21.romanText.rtObjects.RTEllisonStop '*|'>
    ú*|Nc                óL   •— t          ¦   «                              ||¦  «         d S r"   rú   r¯   s      €r   r    zRTEllisonStop.__init__  rû   r   )r  Nr¹   rz   s   @r   r  r    r  r   r  c                  ó   — e Zd ZdZdS )ÚRTRepeatzz
    >>> repeat = romanText.rtObjects.RTRepeat('||:')
    >>> repeat
    <music21.romanText.rtObjects.RTRepeat '||:'>
    Nr  r   r   r   r  r  !  s   € € € € € ðð ð ð r   r  c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚRTRepeatStartz‚
    >>> repeat = romanText.rtObjects.RTRepeatStart()
    >>> repeat
    <music21.romanText.rtObjects.RTRepeatStart ...'||:'>
    ú||:Nc                óL   •— t          ¦   «                              ||¦  «         d S r"   rú   r¯   s      €r   r    zRTRepeatStart.__init__0  rû   r   )r   Nr¹   rz   s   @r   r  r  )  r  r   r  c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚRTRepeatStopz€
    >>> repeat = romanText.rtObjects.RTRepeatStop()
    >>> repeat
    <music21.romanText.rtObjects.RTRepeatStop ...':||'>
    ú:||Nc                óL   •— t          ¦   «                              ||¦  «         d S r"   rú   r¯   s      €r   r    zRTRepeatStop.__init__;  rû   r   )r$  Nr¹   rz   s   @r   r#  r#  4  r  r   r#  c                  ó’   — e Zd Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Z	dd
„Z
d„ Zdd„Zed„ ¦   «         Zej        d„ ¦   «         Zd„ Zd„ ZdS )Ú	RTHandlerc                ó"   — g | _         d| _        d S r   )Ú_tokensÚcurrentLineNumberr$   s    r   r    zRTHandler.__init__D  s   € ð ˆŒØ!"ˆÔÐÐr   c                óÜ   — d}t          |¦  «        D ]5\  }}t                               |                     ¦   «         ¦  «        �|} nŒ6|€t	          d|¦  «        ‚|d|…         ||d…         fS )a!  
        Divide string into header and non-header; this is done before
        tokenization.

        >>> rth = romanText.rtObjects.RTHandler()
        >>> rth.splitAtHeader(['Title: s', 'Time Signature:', '', 'm1 g: i'])
        (['Title: s', 'Time Signature:', ''], ['m1 g: i'])
        NzKCannot find the first measure definition in this file. Dumping contexts: %s)Ú	enumerater–   r—   rQ   r
   )r   ÚlinesÚ
iStartBodyÚiÚlines        r   ÚsplitAtHeaderzRTHandler.splitAtHeaderK  s‘   € ð ˆ
Ý  Ñ'Ô'ð 	ð 	‰GˆAˆtÝ×!Ò! $§*¢*¡,¤,Ñ/Ô/Ð;à�
Ø�ð <ð ÐÝ$ð &>Ø?DñFô Fð Fà�[�j�[Ô! 5¨¨¨Ô#5Ð5Ð5r   c                óô   — g }t          |¦  «        D ]N\  }}|                     ¦   «         }|dk    rŒ t          |¦  «        }|dz   |_        |                     |¦  «         ŒOt          |¦  «        dz   | _        |S )z˜
        In the header, we only have :class:`~music21.romanText.base.RTTagged`
        tokens. We can this process these all as the same class.
        r   rL   )r,  rQ   rI   r   rŠ   r£   r*  )r   r-  rÜ   r/  r0  Úrtts         r   ÚtokenizeHeaderzRTHandler.tokenizeHeader`  s   € ð
 ˆÝ  Ñ'Ô'ð 	ð 	‰GˆAˆtØ—:’:‘<”<ˆDØ�rŠzˆzØå˜4‘.”.ˆCØ ™UˆCŒNØ�KŠK˜ÑÔÐÐÝ!$ U¡¤¨a¡ˆÔØˆr   c           
     óR  — g }| j         }t          |¦  «        D �]\  }}||z   }	 |                     ¦   «         }|dk    rŒ't                               |¦  «        �^t          |¦  «        }||_        |                      |j        |¬¦  «        |_	        |j	        D ]	}||_        Œ
| 
                    |¦  «         n+t          |¦  «        }	||	_        | 
                    |	¦  «         ŒË# t          $ r6}
ddl}|                     ¦   «         }t          d|› d|› d|› �¦  «        |
‚d}
~
ww xY w|S )z�
        In the body, we may have measure, time signature, or note
        declarations, as well as possible other tagged definitions.
        r   N)r®   r   zAt line z (z) an exception was raised:
)r*  r,  rQ   r–   r—   r|   r   ÚtokenizeAtomsrO   rƒ   rŠ   rI   Ú	ExceptionÚ	tracebackÚ
format_excr   )r   r-  rÜ   ÚstartLineNumberr/  r0  r*  ÚrtmÚar3  Úexcr8  ÚtracebackMessages                r   ÚtokenizeBodyzRTHandler.tokenizeBodyq  ss  € ð
 ˆØÔ0ˆÝ  Ñ'Ô'ð 	ñ 	‰GˆAˆtØ /°!Ñ 3ÐðØ—z’z‘|”|�Ø˜2’:�:Øå×%Ò% dÑ+Ô+Ð7Ý# D™/œ/�CØ%6�C”Nà $× 2Ò 2°3´8ÀsÐ 2Ñ KÔ K�C”IØ œYð 9ð 9˜Ø'8˜œ˜Ø—K’K Ñ$Ô$Ð$Ð$õ # 4™.œ.�CØ%6�C”NØ—K’K Ñ$Ô$Ð$øøÝð ð ð Ø Ð Ð Ð Ø#,×#7Ò#7Ñ#9Ô#9Ð Ý(ð*Ð0ð *ð *°Dð *ð *Ø'ð*ð *ñô ð ðøøøøðøøøð ˆs   ¥C$Á B#C$Ã$
D$Ã.1DÄD$Nc                ó4  — g }|                      d¦  «        D �]þ}|                     ¦   «         }|dk    rŒ|dk    r �nÙ|dk    r$|                     t          ||¦  «        ¦  «         ŒQ|dk    r$|                     t	          ||¦  «        ¦  «         Œ{|dk    r$|                     t          ||¦  «        ¦  «         Œ¥t                               |¦  «        �$|                     t          ||¦  «        ¦  «         Œãt                               |¦  «        �%|                     t          ||¦  «        ¦  «         �Œ"t                               |¦  «        �%|                     t          ||¦  «        ¦  «         �Œat                               |¦  «        �%|                     t          ||¦  «        ¦  «         �Œ t                               |¦  «        �%|                     t!          ||¦  «        ¦  «         �Œßt"                               |¦  «        �%|                     t%          ||¦  «        ¦  «         �Œt&                               |¦  «        �%|                     t)          ||¦  «        ¦  «         �Œ]t*                               |¦  «        �%|                     t-          ||¦  «        ¦  «         �Œœt.                               |¦  «        �%|                     t1          ||¦  «        ¦  «         �ŒÛ|                     t3          ||¦  «        ¦  «         �Œ |S )a´	  
        Given a line of data stored in measure consisting only of Atoms,
        tokenize and return a list.

        >>> rth = romanText.rtObjects.RTHandler()
        >>> rth.tokenizeAtoms('IV b3 ii7 b4 ii')
        [<music21.romanText.rtObjects.RTChord 'IV'>,
         <music21.romanText.rtObjects.RTBeat 'b3'>,
         <music21.romanText.rtObjects.RTChord 'ii7'>,
         <music21.romanText.rtObjects.RTBeat 'b4'>,
         <music21.romanText.rtObjects.RTChord 'ii'>]

        >>> rth.tokenizeAtoms('V7 b2 V13 b3 V7 iio6/5[no5]')
        [<music21.romanText.rtObjects.RTChord 'V7'>,
         <music21.romanText.rtObjects.RTBeat 'b2'>,
         <music21.romanText.rtObjects.RTChord 'V13'>,
         <music21.romanText.rtObjects.RTBeat 'b3'>,
         <music21.romanText.rtObjects.RTChord 'V7'>,
         <music21.romanText.rtObjects.RTChord 'iio6/5[no5]'>]

        >>> tokenList = rth.tokenizeAtoms('I b2 I b2.25 V/ii b2.5 bVII b2.75 V g: IV')
        >>> tokenList
        [<music21.romanText.rtObjects.RTChord 'I'>,
         <music21.romanText.rtObjects.RTBeat 'b2'>,
         <music21.romanText.rtObjects.RTChord 'I'>,
         <music21.romanText.rtObjects.RTBeat 'b2.25'>,
         <music21.romanText.rtObjects.RTChord 'V/ii'>,
         <music21.romanText.rtObjects.RTBeat 'b2.5'>,
         <music21.romanText.rtObjects.RTChord 'bVII'>,
         <music21.romanText.rtObjects.RTBeat 'b2.75'>,
         <music21.romanText.rtObjects.RTChord 'V'>,
         <music21.romanText.rtObjects.RTAnalyticKey 'g:'>,
         <music21.romanText.rtObjects.RTChord 'IV'>]

        >>> tokenList[-2].getKey()
        <music21.key.Key of g minor>

        >>> rth.tokenizeAtoms('= m3')
        []

        >>> tokenList = rth.tokenizeAtoms('g;: ||: V b2 ?(Bb: VII7 b3 III b4 ?)Bb: i :||')
        >>> tokenList
        [<music21.romanText.rtObjects.RTKey 'g;:'>,
         <music21.romanText.rtObjects.RTRepeatStart '||:'>,
         <music21.romanText.rtObjects.RTChord 'V'>,
         <music21.romanText.rtObjects.RTBeat 'b2'>,
         <music21.romanText.rtObjects.RTOptionalKeyOpen '?(Bb:'>,
         <music21.romanText.rtObjects.RTChord 'VII7'>,
         <music21.romanText.rtObjects.RTBeat 'b3'>,
         <music21.romanText.rtObjects.RTChord 'III'>,
         <music21.romanText.rtObjects.RTBeat 'b4'>,
         <music21.romanText.rtObjects.RTOptionalKeyClose '?)Bb:'>,
         <music21.romanText.rtObjects.RTChord 'i'>,
         <music21.romanText.rtObjects.RTRepeatStop ':||'>]
        ú r   r•   r  rø   rÿ   )rˆ   rQ   rŠ   r  r÷   rþ   Ú
reBeatAtomr—   r¾   ÚreOptKeyOpenAtomr  ÚreOptKeyCloseAtomr
  Ú	reKeyAtomrî   ÚreAnalyticKeyAtomrñ   ÚreKeySignatureAtomró   ÚreRepeatStartAtomr  ÚreRepeatStopAtomr#  ÚreNoChordAtomr»   r³   )r   r0  r®   rÜ   Úwords        r   r6  zRTHandler.tokenizeAtoms•  s²  € ðp ˆà—J’J˜s‘O”Oð !	6ñ !	6ˆDØ—:’:‘<”<ˆDØ�rŠzˆzØØ˜’�à‘Ø˜’�Ø—’Õ,¨T°9Ñ=Ô=Ñ>Ô>Ð>Ð>Ø˜’�Ø—’�L¨¨yÑ9Ô9Ñ:Ô:Ð:Ð:Ø˜’�Ø—’�M¨$°	Ñ:Ô:Ñ;Ô;Ð;Ð;Ý×!Ò! $Ñ'Ô'Ð3Ø—’�F 4¨Ñ3Ô3Ñ4Ô4Ð4Ð4å!×'Ò'¨Ñ-Ô-Ð9Ø—’Õ-¨d°IÑ>Ô>Ñ?Ô?Ð?Ñ?Ý"×(Ò(¨Ñ.Ô.Ð:Ø—’Õ.¨t°YÑ?Ô?Ñ@Ô@Ð@Ñ@Ý—’ Ñ&Ô&Ð2Ø—’�E $¨	Ñ2Ô2Ñ3Ô3Ð3Ñ3Ý"×(Ò(¨Ñ.Ô.Ð:Ø—’�M¨$°	Ñ:Ô:Ñ;Ô;Ð;Ñ;Ý#×)Ò)¨$Ñ/Ô/Ð;Ø—’�N¨4°Ñ;Ô;Ñ<Ô<Ð<Ñ<Ý"×(Ò(¨Ñ.Ô.Ð:Ø—’�M¨$°	Ñ:Ô:Ñ;Ô;Ð;Ñ;Ý!×'Ò'¨Ñ-Ô-Ð9Ø—’�L¨¨yÑ9Ô9Ñ:Ô:Ð:Ñ:Ý×$Ò$ TÑ*Ô*Ð6Ø—’�I d¨IÑ6Ô6Ñ7Ô7Ð7Ñ7à—’�G D¨)Ñ4Ô4Ñ5Ô5Ð5Ñ5Øˆr   c                óì   — |                      d¦  «        }|                      |¦  «        \  }}| xj        |                      |¦  «        z  c_        | xj        |                      |¦  «        z  c_        dS )zJ
        Walk the RT string, creating RT rtObjects along the way.
        ú
N)rˆ   r1  r)  r4  r?  )r   r   r-  ÚlinesHeaderÚ	linesBodys        r   ÚtokenizezRTHandler.tokenizeó  sk   € ð
 —	’	˜$‘”ˆØ!%×!3Ò!3°EÑ!:Ô!:Ñˆ�YàˆŒ˜×+Ò+¨KÑ8Ô8Ñ8ˆŒØˆŒ˜×)Ò)¨)Ñ4Ô4Ñ4ˆŒˆˆr   c                ó>   — g | _         |                      |¦  «         dS )z‹
        Given an entire specification as a single source string, strSrc, tokenize it.
        This is usually provided in a file.
        N)r)  rP  r   s     r   ÚprocesszRTHandler.processþ  s#   € ð
 ˆŒØ�Š�cÑÔÐÐÐr   rÃ   c                óŽ   — | j         st          d¦  «        ‚d}| j         D ]$}|                     ¦   «         r|dz  }||k    r dS Œ%dS )aP  
        Return True if more than one movement is defined in a RT file.

        >>> rth = romanText.rtObjects.RTHandler()
        >>> rth.process('Movement: 1 \n Movement: 2 \n \n m1')
        >>> rth.definesMovements()
        True
        >>> rth.process('Movement: 1 \n m1')
        >>> rth.definesMovements()
        False
        zmust create tokens firstr   rL   TF)r)  r   rA   )r   ÚcountRequiredÚcountÚts       r   ÚdefinesMovementszRTHandler.definesMovements  se   € ð Œ|ð 	AÝ$Ð%?Ñ@Ô@Ð@ØˆØ”ð 	 ð 	 ˆAØ�|Š|‰~Œ~ð  Ø˜‘
�Ø˜MÒ)Ð)Ø˜4˜4øØˆur   c                ó.   — |                       d¬¦  «        S )a  
        Return True if this handler has 1 or more movement.

        >>> rth = romanText.rtObjects.RTHandler()
        >>> rth.process('Movement: 1 \n \n m1')
        >>> rth.definesMovements()
        False
        >>> rth.definesMovement()
        True
        rL   )rT  )rW  r$   s    r   ÚdefinesMovementzRTHandler.definesMovement  s   € ð ×$Ò$°1Ð$Ñ5Ô5Ð5r   Tc                óÔ  — g }g }| j         D ]W}|                     ¦   «         r,t          ¦   «         }||_        |                     |¦  «         g }|                     |¦  «         ŒX|r*t          ¦   «         }||_        |                     |¦  «         |rVg }|d                              ¦   «         s|d         }d}nd}d}||d…         D ]}	|�||	z   }	|                     |	¦  «         Œ|}|S )a²  
        If we have movements defined, return a list of RTHandler rtObjects,
        representing header information and each movement, in order.

        >>> rth = romanText.rtObjects.RTHandler()
        >>> rth.process('Title: Test \n Movement: 1 \n m1 \n Movement: 2 \n m1')
        >>> post = rth.splitByMovement(False)
        >>> len(post)
        3

        >>> len(post[0])
        1

        >>> post[0].__class__
        <class 'music21.romanText.rtObjects.RTHandler'>
        >>> len(post[1]), len(post[2])
        (2, 2)

        >>> post = rth.splitByMovement(duplicateHeader=True)
        >>> len(post)
        2

        >>> len(post[0]), len(post[1])
        (3, 3)
        r   rL   N)r)  rA   r'  ÚtokensrŠ   rY  )
r   ÚduplicateHeaderrÜ   ÚsubrV  ÚrthÚaltÚhandlerHeadÚiStartÚhs
             r   ÚsplitByMovementzRTHandler.splitByMovement)  s  € ð6 ˆØˆØ”ð 	ð 	ˆAØ�|Š|‰~Œ~ð õ  ‘k”k�Ø �”
Ø—’˜CÑ Ô Ð Ø�Ø�JŠJ�q‰MŒMˆMˆMàð 	Ý‘+”+ˆCØˆCŒJØ�KŠK˜ÑÔÐàð 	ØˆCà˜”7×*Ò*Ñ,Ô,ð Ø" 1œg�Ø��à"�Ø�Ø˜&˜'˜'”]ð ð �ØÐ*Ø# a™�AØ—
’
˜1‘”��àˆDàˆr   c                ó<   — | j         st          d¦  «        ‚| j         S )z5
        Get or set tokens for this Handler.
        z(must process tokens before calling split)r)  r   r$   s    r   r[  zRTHandler.tokensj  s&   € ð
 Œ|ð 	QÝ$Ð%OÑPÔPÐPØŒ|Ðr   c                ó   — || _         dS )z0
        Assign tokens to this Handler.
        N)r)  )r   r[  s     r   r[  zRTHandler.tokenss  s   € ð
 ˆŒˆˆr   c                ó*   — t          | j        ¦  «        S r"   )r£   r)  r$   s    r   Ú__len__zRTHandler.__len__z  s   € Ý�4”<Ñ Ô Ð r   c                óV   — |                       ¦   «         }| j        |j        z   |_        |S )z@
        Return a new handler adding the tokens in both
        )rS   r)  r[  )r   Úotherr^  s      r   Ú__add__zRTHandler.__add__}  s(   € ð �nŠnÑÔˆØ”\ E¤MÑ1ˆŒ
Øˆ
r   r"   )rÃ   )T)r   r   r   r    r1  r4  r?  r6  rP  rR  rW  rY  rc  Úpropertyr[  Úsetterrg  rj  r   r   r   r'  r'  A  s  € € € € € ð#ð #ð #ð6ð 6ð 6ð*ð ð ð""ð "ð "ðH\ð \ð \ð \ð|	5ð 	5ð 	5ðð ð ðð ð ð ð,6ð 6ð 6ð<ð <ð <ð <ðB ðð ñ „Xðð „]ðð ñ „]ðð!ð !ð !ðð ð ð ð r   r'  c                  ó<   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚRTFilez!
    Roman Text File access.
    c                ó"   — d | _         d | _        d S r"   )ÚfileÚfilenamer$   s    r   r    zRTFile.__init__�  s   € ØˆŒ	ØˆŒˆˆr   c                ó@  — dD ]7}	 t          j        ||¬¦  «        | _        | j        � nŒ(# t          $ r Y Œ4w xY w| j        €UdD ]8}	 t          j        ||d¬¦  «        | _        | j        � nŒ)# t          $ r Y Œ5w xY w| j        €t	          d|› d�¦  «        ‚|| _        dS )	z˜
        Open a file for reading, trying a variety of encodings and then
        trying them again with an "ignore" flag if it is not possible.
        )úutf-8Ú	macintoshúlatin-1úutf-16)ÚencodingN)rs  rt  ru  rv  NÚignore)rw  ÚerrorszCannot parse file z, possibly a broken codec?)ÚioÚopenrp  ÚUnicodeDecodeErrorr
   rq  )r   rq  rw  s      r   r{  zRTFile.open‘  sÿ   € ð
 Dð 	ð 	ˆHðåœG H°xÐ@Ñ@Ô@�”	Ø”9Ð(Ø�Eð )øå%ð ð ð Ø�ðøøøàŒ9ÐØMð ð �ðå "¤¨¸8ÈHÐ UÑ UÔ U�D”IØ”yÐ,Ø˜ð -øå)ð ð ð Ø�DðøøøàŒyÐ Ý(ØM¨ÐMÐMÐMñOô Oð Oð !ˆŒˆˆs   †"+«
8·8Á#A-Á-
A:Á9A:c                ó   — || _         dS )zp
        Assign a file-like object, such as those provided by StringIO, as an
        open file object.
        N)rp  )r   ÚfileLikes     r   ÚopenFileLikezRTFile.openFileLike­  s   € ð
 ˆŒ	ˆ	ˆ	r   c                ó   — dS )Nr   r   r$   s    r   r%   zRTFile._reprInternal´  s   € Øˆrr   c                ó8   — | j                              ¦   «          d S r"   )rp  Úcloser$   s    r   r‚  zRTFile.close·  s   € ØŒ	�ŠÑÔÐÐÐr   c                óZ   — |                       | j                             ¦   «         ¦  «        S )z¤
        Read a file. Note that this calls readstr, which processes all tokens.

        If `number` is given, a work number will be extracted if possible.
        )Úreadstrrp  Úreadr$   s    r   r…  zRTFile.readº  s"   € ð �|Š|˜DœIŸNšNÑ,Ô,Ñ-Ô-Ð-r   c                óL   — t          ¦   «         }|                     |¦  «         |S )zV
        Read a string and process all Tokens. Returns a ABCHandler instance.
        )r'  rR  )r   ÚstrSrcÚhandlers      r   r„  zRTFile.readstrÂ  s$   € õ ‘+”+ˆà�Š˜ÑÔÐØˆr   N)r   r   r   rG   r    r{  r  r%   r‚  r…  r„  r   r   r   rn  rn  ˆ  s‡   € € € € € ðð ðð ð ð!ð !ð !ð8ð ð ðð ð ðð ð ð.ð .ð .ðð ð ð ð r   rn  c                  ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestc                ól   — ddl m} |j        D ]%}t          ¦   «         }|                     |¦  «        }Œ&d S )Nr   ©Ú	testFiles)Úmusic21.romanTextr�  ÚALLrn  r„  )r   r�  ÚfileStrÚfÚ
unused_rths        r   Ú
testBasicAzTest.testBasicAÐ  sK   € Ø/Ð/Ð/Ð/Ð/Ð/Ø ”}ð 	,ð 	,ˆGÝ‘”ˆAØŸš 7Ñ+Ô+ˆJˆJð	,ð 	,r   c                óD
  — t                                d¦  «        }|                      |                     ¦   «         d¦  «         |                      |                     d¦  «        d¦  «         |                      t                                d¦  «        d ¦  «         t                                d¦  «        }|                      |                     ¦   «         d¦  «         |                      |                     ¦   «         d¦  «         |                      |                     d¦  «        d¦  «         t                                d	¦  «        }|                      |                     d¦  «        d
¦  «         t                                d¦  «        }|                      |                     d¦  «        d¦  «         t                                d¦  «        }|                      |                     d¦  «        d¦  «         t                                d¦  «        }|                      |                     d¦  «        d¦  «         t                               d¦  «        }|                      |                     d¦  «        d¦  «         t                               d¦  «        }|                      |                     d¦  «        d¦  «         t                               d¦  «        }|                      |                     d¦  «        d¦  «         t                               d¦  «        }|                      |                     d¦  «        d¦  «         t                               d¦  «        }|                      |                     d¦  «        d¦  «         t                               d¦  «        }|                      |                     d¦  «        d¦  «         t                               d¦  «        }|                      |                     d¦  «        d¦  «         |                      t                               d¦  «        d ¦  «         |                      t                               d¦  «        d ¦  «         t                               d¦  «        }|                      |                     d¦  «        d¦  «         t                               d¦  «        }|                      |d ¦  «         t                               d¦  «        }|                      |                     d¦  «        d¦  «         d S )Nzm1 g: V b2 irÃ   r   Úm1zTime Signature: 2/2z	m3-4=m1-2é   úm3-4zm123-432=m1120-24234zm123-432zm231a IV6 b4 C: VÚm231azm123b-432b=m1120a-24234az
m123b-432bzm231var1 IV6 b4 C: VÚm231zvar1 IV6 b4 C: VÚvar1zBb:zF#:zf#:zb:zbb:zg:Úb2zb2.5ÚbVIIzb1.66.5)
r–   r—   ÚassertEqualr˜   rš   Ústartr™   rF  rE  rB  )r   r�   s     r   ÚtestReAzTest.testReAÖ  sø  € å×Ò˜~Ñ.Ô.ˆØ×Ò˜Ÿš™œ !Ñ$Ô$Ð$Ø×Ò˜Ÿš ™œ TÑ*Ô*Ð*à×Ò�×+Ò+Ð,AÑBÔBÀDÑIÔIÐIå×Ò˜{Ñ+Ô+ˆØ×Ò˜Ÿš™œ !Ñ$Ô$Ð$Ø×Ò˜Ÿš™œ AÑ&Ô&Ð&Ø×Ò˜Ÿš ™œ VÑ,Ô,Ð,å×ÒÐ5Ñ6Ô6ˆØ×Ò˜Ÿš ™œ ZÑ0Ô0Ð0å×ÒÐ2Ñ3Ô3ˆØ×Ò˜Ÿš ™œ WÑ-Ô-Ð-å×ÒÐ9Ñ:Ô:ˆØ×Ò˜Ÿš ™œ \Ñ2Ô2Ð2å×ÒÐ5Ñ6Ô6ˆØ×Ò˜Ÿš ™œ VÑ,Ô,Ð,õ �OŠOÐ.Ñ/Ô/ˆØ×Ò˜Ÿš ™œ VÑ,Ô,Ð,å×#Ò# EÑ*Ô*ˆØ×Ò˜Ÿš ™œ UÑ+Ô+Ð+Ý×#Ò# EÑ*Ô*ˆØ×Ò˜Ÿš ™œ UÑ+Ô+Ð+Ý×#Ò# EÑ*Ô*ˆØ×Ò˜Ÿš ™œ UÑ+Ô+Ð+Ý×#Ò# DÑ)Ô)ˆØ×Ò˜Ÿš ™œ TÑ*Ô*Ð*Ý×#Ò# EÑ*Ô*ˆØ×Ò˜Ÿš ™œ UÑ+Ô+Ð+Ý×#Ò# DÑ)Ô)ˆØ×Ò˜Ÿš ™œ TÑ*Ô*Ð*ð 	×Ò�Ÿš¨Ñ.Ô.°Ñ5Ô5Ð5Ø×Ò�Ÿš¨Ñ0Ô0°$Ñ7Ô7Ð7å×Ò˜VÑ$Ô$ˆØ×Ò˜Ÿš ™œ VÑ,Ô,Ð,å×Ò˜VÑ$Ô$ˆØ×Ò˜˜DÑ!Ô!Ð!å×Ò˜YÑ'Ô'ˆØ×Ò˜Ÿš ™œ YÑ/Ô/Ð/Ð/Ð/r   c                ó:  — t          d¦  «        }|                      |j        d¦  «         |                      |j        dg¦  «         |                      |j        d¦  «         |                      |j        d¦  «         t          d¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         t          d¦  «        }|                      |j        d	¦  «         |                      |j        d
g¦  «         |                      |j        d¦  «         |                      |j        d ¦  «         |                      |j        ¦  «         t          d¦  «        }|                      |j        d¦  «         |                      |j        dg¦  «         |                      |j        d¦  «         |                      |j        d ¦  «         |                      |j        ¦  «         t          d¦  «        }|                      |j        d¦  «         |                      |j        dg¦  «         |                      |j        d¦  «         |                      |j        d ¦  «         |  	                    |j        ¦  «         t          d¦  «        }|                      |j        d¦  «         |                      |j        ddg¦  «         |                      |j        d¦  «         |                      |j        d ¦  «         |  	                    |j        ¦  «         d S )Nz$m17var1 vi b2 IV b2.5 viio6/4 b3.5 Izvi b2 IV b2.5 viio6/4 b3.5 Ié   Úm17rL   z$m17varC vi b2 IV b2.5 viio6/4 b3.5 IÚCzm20 vi b2 ii6/5 b3 V b3.5 V7zvi b2 ii6/5 b3 V b3.5 V7é   Úm20z
m0 b3 G: Izb3 G: Ir   Úm0z	m59 = m57z= m57é;   Úm59zm3-4 = m1-2z= m1-2rÄ   r–  r—  )
r|   r�  rO   r~   rN   r€   r�   ÚassertFalser‚   Ú
assertTrue)r   r;  s     r   ÚtestMeasureAttributeProcessingz#Test.testMeasureAttributeProcessing  sÖ  € ÝÐ>Ñ?Ô?ˆØ×Ò˜œÐ#AÑBÔBÐBØ×Ò˜œ b TÑ*Ô*Ð*Ø×Ò˜œ %Ñ(Ô(Ð(Ø×Ò˜Ô*¨AÑ.Ô.Ð.åÐ>Ñ?Ô?ˆØ×Ò˜œÐ#AÑBÔBÐBØ×Ò˜Ô*¨CÑ0Ô0Ð0åÐ6Ñ7Ô7ˆØ×Ò˜œÐ#=Ñ>Ô>Ð>Ø×Ò˜œ b TÑ*Ô*Ð*Ø×Ò˜œ %Ñ(Ô(Ð(Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜Ô-Ñ.Ô.Ð.å˜Ñ%Ô%ˆØ×Ò˜œ 9Ñ-Ô-Ð-Ø×Ò˜œ a SÑ)Ô)Ð)Ø×Ò˜œ $Ñ'Ô'Ð'Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜Ô-Ñ.Ô.Ð.å˜Ñ$Ô$ˆØ×Ò˜œ 7Ñ+Ô+Ð+Ø×Ò˜œ b TÑ*Ô*Ð*Ø×Ò˜œ %Ñ(Ô(Ð(Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø�Š˜Ô,Ñ-Ô-Ð-å˜Ñ&Ô&ˆØ×Ò˜œ 8Ñ,Ô,Ð,Ø×Ò˜œ a¨ VÑ,Ô,Ð,Ø×Ò˜œ &Ñ)Ô)Ð)Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø�Š˜Ô,Ñ-Ô-Ð-Ð-Ð-r   c                ó6  — ddl m} t          ¦   «         }|                     |j        ¦  «         d}|j        D ]}|                     ¦   «         r|dz  }Œ|                      |d¦  «         |                     |j        ¦  «         d}|j        D ]}| 	                    ¦   «         r|dz  }Œ|                      |d¦  «         d}|j        D ]:}| 	                    ¦   «         r$|j
        D ]}t          |t          ¦  «        r|dz  }ŒŒ;|                      |d¦  «         d S )Nr   rŒ  rL   rÄ   é   )rŽ  r�  r'  rR  Ú
mozartK279r)  rA   r�  Úriemenschneider001r;   rƒ   rÇ   rñ   )r   r�  r^  rU  rV  r<  s         r   ÚtestTokenDefinitionzTest.testTokenDefinition4  sC  € à/Ð/Ð/Ð/Ð/Ð/å‰kŒkˆØ�Š�IÔ(Ñ)Ô)Ð)àˆØ”ð 	ð 	ˆAØ�|Š|‰~Œ~ð Ø˜‘
�øØ×Ò˜ Ñ"Ô"Ð"à�Š�IÔ0Ñ1Ô1Ð1ØˆØ”ð 	ð 	ˆAØ�{Š{‰}Œ}ð à˜‘
�øà×Ò˜ 
Ñ+Ô+Ð+àˆØ”ð 	#ð 	#ˆAØ�{Š{‰}Œ}ð #Øœð #ð #�AÝ! !¥]Ñ3Ô3ð #Ø ™
˜øøØ×Ò˜ Ñ"Ô"Ð"Ð"Ð"r   N)r   r   r   r“  rŸ  r«  r°  r   r   r   rŠ  rŠ  Î  sR   € € € € € ð,ð ,ð ,ð50ð 50ð 50ðn%.ð %.ð %.ðN#ð #ð #ð #ð #r   rŠ  Ú__main__)=rG   Ú
__future__r   rÈ   rz  ÚreÚunittestÚmusic21r   r   r   r   r   ÚEnvironmentrÍ   Úcompiler–   r™   r›   rC  rD  rE  rF  rG  rB  rH  rI  rJ  ÚMusic21Exceptionr
   r   r   ÚProtoM21Objectr   rI   r|   r¬   r³   r»   r¾   rß   rî   rñ   ró   r÷   rþ   r  r
  r  r  r  r  r  r  r#  r'  rn  ÚTestCaserŠ  r   ÚmainTestr   r   r   ú<module>r¼     s¶  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø 	€	€	€	Ø 	€	€	€	Ø €€€à Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø&ˆ{Ô&Ð'<Ñ=Ô=€ð ˆrŒzÐ8Ñ9Ô9€ØˆBŒJ�|Ñ$Ô$€	Ø�"”*˜^Ñ,Ô,€à�2”:Ð4Ñ5Ô5Ð Ø�B”JÐ6Ñ7Ô7Ð àˆBŒJÐ)Ñ*Ô*€	Ø�B”JÐ0Ñ1Ô1Ð Ø�R”Z Ñ-Ô-Ð àˆRŒZ˜Ñ$Ô$€
Ø�B”J˜xÑ(Ô(Ð Ø�2”:˜hÑ'Ô'Ð Ø�”
˜>Ñ*Ô*€ð
	ð 	ð 	ð 	ð 	˜Ô6ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�|Ô4ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	˜Ô6ñ 	ô 	ð 	ðRð Rð Rð Rð RˆgÔ$ñ Rô Rð RðjEð Eð Eð Eð Eˆwñ Eô Eð EðD
P3ð P3ð P3ð P3ð P3�ñ P3ô P3ð P3ðfð ð ð ð ˆWñ ô ð ð>"ð "ð "ð "ð "ˆfñ "ô "ð "ð&"ð "ð "ð "ð "�ñ "ô "ð "ð2Dð Dð Dð Dð DˆVñ Dô Dð DðN.ð .ð .ð .ð .�Fñ .ô .ð .ð:ð ð ð ð ˆMñ ô ð ð<ð ð ð ð �Mñ ô ð ð,+ð +ð +ð +ð +�Vñ +ô +ð +ð0	)ð 	)ð 	)ð 	)ð 	)�6ñ 	)ô 	)ð 	)ð	)ð 	)ð 	)ð 	)ð 	)�Fñ 	)ô 	)ð 	)ð#ð #ð #ð #ð #˜ñ #ô #ð #ð4#ð #ð #ð #ð #˜ñ #ô #ð #ð8ð ð ð ð �Vñ ô ð ð)ð )ð )ð )ð )�~ñ )ô )ð )ð)ð )ð )ð )ð )�^ñ )ô )ð )ð)ð )ð )ð )ð )�Nñ )ô )ð )ðð ð ð ð ˆvñ ô ð ð)ð )ð )ð )ð )�Hñ )ô )ð )ð)ð )ð )ð )ð )�8ñ )ô )ð )ðBð Bð Bð Bð Bñ Bô Bð BðN
Að Að Að Að AˆWÔ#ñ Aô Að AðLB#ð B#ð B#ð B#ð B#ˆ8Ôñ B#ô B#ð B#ðR ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   