§
    „Ø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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 ddlmZ ddlmZ  ej        ¦   «         Z ej        i de“de“de“de“de“de“de“de“de“de“de“de“de“de“de“de“¦  «        Z ej        d¦  «        Zd„ Z  ej        eee eeeeeeeeeeeed œ¦  «        Z!ee!d!œZ"d"Z#d#Z$e#e$d!œZ% G d$„ d%¦  «        Z& G d&„ d'e&¦  «        Z' G d(„ d)e&¦  «        Z( G d*„ d+¦  «        Z) G d,„ d-¦  «        Z*dGd2„Z+dHd4„Z,dId6„Z-dJd9„Z.dKdLd?„Z/dMdNdB„Z0dOdC„Z1 G dD„ dEej2        ¦  «        Z3e4dFk    rddlZ ej5        e3¦  «         dS dS )Pz�
Converter for parsing the tabular representations of harmonic analysis such as the
DCMLab's Annotated Beethoven Corpus (Neuwirth et al. 2018).
é    )ÚannotationsN©Úchord)Úcommon)Úenvironment)Úharmony)Úkey)Úmetadata)Úmeter)Úroman)Úspanner)Ústreamr   ÚaltchordÚmeasureÚbeatÚtotbeatÚtimesigÚlengthÚ
global_keyÚ	local_keyÚpedalÚnumeralÚformÚfigbassÚchangesÚrelativerootÚ	phraseendz1(?P<numer>\d+(?:\.\d+)?)/(?P<denom>\d+(?:\.\d+)?)c                ó   — 	 t          | ¦  «        S # t          $ rb t          j        t          | ¦  «        }t          |                     d¦  «        ¦  «        t          |                     d¦  «        ¦  «        z  cY S w xY w)NÚnumerÚdenom)ÚfloatÚ
ValueErrorÚreÚmatchÚMN_ONSET_REGEXÚgroup)ÚvalueÚms     ú“/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/romanText/tsvConverter.pyÚ_float_or_fracr*   B   s}   € ðAÝ�U‰|Œ|ÐøÝð Að Að AÝŒH•^ UÑ+Ô+ˆÝ�Q—W’W˜WÑ%Ô%Ñ&Ô&­¨q¯wªw°wÑ/?Ô/?Ñ)@Ô)@Ñ@Ð@Ð@Ð@ðAøøøs   ‚ ‘A)A=Á<A=)r   ÚmnÚmn_onsetr   ÚvoltaÚ	globalkeyÚlocalkeyr   r   r   r   r   r   r   Úlabel©é   é   )r   r   r   r   r   r   ÚopÚnoÚmovr   r   r   r   r   r   r   r   r   r   )Úmcr+   Úmc_onsetr,   r   ÚstaffÚvoicer-   r0   r.   r/   r   r   Úspecialr   r   r   r   r   Úcadencer   Ú
chord_typeÚglobalkey_is_minorÚlocalkey_is_minorÚchord_tonesÚadded_tonesÚrootÚ	bass_notec                  óv   ‡ — e Zd ZdZdˆ fd„Zedd„¦   «         Zej        dd„¦   «         Zdd	„Zdd„Z	dd„Z
ˆ xZS )ÚTabChordBasez|
    Abstract base class for intermediate representation format for moving
    between tabular data and music21 chords.
    ÚreturnÚNonec                ó(  •— t          ¦   «                              ¦   «          d| _        d | _        d | _        i | _        d| _        d| _        d| _        d | _	        d | _
        d | _        d | _        d | _        d| _        d| _        d| _        d| _        d S )NÚ éÿÿÿÿç      ð?r2   )ÚsuperÚ__init__r   r   ÚrepresentationTypeÚextraÚdcml_versionr   r   r   r   r   r   r   r   r   r   r   ©ÚselfÚ	__class__s    €r)   rM   zTabChordBase.__init__£   s”   ø€ Ý‰Œ×ÒÑÔÐØˆŒØ&*ˆÔØ,0ˆÔØ%'ˆŒ
ØˆÔð ˆŒ
ØˆŒØ#ˆŒ
Ø"ˆŒ	Ø!%ˆŒØ!%ˆŒØ#'ˆŒð !ˆŒØ!ˆŒØˆŒ	ØˆŒˆˆó    Ústrc                ó   — | j         S )aÃ  
        For easier interoperability with the DCML standards, we now use the
        column name 'chord' from the DCML file. But to preserve backwards-
        compatibility, we add this property, which is an alias for 'chord'.

        >>> tabCd = romanText.tsvConverter.TabChord()
        >>> tabCd.chord = 'viio7'
        >>> tabCd.combinedChord
        'viio7'
        >>> tabCd.combinedChord = 'IV+'
        >>> tabCd.chord
        'IV+'
        r   ©rR   s    r)   ÚcombinedChordzTabChordBase.combinedChord»   s   € ð ŒzÐrT   r'   c                ó   — || _         d S ©Nr   )rR   r'   s     r)   rX   zTabChordBase.combinedChordÌ   s   € àˆŒ
ˆ
ˆ
rT   c                óÎ  — | j         dk    r
d}d| _         n$| j         dk    r
d}d| _         nt          d¦  «        ‚t          | j        t	          | j        ¦  «        |¬¦  «        | _        |dk    rÃ| j        �| j                             dd	¦  «        nd| _        | j        d
k    r�| j	                             dd	¦  «        | _	        t          | j	        ¦  «        | _	        | j                             dd¦  «        dk    r7| j        dk    r,t          j        dd| j	        t          j        ¬¦  «        | _	        t	          | j        ¦  «        r‘| j        rlt	          | j        ¦  «        r:t          | j        d|¬¦  «        | _        t          | j        d|¬¦  «        | _        dS t          | j        d|¬¦  «        | _        dS t          | j        d|¬¦  «        | _        dS | j        rlt	          | j        ¦  «        r:t          | j        d|¬¦  «        | _        t          | j        d|¬¦  «        | _        dS t          | j        d|¬¦  «        | _        dS t          | j        d|¬¦  «        | _        dS )už  
        Converts the representationType of a TabChordBase subclass between the
        music21 and DCML conventions.

        To demonstrate, let's set up a dummy TabChordV2().

        >>> tabCd = romanText.tsvConverter.TabChordV2()
        >>> tabCd.global_key = 'F'
        >>> tabCd.local_key = 'vi'
        >>> tabCd.numeral = 'ii'
        >>> tabCd.chord = 'ii%7(6)'
        >>> tabCd.representationType = 'DCML'

        >>> tabCd.representationType
        'DCML'

        >>> tabCd.chord
        'ii%7(6)'

        >>> tabCd._changeRepresentation()
        >>> tabCd.representationType
        'm21'

        >>> tabCd.chord
        'iiÃ¸7[no5][add6]'
        Úm21úm21-DCMLÚDCMLúDCML-m21z@Data source must specify representation type as 'm21' or 'DCML'.©ÚminorÚ	directionNú%õ   Ã¸r3   r=   rI   ÚMm7ÚVz¦
                            (\d+)  # match one or more digits
                            (?![]\d])  # without a digit or a ']' to the right
                        zd\1)ÚflagsTF)rN   r"   ÚcharacterSwapsr   ÚisMinorr   r   ÚreplacerP   r   ÚhandleAddedTonesrO   Úgetr   r#   ÚsubÚVERBOSEr   )rR   rb   s     r)   Ú_changeRepresentationz"TabChordBase._changeRepresentationÐ   sÝ  € ð8 Ô" eÒ+Ð+Ø"ˆIØ&,ˆDÔ#Ð#àÔ$¨Ò.Ð.Ø"ˆIØ&+ˆDÔ#Ð#õ Ð_Ñ`Ô`Ð`å'¨¬Ý.5°d´oÑ.FÔ.FØ2;ð=ñ =ô =ˆŒð ˜
Ò"Ð"Ø8<¼	Ð8M˜œ	×)Ò)¨#¨tÑ4Ô4Ð4ÐSWˆDŒIØÔ  AÒ%Ð%Ø!œZ×/Ò/°°TÑ:Ô:�”
Ý-¨d¬jÑ9Ô9�”
ð ”J—N’N <°Ñ4Ô4¸Ò=Ð=Øœ¨Ò+Ð+õ "$¤ðð Øœ
Ý œjð"*ñ "*ô "*�D”Jõ �4”>Ñ"Ô"ð !	CØÔ ð CÝ˜4Ô,Ñ-Ô-ð 
LÝ(6°tÔ7HØ=AØAJð)Lñ )Lô )L�DÔ%õ $2°$´,Ø8<Ø<Eð$Gñ $Gô $G�D”L�L�Lõ )7°tÔ7HØ=BØAJð)Lñ )Lô )L�DÔ%Ð%Ð%õ  .¨d¬lØ48Ø8Að Cñ  Cô  C�”��ð Ô ð CÝ˜4Ô,Ñ-Ô-ð 
LÝ(6°tÔ7HØ=BØAJð)Lñ )Lô )L�DÔ%õ $2°$´,Ø8<Ø<Eð$Gñ $Gô $G�D”L�L�Lõ )7°tÔ7HØ=BØAJð)Lñ )Lô )L�DÔ%Ð%Ð%õ  .¨d¬lØ49Ø8Að Cñ  Cô  C�”��rT   úharmony.Harmonyc                ó–  — | j         dk    r|                      ¦   «          | j        dv rt          j        ¦   «         }�n„| j        dk    r| j        r| j        }nEd                     d„ | j        | j        | j	        fD ¦   «         ¦  «        }| j
        r|d| j
        z   z  }| j        �@t          j        d| j        t          j        ¦  «        rt          | j        | j        ¦  «        }n| j        }t#          j        ||t"          j        j        t"          j        j        ¬	¦  «        }t+          | t,          ¦  «        ro| j                             d
d¦  «        |j        _        | j                             dd¦  «        |j        _        | j                             dd¦  «        |j        _        | j        |j        _        d|j        _        d|_        |S )an  
        Creates and returns a music21.roman.RomanNumeral() object
        from a TabChord with all shared attributes.
        NB: call changeRepresentation() first if .representationType is not 'm21'
        but you plan to process it with m21 (e.g. moving it into a stream).

        >>> tabCd = romanText.tsvConverter.TabChord()
        >>> tabCd.numeral = 'vii'
        >>> tabCd.global_key = 'F'
        >>> tabCd.local_key = 'V'
        >>> tabCd.representationType = 'm21'
        >>> m21Ch = tabCd.tabToM21()

        Now we can check it's a music21 RomanNumeral():

        >>> m21Ch.figure
        'vii'
        r^   )ú@noneNr3   rI   c              3  ó   K  — | ]}|¯|V — Œ	d S rZ   © )Ú.0Úattrs     r)   ú	<genexpr>z(TabChordBase.tabToM21.<locals>.<genexpr>S  s<   è è € ð #ð #Ø!ÐPTð#Øð#ð #ð #ð #ð #ð #rT   ú/Nz.*(i*v|v?i+).*©Ú
sixthMinorÚseventhMinorr4   r5   r6   ç        ) rN   ro   r   r   ÚNoChordrP   r   Újoinr   r   r   r   r#   r$   Ú
IGNORECASEÚgetLocalKeyr   r   ÚRomanNumeralÚMinor67DefaultÚFLATÚ
isinstanceÚTabChordrO   rl   Ú	editorialr4   r5   r6   r   r   ÚquarterLength)rR   Ú	thisEntryÚcombinedÚlocalKeyNonRomans       r)   ÚtabToM21zTabChordBase.tabToM216  sÁ  € ð& Ô" fÒ,Ð,Ø×&Ò&Ñ(Ô(Ð(ØŒ<˜?Ð*Ð*Ý)0¬Ñ):Ô):ˆI‰IàÔ  AÒ%Ð%¨$¬*Ð%Øœ:��ð Ÿ7š7ð #ð #Ø&*¤l°D´I¸t¼|Ð%Lð#ñ #ô #ñ ô �ð Ô$ð 8Ø  dÔ&7Ñ 7Ñ7�HØŒ~Ð)­b¬hØ! 4¤>µ2´=ñ/ô /Ð)õ
 $/¨t¬~¸t¼Ñ#OÔ#OÐ Ð ð $(¤>Ð ÝÔ*ØØ Ý Ô/Ô4Ý"Ô1Ô6ð	ñ ô ˆIõ ˜$¥Ñ)Ô)ð Dð *.¬¯ª¸¸bÑ)AÔ)A�	Ô#Ô&Ø)-¬¯ª¸¸bÑ)AÔ)A�	Ô#Ô&Ø*.¬*¯.ª.¸ÀÑ*CÔ*C�	Ô#Ô'à(,¬
ˆIÔÔ%Ø,0ˆIÔÔ)ð #&ˆ	ÔØÐrT   Úrowú	list[str]ÚheadIndicesúdict[str, tuple[int, type]]ÚextraIndicesúdict[int, str]c           	     óî   ‡— |                      ¦   «         D ]9\  }\  }}t          | |¦  «        sŒt          | | |‰|         ¦  «        ¦  «         Œ:ˆfd„|                      ¦   «         D ¦   «         | _        d S )Nc                ó8   •— i | ]\  }}‰|         ¯|‰|         “ŒS rt   rt   )ru   ÚiÚcol_namerŒ   s      €r)   ú
<dictcomp>z0TabChordBase.populateFromRow.<locals>.<dictcomp>‡  s<   ø€ ð 
ð 
ð 
Ù!,  HÈÈAÌð
Ø�c˜!”fð
ð 
ð 
rT   )ÚitemsÚhasattrÚsetattrrO   )rR   rŒ   rŽ   r�   r•   r”   Útype_to_coerce_tos    `     r)   ÚpopulateFromRowzTabChordBase.populateFromRowx  s¢   ø€ ð 1<×0AÒ0AÑ0CÔ0Cð 	Cð 	CÑ,ˆHÑ,�qÐ+Ý˜4 Ñ*Ô*ð CØå˜˜hÐ(9Ð(9¸#¸a¼&Ñ(AÔ(AÑBÔBÐBÐBð
ð 
ð 
ð 
Ø0<×0BÒ0BÑ0DÔ0Dð
ñ 
ô 
ˆŒ
ˆ
ˆ
rT   ©rF   rG   ©rF   rU   )r'   rU   )rF   rp   )rŒ   r�   rŽ   r�   r�   r‘   rF   rG   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rM   ÚpropertyrX   Úsetterro   r‹   r›   Ú__classcell__©rS   s   @r)   rE   rE   �   sÕ   ø€ € € € € ðð ð
ð ð ð ð ð ð0 ðð ð ñ „Xðð  Ôðð ð ñ ÔððdCð dCð dCð dCðL@ð @ð @ð @ðD
ð 
ð 
ð 
ð 
ð 
ð 
ð 
rT   rE   c                  ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )r…   zr
    An intermediate representation format for moving between tabular data in
    DCML v1 and music21 chords.
    rF   rG   c                ó€   •— t          ¦   «                              ¦   «          d | _        d | _        d | _        d| _        d S )Nr2   )rL   rM   r   r   r   rP   rQ   s    €r)   rM   zTabChord.__init__�  s<   ø€ å‰Œ×ÒÑÔÐØ"&ˆŒØ!%ˆŒØ59ˆŒØ!"ˆÔÐÐrT   rœ   )rž   rŸ   r    r¡   rM   r¤   r¥   s   @r)   r…   r…   ‹  sG   ø€ € € € € ðð ð#ð #ð #ð #ð #ð #ð #ð #ð #ð #rT   r…   c                  ó  ‡ — e Zd ZdZdˆ fd„Zedd„¦   «         Zej        dd„¦   «         Zedd
„¦   «         Zej        dd„¦   «         Zedd„¦   «         Z	e	j        dd„¦   «         Z	edd„¦   «         Z
e
j        dd„¦   «         Z
ˆ xZS )Ú
TabChordV2zr
    An intermediate representation format for moving between tabular data in
    DCML v2 and music21 chords.
    rF   rG   c                óœ   •— t          ¦   «                              ¦   «          d| _        d| _        d| _        d| _        d| _        d| _        d S )Nr   r|   rI   r3   )rL   rM   r+   r,   r-   r.   r/   rP   rQ   s    €r)   rM   zTabChordV2.__init__�  sJ   ø€ å‰Œ×ÒÑÔÐØˆŒØ"ˆŒØˆŒ
Ø ˆŒØˆŒØ!"ˆÔÐÐrT   r!   c                ó   — | j         dz  dz   S )a,  
        'beat' has been removed from DCML v2 in favor of 'mn_onset' and
        'mc_onset'. 'mn_onset' is equivalent to 'beat', except that 'mn_onset'
        is zero-indexed where 'beat' was 1-indexed, and 'mn_onset' is in
        fractions of a whole-note rather than in quarter notes.

        >>> tabCd = romanText.tsvConverter.TabChordV2()
        >>> tabCd.mn_onset = 0.0
        >>> tabCd.beat
        1.0

        >>> tabCd.mn_onset = 0.5
        >>> tabCd.beat
        3.0

        >>> tabCd.beat = 1.5
        >>> tabCd.beat
        1.5
        ç      @rK   ©r,   rW   s    r)   r   zTabChordV2.beat§  s   € ð. Œ}˜sÑ" SÑ(Ð(rT   r   c                ó(   — |�|dz
  dz  nd | _         d S )NrK   r¬   r­   )rR   r   s     r)   r   zTabChordV2.beatÀ  s    € à.2Ð.>˜ ™ sÑ*Ð*ÀDˆŒˆˆrT   Úintc                ó*   — t          | j        ¦  «        S )z§
        'measure' has been removed from DCML v2 in favor of 'mn' and 'mc'. 'mn'
        is equivalent to 'measure', so this property is provided as an alias.
        ©r¯   r+   rW   s    r)   r   zTabChordV2.measureÄ  s   € õ �4”7‰|Œ|ÐrT   r   c                ó6   — |�t          |¦  «        nd | _        d S rZ   r±   )rR   r   s     r)   r   zTabChordV2.measureÌ  s   € à")Ð"5•#�g‘,”,�,¸4ˆŒˆˆrT   rU   c                ó   — | j         S )zÇ
        'local_key' has been renamed 'localkey' in DCML v2. This property is
        provided as an alias for 'localkey' so that TabChord and TabChordV2 can
        be used in the same way.
        ©r/   rW   s    r)   r   zTabChordV2.local_keyÐ  s   € ð Œ}ÐrT   Úkc                ó   — || _         d S rZ   r´   ©rR   rµ   s     r)   r   zTabChordV2.local_keyÙ  s   € àˆŒˆˆrT   c                ó   — | j         S )zÊ
        'global_key' has been renamed 'globalkey' in DCML v2. This property is
        provided as an alias for 'globalkey' so that TabChord and TabChordV2 can
        be used in the same way.
        ©r.   rW   s    r)   r   zTabChordV2.global_keyÝ  s   € ð Œ~ÐrT   c                ó   — || _         d S rZ   r¹   r·   s     r)   r   zTabChordV2.global_keyæ  s   € àˆŒˆˆrT   rœ   )rF   r!   )r   r!   )rF   r¯   )r   r¯   r�   )rµ   rU   )rž   rŸ   r    r¡   rM   r¢   r   r£   r   r   r   r¤   r¥   s   @r)   r©   r©   ˜  s[  ø€ € € € € ðð ð#ð #ð #ð #ð #ð #ð ð)ð )ð )ñ „Xð)ð0 
„[ðIð Ið Iñ „[ðIð ðð ð ñ „Xðð „^ð@ð @ð @ñ „^ð@ð ðð ð ñ „Xðð Ôðð ð ñ Ôðð ðð ð ñ „Xðð Ôðð ð ñ Ôðð ð ð ð rT   r©   c                  óL   — e Zd ZdZddd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dS )Ú
TsvHandleraû  
    Conversion starting with a TSV file.

    First we need to get a score. (Don't worry about this bit.)

    >>> name = 'tsvEg_v1.tsv'
    >>> path = common.getSourceFilePath() / 'romanText' / name
    >>> handler = romanText.tsvConverter.TsvHandler(path)
    >>> handler.tsvToChords()

    These should be TabChords now.

    >>> testTabChord1 = handler.chordList[0]
    >>> testTabChord1.combinedChord
    '.C.I6'

    Good. We can make them into music21 Roman-numerals.

    >>> m21Chord1 = testTabChord1.tabToM21()
    >>> m21Chord1.figure
    'I'

    And for our last trick, we can put the whole collection in a music21 stream.

    >>> out_stream = handler.toM21Stream()
    >>> out_stream.parts[0].measure(1)[roman.RomanNumeral][0].figure
    'I'

    r2   ÚtsvFileústr | pathlib.PathrP   r¯   c                óF  — |dk    rt           d         | _        t          | _        n8|dk    rt           d         | _        t          | _        nt          d|› d�¦  «        ‚|| _        g | _        d | _        i | _	        i | _
        || _        |                      ¦   «         | _        d S ©Nr2   r3   zdcml_version z is not in (1, 2))ÚHEADERSÚheading_namesr…   Ú_tab_chord_clsr©   r"   ÚtsvFileNameÚ	chordListÚ	m21streamÚ_head_indicesÚ_extra_indicesrP   Ú
_importTsvÚtsvData)rR   r½   rP   s      r)   rM   zTsvHandler.__init__  s£   € Ø˜1ÒÐÝ!(¨¤ˆDÔÝ6>ˆDÔÐØ˜QÒÐÝ!(¨¤ˆDÔÝ",ˆDÔÐåÐL¨\ÐLÐLÐLÑMÔMÐMØ"ˆÔØ-/ˆŒØ,0ˆŒØ@BˆÔØ.0ˆÔØ(ˆÔØ—’Ñ(Ô(ˆŒˆˆrT   Ú
header_rowr�   rF   rG   c                ó¦   — i | _         i | _        t          |¦  «        D ]2\  }}|| j        v r| j        |         }||f| j         |<   Œ(|| j        |<   Œ3dS )a  
        Private method to get column name/column index correspondences.

        Expected column indices (those in HEADERS, which correspond to TabChord
        attributes) are stored in self._head_indices. Others go in
        self._extra_indices.
        N)rÇ   rÈ   Ú	enumeraterÂ   )rR   rË   r”   r•   Útype_to_coerce_col_tos        r)   Ú_get_heading_indiceszTsvHandler._get_heading_indices  s{   € ð  ˆÔØ ˆÔÝ$ ZÑ0Ô0ð 	2ð 	2‰KˆAˆxØ˜4Ô-Ð-Ð-Ø(,Ô(:¸8Ô(DÐ%Ø01Ð3HÐ/I�Ô" 8Ñ,Ð,à)1�Ô# AÑ&Ð&ð	2ð 	2rT   úlist[list[str]]c                óø   — | j         }t          |dd¬¦  «        5 }t          j        |dd¬¦  «        }|                      t          |¦  «        ¦  «         t          |¦  «        cddd¦  «         S # 1 swxY w Y   dS )z?
        Imports TSV file data for further processing.
        Úrúutf-8)Úencodingú	ú")Ú	delimiterÚ	quotecharN)rÄ   ÚopenÚcsvÚreaderrÏ   ÚnextÚlist)rR   ÚfileNameÚfÚ	tsvreaders       r)   rÉ   zTsvHandler._importTsv-  s»   € ð
 Ô#ˆå�(˜C¨'Ð2Ñ2Ô2ð 	#°aÝœ
 1°ÀÐDÑDÔDˆIà×%Ò%¥d¨9¡o¤oÑ6Ô6Ð6Ý˜	‘?”?ð		#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð 	#ð 	#s   šAA/Á/A3Á6A3rŒ   rE   c                ó~   — |                       ¦   «         }|                     || j        | j        ¦  «         d|_        |S )z•
        Makes a TabChord out of a list imported from TSV data
        (a row of the original tabular format -- see TsvHandler.importTsv()).
        r^   )rÃ   r›   rÇ   rÈ   rN   )rR   rŒ   rˆ   s      r)   Ú_makeTabChordzTsvHandler._makeTabChord:  sA   € ð ×'Ò'Ñ)Ô)ˆ	Ø×!Ò! # tÔ'9¸4Ô;NÑOÔOÐOØ'-ˆ	Ô$àÐrT   c                ó�   — | j         }g | _        |D ]4}|                      |¦  «        }|€Œ| j                             |¦  «         Œ5dS )z�
        Converts a list of lists (of the type imported by importTsv)
        into TabChords (i.e. a list of TabChords).
        N)rÊ   rÅ   râ   Úappend)rR   ÚdataÚentryrˆ   s       r)   ÚtsvToChordszTsvHandler.tsvToChordsF  s`   € ð Œ|ˆàˆŒàð 	1ð 	1ˆEØ×*Ò*¨5Ñ1Ô1ˆIØÐ Øà”×%Ò% iÑ0Ô0Ð0Ð0ð	1ð 	1rT   ústream.Scorec                óN  — | j         s|                      ¦   «          |                      ¦   «         }|j                             ¦   «         }|€|S | j         D ]Ï}|j        dz
  }t          |t          ¦  «        r8|j        r1|j	        › t          j        t          |j        ¦  «        dz
           › �}n|j	        }| 	                    |¦  «        }|€t          d¦  «        ‚|                     ¦   «         }|j                             |j        ¦  «         |                     ||¦  «         ŒÐ|                     ¦   «                              t*          j        d¬¦  «         |t*          j                                      ¦   «         }|�!|j        |j        j        z
  |j        z
  |_        || _        |S )au  
        Takes a list of TabChords (self.chordList, prepared by .tsvToChords()),
        converts those TabChords in RomanNumerals
        (converting to the music21 representation format as necessary),
        creates a suitable music21 stream (by running .prepStream() using data from the TabChords),
        and populates that stream with the new RomanNumerals.
        Nr2   zm21Measure should not be NoneT)ÚinPlace)rÅ   rç   Ú
prepStreamÚpartsÚfirstr   r„   r©   r-   r   ÚstringÚascii_lowercaser¯   r"   r‹   r†   ÚupdaterO   ÚinsertÚflattenÚextendDurationr   ÚHarmonyÚlastr‡   Ú
activeSiteÚoffsetrÆ   )	rR   ÚsÚpÚ	thisChordÚoffsetInMeasureÚmeasureNumberÚ
m21MeasureÚthisM21ChordÚlast_harmonys	            r)   ÚtoM21StreamzTsvHandler.toM21StreamW  s’  € ð Œ~ð 	Ø×ÒÑÔÐà�OŠOÑÔˆØŒG�MŠM‰OŒOˆàˆ9àˆHàœð 	=ð 	=ˆIØ'œn¨qÑ0ˆOÝ˜)¥ZÑ0Ô0ð 2°Y´_ð 2à Ô(Ð\­&Ô*@ÅÀYÄ_ÑAUÔAUÐXYÑAYÔ*ZÐ\Ð\ð �ð !*Ô 1�ØŸš =Ñ1Ô1ˆJØÐ!Ý Ð!@ÑAÔAÐAà$×-Ò-Ñ/Ô/ˆLàÔ"×)Ò)¨)¬/Ñ:Ô:Ð:à×Ò˜o¨|Ñ<Ô<Ð<Ð<à	�	Š	‰Œ×"Ò"¥7¤?¸DÐ"ÑAÔAÐAØ�œÔ)×.Ò.Ñ0Ô0ˆØÐ#à” ,Ô"9Ô"@Ñ@À<ÔCVÑVð Ô&ð ˆŒØˆrT   c                óZ  — t          j        ¦   «         }t          j        ¦   «         }d}| j        dk    �r|                     dt          j        ¦   «         ¦  «         | j        d         }g }d|j        v r9|j        d         |j        _	        | 
                    d|j        j	        z   ¦  «         d|j        v r9|j        d         |j        _        | 
                    d|j        j        z   ¦  «         d|j        v r9|j        d         |j        _        | 
                    d	|j        j        z   ¦  «         |rd
                     |¦  «        |j        _        t          | j        d         j        ¦  «        }t#          j        |¦  «        }t          | j        d         j        ¦  «        }t)          j        |¦  «        }	|	j        j        }
d}| j        d         j        dz
  }d}d}| j        D �]Ü}t3          |t4          ¦  «        rM|j        |k    rB|j        r1t9          j        |j        ¬¦  «        }|                     d|¦  «         nd}|j        }n|j        |k    rŒq|j        |dz   k    r\t=          |dz   |j        dz   ¦  «        D ]?}t          j        |¬¦  «        }||
z   |_         |                     |¦  «         |j         }|}Œ@nèt3          |t4          ¦  «        r8|j        r1|j        › tB          j"        tG          |j        ¦  «        dz
           › �}n|j        }t          j        |¬¦  «        }||
z   x}|_         |                     |¦  «         |j        |k    rLt)          j        |j        ¦  «        }|                     |j$        dz
  |¦  «         |j        pd}|j        j        }
|j        }|�|�| %                    |¦  «         �ŒÞ| 
                    |¦  «         |t           j                  &                    ¦   «         }|�,|                     d|¦  «         |                     d|	¦  «         |S )a\  
        Prepares a music21 stream for the harmonic analysis to go into.
        Specifically: creates the score, part, and measure streams,
        as well as some (the available) metadata based on the original TSV data.
        Works like the .template() method,
        except that we don't have a score to base the template on as such.
        Nr2   r   r4   ÚOpr5   ÚNor6   ÚMovÚ_r|   rI   )Únumber)'r   ÚScoreÚPartrP   rñ   r
   ÚMetadatarÅ   rO   Ú
opusNumberrä   r  ÚmovementNumberr~   ÚtitlerU   r   r	   ÚKeyr   r   ÚTimeSignatureÚbarDurationr‡   r   r„   r©   r-   r   ÚRepeatBracketÚrangeÚMeasurer÷   rî   rï   r¯   r   ÚaddSpannedElementsrí   )rR   rø   rù   r(   Ú
firstEntryr  ÚstartingKeySigÚksÚcurrentTimeSigÚtsÚcurrentMeasureLengthÚcurrentOffsetÚpreviousMeasureÚpreviousVoltaÚrepeatBracketræ   ÚmNorü   ÚnewTSÚfirst_measures                       r)   rë   zTsvHandler.prepStream…  s  € õ ŒL‰NŒNˆÝŒK‰MŒMˆØ!%ˆØÔ Ò!Ñ!ð �HŠH�Q�Ô)Ñ+Ô+Ñ,Ô,Ð,àœ¨Ô*ˆJØˆEØ�zÔ'Ð'Ð'Ø(2Ô(8¸Ô(>�”
Ô%Ø—’˜T A¤JÔ$9Ñ9Ñ:Ô:Ð:Ø�zÔ'Ð'Ð'Ø$.Ô$4°TÔ$:�”
Ô!Ø—’˜T A¤JÔ$5Ñ5Ñ6Ô6Ð6Ø˜
Ô(Ð(Ð(Ø,6Ô,<¸UÔ,C�”
Ô)Ø—’˜U Q¤ZÔ%>Ñ>Ñ?Ô?Ð?Øð 3Ø#&§8¢8¨E¡?¤?�”
Ô å˜Tœ^¨AÔ.Ô9Ñ:Ô:ˆÝŒW�^Ñ$Ô$ˆå˜Tœ^¨AÔ.Ô6Ñ7Ô7ˆÝÔ  Ñ0Ô0ˆà!œ~Ô;Ðà25ˆà#œ~¨aÔ0Ô8¸1Ñ<ˆØˆØ;?ˆØ”^ð 1	4ñ 1	4ˆEÝ˜%¥Ñ,Ô,ð °´ÀÒ1MÐ1MØ”;ð )õ
 %,Ô$9ÀÄÐ$MÑ$MÔ$M�Mð
 —H’H˜Q Ñ.Ô.Ð.Ð.à$(�MØ %¤��Ø” /Ò1Ð1ð ØŒ}˜°Ñ2Ò2Ð2Ý  °1Ñ!4°e´mÀaÑ6GÑHÔHð *ð *�CÝœ¨cÐ2Ñ2Ô2�AØ,Ð/CÑC�A”Hà—H’H˜Q‘K”K�KØ$%¤H�MØ&)�O�Oð*õ ˜e¥ZÑ0Ô0ð 2°U´[ð 2à œ=ÐX­&Ô*@ÅÀUÄ[ÑAQÔAQÐTUÑAUÔ*VÐXÐXð "�Mð %*¤M�MÝ”N¨-Ð8Ñ8Ô8�ð ,9Ð;OÑ+OÐO� ¤Ø—’˜‘”�Ø”= NÒ2Ð2Ý!Ô/°´Ñ>Ô>�EØ—H’H˜UœZ¨!™^¨UÑ3Ô3Ð3Ø%*¤]Ð%8°b�NØ+0Ô+<Ô+JÐ(à"'¤-�ØÐ(¨Q¨]Ø×0Ò0°Ñ3Ô3Ð3ùà	�Š�‰ŒˆØ�&œ.Ô)×/Ò/Ñ1Ô1ˆØÐ$Ø× Ò   BÑ'Ô'Ð'Ø× Ò   BÑ'Ô'Ð'ØˆrT   N)r2   )r½   r¾   rP   r¯   )rË   r�   rF   rG   ©rF   rÐ   )rŒ   r�   rF   rE   rœ   )rF   rè   )rž   rŸ   r    r¡   rM   rÏ   rÉ   râ   rç   r   rë   rt   rT   r)   r¼   r¼   í  s¶   € € € € € ðð ð:)ð )ð )ð )ð )ð"2ð 2ð 2ð 2ð"#ð #ð #ð #ð
ð 
ð 
ð 
ð1ð 1ð 1ð 1ð",ð ,ð ,ð ,ð\cð cð cð cð cð crT   r¼   c                  ó<   — e Zd ZdZddd„Zdd
„Zdd„Zdd„Zdd„ZdS )ÚM21toTSVa@  
    Conversion starting with a music21 stream.
    Exports to tabular data format and (optionally) writes the file.

    >>> bachHarmony = corpus.parse('bach/choraleAnalyses/riemenschneider001.rntxt')
    >>> bachHarmony.parts[0].measure(1)[0].figure
    'I'

    The initialization includes the preparation of a list of lists, so

    >>> initial = romanText.tsvConverter.M21toTSV(bachHarmony, dcml_version=2)
    >>> tsvData = initial.tsvData
    >>> from music21.romanText.tsvConverter import DCML_V2_HEADERS
    >>> tsvData[1][DCML_V2_HEADERS.index('chord')]
    'I'
    r3   Ú	m21Streamrè   rP   r¯   c                óÞ   — || _         || _        |dk    rt          d         | _        n,|dk    rt          d         | _        nt	          d|› d�¦  «        ‚|                      ¦   «         | _        d S rÀ   )Úversionr$  ÚDCML_HEADERSÚdcml_headersr"   Úm21ToTsvrÊ   )rR   r$  rP   s      r)   rM   zM21toTSV.__init__ý  sq   € Ø#ˆŒØ"ˆŒØ˜1ÒÐÝ ,¨Q¤ˆDÔÐØ˜QÒÐÝ ,¨Q¤ˆDÔÐåÐL¨\ÐLÐLÐLÑMÔMÐMØ—}’}‘”ˆŒˆˆrT   rF   rÐ   c                óh   — | j         dk    r|                      ¦   «         S |                      ¦   «         S )zž
        Converts a list of music21 chords to a list of lists
        which can then be written to a tsv file with toTsv(), or processed another way.
        r2   )r&  Ú_m21ToTsv_v1Ú_m21ToTsv_v2rW   s    r)   r)  zM21toTSV.m21ToTsv  s5   € ð
 Œ<˜1ÒÐØ×$Ò$Ñ&Ô&Ð&Ø× Ò Ñ"Ô"Ð"rT   c                ó�  ‡‡	— g }t          | j                             ¦   «                              d¦  «        ¦  «        j        j        }| j        t          j                 D �]åŠ	d }‰	j        r‰	j        j	        }d }‰	j        r!‰	j        j        ‰	j        k    r‰	j        j	        }t          ¦   «         Š‰	j	        ‰_        |‰_        ‰	j        �‰	j        nd‰_        t          ‰	j        ¦  «        ‰_        d ‰_        ‰	                     t&          j        ¦  «        }|€d‰_        n|j        ‰_        | j        j        j        pd‰j        d<   | j        j        j        pd‰j        d<   | j        j        j        pd‰j        d<   ‰	j        ‰_        |‰_        ‰	j        j        ‰_        d ‰_         ‰	j!        ‰_"        tG          ‰	¦  «        ‰_$        tK          j&        d‰	j'        ¦  «        }|�| (                    d¦  «        ‰_)        nd‰_)        d ‰_*        |‰_+        d ‰_,        ˆˆ	fd„| j-        D ¦   «         }| .                    |¦  «         �Œç|S )	Nr�   r2   rI   r4   r5   r6   ú^\D*(\d.*|)c           
     ód   •— g | ],}t          ‰|‰j                             |d ¦  «        ¦  «        ‘Œ-S ©rI   ©Úgetattrr†   rl   ©ru   Únamerˆ   ÚthisRNs     €€r)   ú
<listcomp>z)M21toTSV._m21ToTsv_v1.<locals>.<listcomp>B  óH   ø€ ð ð ð àõ ˜	 4¨Ô)9×)=Ò)=¸dÀBÑ)GÔ)GÑHÔHðð ð rT   )/rÜ   r$  ÚrecurseÚgetElementsByClassr	   ÚtonicPitchNameWithCaser   r�   ÚsecondaryRomanNumeralÚfigurer…   rX   r   rü   r   r!   r   r   ÚgetContextByClassr   r  r   ÚratioStringr
   r
  rO   r  r  r‡   r   r   r   r   ÚromanNumeralr   ÚgetFormr   r#   r$   ÚfiguresWrittenr&   r   r   r   r   r(  rä   )
rR   rÊ   r   r   ÚaltChordr  ÚfigbassMatchÚthisInforˆ   r5  s
           @@r)   r+  zM21toTSV._m21ToTsv_v1  sL  øø€ ØˆåØŒN×"Ò"Ñ$Ô$×7Ò7¸ÑGÔGñ
ô 
ä
Ô$ð 	ð ”n¥UÔ%7Ô8ð .	%ñ .	%ˆFàˆLØÔ+ð CØ%Ô;ÔB�àˆHØÔ+ð CØÔ/Ô3°v´zÒAÐAØ%Ô;ÔB�Hå ™
œ
ˆIà&,¤mˆIÔ#Ø!)ˆIÔØ8>Ô8LÐ8X Ô 4Ð 4Ð^_ˆIÔÝ" 6¤;Ñ/Ô/ˆIŒNØ $ˆIÔØ×)Ò)­%Ô*=Ñ>Ô>ˆBØˆzØ$&�	Ô!Ð!à$&¤N�	Ô!Ø$(¤NÔ$;Ô$FÐ$LÈ"ˆIŒO˜DÑ!Ø$(¤NÔ$;Ô$BÐ$HÀbˆIŒO˜DÑ!Ø%)¤^Ô%<Ô%KÐ%QÈrˆIŒO˜EÑ"Ø%Ô3ˆIÔØ#-ˆIÔ Ø"(¤*Ô"CˆIÔØ"ˆIŒOØ &Ô 3ˆIÔÝ$ V™_œ_ˆIŒNåœ8 N°FÔ4IÑJÔJˆLØÐ'Ø$0×$6Ò$6°qÑ$9Ô$9�	Ô!Ð!à$&�	Ô!Ø $ˆIÔØ%1ˆIÔ"Ø"&ˆIÔðð ð ð ð à Ô-ðñ ô ˆHð �NŠN˜8Ñ$Ô$Ð$Ñ$àˆrT   c                ó¨  ‡
‡— g }| j         t          j                                      ¦   «         }|€|S |j        }|j        }| j                              ¦   «                              t          j        t          j	        g¦  «        D �]ÎŠt          ¦   «         Š
‰j        ‰
_        ‰j        dz  ‰
_        ‰                     t           j        ¦  «        }|€d‰
_        n|j        ‰
_        |‰
_        t+          ‰t          j	        ¦  «        rd‰
_        d‰
_        �nt0          j        rt+          ‰t          j        ¦  «        sJ ‚t5          ‰j        |¦  «        }d }‰j        r+‰j        j        }t;          |t=          |¦  «        d¬¦  «        }‰j                             ddd¦  «        ‰
_        d ‰
_         ‰j!        ‰
_        tE          ‰¦  «        ‰
_#        tI          j%        d‰j&        ¦  «        }|�| '                    d¦  «        ‰
_(        nd‰
_(        d ‰
_)        |‰
_*        d ‰
_+        |‰
_,        ˆ
ˆfd	„| j-        D ¦   «         }	| .                    |	¦  «         �ŒÐ|S )
Né   rI   rr   r]   ©rb   Údr2   r.  c           
     ód   •— g | ],}t          ‰|‰j                             |d ¦  «        ¦  «        ‘Œ-S r0  r1  r3  s     €€r)   r6  z)M21toTSV._m21ToTsv_v2.<locals>.<listcomp>Œ  r7  rT   )/r$  r   r�   rí   r	   r:  r8  r9  r   r}   r©   rü   r+   r÷   r,   r=  r   r  r   r>  r   r„   r   r   ÚtÚTYPE_CHECKINGÚlocalKeyAsRnr;  r<  rh   ri   rj   r   r?  r@  r   r#   r$   rA  r&   r   r   r   r   r   r(  rä   )rR   rÊ   Úfirst_rnÚglobal_key_objr   r   r   r   Ú
fig_bass_mrD  rˆ   r5  s             @@r)   r,  zM21toTSV._m21ToTsv_v2J  sV  øø€ Ø#%ˆð ”>¥%Ô"4Ô5×;Ò;Ñ=Ô=ˆØÐØˆNØ!œˆØ#Ô:ˆ
Ø”n×,Ò,Ñ.Ô.×AÒAÝÔ¥¤Ð1ñ
ô 
ð =	%ñ =	%ˆFõ #™œˆIØ!Ô/ˆIŒLð "(¤°Ñ!2ˆIÔØ×.Ò.­uÔ/BÑCÔCˆGØˆØ$&�	Ô!Ð!à$+Ô$7�	Ô!Ø#-ˆIÔ Ý˜&¥'¤/Ñ2Ô2ð %0Ø$+�	Ô!Ø")�	”‘å”?ð BÝ% f­eÔ.@ÑAÔAÐAÐAÐAÝ(¨¬°^ÑDÔD�	Ø#�ØÔ/ð Ø#)Ô#?Ô#F�LÝ#1Ø$¥g¨iÑ&8Ô&8ÀJð$ñ $ô $�Lð #)¤-×"7Ò"7¸¸RÀÑ"CÔ"C�	”Ø"&�	”Ø$*Ô$7�	Ô!Ý!(¨¡¤�	”åœX n°fÔ6KÑLÔL�
ð Ð)Ø(2×(8Ò(8¸Ñ(;Ô(;�IÔ%Ð%à(*�IÔ%Ø$(�	Ô!Ø)5�	Ô&Ø&*�	Ô#Ø&/�	Ô#ðð ð ð ð à Ô-ðñ ô ˆHð �NŠN˜8Ñ$Ô$Ð$Ñ$ØˆrT   ÚfilePathAndNamer¾   c                ó  — t          |ddd¬¦  «        5 }t          j        |ddt          j        ¬¦  «        }|                     | j        ¦  «         | j        D ]}|                     |¦  «         Œ	 ddd¦  «         dS # 1 swxY w Y   dS )	zN
        Writes a list of lists (e.g. from m21ToTsv()) to a tsv file.
        ÚarI   rÓ   )ÚnewlinerÔ   rÕ   rÖ   )r×   rØ   ÚquotingN)rÙ   rÚ   ÚwriterÚQUOTE_MINIMALÚwriterowr(  rÊ   )rR   rP  ÚcsvFileÚcsvOutrˆ   s        r)   ÚwritezM21toTSV.write“  sâ   € õ �/ 3°¸WÐEÑEÔEð 	+ÈÝ”Z Ø*.Ø*-Ý(+Ô(9ð;ñ ;ô ;ˆFð �OŠO˜DÔ-Ñ.Ô.Ð.à!œ\ð +ð +�	Ø—’ 	Ñ*Ô*Ð*Ð*ð+ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	+ð 	+s   ”AA>Á>BÂBN)r3   )r$  rè   rP   r¯   r!  )rP  r¾   )	rž   rŸ   r    r¡   rM   r)  r+  r,  rZ  rt   rT   r)   r#  r#  ì  s�   € € € € € ðð ð 	'ð 	'ð 	'ð 	'ð 	'ð#ð #ð #ð #ð7ð 7ð 7ð 7ðrGð Gð Gð GðR+ð +ð +ð +ð +ð +rT   r#  Úrnúroman.RomanNumeralrF   rU   c                ót   — d| j         v rdS d| j         v rdS d| j         v rdS d| j         v rdS d| j         v rdS dS )uC  
    Takes a music21.roman.RomanNumeral object and returns the string indicating
    'form' expected by the DCML standard.

    >>> romanText.tsvConverter.getForm(roman.RomanNumeral('V'))
    ''
    >>> romanText.tsvConverter.getForm(roman.RomanNumeral('viio7'))
    'o'
    >>> romanText.tsvConverter.getForm(roman.RomanNumeral('IVM7'))
    'M'
    >>> romanText.tsvConverter.getForm(roman.RomanNumeral('III+'))
    '+'
    >>> romanText.tsvConverter.getForm(roman.RomanNumeral('IV+M7'))
    '+M'
    >>> romanText.tsvConverter.getForm(roman.RomanNumeral('viiÃ¸7'))
    '%'
    rd   rc   Úoz+Mú+ÚMrI   )r<  )r[  s    r)   r@  r@  £  se   € ð$ ˆrŒyÐÐØˆsØ
ˆbŒiÐÐØˆsØˆrŒyÐÐð ˆtØ
ˆbŒiÐÐØˆsØ
ˆbŒiÐÐØˆsØˆ2rT   Ú	dcmlChordc                ó€  — t          j        d| ¦  «        }|s| S |                     d¦  «        }|                     d¦  «        }|                     d¦  «        �|                     d¦  «        nd}|                     d¦  «        }|dk    r|d	k    rd
|z   S t          j        d|t           j        ¦  «        }g }g }|dv rd}	nd}	|D ]É\  }
}}}|
dk    r|                     d|› d�¦  «         Œ't          |¦  «        }|
dk    s||	k    rd}n$|dv rd}n|dv r|dk    p|dk    }n|dk    o|dk    }|�;|r|                     d|dz   › d�¦  «         n|                     d|dz
  › d�¦  «         |dk    rd}|                     d|› |› d�¦  «         ŒÊ|d                     |¦  «        z   d                     |¦  «        z   |z   S )aY  
    Converts DCML added-tone syntax to music21.

    >>> romanText.tsvConverter.handleAddedTones('V(64)')
    'Cad64'

    >>> romanText.tsvConverter.handleAddedTones('i(4+2)')
    'i[no3][add4][add2]'

    >>> romanText.tsvConverter.handleAddedTones('Viio7(b4-5)/V')
    'Viio7[no3][no5][addb4]/V'

    When in root position, 7 does not replace 8:

    >>> romanText.tsvConverter.handleAddedTones('vi(#74)')
    'vi[no3][add#7][add4]'

    When not in root position, 7 does replace 8:

    >>> romanText.tsvConverter.handleAddedTones('ii6(11#7b6)')
    'ii6[no8][no5][add11][add#7][addb6]'

    '0' can be used to indicate root-replacement by 7 in a root-position chord.
    We need to change '0' to '7' because music21 changes the 0 to 'o' (i.e.,
    a diminished chord).

    >>> romanText.tsvConverter.handleAddedTones('i(#0)')
    'i[no1][add#7]'
    zR(?P<primary>.*?(?P<figure>\d*(?:/\d+)*))\((?P<added_tones>.*)\)(?P<secondary>/.*)?ÚprimaryrA   Ú	secondaryNrI   r<  rf   Ú64ÚCad64zý
            ([+\-])?  # indicates whether to add or remove chord factor
            ([\^v])?  # indicates whether tone replaces chord factor above/below
            (\#+|b+)?  # alteration
            (1\d|\d)  # figures 0-19, in practice 0-14
        )rI   Ú5Ú53z5/3Ú3Ú7é   é   ú-z[noú]r_  )r2   é   é   )r3   rF  é   ú#ú^ÚbÚvr2   r   z[add)r#   r$   r&   Úfindallrn   rä   r¯   r~   )ra  r(   rc  rA   rd  r<  Úadded_tone_tuplesÚ	additionsÚ	omissionsÚomission_thresholdÚadded_or_removedÚabove_or_belowÚ
alterationÚ
factor_strÚfactorÚreplace_aboves                   r)   rk   rk   Ä  sa  € õ< 	ŒØ]Øñ	ô 	€Að ð ØÐØ�gŠg�iÑ Ô €GØ—'’'˜-Ñ(Ô(€KØ()¯ª°Ñ(<Ô(<Ð(H�—’˜Ñ$Ô$Ð$Èb€IØ�WŠW�XÑÔ€FØ�#‚~€~˜+¨Ò-Ð-Ø˜Ñ"Ð"Ý9;¼ð	ð 	Ý
Œ
ñ	:ô 	:Ðð €IØ€IØÐ1Ð1Ð1ØÐÐàÐØDUð 7ð 7Ñ@Ð˜.¨*°jØ˜sÒ"Ð"Ø×ÒÐ0 :Ð0Ð0Ð0Ñ1Ô1Ð1ØÝ�Z‘”ˆØ˜sÒ"Ð" fÐ0BÒ&BÐ&BØ ˆMˆMØ�yÐ Ð Ø ˆMˆMØ�yÐ Ð ð '¨#Ò-ÐF°À3Ò1FˆMˆMð '¨#Ò-ÐG°.ÀCÒ2GˆMØÐ$Øð 6Ø× Ò Ð!4 v°¡zÐ!4Ð!4Ð!4Ñ5Ô5Ð5Ð5à× Ò Ð!4 v°¡zÐ!4Ð!4Ð!4Ñ5Ô5Ð5Ø�QŠ;ˆ;ØˆFØ×ÒÐ5 
Ð5¨FÐ5Ð5Ð5Ñ6Ô6Ð6Ð6Ø�R—W’W˜YÑ'Ô'Ñ'¨"¯'ª'°)Ñ*<Ô*<Ñ<¸yÑHÐHrT   úkey.Keyc                ól  — | j         }t          j        |                     ¦   «         rdnd| ¬¦  «        }t          j        t          j        |j        ¦  «        |¬¦  «        }| j        dk    rC|j        dk    r8|j	        dv r/|j
        d         |j        d         j        z
  d	z  d
v r
d|j	        z   S |j	        S )a€  
    Takes two music21.key.Key objects and returns the roman numeral for
    `local_key` relative to `global_key`.

    >>> k1 = key.Key('C')
    >>> k2 = key.Key('e')
    >>> romanText.tsvConverter.localKeyAsRn(k1, k2)
    'VI'
    >>> k3 = key.Key('C#')
    >>> romanText.tsvConverter.localKeyAsRn(k3, k2)
    '#VI'
    >>> romanText.tsvConverter.localKeyAsRn(k2, k1)
    'iii'
    r”   ÚI)Ú
keyOrScale)ÚkeyObjÚmajorra   )ÚVIÚVIIr   é   )é	   é   rr  )r:  r   r�   ÚislowerÚromanNumeralFromChordr   ÚChordÚpitchesÚmoder?  ÚpitchClassesÚ
pitchClass)r   r   Úletterr[  rÒ   s        r)   rL  rL    sÂ   € ð Ô-€FÝ	Ô	Ø�~Š~ÑÔÐ(ˆˆ S°Yð
ñ 
ô 
€Bõ 	Ô#¥E¤K°´
Ñ$;Ô$;ÀJÐOÑOÔO€Að 	Œ˜'Ò!Ð! j¤o¸Ò&@Ð&@Ø” -Ð/Ð/Ø” Ô" ZÔ%7¸Ô%:Ô%EÑEÈÑKÈwÐVÐVØ�Q”^Ñ#Ð#ØŒ>ÐrT   Útest_keyÚboolc                ó2   — | |                       ¦   «         k    S )zº
    Checks whether a key is minor or not simply by upper vs lower case.

    >>> romanText.tsvConverter.isMinor('F')
    False

    >>> romanText.tsvConverter.isMinor('f')
    True
    )Úlower)r”  s    r)   ri   ri   7  s   € ð �x—~’~Ñ'Ô'Ò'Ð'rT   Tr]   Ú	preStringra   rb   c                ó–   — |dk    rdddœ}n|dk    rdddœ}nt          d¦  «        ‚|D ]}|                      |||         ¦  «        } Œ| S )	u4  
    Character swap function to coordinate between the two notational versions, for instance
    swapping between '%' and '/o' for the notation of half diminished (for example).

    >>> testStr = 'ii%'
    >>> romanText.tsvConverter.characterSwaps(testStr, minor=False, direction='DCML-m21')
    'iiÃ¸'
    r]   rc   )z/ord   r_   rd   rj  )rc   ÚM7z+Direction must be 'm21-DCML' or 'DCML-m21'.)r"   rj   )r˜  ra   rb   ÚcharacterDictÚthisKeys        r)   rh   rh   D  sˆ   € ð �JÒÐØ"Ø"ðð ˆˆð 
�jÒ	 Ð	 Ø"Ø"ðð ˆˆõ ÐFÑGÔGÐGà ð Gð GˆØ×%Ò% g¨}¸WÔ/EÑFÔFˆ	ˆ	àÐrT   FÚconvertDCMLToM21c                ó´  — |r%t          | t          |d         ¦  «        d¬¦  «        } t          j        | |t          j        j        t          j        j        ¬¦  «        }|                     ¦   «         j        }|                     ¦   «         r| 	                    ¦   «         }n8| 
                    ¦   «         r|                     ¦   «         }nt          d¦  «        ‚|S )a*  
    Re-casts comparative local key (e.g. 'V of G major') in its own terms ('D').

    >>> romanText.tsvConverter.getLocalKey('V', 'G')
    'D'

    >>> romanText.tsvConverter.getLocalKey('ii', 'C')
    'd'

    >>> romanText.tsvConverter.getLocalKey('i', 'C')
    'c'

    By default, assumes an m21 input, and operates as such:

    >>> romanText.tsvConverter.getLocalKey('#vii', 'a')
    'g#'

    Set convert=True to convert from DCML to m21 formats. Hence;

    >>> romanText.tsvConverter.getLocalKey('vii', 'a', convertDCMLToM21=True)
    'g'

    r   r_   r`   ry   z local key must be major or minor)rh   ri   r   r�   r‚   rƒ   rB   r4  ÚisMajorTriadÚupperÚisMinorTriadr—  r"   )r   r   r�  ÚasRomanÚrtÚnewKeys         r)   r€   r€   ^  sÉ   € ð0 ð bÝ" 9µG¸JÀq¼MÑ4JÔ4JÐV`ÐaÑaÔaˆ	åÔ ØØÝÔ'Ô,ÝÔ)Ô.ð	ñ ô €Gð 
�Š‰ŒÔ	€BØ×ÒÑÔð =Ø—’‘”ˆˆØ	×	Ò	Ñ	Ô	ð =Ø—’‘”ˆˆåÐ;Ñ<Ô<Ð<à€MrT   c                óx   — d| vr|}n2|                       d¦  «        }| |dz   d…         }t          ||¦  «        }|S )a  
    Separates comparative Roman-numeral for tonicizations like 'V/vi' into the component parts of
    a Roman-numeral (V) and
    a (very) local key (vi)
    and expresses that very local key in relation to the local key also called (DCML column 11).

    While .getLocalKey() work on the figure and key pair:

    >>> romanText.tsvConverter.getLocalKey('vi', 'C')
    'a'

    With .getSecondaryKey(), we're interested in the relative root of a secondaryRomanNumeral:

    >>> romanText.tsvConverter.getSecondaryKey('V/vi', 'C')
    'a'
    rx   r2   N)Úindexr€   )r[  r   Úvery_local_as_keyÚpositionÚvery_local_as_romans        r)   ÚgetSecondaryKeyrª  Š  sO   € ð" �"€}€}Ø%ÐÐà—8’8˜C‘=”=ˆØ  ¨A¡  Ô/ÐÝ'Ð(;¸YÑGÔGÐàÐrT   c                  ó8   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚTestc                ó$
  — dd l }dddœ}dD �]}||         D �]õ}t          j        ¦   «         dz  |z  }d|v�rÐt          ||¬¦  «        }t          |         }|                     d¦  «        }|                      |j        d         |         |d	k    rd
nd¦  «         |                      |j        d         |         d¦  «         |                     ¦   «          |j	        d         }	|j	        d         }
|  
                    |	t          ¦  «         |                      |	j        |d	k    rd
nd¦  «         |                      |	j        d¦  «         |                      |
j        d¦  «         |                      |
j        d¦  «         |                      |	j        d¦  «         |	                     ¦   «          |                      |	j        d¦  «         |
                     ¦   «          |                      |
j        d¦  «         |	                     ¦   «         }|
                     ¦   «         }|                      |j        |d	k    rd
nd¦  «         |                      |j        d¦  «         |                      |j        j        d¦  «         |                      |j        j        d¦  «         |                     ¦   «         }|                      |j        d                              d¦  «        t.          j                 d         j        |d	k    rd
nd¦  «         t3          j        ¦   «         }t          ||¬¦  «        }|                     ¦   «         }|                     ¦   «         }t9          ||¬¦  «                             |¦  «         t          ||¬¦  «        }|                     ¦   «         }|                     |¦  «         |                      t?          |                      ¦   «         ¦  «        t?          |                      ¦   «         ¦  «        ¦  «         tC          tE          |tF          j$                 |tF          j$                 ¦  «        ¦  «        D ],\  }\  }}|                      ||d|› d|› d|› d|› �¬¦  «         Œ-|tF          j$                  %                    ¦   «         }|j&        j'        |j'        z   }|                      tQ          d„ |                      ¦   «          )                    tF          j$        ¦  «        D ¦   «         ¦  «        |j*        |z
  ¦  «         �Œ÷�Œd S )Nr   )ztsvEg_v1.tsv)ztsvEg_v2major.tsvztsvEg_v2minor.tsvr1   Ú	romanTextra   ©rP   r   r3   ÚI6z.C.I6r2   z	#viio6/iirƒ  ú#viir^   zC majorzitem z
, version z: z != )Úmsgc              3  ó$   K  — | ]}|j         V — Œd S rZ   )r‡   )ru   Úhs     r)   rw   z&Test.testTsvHandler.<locals>.<genexpr>û  s8   è è € ð ð àð œðð ð ð ð ð rT   )+Úosr   ÚgetSourceFilePathr¼   r'  r¦  ÚassertEqualrÊ   rç   rÅ   ÚassertIsInstancerE   rX   r   rN   ro   r‹   r<  r	   r4  r   rì   r   r   r�   r   ÚEnvironmentÚgetTempFiler#  rZ  ÚremoveÚlenr8  rÍ   Úzipr   rô   rí   rö   r÷   Úsumr9  r‡   )rR   rµ  Ú
test_filesr&  r4  ÚpathÚhandlerÚheadersÚchord_iÚtestTabChord1ÚtestTabChord2Ú	m21Chord1Ú	m21Chord2Ú
out_streamÚenvLocalÚforward1Ústream1Ú	temp_tsv2Úforward2Ústream2r”   Úitem1Úitem2Úfirst_harmonyÚfirst_offsets                            r)   ÚtestTsvHandlerzTest.testTsvHandler©  s&  € Øˆ	ˆ	ˆ	à Ø9ð
ð 
ˆ
ð ð Q	ñ Q	ˆGØ" 7Ô+ð Pñ P�õ Ô/Ñ1Ô1°KÑ?À$ÑF�à $Ð&Ñ&Ý(¨¸GÐDÑDÔD�GÝ*¨7Ô3�GØ%Ÿmšm¨GÑ4Ô4�Gð ×$Ò$ W¤_°QÔ%7¸Ô%@È'ÐUVÊ,È,À$À$Ð\cÑdÔdÐdØ×$Ò$ W¤_°QÔ%7¸Ô%@À+ÑNÔNÐNð ×'Ò'Ñ)Ô)Ð)Ø$+Ô$5°aÔ$8�MØ$+Ô$5°aÔ$8�MØ×)Ò)¨-½ÑFÔFÐFØ×$Ò$ ]Ô%@È'ÐUVÊ,È,À$À$Ð\cÑdÔdÐdØ×$Ò$ ]Ô%:¸CÑ@Ô@Ð@Ø×$Ò$ ]Ô%@À+ÑNÔNÐNØ×$Ò$ ]Ô%:¸FÑCÔCÐCð ×$Ò$ ]Ô%EÀvÑNÔNÐNØ!×7Ò7Ñ9Ô9Ð9Ø×$Ò$ ]Ô%:¸CÑ@Ô@Ð@Ø!×7Ò7Ñ9Ô9Ð9Ø×$Ò$ ]Ô%:¸FÑCÔCÐCð !.× 6Ò 6Ñ 8Ô 8�IØ -× 6Ò 6Ñ 8Ô 8�Ið ×$Ò$ YÔ%5¸wÈ!º|¸|°t°tÐQTÑUÔUÐUØ×$Ò$ YÔ%5°{ÑCÔCÐCØ×$Ò$ Y¤]Ô%7¸ÑCÔCÐCØ×$Ò$ Y¤]Ô%7¸ÑCÔCÐCð ")×!4Ò!4Ñ!6Ô!6�JØ×$Ò$Ø"Ô(¨Ô+×3Ò3°AÑ6Ô6µuÔ7IÔJÈ1ÔMÔTØ '¨1¢ ˜˜°#ñô ð õ 'Ô2Ñ4Ô4�å% d¸ÐAÑAÔA�Ø"×.Ò.Ñ0Ô0�ð %×0Ò0Ñ2Ô2�	Ý˜¨wÐ7Ñ7Ô7×=Ò=¸iÑHÔHÐHõ & i¸gÐFÑFÔF�Ø"×.Ò.Ñ0Ô0�Ø—	’	˜)Ñ$Ô$Ð$ð × Ò ¥ W§_¢_Ñ%6Ô%6Ñ!7Ô!7½¸W¿_º_Ñ=NÔ=NÑ9OÔ9OÑPÔPÐPÝ)2µ3Ø�GœOÔ,¨gµg´oÔ.Fñ4ô 4ñ *ô *ð ð Ñ%�A‘~˜˜uð ×$Ò$Ø˜uÐ*\°!Ð*\Ð*\¸wÐ*\Ð*\È%Ð*\Ð*\ÐUZÐ*\Ð*\ð %ñ ô ð ð ð !(­¬Ô 8× >Ò >Ñ @Ô @�Ø,Ô7Ô>ÀÔAUÑU�Ø× Ò Ýð ð à!(§¢Ñ!2Ô!2×!EÒ!EÅgÄoÑ!VÔ!Vðñ ô ñ ô ð Ô)¨LÑ8ñô ð ñ ñUPðQ	ð Q	rT   c                ó’  — dd l }ddlm} |                     d¦  «        }dD �]#}t	          ||¬¦  «        }|j        }t          |                              d¦  «        }|                      |j	        d          
                    d¦  «        d         j        d¦  «         |                      |d         |         d¦  «         t          j        ¦   «         }|                     ¦   «         }	|                     |	¦  «         t!          |	¦  «        }
|                      |
j        d         |         d¦  «         |                     |	¦  «         �Œ%d S )	Nr   )Úcorpusz-bach/choraleAnalyses/riemenschneider001.rntxtr1   r¯  r   r2   rƒ  )rµ  Úmusic21rÕ  Úparser#  rÊ   r'  r¦  r·  rì   r   r<  r   r¹  rº  rZ  r¼   r»  )rR   rµ  rÕ  ÚbachHarmonyr&  ÚinitialrÊ   Ú	numeral_irÉ  ÚtempFrÁ  s              r)   ÚtestM21ToTsvzTest.testM21ToTsv  sC  € Øˆ	ˆ	ˆ	Ø"Ð"Ð"Ð"Ð"Ð"à—l’lÐ#RÑSÔSˆØð 	ñ 	ˆGÝ˜{¸ÐAÑAÔAˆGØ”oˆGÝ$ WÔ-×3Ò3°IÑ>Ô>ˆIØ×Ò˜[Ô.¨qÔ1×9Ò9¸!Ñ<Ô<¸QÔ?ÔFÈÑLÔLÐLØ×Ò˜W QœZ¨	Ô2°CÑ8Ô8Ð8õ #Ô.Ñ0Ô0ˆHØ×(Ò(Ñ*Ô*ˆEØ�MŠM˜%Ñ Ô Ð Ý  Ñ'Ô'ˆGØ×Ò˜Wœ_¨QÔ/°	Ô:¸CÑ@Ô@Ð@Ø�IŠI�eÑÔÐÑð	ð 	rT   c                óŽ   — |                       t          d¦  «        ¦  «         |                      t          d¦  «        ¦  «         d S )Nrß   ÚF)Ú
assertTrueri   ÚassertFalserW   s    r)   ÚtestIsMinorzTest.testIsMinor  s:   € Ø�Š� ™œÑ%Ô%Ð%Ø×Ò� ™œÑ&Ô&Ð&Ð&Ð&rT   c                óì  — d}d                      d„ |D ¦   «         ¦  «        }|                      |t          ¦  «         |                      |t          ¦  «         |                      t	          |¦  «        t	          |¦  «        ¦  «         |                      |d¦  «         |                      |d¦  «         d}t          |dd¬¦  «        }|                      |d¦  «         |                      |d	¦  «         d S )
Nzbefore%afterrI   c                ó0   — g | ]}t          |d ¬¦  «        ‘ŒS )r_   rG  )rh   )ru   Úxs     r)   r6  z(Test.testOfCharacter.<locals>.<listcomp>  s%   € ÐVÐVÐVÀq�>¨!°zÐBÑBÔBÐVÐVÐVrT   u   beforeÃ¸afterzii%Fr_   r`   u   iiÃ¸)r~   r¸  rU   r·  r¼  rh   )rR   Ú	startTextÚnewTextÚ
testStr1inÚtestStr1outs        r)   ÚtestOfCharacterzTest.testOfCharacter  sì   € Ø"ˆ	Ø—'’'ÐVÐVÈIÐVÑVÔVÑWÔWˆà×Ò˜i­Ñ-Ô-Ð-Ø×Ò˜g¥sÑ+Ô+Ð+Ø×Ò�˜Y™œ­¨W©¬Ñ6Ô6Ð6Ø×Ò˜ NÑ3Ô3Ð3à×Ò˜ /Ñ2Ô2Ð2àˆ
Ý$ Z°uÈ
ÐSÑSÔSˆà×Ò˜ UÑ+Ô+Ð+Ø×Ò˜ fÑ-Ô-Ð-Ð-Ð-rT   c                ó:  — t          dd¦  «        }|                      |d¦  «         t          dd¦  «        }|                      |d¦  «         t          dd¦  «        }|                      |d	¦  «         t          d
dd¬¦  «        }|                      |d¦  «         d S )Nrf   ÚGÚDÚiiÚCrH  r±  rR  zg#ÚviiT)r�  Úg)r€   r·  )rR   Útest1Útest2Útest3Útest4s        r)   ÚtestGetLocalKeyzTest.testGetLocalKey,  s¡   € Ý˜C Ñ%Ô%ˆØ×Ò˜ Ñ$Ô$Ð$å˜D #Ñ&Ô&ˆØ×Ò˜ Ñ$Ô$Ð$å˜F CÑ(Ô(ˆØ×Ò˜ Ñ%Ô%Ð%å˜E 3¸Ð>Ñ>Ô>ˆØ×Ò˜ Ñ$Ô$Ð$Ð$Ð$rT   c                ó�   — d}d}t          ||¦  «        }|                      |t          ¦  «         |                      |d¦  «         d S )NzV/virì  rt  )rª  r¸  rU   r·  )rR   ÚtestRNÚtestLocalKeyÚveryLocalKeys       r)   ÚtestGetSecondaryKeyzTest.testGetSecondaryKey9  sM   € ØˆØˆå& v¨|Ñ<Ô<ˆà×Ò˜l­CÑ0Ô0Ð0Ø×Ò˜ sÑ+Ô+Ð+Ð+Ð+rT   c                ó8  ‡ — dˆ fd„}t          j        ¦   «         dz  d	z  }t          |d
¬¦  «        }|                     ¦   «         }|t          j                 }‰                      t          |¦  «        d
¦  «         |\  }} ||dg¦  «          ||dg¦  «         d S )NÚrbúspanner.RepeatBracketÚexpectedMeasuresút.List[str]rF   rG   c                ól   •— d„ | t           j                 D ¦   «         }‰                     ||¦  «         d S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS rt   )ÚmeasureNumberWithSuffix)ru   r(   s     r)   r6  zCTest.testRepeats.<locals>._test_ending_contents.<locals>.<listcomp>F  s$   € ÐSÐSÐS¸1˜1×4Ò4Ñ6Ô6ÐSÐSÐSrT   )r   r  r·  )rü  rþ  Úmeasure_nosrR   s      €r)   Ú_test_ending_contentsz/Test.testRepeats.<locals>._test_ending_contentsC  s=   ø€ ð TÐSÀÅ6Ä>Ô@RÐSÑSÔSˆKØ×Ò˜[Ð*:Ñ;Ô;Ð;Ð;Ð;rT   r®  ztsvEg_v2_repeats.tsvr3   r¯  Ú2aÚ2b)rü  rý  rþ  rÿ  rF   rG   )r   r¶  r¼   r   r   r  r·  r¼  )rR   r  rÀ  rÁ  rË  Úrb_iterÚfirst_endingÚsecond_endings   `       r)   ÚtestRepeatszTest.testRepeatsB  sÄ   ø€ ð	<ð 	<ð 	<ð 	<ð 	<ð 	<õ Ô'Ñ)Ô)¨KÑ7Ð:PÑPˆõ ˜T°Ð2Ñ2Ô2ˆØ×%Ò%Ñ'Ô'ˆØ�'Ô/Ô0ˆØ×Ò�˜W™œ qÑ)Ô)Ð)Ø&-Ñ#ˆ�mØÐ˜l¨T¨FÑ3Ô3Ð3ØÐ˜m¨d¨VÑ4Ô4Ð4Ð4Ð4rT   N)
rž   rŸ   r    rÓ  rÜ  rá  ré  rõ  rú  r
  rt   rT   r)   r¬  r¬  §  s�   € € € € € ðWð Wð Wðrð ð ð('ð 'ð 'ð.ð .ð .ð$%ð %ð %ð,ð ,ð ,ð5ð 5ð 5ð 5ð 5rT   r¬  Ú__main__)r[  r\  rF   rU   )ra  rU   rF   rU   )r   r�  r   r�  rF   rU   )r”  rU   rF   r•  )Tr]   )r˜  rU   ra   r•  rb   rU   rF   rU   )F)r   rU   r   rU   r�  r•  rF   rU   )r[  rU   r   rU   rF   rU   )6r¡   Ú
__future__r   rÚ   Ú	fractionsÚpathlibr#   rî   ÚtypesÚtypingrJ  ÚunittestrÖ  r   r   r   r   r	   r
   r   r   r   r   r¹  ÚenvironLocalÚMappingProxyTyperU   r¯   r!   Ú
V1_HEADERSÚcompiler%   r*   Ú
V2_HEADERSrÁ   ÚDCML_V1_HEADERSÚDCML_V2_HEADERSr'  rE   r…   r©   r¼   r#  r@  rk   rL  ri   rh   r€   rª  ÚTestCaser¬  rž   ÚmainTestrt   rT   r)   ú<module>r     s­  ððð ð #Ð "Ð "Ð "Ð "Ð "à 
€
€
€
Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à&ˆ{Ô&Ñ(Ô(€ð $ˆUÔ#ð %ØˆSð%à�ð%ð ˆsð%ð ˆEð	%ð
 ˆsð%ð ˆsð%ð ˆeð%ð �#ð%ð �ð%ð ˆSð%ð ˆsð%ð ˆCð%ð ˆsð%ð ˆsð%ð �Cð%ð  �ð!%ñ ô €
ð& �”Ø8ñô €ðAð Að Að $ˆUÔ#ØØ
ØØØØØØØØØØØØØð%ð %ñ ô €
ð$ ˜ZÐ
(Ð
(€ð
€ð2€ð> # Ð7Ð7€ðl
ð l
ð l
ð l
ð l
ñ l
ô l
ð l
ð\#ð #ð #ð #ð #ˆ|ñ #ô #ð #ðPð Pð Pð Pð P�ñ Pô Pð Pðj{ð {ð {ð {ð {ñ {ô {ð {ð~s+ð s+ð s+ð s+ð s+ñ s+ô s+ð s+ðnð ð ð ðBSIð SIð SIð SIðlð ð ð ð:
(ð 
(ð 
(ð 
(ðð ð ð ð ð4)ð )ð )ð )ð )ðXð ð ð ð:q5ð q5ð q5ð q5ð q5ˆ8Ôñ q5ô q5ð q5ðl ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð ÐrT   