§
    ƒØjf‰  ã                  óV  — d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	  ej
        d¦  «        Z G d„ d	ej        ¦  «        Z G d
„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d „ d!ej        ¦  «        Z G d"„ d#ej        ¦  «        Z G d$„ d%ej        ¦  «        Z G d&„ d'ej        ¦  «        Z G d(„ d)ej        ¦  «        Z G d*„ d+ej        ¦  «        Z G d,„ d-ej        ¦  «        Z  G d.„ d/ej        ¦  «        Z! G d0„ d1ej        ¦  «        Z" G d2„ d3ej        ¦  «        Z# G d4„ d5ej        ¦  «        Z$eeeeeeeeeeeeeeeee e!e#e$gZ% G d6„ d7ej&        ¦  «        Z'e(d8k    rddlZ ej)        e'¦  «         dS dS )9z&
Original music21 feature extractors.
é    )ÚannotationsN)Úenvironment)Úbase)Útextzfeatures.nativec                  ó   — e Zd ZdS )ÚNativeFeatureExceptionN)Ú__name__Ú
__module__Ú__qualname__© ó    úŒ/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/features/native.pyr   r   4   s   € € € € € Ø€Dr   r   c                  ó0   ‡ — e Zd ZdZdZdˆ fd„	Zd	d„Zˆ xZS )
ÚQualityFeaturear  
    Extends the jSymbolic QualityFeature to automatically find mode.

    Set to 0 if the key signature indicates that
    a recording is major, set to 1 if it indicates
    that it is minor.  A Music21
    addition: if no key mode is found in the piece, or conflicting modes in the keys,
    analyze the piece to discover what mode it is most likely in.

    Example: Handel, Rinaldo Aria (musicxml) is explicitly encoded as being in Major:

    >>> s = corpus.parse('handel/rinaldo/lascia_chio_pianga')
    >>> fe = features.native.QualityFeature(s)
    >>> f = fe.extract()
    >>> f.vector
    [0]

    now we will try it with the last movement of Schoenberg's opus 19 which has
    no mode explicitly encoded in the musicxml but which our analysis routines
    believe (having very little to go on) fits the profile of e minor best.

    >>> schoenberg19mvmt6 = corpus.parse('schoenberg/opus19', 6)
    >>> fe2 = features.native.QualityFeature(schoenberg19mvmt6)
    >>> f2 = fe2.extract()
    >>> f2.vector
    [1]

    OMIT_FROM_DOCS

    # for monophonic melodies
    # incomplete measures / pickups for monophonic melodies

    ÚP22Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )NÚdataOrStreamÚQualityaa  
            Set to 0 if the Key or KeySignature indicates that
            a recording is major, set to 1 if it indicates
            that it is minor.
            Music21 addition: if no key mode is found in the piece, or conflicting
            modes in the keys, analyze the piece to
            discover what mode it is most likely in.
            Té   r   )ÚsuperÚ__init__ÚnameÚdescriptionÚisSequentialÚ
dimensions©Úselfr   ÚkeywordsÚ	__class__s      €r   r   zQualityFeature.__init__\   sK   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?àˆŒ	ðˆÔð !ˆÔØˆŒˆˆr   ÚreturnÚNonec                ój  — | j         �| j        €t          d¦  «        ‚| j         d         }d}t          |¦  «        dk    r4|d         }|j        dk    rd}n|j        dk    rd}|| j        j        d<   dS d}t          |¦  «        dk    r	|d         }n[t          |¦  «        dk    rHt          ¦   «         }|D ]}|                     |j        ¦  «         Œt          |¦  «        dk    r|d         }|€| j         d         }|j        }|dk    rd}n|dk    rd}nt          d	¦  «        ‚|| j        j        d<   dS )
úE
        Do processing necessary, storing result in feature.
        Nz2Cannot process without a data instance or feature.zflat.getElementsByClass(Key)r   r   ÚmajorÚminorzflat.analyzedKeyzOshould be able to get a mode from something here -- perhaps there are no notes?)	ÚdataÚfeatureÚ
ValueErrorÚlenÚmodeÚvectorÚsetÚaddr   )r   ÚallKeysÚ
keyFeatureÚk0ÚuseKeyÚ
seen_modesÚkÚanalyzedModes           r   ÚprocesszQualityFeature.processk   sr  € ð Œ9Ð ¤Ð 4ÝÐQÑRÔRÐRà”)Ð:Ô;ˆØ#ˆ
Ýˆw‰<Œ<˜1ÒÐØ˜”ˆBØŒw˜'Ò!Ð!Ø�
�
Ø”˜GÒ#Ð#Ø�
Ø%/ˆDŒLÔ Ñ"ØˆFàˆÝˆw‰<Œ<˜1ÒÐØ˜Q”ZˆFˆFÝ�‰\Œ\˜AÒÐÝ™œˆJØð 'ð '�Ø—’˜qœvÑ&Ô&Ð&Ð&Ý�:‰Œ !Ò#Ð#ð
 ! œ�ð ˆ>Ø”YÐ1Ô2ˆFà”{ˆØ˜7Ò"Ð"ØˆJˆJØ˜WÒ$Ð$ØˆJˆJå(ð0ñô ð ð
 ",ˆŒÔ˜AÑÐÐr   ©N)r    r!   ©r	   r
   r   Ú__doc__Úidr   r5   Ú__classcell__©r   s   @r   r   r   8   sc   ø€ € € € € ð ð  ðB 
€Bðð ð ð ð ð ð/,ð /,ð /,ð /,ð /,ð /,ð /,ð /,r   r   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )ÚTonalCertaintya»  
    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.TonalCertainty(s)
    >>> f = fe.extract()
    >>> f.vector
    [1.26...]

    >>> pitches = [56, 55, 56, 57, 58, 57, 58, 59, 60, 59, 60, 61, 62, 61,
    ...            62, 63, 64, 63, 64, 65, 66, 65, 66, 67]
    >>> s = stream.Stream()
    >>> for pitch in pitches:
    ...   s.append(note.Note(pitch))
    >>> features.native.TonalCertainty(s).extract().vector
    [0.0]
    ÚK1Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   zTonal Certaintyz^A floating point magnitude value that suggest tonal certainty based on automatic key analysis.r   Fr   ©r   r   r   r   r   Údiscreter   s      €r   r   zTonalCertainty.__init__°   sI   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à%ˆŒ	ðIˆÔàˆŒØˆŒˆˆr   c                ó:   — | j         d         | j        j        d<   dS )r#   zflat.analyzedKey.tonalCertaintyr   N©r&   r'   r+   )r   s    r   r5   zTonalCertainty.process¹   s!   € ð "&¤Ð+LÔ!MˆŒÔ˜AÑÐÐr   r6   r7   r;   s   @r   r=   r=   ž   sd   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ðNð Nð Nð Nð Nð Nð Nr   r=   c                  ó(   ‡ — e Zd ZdZdZdˆ fd„	Zˆ xZS )ÚFirstBeatAttackPrevalencezÁ
    NOT IMPLEMENTED!

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.FirstBeatAttackPrevalence(s)
    >>> f = fe.extract()
    >>> f.vector
    [0]

    TODO: Implement!
    ÚMP1Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   zFirst Beat Attack PrevalencezMFraction of first beats of a measure that have notes that start on this beat.r   Fr   r@   r   s      €r   r   z"FirstBeatAttackPrevalence.__init__Ñ   sH   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à2ˆŒ	ð7ˆÔàˆŒØˆŒˆˆr   r6   )r	   r
   r   r8   r9   r   r:   r;   s   @r   rE   rE   Ã   sN   ø€ € € € € ð
ð 
ð 
€Bðð ð ð ð ð ð ð ð ð r   rE   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )ÚUniqueNoteQuarterLengthsz†
    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.UniqueNoteQuarterLengths(s)
    >>> fe.extract().vector
    [3]
    ÚQL1Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   zUnique Note Quarter Lengthsz*The number of unique note quarter lengths.r   Tr   r@   r   s      €r   r   z!UniqueNoteQuarterLengths.__init__è   sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à1ˆŒ	ØGˆÔØˆŒØˆŒˆˆr   c                ón   — d}| j         d         }|D ]}||         dk    r|dz  }Œ|| j        j        d<   dS )r#   r   ú!flat.notes.quarterLengthHistogramr   NrC   ©r   ÚcountÚhistoÚkeys       r   r5   z UniqueNoteQuarterLengths.processð   sQ   € ð ˆØ”	Ð=Ô>ˆØð 	ð 	ˆCà�SŒz˜AŠ~ˆ~Ø˜‘
�øØ!&ˆŒÔ˜AÑÐÐr   r6   r7   r;   s   @r   rI   rI   ß   s]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð
'ð 
'ð 
'ð 
'ð 
'ð 
'ð 
'r   rI   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )ÚMostCommonNoteQuarterLengthz‹
    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.MostCommonNoteQuarterLength(s)
    >>> fe.extract().vector
    [1.0]
    ÚQL2Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   zMost Common Note Quarter Lengthz,The value of the most common quarter length.r   Fr   r@   r   s      €r   r   z$MostCommonNoteQuarterLength.__init__  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à5ˆŒ	ØIˆÔØˆŒØˆŒˆˆr   c                ó|   — | j         d         }d}d}|D ]}||         |k    r
||         }|}Œ|| j        j        d<   dS )r#   rM   r   NrC   )r   rP   ÚmaximumÚqlrQ   s        r   r5   z#MostCommonNoteQuarterLength.process  s]   € ð ”	Ð=Ô>ˆØˆØˆØð 	ð 	ˆCà�SŒz˜WÒ$Ð$Ø œ*�Ø�øØ!#ˆŒÔ˜AÑÐÐr   r6   r7   r;   s   @r   rS   rS   ý   s]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð$ð $ð $ð $ð $ð $ð $r   rS   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú%MostCommonNoteQuarterLengthPrevalencezÚ
    Fraction of notes that have the most common quarter length.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.MostCommonNoteQuarterLengthPrevalence(s)
    >>> fe.extract().vector
    [0.60...]
    ÚQL3Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z*Most Common Note Quarter Length Prevalencez;Fraction of notes that have the most common quarter length.r   Fr   r@   r   s      €r   r   z.MostCommonNoteQuarterLengthPrevalence.__init__(  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à@ˆŒ	ØXˆÔØˆŒØˆŒˆˆr   c                óÎ   — d}| j         d         }|st          d¦  «        ‚d}|D ]-}||         dk    r|||         z  }||         |k    r||         }Œ.||z  | j        j        d<   dS )r#   r   rM   úinput lacks notesN©r&   r   r'   r+   ©r   Ú	summationrP   ÚmaxKeyrQ   s        r   r5   z-MostCommonNoteQuarterLengthPrevalence.process0  s�   € ð ˆ	Ø”	Ð=Ô>ˆØð 	>Ý(Ð)<Ñ=Ô=Ð=ØˆØð 	(ð 	(ˆCà�SŒz˜AŠ~ˆ~Ø˜U 3œZÑ'�	Ø˜”: Ò'Ð'Ø" 3œZ�FøØ!'¨)Ñ!3ˆŒÔ˜AÑÐÐr   r6   r7   r;   s   @r   rZ   rZ     s]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð4ð 4ð 4ð 4ð 4ð 4ð 4r   rZ   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )ÚRangeOfNoteQuarterLengthszË
    Difference between the longest and shortest quarter lengths.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.RangeOfNoteQuarterLengths(s)
    >>> fe.extract().vector
    [1.5]
    ÚQL4Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   zRange of Note Quarter Lengthsz<Difference between the longest and shortest quarter lengths.r   Fr   r@   r   s      €r   r   z"RangeOfNoteQuarterLengths.__init__M  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à3ˆŒ	ØYˆÔØˆŒØˆŒˆˆr   c                óê   — | j         d         }|st          d¦  «        ‚t          |                     ¦   «         ¦  «        }t	          |                     ¦   «         ¦  «        }||z
  | j        j        d<   dS )r#   rM   r^   r   N)r&   r   ÚminÚkeysÚmaxr'   r+   )r   rP   ÚminValÚmaxVals       r   r5   z!RangeOfNoteQuarterLengths.processU  sk   € ð ”	Ð=Ô>ˆØð 	>Ý(Ð)<Ñ=Ô=Ð=Ý�U—Z’Z‘\”\Ñ"Ô"ˆÝ�U—Z’Z‘\”\Ñ"Ô"ˆØ!'¨&¡ˆŒÔ˜AÑÐÐr   r6   r7   r;   s   @r   rd   rd   B  s]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1r   rd   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú!UniquePitchClassSetSimultaneitieszÂ
    Number of unique pitch class simultaneities.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.UniquePitchClassSetSimultaneities(s)
    >>> fe.extract().vector
    [27]
    ÚCS1Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z%Unique Pitch Class Set Simultaneitiesz,Number of unique pitch class simultaneities.r   Fr   r@   r   s      €r   r   z*UniquePitchClassSetSimultaneities.__init__v  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à;ˆŒ	ØIˆÔØˆŒØˆŒˆˆr   c                ón   — d}| j         d         }|D ]}||         dk    r|dz  }Œ|| j        j        d<   dS )r#   r   ú>chordify.flat.getElementsByClass(Chord).pitchClassSetHistogramr   NrC   rN   s       r   r5   z)UniquePitchClassSetSimultaneities.process~  sQ   € ð ˆØ”	ÐZÔ[ˆØð 	ð 	ˆCà�SŒz˜AŠ~ˆ~Ø˜‘
�øØ!&ˆŒÔ˜AÑÐÐr   r6   r7   r;   s   @r   rn   rn   k  ó]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð
'ð 
'ð 
'ð 
'ð 
'ð 
'ð 
'r   rn   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )ÚUniqueSetClassSimultaneitiesz»
    Number of unique set class simultaneities.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.UniqueSetClassSimultaneities(s)
    >>> fe.extract().vector
    [14]
    ÚCS2Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   zUnique Set Class Simultaneitiesz*Number of unique set class simultaneities.r   Fr   r@   r   s      €r   r   z%UniqueSetClassSimultaneities.__init__–  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à5ˆŒ	ØGˆÔØˆŒØˆŒˆˆr   c                ón   — d}| j         d         }|D ]}||         dk    r|dz  }Œ|| j        j        d<   dS )r#   r   ú9chordify.flat.getElementsByClass(Chord).setClassHistogramr   NrC   rN   s       r   r5   z$UniqueSetClassSimultaneities.processž  sQ   € ð ˆØ”	ÐUÔVˆØð 	ð 	ˆCà�SŒz˜AŠ~ˆ~Ø˜‘
�øØ!&ˆŒÔ˜AÑÐÐr   r6   r7   r;   s   @r   ru   ru   ‹  rs   r   ru   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú-MostCommonPitchClassSetSimultaneityPrevalencezù
    Fraction of all pitch class simultaneities that are the most common simultaneity.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.MostCommonPitchClassSetSimultaneityPrevalence(s)
    >>> fe.extract().vector
    [0.134...]
    ÚCS3Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z3Most Common Pitch Class Set Simultaneity PrevalencezQFraction of all pitch class simultaneities that are the most common simultaneity.r   Fr   r@   r   s      €r   r   z6MostCommonPitchClassSetSimultaneityPrevalence.__init__·  sH   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?àIˆŒ	ð<ˆÔàˆŒØˆŒˆˆr   c                óü   — d}| j         d         }d}|st          d¦  «        ‚|D ]-}||         dk    r|||         z  }||         |k    r||         }Œ.|dk    r||z  | j        j        d<   dS d| j        j        d<   dS )r#   r   rr   r^   Nr_   r`   s        r   r5   z5MostCommonPitchClassSetSimultaneityPrevalence.processÀ  s­   € ð ˆ	Ø”	ÐZÔ[ˆØˆØð 	>Ý(Ð)<Ñ=Ô=Ð=Øð 	(ð 	(ˆCà�SŒz˜AŠ~ˆ~Ø˜U 3œZÑ'�	Ø˜”: Ò'Ð'Ø" 3œZ�FøØ˜Š>ˆ>Ø%+¨iÑ%7ˆDŒLÔ Ñ"Ð"Ð"à%&ˆDŒLÔ Ñ"Ð"Ð"r   r6   r7   r;   s   @r   r{   r{   «  s]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð'ð 'ð 'ð 'ð 'ð 'ð 'r   r{   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú(MostCommonSetClassSimultaneityPrevalencea¤  
    Fraction of all set class simultaneities that the most common simultaneity
    occupies.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.MostCommonSetClassSimultaneityPrevalence(s)
    >>> fe.extract().vector
    [0.653...]
    >>> s2 = corpus.parse('schoenberg/opus19', 6)
    >>> fe2 = features.native.MostCommonSetClassSimultaneityPrevalence(s2)
    >>> fe2.extract().vector
    [0.235...]
    ÚCS4Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z-Most Common Set Class Simultaneity PrevalencezOFraction of all set class simultaneities that are the most common simultaneity.r   Fr   r@   r   s      €r   r   z1MostCommonSetClassSimultaneityPrevalence.__init__å  sI   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?àCˆŒ	ð@ˆÔàˆŒØˆŒˆˆr   c                óü   — d}| j         d         }|st          d¦  «        ‚d}|D ]-}||         dk    r|||         z  }||         |k    r||         }Œ.|dk    r||z  | j        j        d<   dS d| j        j        d<   dS )r#   r   ry   r^   Nr_   r`   s        r   r5   z0MostCommonSetClassSimultaneityPrevalence.processî  s­   € ð ˆ	Ø”	ÐUÔVˆØð 	>Ý(Ð)<Ñ=Ô=Ð=ØˆØð 	(ð 	(ˆCà�SŒz˜AŠ~ˆ~Ø˜U 3œZÑ'�	Ø˜”: Ò'Ð'Ø" 3œZ�FøØ˜Š>ˆ>Ø%+¨iÑ%7ˆDŒLÔ Ñ"Ð"Ð"à%&ˆDŒLÔ Ñ"Ð"Ð"r   r6   r7   r;   s   @r   r€   r€   Õ  s]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð'ð 'ð 'ð 'ð 'ð 'ð 'r   r€   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú MajorTriadSimultaneityPrevalencezÑ
    Percentage of all simultaneities that are major triads.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.MajorTriadSimultaneityPrevalence(s)
    >>> fe.extract().vector
    [0.46...]
    ÚCS5Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z#Major Triad Simultaneity Prevalencez7Percentage of all simultaneities that are major triads.r   Fr   r@   r   s      €r   r   z)MajorTriadSimultaneityPrevalence.__init__  óF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à9ˆŒ	ØTˆÔØˆŒØˆŒˆˆr   c                óÈ   — t          | j        d         ¦  «        }| j        d         }|dk    r%|d         |d         z   }||z  | j        j        d<   dS d| j        j        d<   dS )r#   ú'chordify.flat.getElementsByClass(Chord)ú6chordify.flat.getElementsByClass(Chord).typesHistogramr   ÚisMajorTriadÚisIncompleteMajorTriadN©r)   r&   r'   r+   ©r   ÚtotalrP   Úparts       r   r5   z(MajorTriadSimultaneityPrevalence.process  ór   € õ
 �D”IÐGÔHÑIÔIˆØ”	ÐRÔSˆà�AŠ:ˆ:Ø˜Ô(¨5Ð1IÔ+JÑJˆDØ%)¨E¡\ˆDŒLÔ Ñ"Ð"Ð"à%&ˆDŒLÔ Ñ"Ð"Ð"r   r6   r7   r;   s   @r   r…   r…     ó]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð'ð 'ð 'ð 'ð 'ð 'ð 'r   r…   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú MinorTriadSimultaneityPrevalencezð
    Percentage of all simultaneities that are minor triads.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.MinorTriadSimultaneityPrevalence(s)
    >>> fe.extract().vector  # same as major in this work
    [0.211...]
    ÚCS6Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z#Minor Triad Simultaneity Prevalencez7Percentage of all simultaneities that are minor triads.r   Fr   r@   r   s      €r   r   z)MinorTriadSimultaneityPrevalence.__init__0  rˆ   r   c                óÈ   — t          | j        d         ¦  «        }| j        d         }|dk    r%|d         |d         z   }||z  | j        j        d<   dS d| j        j        d<   dS )r#   rŠ   r‹   r   ÚisMinorTriadÚisIncompleteMinorTriadNrŽ   r�   s       r   r5   z(MinorTriadSimultaneityPrevalence.process8  r’   r   r6   r7   r;   s   @r   r•   r•   %  r“   r   r•   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú%DominantSeventhSimultaneityPrevalencezÛ
    Percentage of all simultaneities that are dominant seventh.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.DominantSeventhSimultaneityPrevalence(s)
    >>> fe.extract().vector
    [0.076...]
    ÚCS7Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z(Dominant Seventh Simultaneity Prevalencez;Percentage of all simultaneities that are dominant seventh.r   Fr   r@   r   s      €r   r   z.DominantSeventhSimultaneityPrevalence.__init__R  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à>ˆŒ	ØXˆÔØˆŒØˆŒˆˆr   c                ó¶   — t          | j        d         ¦  «        }| j        d         }|dk    r|d         }||z  | j        j        d<   dS d| j        j        d<   dS )r#   rŠ   r‹   r   ÚisDominantSeventhNrŽ   r�   s       r   r5   z-DominantSeventhSimultaneityPrevalence.processZ  óh   € õ
 �D”IÐGÔHÑIÔIˆØ”	ÐRÔSˆà�AŠ:ˆ:ØÐ,Ô-ˆDØ%)¨E¡\ˆDŒLÔ Ñ"Ð"Ð"à%&ˆDŒLÔ Ñ"Ð"Ð"r   r6   r7   r;   s   @r   rœ   rœ   G  r“   r   rœ   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú%DiminishedTriadSimultaneityPrevalencezÜ
    Percentage of all simultaneities that are diminished triads.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.DiminishedTriadSimultaneityPrevalence(s)
    >>> fe.extract().vector
    [0.019...]
    ÚCS8Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z(Diminished Triad Simultaneity Prevalencez<Percentage of all simultaneities that are diminished triads.r   Fr   r@   r   s      €r   r   z.DiminishedTriadSimultaneityPrevalence.__init__t  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à>ˆŒ	ØYˆÔØˆŒØˆŒˆˆr   c                ó¶   — t          | j        d         ¦  «        }| j        d         }|dk    r|d         }||z  | j        j        d<   dS d| j        j        d<   dS )r#   rŠ   r‹   r   ÚisDiminishedTriadNrŽ   r�   s       r   r5   z-DiminishedTriadSimultaneityPrevalence.process|  r¡   r   r6   r7   r;   s   @r   r£   r£   i  r“   r   r£   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )ÚTriadSimultaneityPrevalencea   
    Gives the proportion of all simultaneities which form triads (major,
    minor, diminished, or augmented)

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.TriadSimultaneityPrevalence(s)
    >>> fe.extract().vector
    [0.692...]
    >>> s2 = corpus.parse('schoenberg/opus19', 2)
    >>> fe2 = features.native.TriadSimultaneityPrevalence(s2)
    >>> fe2.extract().vector
    [0.02272727...]
    ÚCS9Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   zTriad Simultaneity Prevalencez2Proportion of all simultaneities that form triads.r   Fr   r@   r   s      €r   r   z$TriadSimultaneityPrevalence.__init__›  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à3ˆŒ	ØOˆÔØˆŒØˆŒˆˆr   c                ó¶   — t          | j        d         ¦  «        }| j        d         }|dk    r|d         }||z  | j        j        d<   dS d| j        j        d<   dS )r#   rŠ   r‹   r   ÚisTriadNrŽ   r�   s       r   r5   z#TriadSimultaneityPrevalence.process£  sg   € õ
 �D”IÐGÔHÑIÔIˆØ”	ÐRÔSˆà�AŠ:ˆ:Ø˜Ô#ˆDØ%)¨E¡\ˆDŒLÔ Ñ"Ð"Ð"à%&ˆDŒLÔ Ñ"Ð"Ð"r   r6   r7   r;   s   @r   r©   r©   ‹  s]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð'ð 'ð 'ð 'ð 'ð 'ð 'r   r©   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú'DiminishedSeventhSimultaneityPrevalencezá
    Percentage of all simultaneities that are diminished seventh chords.

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.DiminishedSeventhSimultaneityPrevalence(s)
    >>> fe.extract().vector
    [0.0]
    ÚCS10Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z*Diminished Seventh Simultaneity PrevalencezDPercentage of all simultaneities that are diminished seventh chords.r   Fr   r@   r   s      €r   r   z0DiminishedSeventhSimultaneityPrevalence.__init__½  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à@ˆŒ	ØaˆÔØˆŒØˆŒˆˆr   c                ó¶   — t          | j        d         ¦  «        }| j        d         }|dk    r|d         }||z  | j        j        d<   dS d| j        j        d<   dS )r#   rŠ   r‹   r   ÚisDiminishedSeventhNrŽ   r�   s       r   r5   z/DiminishedSeventhSimultaneityPrevalence.processÅ  sh   € õ
 �D”IÐGÔHÑIÔIˆØ”	ÐRÔSˆà�AŠ:ˆ:ØÐ.Ô/ˆDØ%)¨E¡\ˆDŒLÔ Ñ"Ð"Ð"à%&ˆDŒLÔ Ñ"Ð"Ð"r   r6   r7   r;   s   @r   r¯   r¯   ²  s]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð'ð 'ð 'ð 'ð 'ð 'ð 'r   r¯   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )Ú!IncorrectlySpelledTriadPrevalencea  
    Percentage of all triads that are spelled incorrectly.

    example:

    Mozart k155 movement 2 has a single instance of an incorrectly spelled
    triad (m. 17, where the C# of an A-major chord has a lower neighbor B#
    thus temporarily creating an incorrectly spelled A-minor chord).

    We would expect highly chromatic music such as Reger or Wagner to have
    a higher percentage, or automatically rendered MIDI
    transcriptions (which don't distinguish between D# and Eb).

    >>> s = corpus.parse('bwv66.6')
    >>> fe = features.native.IncorrectlySpelledTriadPrevalence(s)
    >>> fe.extract().vector
    [0.02...]
    ÚCS11Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z$Incorrectly Spelled Triad Prevalencez6Percentage of all triads that are spelled incorrectly.r   Fr   r@   r   s      €r   r   z*IncorrectlySpelledTriadPrevalence.__init__é  sF   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à:ˆŒ	ØSˆÔØˆŒØˆŒˆˆr   c                ó"  — | j         d         }|st          d¦  «        ‚|d         }| j         d         }d}d|v r||d         z  }d|v r||d         z  }d|v r||d         z  }||z
  }|dk    r||z  | j        j        d<   d
S t          d	¦  «        ‚)r#   r‹   r^   r­   ry   r   z3-11z3-12z3-10zinput lacks Forte triadsNr_   )r   rP   ÚtotalCorrectlySpelledÚ	forteDataÚtotalForteTriadsÚtotalIncorrectlySpelleds         r   r5   z)IncorrectlySpelledTriadPrevalence.processñ  sØ   € ð
 ”	ÐRÔSˆØð 	>Ý(Ð)<Ñ=Ô=Ð=à % iÔ 0ÐØ”IÐYÔZˆ	ØÐØ�YÐÐØ 	¨&Ô 1Ñ1ÐØ�YÐÐØ 	¨&Ô 1Ñ1ÐØ�YÐÐØ 	¨&Ô 1Ñ1Ðà"2Ð5JÑ"JÐà˜qÒ Ð Ø%<Ð?OÑ%OˆDŒLÔ Ñ"Ð"Ð"å(Ð)CÑDÔDÐDr   r6   r7   r;   s   @r   rµ   rµ   Ô  sd   ø€ € € € € ðð ð$ 
€Bðð ð ð ð ð ðEð Eð Eð Eð Eð Eð Er   rµ   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )ÚChordBassMotionFeaturea¦  
    A twelve element feature that reports the fraction
    of all chord motion of music21.harmony.Harmony objects
    that move up by i-half-steps. (a half-step motion down would
    be stored in i = 11).  i = 0 is always 0.0 since consecutive
    chords on the same pitch are ignored (unless there are 0 or 1 harmonies, in which case it is 1)

    Sample test on Dylan's Blowing In The Wind (not included), showing all
    motion is 3rds, 6ths, or especially 4ths and 5ths.

    s = corpus.parse('demos/BlowinInTheWind')
    fe = features.native.ChordBassMotionFeature(s)
    fe.extract().vector

    [0.0, 0.0, 0.0, 0.0416..., 0.0416..., 0.166..., 0.0, 0.54166..., 0.0, 0.0, 0.2083... 0.0]

    For comparison, the Beatles Here Comes the Sun has more tone motion

    [0.0, 0.05..., 0.14..., 0.03..., 0.06..., 0.3..., 0.008..., 0.303...,
     0.0, 0.0, 0.07..., 0.008...]

    Post 1990s music has a lot more semitone motion.

    ÚCS12Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   zChord Bass Motionz›12-element vector showing the fraction of chords that move by x semitones (where x=0 is always 0 unless there are 0 or 1 harmonies, in which case it is 1).é   Fr   r@   r   s      €r   r   zChordBassMotionFeature.__init__'  sK   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à'ˆŒ	ðFˆÔð ˆŒØˆŒˆˆr   c                óB  — | j         d         }g d¢}d}d}|D ]»}|€|}Œ|                     ¦   «         �|                     ¦   «         }n|                     ¦   «         }|                     ¦   «         �|                     ¦   «         }n|                     ¦   «         }|j        |j        k    rŒ’|j        |j        z
  dz  }||xx         dz  cc<   |dz  }|}Œ¼|dk    rg d¢}	n4g d¢}
t	          dd¦  «        D ]}t          ||         ¦  «        |z  |
|<   Œ|
}	|	| j        _        dS )	r#   z flat.getElementsByClass(Harmony))r   r   r   r   r   r   r   r   r   r   r   r   r   NrÁ   r   )g      ð?ç        rÃ   rÃ   rÃ   rÃ   rÃ   rÃ   rÃ   rÃ   rÃ   rÃ   )rÃ   r   r   r   r   r   r   r   r   r   r   r   )r&   ÚbassÚrootÚ
pitchClassÚrangeÚfloatr'   r+   )r   ÚharmsÚ	totMotionÚtotalHarmonicMotionÚlastHarmÚthisHarmÚlastBassÚthisBassÚhalfStepMotionr+   ÚtotHarmonicMotionFractionÚis               r   r5   zChordBassMotionFeature.process1  sa  € ð
 ”	Ð<Ô=ˆà8Ð8Ð8ˆ	ØÐØˆàð 	(ð 	(ˆHØÐØ#��à—=’=‘?”?Ð.Ø'Ÿ}š}™œ�H�Hà'Ÿ}š}™œ�Hà—=’=‘?”?Ð.Ø'Ÿ}š}™œ�H�Hà'Ÿ}š}™œ�HàÔ&¨(Ô*=Ò=Ð=Øà&.Ô&9¸HÔ<OÑ&OÐSUÑ%U�NØ˜nÐ-Ð-Ô-°Ñ2Ð-Ð-Ñ-Ø'¨1Ñ,Ð'Ø'�H�Hà !Ò#Ð#ØQÐQÐQˆFˆFà(NÐ(NÐ(NÐ%Ý˜1˜b‘\”\ð Yð Y�Ý/4°Y¸q´\Ñ/BÔ/BÐEXÑ/XÐ)¨!Ñ,Ð,Ø.ˆFà$ˆŒÔÐÐr   r6   r7   r;   s   @r   r¾   r¾     s]   ø€ € € € € ðð ð0 
€Bðð ð ð ð ð ð)%ð )%ð )%ð )%ð )%ð )%ð )%r   r¾   c                  ó   — e Zd ZdZdZdS )ÚComposerPopularityzÉ
    REMOVED in v7 because Google's repsonse no longer includes result counts.
    Empty class still here so that id won't be reused, but it's been removed
    from this module's list of features.
    ÚMD1N)r	   r
   r   r8   r9   r   r   r   rÔ   rÔ   `  s   € € € € € ðð ð
 
€B€B€Br   rÔ   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )ÚLandiniCadencezY
    Return a boolean if one or more Parts end with a Landini-like cadential figure.
    ÚMC1Nc                óv   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        d S )Nr   z!Ends With Landini Melodic Contourz\Boolean that indicates the presence of a Landini-like cadential figure in one or more parts.r   Fr   r@   r   s      €r   r   zLandiniCadence.__init__s  sI   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à7ˆŒ	ðEˆÔàˆŒØˆŒˆˆr   c                ó  — ddgg d¢g}g }| j         j        dk    rKt          | j         j        ¦  «        D ]0}| j         d         |         d         }|                     |¦  «         Œ1n"| j         d         }|                     |¦  «         d}|D ]m}g }|D ]}|dk    r|                     |¦  «         Œ|D ]B}t	          |¦  «        t	          |¦  «        k    r |t	          |¦  «         d…         |k    rd	} nŒC|r nŒn|rd
| j        j        d<   dS dS )r#   éþÿÿÿé   )éÿÿÿÿrÛ   rÜ   r   ÚpartsÚcontourListFNTr   )r&   Ú
partsCountrÇ   Úappendr)   r'   r+   )	r   ÚmatchÚcBundlerÒ   ÚcListÚfoundÚ
cListCleanÚcÚcMatchs	            r   r5   zLandiniCadence.process|  sg  € ð �a�˜+˜+˜+Ð&ˆàˆØŒ9Ô !Ò#Ð#Ý˜4œ9Ô/Ñ0Ô0ð &ð &�Øœ	 'Ô*¨1Ô-¨mÔ<�Ø—’˜uÑ%Ô%Ð%Ð%ð&ð ”I˜mÔ,ˆEØ�NŠN˜5Ñ!Ô!Ð!ð ˆØð 	ð 	ˆEàˆJØð )ð )�Ø˜’6�6Ø×%Ò% aÑ(Ô(Ð(øàð ð �õ �z‘?”?¥c¨&¡k¤kÒ1Ð1à!¥3 v¡;¤; , - -Ô0°FÒ:Ð:Ø $˜Ø˜øØð Ø�ðàð 	'Ø%&ˆDŒLÔ Ñ"Ð"Ð"ð	'ð 	'r   r6   r7   r;   s   @r   r×   r×   m  s]   ø€ € € € € ðð ð 
€Bðð ð ð ð ð ð&'ð &'ð &'ð &'ð &'ð &'ð &'r   r×   c                  ó.   ‡ — e Zd ZdZdZdˆ fd„	Zd„ Zˆ xZS )ÚLanguageFeaturea^  
    language of text as a number
    the number is the index of text.LanguageDetector.languageCodes + 1
    or 0 if there is no language.

    Detect that the language of a Handel aria is Italian.

    >>> s = corpus.parse('handel/rinaldo/lascia_chio_pianga')
    >>> fe = features.native.LanguageFeature(s)
    >>> fe.extract().vector
    [3]

    ÚTX1Nc                ó¦   •—  t          ¦   «         j        dd|i|¤Ž d| _        d| _        d| _        d| _        t          j        ¦   «         | _        d S )Nr   zLanguage FeatureztLanguage of the lyrics of the piece given as a numeric value from text.LanguageDetector.mostLikelyLanguageNumeric().r   Tr   )	r   r   r   r   r   rA   r   ÚLanguageDetectorÚlanguageDetectorr   s      €r   r   zLanguageFeature.__init__¸  s\   ø€ Ø�‰ŒÔÐ?Ð? lÐ?°hÐ?Ð?Ð?à&ˆŒ	ð\ˆÔàˆŒØˆŒÝ $Ô 5Ñ 7Ô 7ˆÔÐÐr   c                ón   — | j         d         }| j                             |¦  «        | j        j        d<   dS )r#   ÚassembledLyricsr   N)r&   rî   ÚmostLikelyLanguageNumericr'   r+   )r   ÚstoredLyricss     r   r5   zLanguageFeature.processÂ  s8   € ð ”yÐ!2Ô3ˆØ!%Ô!6×!PÒ!PÐQ]Ñ!^Ô!^ˆŒÔ˜AÑÐÐr   r6   r7   r;   s   @r   rê   rê   ¨  sd   ø€ € € € € ðð ð 
€Bð8ð 8ð 8ð 8ð 8ð 8ð_ð _ð _ð _ð _ð _ð _r   rê   c                  ó   — e Zd Zd„ Zd„ ZdS )ÚTestc                óV  — ddl m} ddl m} ddl m} |                     ¦   «         }|                     |                     g d¢¦  «        ¦  «         |                     |                     g d¢¦  «        ¦  «         |                     |                     g d¢¦  «        ¦  «         |                     |                     g d¢¦  «        ¦  «         |j                             |¦  «        }|  	                    t          |                     ¦   «         j        d         ¦  «        d	¦  «         d S )
Nr   )Ústream©Úfeatures)Úchord)rç   ÚeÚg)rç   rú   Úa)rç   úd#rû   )rç   rý   za--z0.5)Úmusic21rö   rø   rù   ÚStreamrá   ÚChordÚnativerµ   ÚassertEqualÚstrÚextractr+   )r   rö   rø   rù   ÚsÚfes         r   Ú%testIncorrectlySpelledTriadPrevalencez*Test.testIncorrectlySpelledTriadPrevalenceî  s  € Ø"Ð"Ð"Ð"Ð"Ð"Ø$Ð$Ð$Ð$Ð$Ð$Ø!Ð!Ð!Ð!Ð!Ð!à�MŠM‰OŒOˆØ	�Š�—’˜_˜_˜_Ñ-Ô-Ñ.Ô.Ð.Ø	�Š�—’˜_˜_˜_Ñ-Ô-Ñ.Ô.Ð.Ø	�Š�—’Ð-Ð-Ð-Ñ.Ô.Ñ/Ô/Ð/Ø	�Š�—’Ð/Ð/Ð/Ñ0Ô0Ñ1Ô1Ð1àŒ_×>Ò>¸qÑAÔAˆØ×Ò�˜RŸZšZ™\œ\Ô0°Ô3Ñ4Ô4°eÑ<Ô<Ð<Ð<Ð<r   c                ój  — ddl m} ddl m} |                     d¦  «        }|j                             |¦  «        }|                      |                     ¦   «         j        d         d¦  «         |                     d¦  «        }|j                             |¦  «        }|                      |                     ¦   «         j        d         d¦  «         |                     d¦  «        }|j                             |¦  «        }|                      |                     ¦   «         j        d         d¦  «         d S )Nr   )Ú	converterr÷   ztinynotation: 3/4 f#4 f# e g2r   ztinynotation: 3/4 f#4 f# f# g2ztinynotation: 3/4 f#4 e a g2)	rþ   r	  rø   Úparser  r×   r  r  r+   )r   r	  rø   r  r  s        r   ÚtestLandiniCadencezTest.testLandiniCadenceü  s  € Ø%Ð%Ð%Ð%Ð%Ð%Ø$Ð$Ð$Ð$Ð$Ð$à�OŠOÐ;Ñ<Ô<ˆØŒ_×+Ò+¨AÑ.Ô.ˆØ×Ò˜Ÿš™œÔ,¨QÔ/°Ñ3Ô3Ð3à�OŠOÐ<Ñ=Ô=ˆØŒ_×+Ò+¨AÑ.Ô.ˆØ×Ò˜Ÿš™œÔ,¨QÔ/°Ñ3Ô3Ð3à�OŠOÐ:Ñ;Ô;ˆØŒ_×+Ò+¨AÑ.Ô.ˆØ×Ò˜Ÿš™œÔ,¨QÔ/°Ñ3Ô3Ð3Ð3Ð3r   N)r	   r
   r   r  r  r   r   r   rô   rô   ì  s2   € € € € € ð=ð =ð =ð4ð 4ð 4ð 4ð 4r   rô   Ú__main__)*r8   Ú
__future__r   Úunittestrþ   r   Úmusic21.featuresr   ÚfeaturesModuler   ÚEnvironmentÚenvironLocalÚFeatureExceptionr   ÚFeatureExtractorr   r=   rE   rI   rS   rZ   rd   rn   ru   r{   r€   r…   r•   rœ   r£   r©   r¯   rµ   r¾   rÔ   r×   rê   ÚfeatureExtractorsÚTestCaserô   r	   ÚmainTestr   r   r   ú<module>r     sj  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€à Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð à&ˆ{Ô&Ð'8Ñ9Ô9€ð>	ð 	ð 	ð 	ð 	˜^Ô<ñ 	ô 	ð 	ðb,ð b,ð b,ð b,ð b,�^Ô4ñ b,ô b,ð b,ðLNð Nð Nð Nð N�^Ô4ñ Nô Nð NðJð ð ð ð  Ô ?ñ ô ð ð8'ð 'ð 'ð 'ð '˜~Ô>ñ 'ô 'ð 'ð<$ð $ð $ð $ð $ .Ô"Añ $ô $ð $ð@"4ð "4ð "4ð "4ð "4¨NÔ,Kñ "4ô "4ð "4ðJ1ð 1ð 1ð 1ð 1 Ô ?ñ 1ô 1ð 1ðR'ð 'ð 'ð 'ð '¨Ô(Gñ 'ô 'ð 'ð@'ð 'ð 'ð 'ð ' >Ô#Bñ 'ô 'ð 'ð@''ð ''ð ''ð ''ð ''ØÔ'ñ''ô ''ð ''ðT+'ð +'ð +'ð +'ð +'¨~Ô/Nñ +'ô +'ð +'ð\'ð 'ð 'ð 'ð ' ~Ô'Fñ 'ô 'ð 'ðD'ð 'ð 'ð 'ð ' ~Ô'Fñ 'ô 'ð 'ðD'ð 'ð 'ð 'ð '¨NÔ,Kñ 'ô 'ð 'ðD'ð 'ð 'ð 'ð '¨NÔ,Kñ 'ô 'ð 'ðD$'ð $'ð $'ð $'ð $' .Ô"Añ $'ô $'ð $'ðN'ð 'ð 'ð 'ð '¨nÔ.Mñ 'ô 'ð 'ðD5Eð 5Eð 5Eð 5Eð 5E¨Ô(Gñ 5Eô 5Eð 5EðpN%ð N%ð N%ð N%ð N%˜^Ô<ñ N%ô N%ð N%ðhð ð ð ð ˜Ô8ñ ô ð ð5'ð 5'ð 5'ð 5'ð 5'�^Ô4ñ 5'ô 5'ð 5'ðv_ð _ð _ð _ð _�nÔ5ñ _ô _ð _ðH ààØØ)Øà%Ø Ø1Ø,Ø$Ø$Ø)Ø)ØØ+Ø%Øð àð7Ð ðB4ð 4ð 4ð 4ð 4ˆ8Ôñ 4ô 4ð 4ðB ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   