§
    ƒØjTÓ  ã                  ó:  — U d Z ddlmZ ddlZddlZddlZddlZddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ  ej        d¦  «        Z G d„ de	j        ¦  «        Z G d„ dej        ¦  «        Z G d„ de	j        ¦  «        Z G d„ d¦  «        Z G d„ de	j        ¦  «        Z G d„ d¦  «        Z G d„ dej        ¦  «        Z  G d„ dej        ¦  «        Z!g Z"d e#d!<   e$d"k    rddlZ ej%        e ¦  «         dS dS )#z¯
Tools for generation reduction displays, showing a score and or a chord reduction,
and one or more reductive representation lines.

Used by graph.PlotHorizontalBarWeighted()
é    )ÚannotationsN)Úexceptions21)Úchord)Úcommon)ÚDocOrder)Úenvironment)Úexpressions)Ú
instrument)Únote)Úpitch)Úprebase)Ústreamzanalysis.reductionc                  ó   — e Zd ZdS )ÚReductiveEventExceptionN©Ú__name__Ú
__module__Ú__qualname__© ó    ú�/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/analysis/reduction.pyr   r   )   ó   € € € € € Ø€Dr   r   c            	      ój   — e Zd ZdZdZdZdddddd	d
ddœZdddddddœZd„ Zd„ Z	d„ Z
dd„Zdd„Zd„ ZdS )ÚReductiveNotea†  
    The extraction of an event from a score and specification of where
    and how it should be presented in a reductive score.

    A specification string, as well as Note, must be provided for parsing.

    A specification must be created when access the Measure that the source note
    is found in. Storing the measure and index position provides significant
    performance optimization, as we do no have to search
    every note when generated the reduction.

    The `measureIndex` is the index of measure where this is found, not
    the measure number. The `measureOffset` is the position in the measure
    specified by the index.
    ú:ú/r   ÚoctaveÚnoteheadFillÚstemDirectionÚgroupÚvoiceÚ	textAboveÚ	textBelow)ÚpÚoÚnfÚsdÚgÚvÚtaÚtbNÚnoStem)r   r   r   r   r    r!   c                óœ   — || _         d | _        i | _        d| _        |                      | j         ¦  «         || _        || _        || _        d S )NF)Ú_specificationÚ_noteÚ_parametersÚ	_isParsedÚ_parseSpecificationÚmeasureIndexÚmeasureOffset)ÚselfÚspecificationÚ	inputNoter3   r4   s        r   Ú__init__zReductiveNote.__init__X   sT   € Ø+ˆÔàˆŒ
ØˆÔàˆŒØ× Ò  Ô!4Ñ5Ô5Ð5ØˆŒ
Ø(ˆÔØ*ˆÔÐÐr   c                ó¤  — g }| j         D ]o}| j         |         }|| j        v rW| j        |         rJ|                     |¦  «         |                     d¦  «         |                     | j        |         ¦  «         Œp| j        �<|                     d¦  «         |                     t	          | j        ¦  «        ¦  «         d                     |¦  «        S )Nr   z of Ú )Ú_parameterKeysr0   Úappendr/   ÚreprÚjoin)r5   ÚmsgÚkeyÚattrs       r   Ú_reprInternalzReductiveNote._reprInternald   sÃ   € ØˆØÔ&ð 	7ð 	7ˆCØÔ& sÔ+ˆDØ�tÔ'Ð'Ð'ØÔ# DÔ)ð 7Ø—J’J˜s‘O”O�OØ—J’J˜s‘O”O�OØ—J’J˜tÔ/°Ô5Ñ6Ô6Ð6øØŒ:Ð!Ø�JŠJ�vÑÔÐØ�JŠJ•t˜DœJÑ'Ô'Ñ(Ô(Ð(Ø�wŠw�s‰|Œ|Ðr   c                ó   — | j         |         S ©N)r0   )r5   r@   s     r   Ú__getitem__zReductiveNote.__getitem__r   s   € ØÔ Ô$Ð$r   ÚspecÚstrc                ó  — t          j        | j        ¦  «        | _        |                     ¦   «         }|                     | j        | j        z   ¦  «        sd S |                     | j        ¦  «        }|dd …         D ]ƒ}| j        |vrŒ|                     | j        ¦  «        \  }}|                     ¦   «         }|                     ¦   «         }| 	                    ¦   «         | j
        v r| j
        |         }|| j        |<   Œ„d| _        d S )Né   T)ÚcopyÚdeepcopyÚ_defaultParametersr0   ÚstripÚ
startswithÚ_delimitValueÚsplitÚ_delimitArgÚlowerr;   r1   )r5   rF   ÚargsÚaÚcandidateKeyÚvaluerA   s          r   r2   z!ReductiveNote._parseSpecificationu   sû   € åœ=¨Ô)@ÑAÔAˆÔØ�zŠz‰|Œ|ˆà�Š˜tÔ1°DÔ4FÑFÑGÔGð 	ØˆFØ�zŠz˜$Ô*Ñ+Ô+ˆØ�a�b�b”ð 		/ð 		/ˆAàÔ!¨Ð*Ð*ØØ"#§'¢'¨$Ô*<Ñ"=Ô"=ÑˆL˜%Ø'×-Ò-Ñ/Ô/ˆLØ—K’K‘M”MˆEØ×!Ò!Ñ#Ô# tÔ':Ð:Ð:ØÔ*¨<Ô8�Ø).�Ô  Ñ&øØˆŒˆˆr   ÚreturnÚboolc                ó   — | j         S rD   )r1   ©r5   s    r   ÚisParsedzReductiveNote.isParsed‰   s
   € ØŒ~Ðr   c                ó  — d}| j         j        r¥d| j        v rwt          j        | j        d         ¦  «        }| j         D ]O}|j                             ¦   «         |j        j                             ¦   «         k    rt          j        |¦  «        }ŒPn>t          j        | j         j	        d         ¦  «        }nt          j        | j         ¦  «        }|€'| j        d         }t          d|›d| j         ›�¦  «        ‚g |_        d|_        g |_        g |_        d|j        _        |j        j        �d|j        j        _        d}d| j        v r$| j        d         r| j        d         |j        _        d| j        v r| j        d         |_        d	| j        v r'| j        d	         }|r|d
k    rd}n|dk    rd}||_        d| j        v r |                     | j        d         ¦  «         d| j        v rt          j        | j        d         ¦  «        }||fS )zt
        Produce a new note, a deep copy of the supplied note
        and with the specified modifications.
        Nr   r   zCould not find pitch, z in self._note: Tr   r   r   ÚyesÚnoFr#   r"   )r/   ÚisChordr0   r   ÚPitchÚnamerR   rJ   rK   Úpitchesr   ÚlyricsÚtier	   ÚarticulationsÚdurationÚdotsÚ
accidentalÚdisplayStatusr   r   r   ÚaddLyricÚTextExpression)r5   Únr$   ÚsubÚpitchParameterÚteÚnhfs          r   ÚgetNoteAndTextExpressionz&ReductiveNote.getNoteAndTextExpressionŒ   s  € ð
 ˆØŒ:Ôð 	*à˜$Ô*Ð*Ð*Ý”K Ô 0°Ô 9Ñ:Ô:�Øœ:ð /ð /�CØ”v—|’|‘~”~¨¬¬×)=Ò)=Ñ)?Ô)?Ò?Ð?å œM¨#Ñ.Ô.˜øð/õ ”M $¤*Ô"4°QÔ"7Ñ8Ô8��å”˜dœjÑ)Ô)ˆAàˆ9Ø!Ô-¨gÔ6ˆNÝ)ØY¨ÐYÐYÈ4Ì:ÐYÐYñ[ô [ð [àˆŒØˆŒØˆŒØˆŒØˆŒ
ŒØŒ7ÔÐ)Ø/3ˆAŒGÔÔ,Øˆà�tÔ'Ð'Ð'ØÔ Ô)ð <Ø!%Ô!1°(Ô!;�””Ø˜dÔ.Ð.Ð.Ø"Ô.¨Ô?ˆAŒOØ˜TÔ-Ð-Ð-ØÔ" >Ô2ˆCØð %Ø˜%’<�<Ø�C�CØ˜D’[�[Ø�CØ!$�”à˜$Ô*Ð*Ð*Ø�JŠJ�tÔ'¨Ô4Ñ5Ô5Ð5Ø˜$Ô*Ð*Ð*ÝÔ+¨DÔ,<¸[Ô,IÑJÔJˆBØ�"ˆuˆr   )rF   rG   )rW   rX   )r   r   r   Ú__doc__rO   rQ   r;   rL   r8   rB   rE   r2   r[   rq   r   r   r   r   r   2   sÕ   € € € € € ðð ð €MØ€Kð ØØØØØØØð	ð 	€Nð ØØØ!ØØðð Ðð
+ð 
+ð 
+ðð ð ð%ð %ð %ðð ð ð ð(ð ð ð ð3ð 3ð 3ð 3ð 3r   r   c                  ó   — e Zd ZdS )ÚScoreReductionExceptionNr   r   r   r   rt   rt   Ã   r   r   rt   c                  óŠ   — e Zd ZdZd„ Zd„ Zd„ Z eeed¬¦  «        Zd„ Z	d„ Z
 ee
e	d	¬¦  «        Zdd„Zdd„Zd„ Zd„ Zd„ ZdS )ÚScoreReductionz&
    An object to reduce a score.
    c                óL   — i | _         g | _        g | _        d | _        d | _        d S rD   )Ú_reductiveNotesÚ_reductiveVoicesÚ_reductiveGroupsÚ_scoreÚ_chordReduction)r5   Úkeywordss     r   r8   zScoreReduction.__init__Ë   s1   € à!ˆÔØ "ˆÔØ "ˆÔð ˆŒØ#ˆÔÐÐr   c                óV  — t          |t          j        ¦  «        st          d¦  «        ‚|j        rt          j        |¦  «        | _        nBt          j        ¦   «         }| 	                    dt          j        |¦  «        ¦  «         || _        | j         
                    dd¬¦  «         d S )Núcannot set a non Streamr   rv   T)Úrecurse)Ú
isinstancer   ÚStreamrt   ÚhasPartLikeStreamsrJ   rK   r{   ÚScoreÚinsertÚsetDerivationMethod©r5   rV   Úss      r   Ú	_setScorezScoreReduction._setScoreÖ   s–   € Ý˜%¥¤Ñ/Ô/ð 	EÝ)Ð*CÑDÔDÐDØÔ#ð 	åœ-¨Ñ.Ô.ˆDŒKˆKå”‘”ˆAØ�HŠH�Q�œ eÑ,Ô,Ñ-Ô-Ð-ØˆDŒKØŒ×'Ò'Ð(8À$Ð'ÑGÔGÐGÐGÐGr   c                ó   — | j         S rD   )r{   rZ   s    r   Ú	_getScorezScoreReduction._getScoreâ   s
   € ØŒ{Ðr   zý
        Get or set the Score. Setting the score set a deepcopy of the score; the score
        set here will not be altered.

        >>> s = corpus.parse('bwv66.6')
        >>> sr = analysis.reduction.ScoreReduction()
        >>> sr.score = s
        )Údocc                ó:  — t          |t          j        ¦  «        st          d¦  «        ‚|                     ¦   «         rt          j        |¦  «        | _        d S t          j        ¦   «         }| 	                    dt          j        |¦  «        ¦  «         || _        d S )Nr   r   )
r�   r   r‚   rt   rƒ   rJ   rK   r|   r„   r…   r‡   s      r   Ú_setChordReductionz!ScoreReduction._setChordReductionï   s‰   € Ý˜%¥¤Ñ/Ô/ð 	EÝ)Ð*CÑDÔDÐDØ×#Ò#Ñ%Ô%ð 	%å#'¤=°Ñ#7Ô#7ˆDÔ Ð Ð å”‘”ˆAØ�HŠH�Q�œ eÑ,Ô,Ñ-Ô-Ð-Ø#$ˆDÔ Ð Ð r   c                ó   — | j         S rD   )r|   rZ   s    r   Ú_getChordReductionz!ScoreReduction._getChordReductionú   s   € ØÔ#Ð#r   z±
        Get or set a Chord reduction as a Stream or Score. Setting the this values
        set a deepcopy of the reduction; the reduction set here will not be altered.
        Tc                óø   — |€dS |j         D ]m}t          |                     t          j        ¦  «        ¦  «        D ]>\  }}|                     ¦   «         j        D ]}|||dœ}|                      |||¦  «         Œ Œ?ŒndS )zm
        Remove and store all reductive events
        Store in a dictionary where obj id is obj key
        N©ÚpartÚmeasurer3   )ÚpartsÚ	enumerateÚgetElementsByClassr   ÚMeasurer€   ÚnotesÚ_extractNoteReductiveEvent)r5   ÚscoreÚremoveAfterParsingr$   ÚiÚmrl   ÚinfoDicts           r   Ú_extractReductionEventsz&ScoreReduction._extractReductionEvents  sµ   € ð
 ˆ=ØˆFà”ð 	Uð 	UˆAÝ! !×"6Ò"6µv´~Ñ"FÔ"FÑGÔGð Uð U‘��1ØŸš™œÔ*ð Uð U�AØ()Ø+,Ø01ð 3ð  3�Hð ×3Ò3°A°xÐASÑTÔTÐTÐTð	UðUð	Uð 	Ur   Nc                ó   — |€d d ddœ}|d         }|j         sd S g }||v r|                     |¦  «        }n%d}|j        D ]}||v r|                     |¦  «        }Œt          |j         ¦  «        D ]y\  }}	t	          |	j        ||d         |¦  «        }
|
                     ¦   «         rCt          t          |¦  «        ¦  «        |	j        z   }|
| j	        |<   | 
                    |¦  «         Œz|r!|D ] }t          j        d¦  «        |j         |<   Œd S d S )Nr   r’   r”   ç        r3   r:   )rc   ÚgetOffsetBySiteÚvoicesr–   r   Útextr[   rG   Úidrx   r<   r   ÚLyric)r5   rl   rŸ   rœ   rž   ÚremovalIndicesÚoffsetr)   ÚkÚlyrÚrnr@   Úqs                r   rš   z)ScoreReduction._extractNoteReductiveEvent  sS  € ØÐØ $Ø#'Ø()ðð ˆHð �YÔˆàŒxð 	ØˆFàˆØ�ˆ6ˆ6Ø×&Ò& qÑ)Ô)ˆFˆFàˆFØ”Xð 2ð 2�Ø˜�6�6Ø×.Ò.¨qÑ1Ô1�Føõ   ¤Ñ)Ô)ð 	)ð 	)‰FˆAˆså˜sœx¨¨H°^Ô,DÀfÑMÔMˆBØ�{Š{‰}Œ}ð )õ �"˜Q™%œ%‘j”j 3¤8Ñ+�Ø,.�Ô$ SÑ)Ø×%Ò% aÑ(Ô(Ð(øØð 	-Ø#ð -ð -�å"œj¨™nœn�”˜‘�ð	-ð 	-ð-ð -r   c                ób  — i | _         |                      | j        ¦  «         |                      | j        ¦  «         | j                              ¦   «         D ]Ù\  }}|d         | j        vr | j                             |d         ¦  «         |d         | j        vr | j                             |d         ¦  «         t          | j        ¦  «        dk    r#d | j        v r| j         	                    d ¦  «         t          | j        ¦  «        dk    r#d | j        v r| j         	                    d ¦  «         ŒÚd S )Nr    r!   é   )
rx   r    r|   r{   Úitemsrz   r<   ry   ÚlenÚremove)r5   Ú
unused_keyr¬   s      r   Ú_parseReductiveNotesz#ScoreReduction._parseReductiveNotes9  s8  € Ø!ˆÔØ×$Ò$ TÔ%9Ñ:Ô:Ð:Ø×$Ò$ T¤[Ñ1Ô1Ð1Ø"Ô2×8Ò8Ñ:Ô:ð 	3ð 	3‰NˆJ˜Ø�'Œ{ $Ô"7Ð7Ð7ØÔ%×,Ò,¨R°¬[Ñ9Ô9Ð9Ø�'Œ{ $Ô"7Ð7Ð7ØÔ%×,Ò,¨R°¬[Ñ9Ô9Ð9õ �DÔ)Ñ*Ô*¨aÒ/Ð/Ø Ô 5Ð5Ð5ØÔ%×,Ò,¨TÑ2Ô2Ð2õ �DÔ)Ñ*Ô*¨aÒ/Ð/Ø Ô 5Ð5Ð5ØÔ%×,Ò,¨TÑ2Ô2Ð2øð	3ð 	3r   c                óª  — |                       ¦   «          t          j        ¦   «         }d}t          | j        ¦  «        dk    rd}d}t          | j        ¦  «        dk    rd}| j        r3| j        j                             ¦   «          	                    d¬¦  «        }n2| j
        j                             ¦   «          	                    d¬¦  «        }| j        D �]�}t          j        |¦  «        }||_        t          j        ¦   «         }||_        |                     d|¦  «         |                     t          j        ¦  «        }| j                             ¦   «         D �]N\  }	}
|s|
d         |k    �r9||
j                 }|j        sO|                     d¦  «         | j        D ]2}t          j        ¦   «         }||_        |                     d|¦  «         Œ3|r[|
                     ¦   «         \  }}|j        d                              |
j        |¦  «         |r|                     |
j        |¦  «         ŒÕ|                     |
d         ¦  «        }|€|j        d         }|
                     ¦   «         \  }}|                     |
j        |¦  «         |r|                     |
j        |¦  «         �ŒPt=          |                     t          j        ¦  «        ¦  «        D ]v\  }}|j        D ]2}|                     ¦   «         j         r| !                    dd¬	¦  «         Œ3| "                    d¬
¦  «         |tF          j$                 D ]}d|j%        _&        ŒŒw|                     d|¦  «         �Œ‘| j
        r%| j
        j        D ]}|                     d|¦  «         Œg }| j        r:| j        j        D ]-}|                     d|¦  «         | '                    |¦  «         Œ.|S )NFrI   T)ÚretainVoicesr   r    ÚRestr!   )ÚfillGapsÚinPlace©r¹   )(r´   r   r„   r±   rz   ry   r{   r•   ÚfirstÚtemplater|   rJ   rK   r¦   r
   Ú
InstrumentÚpartNamer…   r—   r˜   rx   r°   r3   r¤   ÚremoveByClassÚVoicerq   ÚinsertIntoNoteOrChordr4   ÚgetElementByIdr–   r€   r™   Ú	makeRestsÚflattenUnnecessaryVoicesr   r·   ÚstyleÚhideObjectOnPrintr<   )r5   rˆ   ÚoneGroupÚoneVoiceÚ	mTemplateÚgNamer(   ÚinstÚ	gMeasuresr³   r¬   ÚgMeasureÚvIdr)   rl   ro   r�   rž   Úrr$   ÚsrcPartss                        r   Ú_createReductionzScoreReduction._createReductionO  sê  € Ø×!Ò!Ñ#Ô#Ð#ÝŒL‰NŒNˆàˆÝˆtÔ$Ñ%Ô%¨Ò*Ð*àˆHØˆÝˆtÔ$Ñ%Ô%¨Ò*Ð*àˆHàŒ;ð 	XØœÔ)×/Ò/Ñ1Ô1×:Ò:ÈÐ:ÑNÔNˆIˆIàÔ,Ô2×8Ò8Ñ:Ô:×CÒCÐQVÐCÑWÔWˆIð Ô*ð 5	ñ 5	ˆEõ ”˜iÑ(Ô(ˆAØˆAŒDÝÔ(Ñ*Ô*ˆDØ!ˆDŒMØ�HŠH�Q˜ÑÔÐØ×,Ò,­V¬^Ñ<Ô<ˆIð
 #'Ô"6×"<Ò"<Ñ">Ô">ð Bñ B‘�
˜BØð B˜r 'œ{¨eÒ3Ñ3ð  )¨¬Ô9�HØ#œ?ð 2à ×.Ò.¨vÑ6Ô6Ð6Ø#'Ô#8ð 2ð 2˜CÝ &¤¡¤˜AØ#&˜AœDØ$ŸOšO¨A¨qÑ1Ô1Ð1Ð1Øð BØ "× ;Ò ;Ñ =Ô =™˜˜2Ø œ¨Ô*×@Ò@ØÔ,¨añ1ô 1ð 1ð ð BØ$ŸOšO¨BÔ,<¸bÑAÔAÐAøà$×3Ò3°B°w´KÑ@Ô@˜Ø˜9Ø (¤°Ô 2˜AØ "× ;Ò ;Ñ =Ô =™˜˜2Ø×/Ò/°Ô0@À!ÑDÔDÐDØð BØ$ŸOšO¨BÔ,<¸bÑAÔAÐAùõ " !×"6Ò"6µv´~Ñ"FÔ"FÑGÔGð 5ð 5‘��1àœð Að A�AØ—y’y‘{”{Ô(ð AØŸš¨T¸4˜Ñ@Ô@Ð@øØ×*Ò*°4Ð*Ñ8Ô8Ð8à�4œ9œð 5ð 5�AØ04�A”GÔ-Ð-ð5ð �HŠH�Q˜‰NŒNˆN‰Nð Ôð 	ØÔ)Ô/ð ð �Ø—’˜˜A‘”��àˆØŒ;ð 	#Ø”[Ô&ð #ð #�Ø—’˜˜A‘”�Ø—’ Ñ"Ô"Ð"Ð"Øˆr   c                ód   — | j         €| j        €t          d¦  «        ‚|                      ¦   «         S )z>
        Given a score, populate this Score reduction
        Nzno score defined to reduce)r›   ÚchordReductionrt   rÑ   rZ   s    r   ÚreducezScoreReduction.reduce¥  s5   € ð
 Œ:Ð $Ô"5Ð"=Ý)Ð*FÑGÔGÐGà×$Ò$Ñ&Ô&Ð&r   )T)NT)r   r   r   rr   r8   r‰   r‹   Úpropertyr›   rŽ   r�   rÓ   r    rš   r´   rÑ   rÔ   r   r   r   rv   rv   Ç   s  € € € € € ðð ð$ð $ð $ð
Hð 
Hð 
Hðð ð ð ˆH�Y 	ð 0ð ñ ô €Eð	%ð 	%ð 	%ð$ð $ð $ð �XÐ0Ð2Dð Kð ñ ô €NðUð Uð Uð Uð "-ð "-ð "-ð "-ðJ3ð 3ð 3ð,Tð Tð Tðl'ð 'ð 'ð 'ð 'r   rv   c                  ó   — e Zd ZdS )ÚPartReductionExceptionNr   r   r   r   r×   r×   ²  r   r   r×   c                  ó`   — e Zd ZdZ	 dddddddœdd„Zd„ Zd„ Z	 	 	 dd„Zd„ Zdd„Z	d„ Z
d„ ZdS )ÚPartReductionaª  
    A part reduction reduces a Score into one or more parts.
    Parts are combined based on a part group dictionary.
    Each resulting part is then segmented by an object.
    This object is assigned as floating-point value.

    This reduction is designed to work with the GraphHorizontalBarWeighted and related Plot
    subclasses.

    If the `fillByMeasure` parameter is True, and if measures are available,
    each part will segment by Measure divisions, and look for the target activity only
    once per Measure.

    If more than one target is found in the Measure, values will be averaged.

    If `fillByMeasure` is False, the part will be segmented by each Note.

    The `segmentByTarget` parameter is True, segments, which may be Notes or Measures,
    will be divided if necessary to show changes that occur over the duration of the
    segment by a target object.

    If the `normalizeByPart` parameter is True, each part will be normalized within
    the range only of that part. If False, all parts will be normalized by the max
    of all parts. The default is True.

    If the `normalize` parameter is False, no normalization will take place. The default is True.

    NTF)Ú
partGroupsÚfillByMeasureÚsegmentByTargetÚ	normalizeÚnormalizeByPartrÚ   úlist[dict[str, t.Any]] | NonerÛ   rX   rÜ   rÝ   rÞ   c               ó*  — |€d S t          |t          j        ¦  «        st          d¦  «        ‚|| _        g | _        i | _        || _        || _        || _	        || _
        || _        | j        j        D ] }|                     ¦   «         s
d| _         d S Œ!d S )Nzprovided Stream must be ScoreF)r�   r   r„   r×   r{   Ú_partBundlesÚ_eventSpansÚ_partGroupsÚ_fillByMeasureÚ_segmentByTargetÚ_normalizeByPartÚ_normalizeToggler•   ÚhasMeasures)	r5   ÚsrcScorerÚ   rÛ   rÜ   rÝ   rÞ   r}   r$   s	            r   r8   zPartReduction.__init__Ó  s¼   € ð ÐØˆFÝ˜(¥F¤LÑ1Ô1ð 	JÝ(Ð)HÑIÔIÐIØˆŒð 57ˆÔà79ˆÔð &ˆÔà+ˆÔð !0ˆÔØ /ˆÔØ )ˆÔð ”Ô"ð 	ð 	ˆAØ—=’=‘?”?ð Ø&+�Ô#à��ðð	ð 	r   c                óê  — g | _         | j        �r| j        D �]}|d         |d         |d         }}}g }| j        j        D ]Å}|€|g}t	          |j        ¦  «                             ¦   «         }|D ]•}t          |t          ¦  «        rB|                     |                     ¦   «         ¦  «        dk    r| 	                    |¦  «          n=t          j        |                     ¦   «         |¦  «        r| 	                    |¦  «         Œ–ŒÆ|sŒò|||dœ}	| j          	                    |	¦  «         �Œn5| j        j        D ](}|j        d|gdœ}	| j          	                    |	¦  «         Œ)| j         D ]Š}
t          |
d         ¦  «        d	k    r$|
d         d                              ¦   «         |
d
<   Œ?t          j        ¦   «         }|
d         D ]}|                     d|¦  «         Œ|                     ¦   «         |
d
<   Œ‹dS )z­
        Fill the _partBundles list with dictionaries,
        each dictionary defining a name (part id or supplied), a color, and list
        of Parts that match.
        ra   ÚcolorÚmatchNr   )ÚpGroupIdrë   r•   ú#666666r•   rI   ú
parts.flat)rá   rã   r{   r•   rG   r¦   rR   r�   Úfindr<   Úrerì   r±   Úflattenr   r‚   r…   )r5   Údra   ÚpColorÚmatchesrm   r$   ÚpIdrž   ÚdataÚ
partBundlerˆ   s               r   Ú_createPartBundlesz PartReduction._createPartBundlesú  s'  € ð ˆÔØÔñ 	/ØÔ%ð /ñ /�Ø()¨&¬	°1°W´:¸qÀ¼z˜g�f�Ø�ØœÔ*ð *ð *�Að �Ø#' &˜Ý˜aœd™)œ)Ÿ/š/Ñ+Ô+�CØ$ð *ð *˜Ý& q­#Ñ.Ô.ð *Ø$'§H¢H¨Q¯WªW©Y¬YÑ$7Ô$7¸1Ò$<Ð$<ØŸJšJ q™MœM˜MØ!˜EÝœX a§g¢g¡i¤i°Ñ5Ô5ð *ØŸJšJ q™MœM˜Møøàð Øà $Ø#Ø ðð �ð
 Ô!×(Ò(¨Ñ.Ô.Ð.Ñ.ð1/ð4 ”[Ô&ð /ð /�à$%¤D°9ÈÀsÐKÐK�ØÔ!×(Ò(¨Ñ.Ô.Ð.Ð.ð Ô+ð 		7ð 		7ˆJÝ�:˜gÔ&Ñ'Ô'¨1Ò,Ð,Ø+5°gÔ+>¸qÔ+A×+IÒ+IÑ+KÔ+K�
˜<Ñ(Ð(õ ”M‘O”O�Ø# GÔ,ð #ð #�AØ—H’H˜Q ‘N”N�N�NØ+,¯9ª9©;¬;�
˜<Ñ(Ð(ð		7ð 		7r   c                ól  — i | _         | j        D �]#}|d         }|d         }|d         }g }d }d }d }| j        rõg }	|D ]F}
|	                     |
                     t
          j        ¦  «                             ¦   «         ¦  «         ŒGt          t          |	d         ¦  «        ¦  «        D ]†}d}|	D ]%}
|
|          	                    ¦   «         j
        rd} nŒ&|sŒ/|	d         |         }|                     |	d         ¦  «        }||j        j        z   }|||z
  d |dœ}|                     |¦  «         Œ‡nú|d         }|                     ¦   «         }t          |¦  «        D ]Î\  }}|€B|€Œ
|                     |¦  «        |j        z   }|||z
  d |dœ}|                     |¦  «         d }ŒI|t          |¦  «        d	z
  k    rV|€|                     |¦  «        }|                     |¦  «        |j        z   }|||z
  d |dœ}|                     |¦  «         d }Œµ|€|                     |¦  «        }|}ŒÏ|| j         |<   �Œ%d S )
Nrí   rë   r•   r   FT)ÚeStartÚspanÚweightrë   rï   rI   )râ   rá   rä   r<   r—   r   r˜   Úranger±   Úiterr™   r£   ÚbarDurationÚquarterLengthÚfindConsecutiveNotesr–   )r5   rø   rí   rô   r•   Ú
dataEventsrû   ÚeEndÚeLastÚpartMeasuresr$   r�   ÚactiveÚeÚdsÚeSrcÚnoteSrcs                    r   Ú_createEventSpanszPartReduction._createEventSpans.  sÞ  € àˆÔàÔ+ð m	4ñ m	4ˆJØ! *Ô-ˆHØ Ô(ˆFØ˜wÔ'ˆEàˆJàˆFØˆDØˆEð Ô"ð ^"Ø!�Øð Wð W�AØ ×'Ò'¨×(<Ò(<½V¼^Ñ(LÔ(L×(SÒ(SÑ(UÔ(UÑVÔVÐVÐVõ
 �s <°¤?Ñ3Ô3Ñ4Ô4ð *ð *�AØ"�Fà)ð "ð "˜à˜Qœ4Ÿ9š9™;œ;Ô,ð "Ø%)˜FØ!˜Eð"ð "ð !Ø à$ Qœ¨Ô*�AØ×.Ò.¨|¸A¬Ñ?Ô?�Fð # Q¤]Ô%@Ñ@�DØ$*Ø"&¨¡-Ø$(Ø#)ðð �Bð
 ×%Ò% bÑ)Ô)Ð)Ð)ð-*ðd " ,Ô/�ð ×3Ò3Ñ5Ô5�Ý% gÑ.Ô.ð  "ð  "‘D�A�qð �yØ!˜>Ø$à#(×#8Ò#8¸Ñ#>Ô#>ÀÔATÑ#T˜Dà(.Ø&*¨V¡mØ(,Ø'-ð ð  ˜ð
 #×)Ò)¨"Ñ-Ô-Ð-Ø!%˜˜Ø�c '™lœl¨QÑ.Ò.Ð.Ø!˜>à%&×%6Ò%6°tÑ%<Ô%<˜FØ ×0Ò0°Ñ6Ô6¸¼ÑH˜à(.Ø&*¨V¡mØ(,Ø'-ð ð  ˜ð
 #×)Ò)¨"Ñ-Ô-Ð-Ø!%˜˜à!˜>Ø%&×%6Ò%6°tÑ%<Ô%<˜FØ !˜˜à)3ˆDÔ˜XÑ&Ñ&ð[m	4ð m	4r   ÚDynamicc           	     ól  ‡— ˆfd„}|€|}|s‘| j         D ]‡}|d         }| j        |d                  D ]i}|d         }||d         z   }	|                     ||	ddd¬	¦  «                             ‰¦  «                             ¦   «         }
|
sd}n ||
¦  «        }||d
<   ŒjŒˆdS | j         D �]}g }|d         }| j        |d                  D �]Û}|d         }||d         z   }	|                     ||	ddd¬	¦  «                             ‰¦  «                             ¦   «         }
|
                     ‰d¬¦  «         t          j        |¦  «        }|
s|                     |¦  «         Œ˜t          |
¦  «        D �]2\  }}| 
                    |¦  «        }|j        j        }||z   |	k    r|	|z
  }|dk    r|	|z
  }|dk    r5|d         |k    r)||d<    ||¦  «        |d
<   |                     |¦  «         Œ{t          dk    rk|d         |k    r_||z
  |d<   |                     |¦  «         t          j        |¦  «        }||d<   ||d<    ||¦  «        |d
<   |                     |¦  «         Œñt          j        |¦  «        }||d<   ||d<    ||¦  «        |d
<   |                     |¦  «         �Œ4�ŒÝ|| j        |d         <   �ŒdS )aè  
        For each span, determine the measured parameter value. This is translated
        as the height of the bar graph.

        If `splitSpans` is True, a span will be split of the target changes over the span.
        Otherwise, Spans will be averaged. This is the `segmentByTarget` parameter.

        The `targetToWeight` parameter is a function that takes a list or Stream of objects
        (of the class specified by `target`) and returns a single floating-point value.
        c                ó¨   •— t          | d¦  «        r| j        rnt          j        | ¦  «        s| g} d}| D ]}||j        z  }Œ|t          ‰¦  «        z  S )NÚisStreamr   )Úhasattrr  r   Ú
isIterableÚvolumeScalarr±   )ÚtargetsÚ	summationr  Útargets      €r   Ú_dynamicToWeightz8PartReduction._getValueForSpan.<locals>._dynamicToWeight³  so   ø€ å�w 
Ñ+Ô+ð $°Ô0@ð $ØÝÔ& wÑ/Ô/ð $Ø"˜)�ØˆIØð ,ð ,�Ø˜Qœ^Ñ+�	�	Ø�s 6™{œ{Ñ*Ð*r   Nrï   rí   rû   rü   FT)ÚincludeEndBoundaryÚmustFinishInSpanÚmustBeginInSpanrý   rº   gü©ñÒMbP?r   )rá   râ   ÚgetElementsByOffsetr—   r   ÚextendDurationrJ   rK   r<   r–   r£   rf   r  Út)r5   r  Ú
splitSpansÚtargetToWeightr  rø   ÚflatRefr	  ÚoffsetStartÚ	offsetEndrì   ÚwÚfinalBundleÚdsFirstr�   ÚtarÚtargetStartÚ
targetSpanÚdsNexts    `                 r   Ú_getValueForSpanzPartReduction._getValueForSpan¢  s�  ø€ ð"		+ð 		+ð 		+ð 		+ð 		+ð Ð!Ø-ˆNàð T	GØ"Ô/ð %ð %�
Ø$ \Ô2�ØÔ*¨:°jÔ+AÔBð %ð %�Bà"$ X¤,�KØ +¨b°¬jÑ 8�IØ#×7Ò7Ø#Ø!Ø+0Ø).Ø(,ð 8ñ ô ÷ )Ò(¨Ñ0Ô0·²±´ð ð !ð 2Ø ˜˜à*˜N¨5Ñ1Ô1˜à#$�B�x‘L�Lð!%ð%ð %ð( #Ô/ð ?Gñ ?G�
Ø �Ø$ \Ô2�àÔ*¨:°jÔ+AÔBð 97ñ 97�BØ"$ X¤,�KØ +¨b°¬jÑ 8�Ið $×7Ò7¸ÀYØ+/À%Ø(,ð 8ñ .ô .ç.@Ò.@ÀÑ.HÔ.HÏÊÉÌð ð
 ×(Ò(¨¸Ð(Ñ>Ô>Ð>å"œm¨BÑ/Ô/�GØ ð !à#×*Ò*¨7Ñ3Ô3Ð3Ø å"+¨EÑ"2Ô"2ð '7ñ '7™˜˜3Ø&)×&9Ò&9¸'Ñ&BÔ&B˜à%(¤\Ô%?˜
ð '¨Ñ3°iÒ?Ð?Ø)2°[Ñ)@˜Jð &¨Ò.Ð.Ø)2°[Ñ)@˜Jð  š6˜6 b¨¤l°kÒ&AÐ&Að /9˜G F™OØ0>°¸sÑ0CÔ0C˜G HÑ-Ø'×.Ò.¨wÑ7Ô7Ð7Ð7Ý !šV˜V¨¨8¬¸Ò(CÐ(Cð /:¸KÑ.G˜G F™OØ'×.Ò.¨wÑ7Ô7Ð7Ý%)¤]°2Ñ%6Ô%6˜FØ/:˜F 8Ñ,Ø-7˜F 6™NØ/=¨~¸cÑ/BÔ/B˜F 8Ñ,Ø'×.Ò.¨vÑ6Ô6Ð6Ð6å%)¤]°2Ñ%6Ô%6˜FØ/:˜F 8Ñ,Ø-7˜F 6™NØ/=¨~¸cÑ/BÔ/B˜F 8Ñ,Ø'×.Ò.¨vÑ6Ô6Ð6Ñ6ñO'7ðR <G�Ô  ¨JÔ!7Ñ8Ñ8ð?Gð ?Gr   c                óø   — d}| j         D ]o}d}t          | j        |d                  ¦  «        D ]J\  }}|dk    r|d         €||d<   Œ|d         }Œ"|d         r	|d         }Œ3|r||d<   Œ;|d         €|€||d<   ŒKŒpdS )zŠ
        Extend the value of a target parameter to the next boundary.
        An undefined boundary will wave as its weight None.
        g{®Gáz„?Nrí   r   rý   )rá   r–   râ   )r5   ÚminValuerø   Ú
lastWeightr�   r	  s         r   Ú_extendSpanszPartReduction._extendSpans  sÅ   € ð ˆØÔ+ð 	0ð 	0ˆJØˆJÝ" 4Ô#3°J¸zÔ4JÔ#KÑLÔLð 0ð 0‘��2Ø˜’6�6Ø˜(”|Ð+Ø'/˜˜8™˜ð &(¨¤\˜
˜
à˜(”|ð 0Ø%'¨¤\˜
˜
Ø#ð 0Ø'1˜˜8™˜à˜HœÐ-°*Ð2DØ'/˜˜8™øð0ð	0ð 	0r   c                ó�  — i }| j         D ]9}d}| j        |d                  D ]}|d         |k    r|d         }Œ|||d         <   Œ:	 t          |                     ¦   «         ¦  «        }n# t          $ r d}Y nw xY w| j         D ]E}| j        |d                  D ]/}|r||d                  }n|}|dk    r|d         |z  |d<   Œ*d|d<   Œ0ŒFdS )zF
        Normalize, either within each Part, or for all parts
        r   rí   rý   rI   N)rá   râ   ÚmaxÚvaluesÚ
ValueError)r5   ÚbyPartÚ
partMaxRefrø   ÚpartMaxr	  ÚmaxOfMaxÚbestMaxs           r   Ú
_normalizezPartReduction._normalize<  s0  € ð ˆ
ØÔ+ð 	9ð 	9ˆJØˆGØÔ& z°*Ô'=Ô>ð +ð +�Ø�h”< 'Ò)Ð)Ø  œl�GøØ18ˆJ�z *Ô-Ñ.Ð.ð	Ý˜:×,Ò,Ñ.Ô.Ñ/Ô/ˆHˆHøÝð 	ð 	ð 	ØˆHˆHˆHð	øøøð Ô+ð 
	%ð 
	%ˆJØÔ& z°*Ô'=Ô>ð 	%ð 	%�àð 'Ø(¨°JÔ)?Ô@�G�Gà&�GØ˜a’<�<Ø$& x¤L°7Ñ$:�B�x‘L�Là#$�B�x‘L�Lð	%ð
	%ð 
	%s   Á!A' Á'A6Á5A6c                óü   — |                       ¦   «          |                      ¦   «          |                      | j        ¬¦  «         |                      ¦   «          | j        r|                      | j        ¬¦  «         dS dS )z+
        Core processing routines.
        )r  )r3  N)rù   r  r*  rå   r.  rç   r8  ræ   rZ   s    r   ÚprocesszPartReduction.processY  s†   € ð 	×ÒÑ!Ô!Ð!Ø×ÒÑ Ô Ð Ø×Ò¨Ô)>ÐÑ?Ô?Ð?Ø×ÒÑÔÐØÔ ð 	:Ø�OŠO 4Ô#8ˆOÑ9Ô9Ð9Ð9Ð9ð	:ð 	:r   c           	     óî   — g }| j         D ]j}g }|d         }| j        |         D ]3}|                     |d         |d         |d         |d         g¦  «         Œ4|                     |d         |f¦  «         Œk|S )zF
        Get all data organized into bar span specifications.
        rí   rû   rü   rý   rë   )rá   râ   r<   )r5   r÷   rø   ÚdataListÚ
groupSpansr	  s         r   Ú!getGraphHorizontalBarWeightedDataz/PartReduction.getGraphHorizontalBarWeightedDataf  s•   € ð ˆàÔ+ð 	<ð 	<ˆJàˆHØ# JÔ/ˆJØÔ& zÔ2ð Wð W�à—’  H¤¨r°&¬z¸2¸h¼<ÈÈGÌÐ UÑVÔVÐVÐVØ�KŠK˜ JÔ/°Ð:Ñ;Ô;Ð;Ð;Øˆr   rD   )
rÚ   rß   rÛ   rX   rÜ   rX   rÝ   rX   rÞ   rX   )r  TN©F)r   r   r   rr   r8   rù   r  r*  r.  r8  r:  r>  r   r   r   rÙ   rÙ   ¶  sæ   € € € € € ðð ð: ð%ð <@Ø'+Ø)-Ø#'Ø).ð%ð %ð %ð %ð %ð %ðN17ð 17ð 17ðhq4ð q4ð q4ðl ØØð	tGð tGð tGð tGðl0ð 0ð 0ðH%ð %ð %ð %ð:	:ð 	:ð 	:ðð ð ð ð r   rÙ   c                  ó^   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
dd
„Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestc                óB   — ddl m}  || t          ¦   «         ¦  «         d S )Nr   )ÚtestCopyAll)Úmusic21.test.commonTestrC  Úglobals)r5   rC  s     r   ÚtestCopyAndDeepcopyzTest.testCopyAndDeepcopy|  s0   € Ø7Ð7Ð7Ð7Ð7Ð7Øˆ�D�'™)œ)Ñ$Ô$Ð$Ð$Ð$r   c                óì  — ddl m} ddl m} |                     d¦  «        }|j        d                              ¦   «         j        d                              d¦  «         |j        d                              ¦   «         j        d                              d¦  «         |j        d                              ¦   «         j        d	                              d
¦  «         |j        d                              ¦   «         j        d                              d¦  «         |j         	                    ¦   «         }||_
        |                     ¦   «         }|                      t          |j        d                              ¦   «         j        ¦  «        d¦  «         |j                             ¦   «         t          j                 d d…         }t          j        ¦   «         }|D ]}|                     |¦  «         Œ|                     ¦   «         }	d„ |	j        D ¦   «         }
d | _        |                      |
g d¢¦  «         |                      |j        d                              ¦   «         j        d         j        d¦  «         d S )Nr   ©Úanalysis©Úcorpusúbwv66.6é   Útesté   z::/o:6/tb:herer¯   z::/o:5/tb:fromBassrI   é   z ::/o:4/nf:no/g:Ursatz/ta:3 3 200c                óP   — g | ]#}t          |¦  «        |j        |j        j        f‘Œ$S r   )r=   r©   rf   r  )Ú.0r  s     r   ú
<listcomp>z(Test.testExtractionA.<locals>.<listcomp>™  s,   € ÐbÐbÐbÀ1•$�q‘'”'˜1œ8 Q¤ZÔ%=Ð>ÐbÐbÐbr   ))ú<music21.note.Rest quarter>r¢   ç      ð?)z<music21.note.Note F#>rU  rU  )rT  ç       @rU  )z<music21.note.Note C#>ç      @rU  )rT  ç      @rU  )z<music21.note.Note G#>g      @rU  ÚfromBass)Úmusic21rI  rK  Úparser•   rò   r™   rj   Ú	reductionrv   r›   rÔ   ÚassertEqualr±   r»   r   r˜   r‚   r<   ÚnotesAndRestsÚmaxDiffÚlyric)r5   rI  rK  rˆ   ÚsrÚpostÚthree_measuresÚ
new_streamrž   Úflat_streamrì   s              r   ÚtestExtractionAzTest.testExtractionA€  s=  € Ø$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"Ø�LŠL˜Ñ#Ô#ˆà	Œ�Œ
×ÒÑÔÔ" 1Ô%×.Ò.¨vÑ6Ô6Ð6Ø	Œ�Œ
×ÒÑÔÔ" 1Ô%×.Ò.Ð/?Ñ@Ô@Ð@Ø	Œ�Œ
×ÒÑÔÔ" 1Ô%×.Ò.Ð/CÑDÔDÐDà	Œ�Œ
×ÒÑÔÔ" 1Ô%×.Ò.Ð/QÑRÔRÐRàÔ×.Ò.Ñ0Ô0ˆØˆŒà�yŠy‰{Œ{ˆð 	×Ò�˜TœZ¨œ]×2Ò2Ñ4Ô4Ô:Ñ;Ô;¸QÑ?Ô?Ð?ð œ×)Ò)Ñ+Ô+­F¬NÔ;¸B¸Q¸BÔ?ˆÝ”]‘_”_ˆ
Øð 	!ð 	!ˆAØ×Ò˜aÑ Ô Ð Ð Ø ×(Ò(Ñ*Ô*ˆØbÐbÈÔHaÐbÑbÔbˆØˆŒØ×Ò˜ð@ð @ð @ñ	Aô 	Að 	Að 	×Ò˜œ Aœ×.Ò.Ñ0Ô0Ô6°qÔ9Ô?ÀÑLÔLÐLÐLÐLr   c                ó¢  — ddl m} ddl m} |                     d¦  «        }|j        d                              ¦   «         j        d                              d¦  «         |j        d                              ¦   «         j        d                              d	¦  «         |j        d                              ¦   «         j        d                              d
¦  «         |j        d                              ¦   «         j        d                              d¦  «         |j         	                    ¦   «         }| 
                    dd¦  «        }||_        |                     ¦   «         }|                      t          |j        ¦  «        d¦  «         |j        d                              ¦   «         j        }|                      t          |¦  «        d¦  «         d S )Nr   rH  rJ  rL  rO  z::/o:6/v:1/tb:s/g:UrsatzrM  r¯   z::/o:5/v:2/tb:bz::/o:4/v:2/tb:trI   z::/o:4/v:2/tb:aé
   é   )rZ  rI  rK  r[  r•   rò   r™   rj   r\  rv   Úmeasuresr›   rÔ   r]  r±   )r5   rI  rK  rˆ   ra  Úextractrb  rì   s           r   ÚtestExtractionBzTest.testExtractionB§  sˆ  € Ø$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"Ø�LŠL˜Ñ#Ô#ˆà	Œ�Œ
×ÒÑÔÔ" 1Ô%×.Ò.Ð/IÑJÔJÐJØ	Œ�Œ
×ÒÑÔÔ" 1Ô%×.Ò.Ð/@ÑAÔAÐAØ	Œ�Œ
×ÒÑÔÔ" 1Ô%×.Ò.Ð/@ÑAÔAÐAØ	Œ�Œ
×ÒÑÔÔ" 1Ô%×.Ò.Ð/@ÑAÔAÐAàÔ×.Ò.Ñ0Ô0ˆØ—*’*˜Q Ñ#Ô#ˆàˆŒà�yŠy‰{Œ{ˆà×Ò�˜TœZ™œ¨!Ñ,Ô,Ð,Ø”
˜1”×%Ò%Ñ'Ô'Ô-ˆØ×Ò�˜U™œ QÑ'Ô'Ð'Ð'Ð'r   c                óî  — ddl m} ddl m} |                     dd¦  «        }|                     ¦   «         j        D ]„}t          |t          j        ¦  «        r&|j	        j
        dk    r|                     d¦  «         ŒBt          |t          j        ¦  «        r(dd„ |j        D ¦   «         v r|                     d¦  «         Œ…|j                             ¦   «         }||_        |                     ¦   «         }d S )	Nr   rH  rJ  úschoenberg/opus19é   úF#z::/p:f#/o:4c                ó   — g | ]	}|j         ‘Œ
S r   ©ra   ©rR  r$   s     r   rS  z(Test.testExtractionD.<locals>.<listcomp>ð  ó   € Ð6Ð6Ð6 q˜AœFÐ6Ð6Ð6r   ©rZ  rI  rK  r[  rò   r™   r�   r   ÚNoter   ra   rj   r   ÚChordrb   r\  rv   r›   rÔ   ©r5   rI  rK  Úsrcrl   ra  Úunused_posts          r   ÚtestExtractionDzTest.testExtractionDã  sý   € à$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"à�lŠlÐ.°Ñ2Ô2ˆØ—’‘”Ô$ð 	.ð 	.ˆAÝ˜!�TœYÑ'Ô'ð .Ø”7”< 4Ò'Ð'Ø—J’J˜}Ñ-Ô-Ð-øõ ˜A�uœ{Ñ+Ô+ð .ØÐ6Ð6¨A¬IÐ6Ñ6Ô6Ð6Ð6Ø—J’J˜}Ñ-Ô-Ð-øð Ô×.Ò.Ñ0Ô0ˆØˆŒØ—i’i‘k”kˆˆˆr   c                óˆ  — ddl m} ddl m} |                     dd¦  «        }|                     ¦   «         j        D ]Ñ}t          |t          j        ¦  «        rK|j	        j
        dk    r|                     d¦  «         |j	        j
        dk    r|                     d	¦  «         Œgt          |t          j        ¦  «        rPdd
„ |j        D ¦   «         v r|                     d¦  «         dd„ |j        D ¦   «         v r|                     d	¦  «         ŒÒ|j                             ¦   «         }||_        |                     ¦   «         }d S )Nr   rH  rJ  rn  ro  rp  z::/p:f#/o:4/g:F#ÚCz::/p:c/o:4/g:Cc                ó   — g | ]	}|j         ‘Œ
S r   rr  rs  s     r   rS  z)Test.testExtractionD2.<locals>.<listcomp>  rt  r   c                ó   — g | ]	}|j         ‘Œ
S r   rr  rs  s     r   rS  z)Test.testExtractionD2.<locals>.<listcomp>	  s   € Ð5Ð5Ð5 a˜1œ6Ð5Ð5Ð5r   ru  rx  s          r   ÚtestExtractionD2zTest.testExtractionD2ú  sL  € à$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"à�lŠlÐ.°Ñ2Ô2ˆØ—’‘”Ô$ð 
	1ð 
	1ˆAÝ˜!�TœYÑ'Ô'ð 	1Ø”7”< 4Ò'Ð'Ø—J’JÐ1Ñ2Ô2Ð2Ø”7”< 3Ò&Ð&Ø—J’JÐ/Ñ0Ô0Ð0øÝ˜A�uœ{Ñ+Ô+ð 1ØÐ6Ð6¨A¬IÐ6Ñ6Ô6Ð6Ð6Ø—J’JÐ1Ñ2Ô2Ð2ØÐ5Ð5¨1¬9Ð5Ñ5Ô5Ð5Ð5Ø—J’JÐ/Ñ0Ô0Ð0øàÔ×.Ò.Ñ0Ô0ˆØˆŒØ—i’i‘k”kˆˆˆr   c                ó°   — ddl m} ddl m} |                     d¦  «        }|j                             ¦   «         }||_        |                     ¦   «         }d S )Nr   rH  rJ  zcorelli/opus3no1/1grave)rZ  rI  rK  r[  r\  rv   r›   rÔ   )r5   rI  rK  ry  ra  rz  s         r   ÚtestExtractionEzTest.testExtractionE  sf   € Ø$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"à�lŠlÐ4Ñ5Ô5ˆð Ô×.Ò.Ñ0Ô0ˆàˆŒØ—i’i‘k”kˆˆˆr   c                ó.  — ddl m} ddl m} |                     d¦  «        }ddddgd	œd
dddgd	œg}|j                             ||¬¦  «        }|                     ¦   «          |j        D ]+}|                      t          |d         ¦  «        d¦  «         Œ,d S )Nr   rH  rJ  rL  zHigh Voicesz#ff0088ÚsopranoÚalto)ra   rë   rì   z
Low Voicesz#8800ffÚtenorÚbass)rÚ   rì   r¯   )
rZ  rI  rK  r[  r\  rÙ   r:  rã   r]  r±   )r5   rI  rK  rˆ   rÚ   Úprrm   s          r   ÚtestPartReductionAzTest.testPartReductionA  sÜ   € Ø$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"à�LŠL˜Ñ#Ô#ˆð &Ø"Ø# VÐ,ðð ð %Ø"Ø! 6Ð*ðð ð
ˆ
ð Ô×-Ò-¨a¸JÐ-ÑGÔGˆØ
�
Š
‰ŒˆØ”>ð 	3ð 	3ˆCØ×Ò�S  W¤Ñ.Ô.°Ñ2Ô2Ð2Ð2ð	3ð 	3r   c                óÖ  — t          |¦  «        D ]Ø\  }}||         }|                      |d         |d         ¦  «         t          |d         ¦  «        D ]“\  }}|d         |         }|                      |d         |d         ¦  «         |                      |d         |d         ¦  «         |                      |d         |d         d|› d|› d|d         › d|d         › �¬¦  «         Œ”ŒÙd	S )
z`
        Utility function to compare known data but not compare floating point weights.
        r   rI   r¯   zfor partId z, entry z: should be z	 <-> was )r?   N)r–   r]  ÚassertAlmostEqual)	r5   rì   r  ÚpartIdÚbrT   r�   Ú	dataMatchÚ
dataTargets	            r   Ú_matchWeightedDatazTest._matchWeightedData7  s3  € õ # 6Ñ*Ô*ð 	ð 	‰IˆF�AØ�f”ˆAØ×Ò˜Q˜qœT 1 Q¤4Ñ(Ô(Ð(Ý )¨!¨A¬$¡¤ð ð ‘��9Ø˜qœT !œW�
à×&Ò& y°¤|°ZÀ´]ÑCÔCÐCà×&Ò& y°¤|°ZÀ´]ÑCÔCÐCà×&Ò&Ø˜a”LØ˜q”MðM vð Mð M°qð Mð MØ&/°¤lðMð MØ=GÈ¼]ðMð Mð 'ñ ô ð ð ðð	ð 	r   Fc                ó:  — ddl m} ddl m} ddl m} g d¢}g d¢}t	          j        ¦   «         }d}||fD ]˜}	t	          j        ¦   «         }
||
_        d}|	D ]\\  }}|
                     |t          j
        |¬¦  «        ¦  «         |
                     ||                     |¦  «        ¦  «         ||z  }Œ]|                     d|
¦  «         |dz  }Œ™|du r|                     ¦   «          |j                             |d	¬
¦  «        }|                     ¦   «          |                     ¦   «         }dg d¢g d¢g d¢g d¢g d¢gfdg d¢g d¢g d¢g d¢g d¢gfg}|                      ||¦  «         |du r2|j                             |d¬¦  «        }
|
                     ¦   «          dS dS )ú1
        Artificially create test cases.
        r   rH  ©Údynamics)Úgraph))rI   Úmf)rM  Úf)r¯   r$   )rO  Úff)r¯   r–  ©r  rI   TF©rÝ   )r¢   rU  çÕAÔA´?rî   )rU  rW  g™™™™™™¹?rî   )rX  rV  çš™™™™™©?rî   )ç      @rX  g_ñ_ñ¿?rî   ©ç      $@rV  r›  rî   ÚDynamics)ÚtitleN)rZ  rI  r”  r•  r   r„   ÚPartr¦   r…   r   rv  r  Úshowr\  rÙ   r:  r>  r�  ÚplotÚDolanÚrun)r5   r£  rI  r”  r•  ÚdurDynPairsAÚdurDynPairsBrˆ   ÚpCountÚpairsr$   ÚposÚqlÚdynrˆ  rì   r  s                    r   ÚtestPartReductionBzTest.testPartReductionBL  s,  € ð 	%Ð$Ð$Ð$Ð$Ð$Ø$Ð$Ð$Ð$Ð$Ð$Ø!Ð!Ð!Ð!Ð!Ð!ØLÐLÐLˆØLÐLÐLˆåŒL‰NŒNˆØˆØ" LÐ1ð 
	ð 
	ˆEÝ”‘”ˆAØˆAŒDØˆCØ ð ð ‘��CØ—’˜�dœi°bÐ9Ñ9Ô9Ñ:Ô:Ð:Ø—’˜˜h×.Ò.¨sÑ3Ô3Ñ4Ô4Ð4Ø�r‘	��à�HŠH�Q˜‰NŒNˆNØ�a‰KˆFˆFà�4ˆ<ˆ<Ø�FŠF‰HŒHˆHàÔ×-Ò-¨a¸5Ð-ÑAÔAˆØ
�
Š
‰ŒˆØ×4Ò4Ñ6Ô6ˆØÐAÐAÐAØAÐAÐAØ2Ð2Ð2ØAÐAÐAØBÐBÐBð	Dð Eð
 ÐAÐAÐAØAÐAÐAØ2Ð2Ð2ØAÐAÐAØBÐBÐBð	Dð Eð	Fˆð 	×Ò  vÑ.Ô.Ð.à�4ˆ<ˆ<Ø”
× Ò  ¨*Ð Ñ5Ô5ˆAØ�EŠE‰GŒGˆGˆGˆGð ˆ<r   c                óZ  — ddl m} ddl m} t          j        ¦   «         }t          j        ¦   «         }d|_        t          j        ¦   «         }d|_        dD ]R}|                     t          j	        |¬¦  «        ¦  «         |                     t          j	        |¬¦  «        ¦  «         ŒSdD ].\  }}| 
                    ||                     |¦  «        ¦  «         Œ/dD ].\  }}| 
                    ||                     |¦  «        ¦  «         Œ/| 
                    d|¦  «         | 
                    d|¦  «         |j                             |d	¬
¦  «        }	|	                     ¦   «          |	                     ¦   «         }
dg d¢g d¢g d¢gfdg d¢g d¢g d¢gfg}|                      |
|¦  «         dS )r’  r   rH  r“  rI   )rI   r¯   rI   rO  r™  ©©r   r$   )r¯   Úfff)ro  Úppp)r±  )rI   r²  )r¯   r³  Frš  ©r¢   rV  rœ  rî   )rV  rX  çQuPuÀ?rî   ©r�  rV  çAñ_ñ•?rî   )r¢   rU  rœ  rî   )rU  rU  rµ  rî   )rV  r�  r·  rî   N)rZ  rI  r”  r   r„   r¢  r¦   r<   r   rv  r…   r  r\  rÙ   r:  r>  r�  ©r5   rI  r”  rˆ   Úp1Úp2r¬  r«  r­  rˆ  rì   r  s               r   ÚtestPartReductionCzTest.testPartReductionC|  sì  € ð 	%Ð$Ð$Ð$Ð$Ð$Ø$Ð$Ð$Ð$Ð$Ð$åŒL‰NŒNˆÝŒ[‰]Œ]ˆØˆŒÝŒ[‰]Œ]ˆØˆŒØð 	3ð 	3ˆBØ�IŠI•d”i¨bÐ1Ñ1Ô1Ñ2Ô2Ð2Ø�IŠI•d”i¨bÐ1Ñ1Ô1Ñ2Ô2Ð2Ð2Ø:ð 	2ð 	2‰HˆC�Ø�IŠI�c˜8×+Ò+¨CÑ0Ô0Ñ1Ô1Ð1Ð1Ø:ð 	2ð 	2‰HˆC�Ø�IŠI�c˜8×+Ò+¨CÑ0Ô0Ñ1Ô1Ð1Ð1Ø	�Š��B‰ŒˆØ	�Š��B‰ŒˆàÔ×-Ò-¨a¸5Ð-ÑAÔAˆØ
�
Š
‰ŒˆØ×4Ò4Ñ6Ô6ˆàÐ2Ð2Ð2Ø@Ð@Ð@Ø=Ð=Ð=ð?ð @ð Ð2Ð2Ð2Ø@Ð@Ð@Ø=Ð=Ð=ð?ð @ðAˆð 	×Ò  vÑ.Ô.Ð.Ð.Ð.r   c                óü  — ddl m} ddl m} t          j        ¦   «         }t          j        ¦   «         }d|_        t          j        ¦   «         }d|_        dD ]¥}|rQ|                     t          j	        |¬¦  «        ¦  «         |                     t          j	        |¬¦  «        ¦  «         ŒU|                     t          j
        d¬¦  «        ¦  «         |                     t          j
        d¬¦  «        ¦  «         Œ¦dD ].\  }}|                     ||                     |¦  «        ¦  «         Œ/d	D ].\  }}|                     ||                     |¦  «        ¦  «         Œ/|                     d|¦  «         |                     d|¦  «         |j                             |¦  «        }	|	                     ¦   «          |	                     ¦   «         }
dg d
¢g d¢g d¢gfdg d¢g d¢g d¢gfg}|                      |
|¦  «         dS )zC
        Artificially create test cases. Here, uses rests.
        r   rH  r“  rI   )Nr¯   Fr¯   Fr¯   r™  r¯   r°  ©)r   r–  )r¯   r—  )ro  r–  ©rV  rV  rU  rî   )r�  rV  çUUUUUUÅ?rî   )rŸ  rV  r¿  rî   )rV  rV  g9Žã8Žãè?rî   )r�  rV  çä8Žã8Žã?rî   )rŸ  rV  rÀ  rî   N)rZ  rI  r”  r   r„   r¢  r¦   r<   r   rv  r·   r…   r  r\  rÙ   r:  r>  r�  r¸  s               r   ÚtestPartReductionDzTest.testPartReductionD   s2  € ð 	%Ð$Ð$Ð$Ð$Ð$Ø$Ð$Ð$Ð$Ð$Ð$åŒL‰NŒNˆÝŒ[‰]Œ]ˆØˆŒÝŒ[‰]Œ]ˆØˆŒØ/ð 	6ð 	6ˆBØð 6Ø—	’	�$œ)°"Ð5Ñ5Ô5Ñ6Ô6Ð6Ø—	’	�$œ)°"Ð5Ñ5Ô5Ñ6Ô6Ð6Ð6à—	’	�$œ)°!Ð4Ñ4Ô4Ñ5Ô5Ð5Ø—	’	�$œ)°!Ð4Ñ4Ô4Ñ5Ô5Ð5Ð5Ø:ð 	2ð 	2‰HˆC�Ø�IŠI�c˜8×+Ò+¨CÑ0Ô0Ñ1Ô1Ð1Ð1Ø8ð 	2ð 	2‰HˆC�Ø�IŠI�c˜8×+Ò+¨CÑ0Ô0Ñ1Ô1Ð1Ð1Ø	�Š��B‰ŒˆØ	�Š��B‰Œˆð Ô×-Ò-¨aÑ0Ô0ˆØ
�
Š
‰ŒˆØ×4Ò4Ñ6Ô6ˆàÐ1Ð1Ð1Ø3Ð3Ð3Ø4Ð4Ð4ð6ð 7ð Ð3Ð3Ð3Ø@Ð@Ð@ØAÐAÐAðCð DðEˆð 	×Ò  vÑ.Ô.Ð.Ð.Ð.r   c                ó4  — ddl m} ddl m} t          j        ¦   «         }t          j        ¦   «         }d|_        t          j        ¦   «         }d|_        dD ]¥}|rQ|                     t          j	        |¬¦  «        ¦  «         |                     t          j	        |¬¦  «        ¦  «         ŒU|                     t          j
        d¬¦  «        ¦  «         |                     t          j
        d¬¦  «        ¦  «         Œ¦dD ].\  }}|                     ||                     |¦  «        ¦  «         Œ/d	D ].\  }}|                     ||                     |¦  «        ¦  «         Œ/|                     d
¬¦  «         |                     d
¬¦  «         |                     d|¦  «         |                     d|¦  «         |j                             |d
dd¬¦  «        }	|	                     ¦   «          |	                     ¦   «         }
dg d¢g d¢g d¢gfdg d¢g d¢g d¢gfg}|                      ||
¦  «         |j                             |dd
d¬¦  «        }	|	                     ¦   «          |	                     ¦   «         }
dg d¢g d¢g d¢g d¢gfdg d¢g d¢g d¢g d¢gfg}|                      ||
¦  «         |j                             |dd¬¦  «        }	|	                     ¦   «          |	                     ¦   «         }
dg d¢g d¢g d¢gfdg d¢g d¢g d ¢gfg}|                      ||
¦  «         |j                             |d
d
¬¦  «        }	|	                     ¦   «          |	                     ¦   «         }
dg d!¢g d"¢g d#¢g d$¢gfdg d%¢g d&¢g d'¢g d(¢gfg}|                      ||
¦  «         d)S )*r’  r   rH  r“  rI   )r¯   r¯   Fr¯   Fr¯   r™  r¯   r°  r½  Trº   F)rÛ   rÜ   rÝ   )r¢   rX  gf1Û¶mÛÆ?rî   )rX  rX  r·  rî   )ç       @rX  r·  rî   )rX  rX  r›  rî   )rÃ  rX  r›  rî   r´  )rV  rV  rµ  rî   r¶  )rŸ  rV  r·  rî   )r¢   rV  r›  rî   )rV  rV  gš™™™™™¹?rî   )r�  rV  r›  rî   rž  )rÛ   rÜ   )r¢   rX  rU  rî   )r�  rV  ç¸…ëQ¸¾?rî   )rŸ  rV  rÄ  rî   )r�  rV  ç)\�Âõ(Ü?rî   )rŸ  rV  rÅ  rî   )r¢   rV  gø‡ã8ŽãØ?rî   r¾  )r�  rV  ç?„UUUUÅ?rî   )rÃ  rX  rÆ  rî   )r¢   rV  rÀ  rî   )rV  rV  g7Žã8Žãè?rî   )r�  rV  çã8Žã8Žã?rî   )rÃ  rX  rÇ  rî   N)rZ  rI  r”  r   r„   r¢  r¦   r<   r   rv  r·   r…   r  ÚmakeMeasuresr\  rÙ   r:  r>  r�  )r5   rI  r”  rˆ   r¹  rº  r¬  r«  r­  rˆ  r  rì   s               r   ÚtestPartReductionEzTest.testPartReductionEÊ  s²  € ð 	%Ð$Ð$Ð$Ð$Ð$Ø$Ð$Ð$Ð$Ð$Ð$ÝŒL‰NŒNˆÝŒ[‰]Œ]ˆØˆŒÝŒ[‰]Œ]ˆØˆŒØ,ð 	6ð 	6ˆBØð 6Ø—	’	�$œ)°"Ð5Ñ5Ô5Ñ6Ô6Ð6Ø—	’	�$œ)°"Ð5Ñ5Ô5Ñ6Ô6Ð6Ð6à—	’	�$œ)°!Ð4Ñ4Ô4Ñ5Ô5Ð5Ø—	’	�$œ)°!Ð4Ñ4Ô4Ñ5Ô5Ð5Ð5Ø:ð 	2ð 	2‰HˆC�Ø�IŠI�c˜8×+Ò+¨CÑ0Ô0Ñ1Ô1Ð1Ð1Ø8ð 	2ð 	2‰HˆC�Ø�IŠI�c˜8×+Ò+¨CÑ0Ô0Ñ1Ô1Ð1Ð1Ø
�Š ˆÑ%Ô%Ð%Ø
�Š ˆÑ%Ô%Ð%Ø	�Š��B‰ŒˆØ	�Š��B‰ŒˆàÔ×-Ò-¨a¸tØ$)°Uð .ñ <ô <ˆà
�
Š
‰ŒˆØ×5Ò5Ñ7Ô7ˆØÐ;Ð;Ð;Ø<Ð<Ð<Ø<Ð<Ð<ð>ð ?ð Ð;Ð;Ð;Ø@Ð@Ð@Ø@Ð@Ð@ðBð CðDˆð 	×Ò  vÑ.Ô.Ð.àÔ×-Ò-¨a¸uØ$(°Eð .ñ ;ô ;ˆà
�
Š
‰ŒˆØ×5Ò5Ñ7Ô7ˆØÐ1Ð1Ð1Ø?Ð?Ð?Ø<Ð<Ð<Ø=Ð=Ð=ð?ð @ð Ð@Ð@Ð@Ø0Ð0Ð0Ø@Ð@Ð@ØAÐAÐAðCð Dð	Eˆð 	×Ò  vÑ.Ô.Ð.ð Ô×-Ò-¨a¸uØ$)ð .ñ +ô +ˆà
�
Š
‰ŒˆØ×5Ò5Ñ7Ô7ˆàÐ0Ð0Ð0Ø1Ð1Ð1Ø2Ð2Ð2ð4ð 5ð Ð0Ð0Ð0Ø1Ð1Ð1Ø2Ð2Ð2ð4ð 5ð6ˆð 	×Ò  vÑ.Ô.Ð.ð Ô×-Ò-¨a¸tØ$(ð .ñ *ô *ˆà
�
Š
‰ŒˆØ×5Ò5Ñ7Ô7ˆØÐ<Ð<Ð<Ø0Ð0Ð0Ø;Ð;Ð;Ø;Ð;Ð;ð=ð >ð Ð?Ð?Ð?Ø?Ð?Ð?Ø>Ð>Ð>Ø>Ð>Ð>ð@ð Að	Bˆð 	×Ò  vÑ.Ô.Ð.Ð.Ð.r   c                ó´   — ddl m} |                     dd¦  «        }t          |ddd¬¦  «        }|                     ¦   «          |                     ¦   «         }d S )Nr   rJ  rn  r¯   FT)rÛ   rÜ   rÞ   )rZ  rK  r[  rÙ   r:  r>  )r5   rK  Úscrˆ  Úunused_targets        r   ÚxtestPartReductionSchoenbergz!Test.xtestPartReductionSchoenberg"  sl   € Ø"Ð"Ð"Ð"Ð"Ð"Ø�\Š\Ð-¨qÑ1Ô1ˆÝØØØ Ø!ð	
ñ 
ô 
ˆð 	�
Š
‰ŒˆØ×<Ò<Ñ>Ô>ˆˆˆr   Nr?  )r   r   r   rF  rf  rl  r{  r€  r‚  r‰  r�  r®  r»  rÁ  rÉ  rÍ  r   r   r   rA  rA  {  sè   € € € € € ð%ð %ð %ð$Mð $Mð $MðN(ð (ð (ðx"ð "ð "ð."ð "ð "ð."ð "ð "ð3ð 3ð 3ð0ð ð ð*-ð -ð -ð -ð`!/ð !/ð !/ðH%/ð %/ð %/ðTS/ð S/ð S/ðp
?ð 
?ð 
?ð 
?ð 
?r   rA  c                  ó   — e Zd ZdZd„ ZdS )ÚTestExternalTc                óX   — t          ¦   «         }|                     | j        ¬¦  «         d S )N)r£  )rA  r®  r£  )r5   rN  s     r   r®  zTestExternal.testPartReductionB2  s*   € Ý‰vŒvˆØ×Ò T¤YÐÑ/Ô/Ð/Ð/Ð/r   N)r   r   r   r£  r®  r   r   r   rÏ  rÏ  /  s(   € € € € € Ø€Dð0ð 0ð 0ð 0ð 0r   rÏ  r   Ú
_DOC_ORDERÚ__main__)&rr   Ú
__future__r   rJ   rñ   Útypingr  ÚunittestrZ  r   r   r   Úmusic21.common.typesr   r   r	   r
   r   r   r   r   ÚEnvironmentÚenvironLocalÚMusic21Exceptionr   ÚProtoM21Objectr   rt   rv   r×   rÙ   ÚTestCaserA  rÏ  rÑ  Ú__annotations__r   ÚmainTestr   r   r   ú<module>rÞ     sô  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€à  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à&ˆ{Ô&Ð';Ñ<Ô<€ð	ð 	ð 	ð 	ð 	˜lÔ;ñ 	ô 	ð 	ðMð Mð Mð Mð M�GÔ*ñ Mô Mð Mðb	ð 	ð 	ð 	ð 	˜lÔ;ñ 	ô 	ð 	ðf'ð f'ð f'ð f'ð f'ñ f'ô f'ð f'ðV	ð 	ð 	ð 	ð 	˜\Ô:ñ 	ô 	ð 	ðBð Bð Bð Bð Bñ Bô Bð BðJq?ð q?ð q?ð q?ð q?ˆ8Ôñ q?ô q?ð q?ðh0ð 0ð 0ð 0ð 0�8Ô$ñ 0ô 0ð 0ð €
Ð Ð Ð Ñ ð ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   