§
    ƒØjÒ*  ã                  óÆ   — d Z ddlmZ ddlZddlZddlZd„ Z G d„ d¦  «        Z G d„ d¦  «        Z	 G d	„ d
ej
        ¦  «        Zedk    rddlZ ej        e¦  «         dS dS )zƒ
Harmonic annotations from humdrum to `music21`.

The `**harm` representation is described here: https://www.humdrum.org/rep/harm/
é    )ÚannotationsNc                óÞ  — t          ¦   «                              | ¦  «        }|sdS |d         dk    r	d}dg|d<   n,|d         dk    rd}n|d         d	k    r	d	}dg|d<   n|d         }d
}|d         r|d         }d
}|d         r|d         }d}|d         rd|d         v rd}|d         rg d¢                     |d         ¦  «        }nd}d
}|dk    r|rdnd
}n"|dk    r|rdnd}n|dk    r|rdnd}n|dk    rd}g }|d         rD|                     d
¦  «         |d         }	|	r%|                     |	d         ¦  «         |	d         }	|	°%d
}	|rd                     |¦  «        }	||z   |z   |z   |	z   S )al  
    Converts a `**harm` string into a string that
    can be used to instantiate a RomanNumeral object.

    This is necessary because the two notations are not
    identical. For example, a "V7b" in `**harm` turns into "V65".

    Instantiate a HarmParser to process `**harm` strings

    >>> convertHarmToRoman = humdrum.harmParser.convertHarmToRoman

    Convert a few `**harm` strings to music21.roman.RomanNumeral figures

    >>> diatonicTriads = ['I', 'Vc', 'Ib', 'iib', 'V', 'viiob', 'vib']
    >>> [convertHarmToRoman(x) for x in diatonicTriads]
    ['I', 'V64', 'I6', 'ii6', 'V', 'viio6', 'vi6']

    A few seventh-chord inversions
    >>> diatonicSevenths = ['V7', 'viio7c', 'V7d', 'viio7b', 'V7c']
    >>> [convertHarmToRoman(x) for x in diatonicSevenths]
    ['V7', 'viio43', 'V2', 'viio65', 'V43']

    Inversion-wise, augmented sixth chords are a bit tricky
    German and French are treated as seventh-chords (4 notes)
    Italians are treated as triads

    >>> italianSixths = ['Lt', 'Ltb', 'Ltc']
    >>> [convertHarmToRoman(x) for x in italianSixths]
    ['It', 'It6', 'It64']

    >>> frenchSixths = ['Fr', 'Frb', 'Frc', 'Frd']
    >>> [convertHarmToRoman(x) for x in frenchSixths]
    ['Fr7', 'Fr65', 'Fr43', 'Fr2']

    >>> germanSixths = ['Gn', 'Gnb', 'Gnc', 'Gnd']
    >>> [convertHarmToRoman(x) for x in germanSixths]
    ['Ger7', 'Ger65', 'Ger43', 'Ger2']
    NÚrootÚGnÚGerÚ7Ú	intervalsÚLtÚItÚFrÚ Ú
accidentalÚ	attributeFTÚ	inversion)ÚaÚbÚcÚdr   é   Ú65Ú6é   Ú43Ú64é   Ú2Ú	secondaryú/)Ú
HarmParserÚparseÚindexÚappendÚjoin)
ÚharmStrÚharmÚdegreeÚ
alterationÚfifthsQualityÚ	isSeventhÚinversionNumberr   ÚsecondaryFunctionsr   s
             ú�/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/humdrum/harmParser.pyÚconvertHarmToRomanr-      s%  € õR ‰<Œ<×Ò˜gÑ&Ô&€Dàð ØˆtàˆF„|�tÒÐØˆØ ˜Eˆˆ[ÑÐØ	ˆfŒ˜Ò	Ð	ØˆˆØ	ˆfŒ˜Ò	Ð	ØˆØ ˜Eˆˆ[ÑÐà�f”ˆà€JØˆLÔð (Ø˜,Ô'ˆ
à€MØˆKÔð *Ø˜[Ô)ˆà€IØˆKÔð ˜S D¨Ô$5Ð5Ð5Øˆ	àˆKÔð Ø.Ð.Ð.×4Ò4°T¸+Ô5FÑGÔGˆˆàˆØ€IØ˜!ÒÐØ$Ð,�C�C¨"ˆ	ˆ	Ø	˜AÒ	Ð	Ø%Ð.�D�D¨3ˆ	ˆ	Ø	˜AÒ	Ð	Ø%Ð/�D�D¨4ˆ	ˆ	Ø	˜AÒ	Ð	àˆ	àÐØˆKÔð /Ø×!Ò! "Ñ%Ô%Ð%Ø˜Ô%ˆ	Øð 	/Ø×%Ò% i°Ô&7Ñ8Ô8Ð8Ø! +Ô.ˆIð ð 	/ð €IØð 1Ø—H’HÐ/Ñ0Ô0ˆ	Ø˜Ñ Ñ.°Ñ:¸YÑFÐFó    c                  óf   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ez   ez   ez   ez   ez   e
z   ez   dz   ZdS )ÚHarmDefszA
    Regular expression definitions for the HarmParser class
    zK
    (?P<accidental>          # Named group _accidental
    [#-]{0,2})
    zÅ
    (?P<root>               # Named group _root_
     i|ii|iii|iv|v|vi|vii|  # Minor mode degrees
     I|II|III|IV|V|VI|VII|  # Major mode degrees
     N|Gn|Lt|Fr|Tr)         # Special chords
    zF
    (?P<attribute>          # Named group _attribute_
    [o+]?)
    aO  
    ((?P<intervals>         # Named group _intervals
    \d+|[mMPAD]\d+|         # Detect minor, Major, Augmented or Diminished intervals
    AA\d+|                  # Double-augmented intervals
    DD\d+)                  # Double-diminished intervals
    *)                      # Not a limit on how many intervals can be added
    z€
    (?P<inversion>          # Named group _inversions_
    [b-d]?)                 # Only third inversions possible so far
    a€  
    ^(                      # Match for entire string or fail
    \(                      # Open parenthesis
    (?P<implied_harmony>    # Group the expression
    ([^\(^\)])+             # At least one expression
    )                       # /Group the expression
    \)                      # Closing parenthesis
    )$                      # /Match for entire string or fail
    aQ  
    (\[                     # Open brackets
    (?P<alternative>        # Named group _alternative_
    ([^\[^\]])+)            # Match at least one time for any expression inside brackets
    \]                      # Close brackets
    )?                      # If no alternative expression, then no brackets should appear at all
    a(  
    (/                      # Slash implies a secondary function
    (?P<secondary>          # Named group _secondary_
    ([\s\S])+)              # Get all the expression after the slash symbol
    )?                      # If no secondary function, then the slash symbol should not appear
    z^(z)$N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úrootsr   r	   r   ÚimpliedÚalternativer   ÚharmExpression© r.   r,   r0   r0   v   s£   € € € € € ðð ð
€Jð€Eð€Ið€Ið€Ið€Gð€Kð€Ið Ø
ñà
ñð ñð ñ	ð
 ñð ñð ñð ñ€N€N€Nr.   r0   c                  ó4   — e Zd ZdZ e¦   «         Zd„ Zdd„ZdS )r   z1
    Parses an expression in `**harm` syntax
    c                óÒ   — t          j        t          j        j        t           j        ¦  «        | _        t          j        t          j        j        t           j        ¦  «        | _        d S )N)	ÚreÚcompiler   Údefsr8   ÚVERBOSEÚ
harmRegExpr6   ÚimpliedRegExp)Úselfs    r,   Ú__init__zHarmParser.__init__Í   s=   € Ýœ*¥Z¤_Ô%CÅRÄZÑPÔPˆŒÝœZ­
¬Ô(?ÅÄÑLÔLˆÔÐÐr.   Úreturnúdict[str, t.Any]c                óÄ  — | j                              |¦  «        }|r8|                     ¦   «         d         }|                      |¦  «        }|rd|d<   |S | j                             |¦  «        }|ro|                     ¦   «         }d|d<   |d         �"|d         }|                      |¦  «        }||d<   |d         �"|d         }|                      |¦  «        }	|	|d<   |S i S )NÚimplied_harmonyTr6   Fr7   r   )rA   ÚmatchÚ	groupdictr    r@   )
rB   r8   ÚimpliedMatchÚimpliedHarmonyÚmÚmatchHarmRegExpÚalternativeExpressionr   ÚsecondaryExpressionÚss
             r,   r    zHarmParser.parseÑ   s  € ð Ô)×/Ò/°Ñ?Ô?ˆØð 	à)×3Ò3Ñ5Ô5Ð6GÔHˆNà—
’
˜>Ñ*Ô*ˆAØð $Ø#��)‘ØˆHð #œo×3Ò3°NÑCÔCˆOØð Ø#×-Ò-Ñ/Ô/�Ø$��)‘à�]Ô#Ð/Ø,-¨mÔ,<Ð)ØŸ
š
Ð#8Ñ9Ô9�AØ'(�A�mÑ$à�[”>Ð-Ø*+¨K¬.Ð'ØŸ
š
Ð#6Ñ7Ô7�AØ%&�A�k‘NØ�ØˆIr.   N)rD   rE   )r1   r2   r3   r4   r0   r>   rC   r    r9   r.   r,   r   r   Æ   sQ   € € € € € ðð ð ˆ8‰:Œ:€DðMð Mð Mðð ð ð ð ð r.   r   c                  ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestc                óp   — g d¢}d}d„ |D ¦   «         }|                       t          |¦  «        |¦  «         d S )N)ÚIÚIbÚIcÚiiÚiibÚiicÚiiiÚiiibÚiiicÚIVÚIVbÚIVcÚVÚVbÚVcÚviÚvibÚvicÚviioÚviiobÚviioc)rT   ÚI6ÚI64rW   Úii6Úii64rZ   Úiii6Úiii64r]   ÚIV6ÚIV64r`   ÚV6ÚV64rc   Úvi6Úvi64rf   Úviio6Úviio64c                ó,   — g | ]}t          |¦  «        ‘ŒS r9   ©r-   ©Ú.0Úxs     r,   ú
<listcomp>z#Test.testTriads.<locals>.<listcomp>  s!   € ÐAÐAÐA°Õ)¨!Ñ,Ô,ÐAÐAÐAr.   ©ÚassertEqualÚtuple)rB   Ú
harmTriadsÚgroundTruthÚromanTriadss       r,   Ú
testTriadszTest.testTriadsó   sT   € ð
ð 
ð 
ˆ
ð
ˆð BÐA°jÐAÑAÔAˆØ×Ò�˜{Ñ+Ô+¨[Ñ9Ô9Ð9Ð9Ð9r.   c                óp   — g d¢}d}d„ |D ¦   «         }|                       t          |¦  «        |¦  «         d S )N)ÚI7ÚI7bÚI7cÚI7dÚii7Úii7bÚii7cÚii7dÚiii7Úiii7bÚiii7cÚiii7dÚIV7ÚIV7bÚIV7cÚIV7dÚV7ÚV7bÚV7cÚV7dÚvi7Úvi7bÚvi7cÚvi7dÚviio7Úviio7bÚviio7cÚviio7d)r…   ÚI65ÚI43ÚI2r‰   Úii65Úii43Úii2r�   Úiii65Úiii43Úiii2r‘   ÚIV65ÚIV43ÚIV2r•   ÚV65ÚV43ÚV2r™   Úvi65Úvi43Úvi2r�   Úviio65Úviio43Úviio2c                ó,   — g | ]}t          |¦  «        ‘ŒS r9   rx   ry   s     r,   r|   z%Test.testSevenths.<locals>.<listcomp>  s!   € ÐEÐEÐE°1Õ+¨AÑ.Ô.ÐEÐEÐEr.   r}   )rB   ÚharmSeventhsr�   ÚromanSeventhss       r,   ÚtestSeventhszTest.testSevenths
  sT   € ð
ð 
ð 
ˆð
ˆð FÐE¸ÐEÑEÔEˆØ×Ò�˜}Ñ-Ô-¨{Ñ;Ô;Ð;Ð;Ð;r.   c                óp   — g d¢}d}d„ |D ¦   «         }|                       t          |¦  «        |¦  «         d S )N)ÚNÚNbÚNcr
   ÚLtbÚLtcr   ÚFrbÚFrcÚFrdr   ÚGnbÚGncÚGnd)r»   ÚN6ÚN64r   ÚIt6ÚIt64ÚFr7ÚFr65ÚFr43ÚFr2ÚGer7ÚGer65ÚGer43ÚGer2c                ó,   — g | ]}t          |¦  «        ‘ŒS r9   rx   ry   s     r,   r|   z*Test.testSpecialChords.<locals>.<listcomp>-  s!   € ÐOÐOÐO¸Õ0°Ñ3Ô3ÐOÐOÐOr.   r}   )rB   ÚharmSpecialChordsr�   ÚromanSpecialChordss       r,   ÚtestSpecialChordszTest.testSpecialChords   sX   € ð
ð 
ð 
Ðð
ˆð PÐOÐ=NÐOÑOÔOÐØ×Ò�Ð1Ñ2Ô2°KÑ@Ô@Ð@Ð@Ð@r.   c                óp   — g d¢}d}d„ |D ¦   «         }|                       t          |¦  «        |¦  «         d S )N)z-IIbz--IIcú#IV7z##IV7b)z-II6z--II64r×   z##IV65c                ó,   — g | ]}t          |¦  «        ‘ŒS r9   rx   ry   s     r,   r|   z(Test.testAlterations.<locals>.<listcomp>7  s!   € ÐKÐKÐK°aÕ.¨qÑ1Ô1ÐKÐKÐKr.   r}   )rB   ÚharmAlterationsr�   ÚromanAlterationss       r,   ÚtestAlterationszTest.testAlterations0  sV   € ð
ð 
ð 
ˆð
ˆð LÐK¸?ÐKÑKÔKÐØ×Ò�Ð/Ñ0Ô0°+Ñ>Ô>Ð>Ð>Ð>r.   N)r1   r2   r3   rƒ   r¹   rÕ   rÛ   r9   r.   r,   rR   rR   ñ   sS   € € € € € ð:ð :ð :ð.<ð <ð <ð,Að Að Að ?ð ?ð ?ð ?ð ?r.   rR   Ú__main__)r4   Ú
__future__r   r<   ÚtypingÚtÚunittestr-   r0   r   ÚTestCaserR   r1   Úmusic21ÚmainTestr9   r.   r,   ú<module>rä      s  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ø €€€ð^Gð ^Gð ^GðBMð Mð Mð Mð Mñ Mô Mð Mð`(ð (ð (ð (ð (ñ (ô (ð (ðVG?ð G?ð G?ð G?ð G?ˆ8Ôñ G?ô G?ð G?ðT ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr.   