§
    ƒØjs0 ã                  óT  — d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
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 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m Z   ej!        d¦  «        Z" G d„ dej#        ¦  «        Z$ G d„ dej%        e$¦  «        Z& G d„ dej'        e$¦  «        Z( G d„ de(¦  «        Z) G d„ d e)¦  «        Z* G d!„ d"e(¦  «        Z+ G d#„ d$e(¦  «        Z, G d%„ d&ej-        e$¦  «        Z. G d'„ d(e.¦  «        Z/ G d)„ d*e.¦  «        Z0 G d+„ d,e.¦  «        Z1 G d-„ d.ej2        e$¦  «        Z3 G d/„ d0e3¦  «        Z4 G d1„ d2e3¦  «        Z5 G d3„ d4e3¦  «        Z6 G d5„ d6ej7        e$¦  «        Z8 G d7„ d8e8¦  «        Z9 G d9„ d:e8¦  «        Z: G d;„ d<ej;        e$¦  «        Z< G d=„ d>e<¦  «        Z= G d?„ d@e<¦  «        Z> G dA„ dBej?        e$¦  «        Z@ G dC„ dDe@¦  «        ZA G dE„ dFejB        e$¦  «        ZC G dG„ dHeC¦  «        ZD G dI„ dJejE        e$¦  «        ZF G dK„ dLeF¦  «        ZG G dM„ dNe	jH        ¦  «        ZI G dO„ dPe	jH        ¦  «        ZJe/e0e1e9e:e)e*e+e,e>e=eAe4e5e6eDgZKeLdQk    rddlZ ejM        eJ¦  «         dS dS )Ra!  
Object definitions for plotting :class:`~music21.stream.Stream` objects.

The :class:`~music21.graph.plot.PlotStream`
object subclasses combine a Graph object with the PlotStreamMixin to give
reusable approaches to graphing data and structures in
:class:`~music21.stream.Stream` objects.
é    )ÚannotationsN)Ú	correlate)Údiscrete)Ú	reduction)Úwindowed)Úbase)Úchord)Úcommon)Úcorpus)Ú	converter)Údynamics)Úenvironment)Úfeatures)Únote)Úprebase)Ústream)Úaxis)Ú
primitives)ÚGraphExceptionÚPlotStreamExceptionz
graph.plotc                  óÜ   — e Zd ZU dZej        ej        dœZded<   d!d„Zd"d
„Z	e
d„ ¦   «         Zddœd#d„Zd„ Zd„ Zd$d„Zd%d„Zd„ Zed„ ¦   «         Zd„ Zed&d„¦   «         Ze
d „ ¦   «         ZdS )'ÚPlotStreamMixinzj
    This Mixin adds Stream extracting and Axis holding features to any
    class derived from Graph.
    ©ÚxÚyúdict[str, type[axis.Axis]]ÚaxesClassesNTc                óL  — |�"t          |d¦  «        st          d|› �¦  «        ‚|| _        || _        ddg| _        d| _        d | _        | j                             ¦   «         D ]9\  }}|�2 || |¦  «        }t          | d| 
                    ¦   «         z   |¦  «         Œ:|| _        d S )NÚelementsz!non-stream provided as argument: ÚNoteÚChordTr   )Úhasattrr   Ú	streamObjÚrecurseÚclassFilterListÚmatchPitchCountForChordsÚdatar   ÚitemsÚsetattrÚupperÚsavedKeywords)Úselfr#   r$   ÚkeywordsÚaxisNameÚ	axisClassÚaxisObjs          ú‡/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/graph/plot.pyÚ__init__zPlotStreamMixin.__init__C   sÄ   € àÐ ­°¸JÑ)GÔ)GÐ Ý%Ð&UÈ)Ð&UÐ&UÑVÔVÐVØ"ˆŒØˆŒØ &¨Ð0ˆÔØ(,ˆÔ%àˆŒ	à#'Ô#3×#9Ò#9Ñ#;Ô#;ð 	Bð 	BÑˆH�iØÐ$Ø#˜) D¨(Ñ3Ô3�Ý˜˜f x§~¢~Ñ'7Ô'7Ñ7¸ÑAÔAÐAøà%ˆÔÐÐó    ÚreturnÚstrc                óB   — | j         }|�t          |¦  «        }nd}d|› �S )av  
        The representation of the Plot shows the stream repr
        in addition to the class name.

        >>> st = stream.Stream()
        >>> st.id = 'empty'
        >>> plot = graph.plot.ScatterPitchClassQuarterLength(st)
        >>> plot
        <music21.graph.plot.ScatterPitchClassQuarterLength for <music21.stream.Stream empty>>

        >>> plot = graph.plot.ScatterPitchClassQuarterLength(None)
        >>> plot
        <music21.graph.plot.ScatterPitchClassQuarterLength for (no stream)>

        >>> plot.axisX
        <music21.graph.axis.QuarterLengthAxis: x axis for ScatterPitchClassQuarterLength>

        >>> plot.axisY
        <music21.graph.axis.PitchClassAxis: y axis for ScatterPitchClassQuarterLength>

        >>> axIsolated = graph.axis.DynamicsAxis(axisName='z')
        >>> axIsolated
        <music21.graph.axis.DynamicsAxis: z axis for (no client)>
        Nz(no stream)zfor )r#   Úrepr)r,   ÚsÚ
streamNames      r1   Ú_reprInternalzPlotStreamMixin._reprInternalU   s0   € ð4 ŒNˆØˆ=Ý˜a™œˆJˆJà&ˆJà"�jÐ"Ð"Ð"r3   c                óz   — g }dD ]5}t          | |¦  «        r#|                     t          | |¦  «        ¦  «         Œ6|S )a�  
        return a list of axisX, axisY, axisZ if any are defined in the class.

        Some might be None.

        >>> s = stream.Stream()
        >>> p = graph.plot.ScatterPitchClassOffset(s)
        >>> p.allAxes
        [<music21.graph.axis.OffsetAxis: x axis for ScatterPitchClassOffset>,
         <music21.graph.axis.PitchClassAxis: y axis for ScatterPitchClassOffset>]
        )ÚaxisXÚaxisYÚaxisZ)r"   ÚappendÚgetattr)r,   ÚallAxesListr.   s      r1   ÚallAxeszPlotStreamMixin.allAxesw   sO   € ð ˆØ3ð 	<ð 	<ˆHÝ�t˜XÑ&Ô&ð <Ø×"Ò"¥7¨4°Ñ#:Ô#:Ñ;Ô;Ð;øØÐr3   ©ÚcallProcessrD   Úboolc               óˆ  — t           j        r-ddlm} t	          | |¦  «        rt	          | t
          ¦  «        sJ ‚|                      ¦   «          |                      ¦   «          t          | d¦  «        rT| j	        rM|  
                    d| j	                             ¦   «         ¦  «         |                      d| j	        j        ¦  «         t          | d¦  «        rT| j        rM|  
                    d| j                             ¦   «         ¦  «         |                      d| j        j        ¦  «         |r|                      ¦   «          dS dS )zº
        main routine to extract data, set axis labels, run process() on the underlying
        Graph object, and if self.doneAction is not None, either write or show the graph.
        r   )ÚGraphr=   r   r<   r   N)ÚtÚTYPE_CHECKINGÚmusic21.graph.primitivesrG   Ú
isinstancer   ÚsetAxisKeywordsÚextractDatar"   r=   ÚsetTicksÚticksÚsetAxisLabelÚlabelr<   Úprocess)r,   rD   r-   rG   s       r1   ÚrunzPlotStreamMixin.runŠ   s=  € õ
 Œ?ð 	QØ6Ð6Ð6Ð6Ð6Ð6Ý˜d EÑ*Ô*ÐP­z¸$ÅÑ/PÔ/PÐPÐPÐPà×ÒÑÔÐØ×ÒÑÔÐÝ�4˜Ñ!Ô!ð 	5 d¤jð 	5Ø�MŠM˜#˜tœz×/Ò/Ñ1Ô1Ñ2Ô2Ð2Ø×Ò˜c 4¤:Ô#3Ñ4Ô4Ð4Ý�4˜Ñ!Ô!ð 	5 d¤jð 	5Ø�MŠM˜#˜tœz×/Ò/Ñ1Ô1Ñ2Ô2Ð2Ø×Ò˜c 4¤:Ô#3Ñ4Ô4Ð4àð 	Ø�LŠL‰NŒNˆNˆNˆNð	ð 	r3   c                ó:  — | j         D ]’}|€Œ|j        }| j        D ]~}|                     |¦  «        sŒt	          |¦  «        dk     rŒ,|d                              ¦   «         |dd…         z   }t          ||¦  «        sŒbt          ||| j        |         ¦  «         ŒŒ“dS )a€  
        Configure axis parameters based on keywords given when creating the Plot.

        Looks in self.savedKeywords, in case any post creation manipulation needs
        to happen.

        Finds keywords that begin with x, y, z and sets the remainder of the
        keyword (lowercasing the first letter) as an attribute.  Does not
        set any new attributes, only existing ones.

        >>> b = corpus.parse('bwv66.6')
        >>> hist = graph.plot.HistogramPitchSpace(b, xHideUnused=False)
        >>> hist.axisX.hideUnused
        True
        >>> hist.setAxisKeywords()
        >>> hist.axisX.hideUnused
        False
        Né   é   é   )rB   r.   r+   Ú
startswithÚlenÚlowerr"   r)   )r,   ÚthisAxisÚthisAxisLetterÚkwÚshortKws        r1   rL   zPlotStreamMixin.setAxisKeywords    sÇ   € ð& œð 	Cð 	CˆHØÐØØ%Ô.ˆNØÔ(ð 	Cð 	C�Ø—}’} ^Ñ4Ô4ð ØÝ�r‘7”7˜Q’;�;ØØ˜Qœ%Ÿ+š+™-œ-¨"¨Q¨R¨R¬&Ñ0�å˜x¨Ñ1Ô1ð ØÝ˜ '¨4Ô+=¸bÔ+AÑBÔBÐBÐBð	Cð		Cð 	Cr3   c                ó  ‡— d | j         v rt          d¦  «        ‚| j        r| j                             ¦   «         }n| j                             ¦   «         }| j        r|                     | j        ¦  «        }g | _        |D ]3}|                      |¦  «        }|�| j         	                    |¦  «         Œ4|  
                    ¦   «          t          | j         ¦  «        D ]+\  Š}|                     ˆfd„| j        D ¦   «         ¦  «         Œ,d S )Nz3Set all axes before calling extractData() via run()c                ó    •— g | ]
}|‰         ‘ŒS © ra   )Ú.0ÚdÚis     €r1   ú
<listcomp>z/PlotStreamMixin.extractData.<locals>.<listcomp>Ú   s   ø€ Ð+DÐ+DÐ+D°Q¨A¨a¬DÐ+DÐ+DÐ+Dr3   )rB   r   r$   r#   Úiterr%   ÚgetElementsByClassr'   ÚprocessOneElementÚextendÚpostProcessDataÚ	enumerateÚsetBoundariesFromData)r,   ÚsIterÚelÚdataListr[   rd   s        @r1   rM   zPlotStreamMixin.extractDataÄ   s$  ø€ Ø�4”<ÐÐÝ%Ð&[Ñ\Ô\Ð\àŒ<ð 	*Ø”N×*Ò*Ñ,Ô,ˆEˆEà”N×'Ò'Ñ)Ô)ˆEàÔð 	CØ×,Ò,¨TÔ-AÑBÔBˆEàˆŒ	àð 	+ð 	+ˆBØ×-Ò-¨bÑ1Ô1ˆHØÐ#Ø”	× Ò  Ñ*Ô*Ð*øà×ÒÑÔÐå$ T¤\Ñ2Ô2ð 	Fð 	F‰KˆAˆxØ×*Ò*Ð+DÐ+DÐ+DÐ+D¸$¼)Ð+DÑ+DÔ+DÑEÔEÐEÐEð	Fð 	Fr3   rn   úbase.Music21Objectc                óJ  ‡	— d„ t          t          | j        ¦  «        ¦  «        D ¦   «         }i Š	t          |t          j        ¦  «        sPt          | j        ¦  «        D ]:\  }}|                     |‰	¦  «        }t          |t          ¦  «        s|�|g}|||<   Œ;n|  	                    |‰	¦  «        } | j
        |‰	g|¢R Ž  d|v rdS t          d„ |D ¦   «         ¦  «        }ˆ	fd„t          |¦  «        D ¦   «         }|                     |¦  «         t          t          |Ž ¦  «        }|S )a¾  
        Get a list of data from a single element (generally a Note or chord):

        >>> n = note.Note('C#4')
        >>> n.offset = 10.25
        >>> s = stream.Stream([n])
        >>> pl = graph.plot.ScatterPitchClassOffset(s)
        >>> pl.processOneElement(n)
        [(10.25, 1, {})]

        >>> c = chord.Chord(['D4', 'E5'])
        >>> s.insert(5.0, c)
        >>> pl.processOneElement(c)
        [(5.0, 2, {}), (5.0, 4, {})]
        c                ó   — g | ]}g ‘ŒS ra   ra   )rb   Ú_s     r1   re   z5PlotStreamMixin.processOneElement.<locals>.<listcomp>ì   s   € Ð+QÐ+QÐ+Q°1¨BÐ+QÐ+QÐ+Qr3   Nc                ó,   — g | ]}t          |¦  «        ‘ŒS ra   ©rY   )rb   Úevs     r1   re   z5PlotStreamMixin.processOneElement.<locals>.<listcomp>  s   € Ð!BÐ!BÐ!B¨b¥# b¡'¤'Ð!BÐ!BÐ!Br3   c                ó8   •— g | ]}‰                      ¦   «         ‘ŒS ra   )Úcopy)rb   rs   Ú
formatDicts     €r1   re   z5PlotStreamMixin.processOneElement.<locals>.<listcomp>  s#   ø€ ÐOÐOÐO°˜*Ÿ/š/Ñ+Ô+ÐOÐOÐOr3   )ÚrangerY   rB   rK   r	   r!   rk   ÚextractOneElementÚlistÚextractChordDataMultiAxisÚpostProcessElementÚmaxr?   Úzip)
r,   rn   ÚelementValuesrd   r[   Ú	axisValueÚelementValueLengthÚformatDictListÚ
returnListry   s
            @r1   rh   z!PlotStreamMixin.processOneElementÜ   sZ  ø€ ð  ,RÐ+Q½½cÀ$Ä,Ñ>OÔ>OÑ8PÔ8PÐ+QÑ+QÔ+QˆØ)+ˆ
õ ˜"�eœkÑ*Ô*ð 	KÝ(¨¬Ñ6Ô6ð -ð -‘��8Ø$×6Ò6°r¸:ÑFÔF�	õ
 " )­TÑ2Ô2ð ,°yÐ7LØ!* �IØ#,�˜aÑ Ð ð-ð !×:Ò:¸2¸zÑJÔJˆMàˆÔ  JÐ?°Ð?Ð?Ð?Ð?Ø�=Ð Ð Ø�4å Ð!BÐ!B°MÐ!BÑ!BÔ!BÑCÔCÐØOÐOÐOÐOµUÐ;MÑ5NÔ5NÐOÑOÔOˆØ×Ò˜^Ñ,Ô,Ð,Ý�#˜}Ð-Ñ.Ô.ˆ
ØÐr3   ry   údict[t.Any, t.Any]Úvaluesúlist[numbers.Real]ÚNonec                ó   — dS )zÜ
        Any processing that needs to take place for each element, independent
        of what the axis is finding can go here.  For chords, a single
        formatDict applies to all pitches/notes in the chord.
        Nra   )r,   rn   ry   r‡   s       r1   r~   z"PlotStreamMixin.postProcessElement  s	   € ð 	ˆr3   c                óB   — | j         D ]}|                     ¦   «          ŒdS )úN
        Call any post data processing routines here and on any axes.
        N)rB   rj   )r,   r[   s     r1   rj   zPlotStreamMixin.postProcessData  s4   € ð œð 	'ð 	'ˆHØ×$Ò$Ñ&Ô&Ð&Ð&ð	'ð 	'r3   c                ó  — g }d}	 |                       ||¦  «        }n# t          $ r Y nw xY w|�|                     |¦  «         |sG|D ]D}d}	 |                       ||¦  «        }n# t          $ r Y  nw xY w|�|                     |¦  «         ŒE|S )zÐ
        Look for Note-like attributes in a Chord. This is done by first
        looking at the Chord, and then, if attributes are not found, looking at each pitch.

        Returns a list of values.
        N)r{   ÚAttributeErrorr?   )ÚaxÚcry   r‡   ÚvalueÚns         r1   ÚextractChordDataOneAxisz'PlotStreamMixin.extractChordDataOneAxis  sÞ   € ð ˆØˆð	Ø×(Ò(¨¨JÑ7Ô7ˆEˆEøÝð 	ð 	ð 	ØˆDð	øøøð ÐØ�MŠM˜%Ñ Ô Ð àð 
	)Øð 	)ð 	)�à�ðØ×0Ò0°°JÑ?Ô?�E�EøÝ%ð ð ð Ø�E�Eðøøøð Ð$Ø—M’M %Ñ(Ô(Ð(øØˆs   † �
*©*ÁA$Á$
A2Á1A2c                ór  ‡ ‡‡— ˆˆˆ fd„‰ j         D ¦   «         }g }t          ‰ j         |¦  «        D ]\  }}|s|                     ||f¦  «         Œ|D ]I\  }}‰D ]A}	 |                     |‰¦  «        }	n# t          $ r Y Œ&w xY w|	�|                     |	¦  «         ŒBŒJ‰ j        r‰                      |¦  «         |S )zB
        Returns a list of lists of values for each axis.
        c                ó>   •— g | ]}‰                      |‰‰¦  «        ‘ŒS ra   )r“   )rb   r�   r�   ry   r,   s     €€€r1   re   z=PlotStreamMixin.extractChordDataMultiAxis.<locals>.<listcomp>=  s+   ø€ Ð`Ð`Ð`ÈR˜×5Ò5°b¸!¸ZÑHÔHÐ`Ð`Ð`r3   )rB   r€   r?   r{   rŽ   r&   ÚfillValueLists)
r,   r�   ry   r�   ÚlookIntoChordForNotesGroupsr[   r‡   Ú
destValuesr’   Útargets
   ```       r1   r}   z)PlotStreamMixin.extractChordDataMultiAxis9  s  øøø€ ð aÐ`Ð`Ð`Ð`Ð`ÐSWÔS_Ð`Ñ`Ô`ˆà&(Ð#Ý # D¤L°-Ñ @Ô @ð 	Gð 	GÑˆH�fØð GØ+×2Ò2°H¸fÐ3EÑFÔFÐFøà$?ð 	.ð 	.Ñ ˆH�jØð .ð .�ðØ%×7Ò7¸¸:ÑFÔF�F�FøÝ%ð ð ð Ø�HðøøøàÐ%Ø×%Ò% fÑ-Ô-Ð-øð.ð Ô(ð 	/Ø×Ò Ñ.Ô.Ð.ØÐs   ÁA2Á2
A?Á>A?r   c                ó–   — t          d„ | D ¦   «         ¦  «        }| D ],}|t          |¦  «        z
  }|r	|d         }n|}|r	||g|z  z  }Œ-dS )a2  
        pads a list of lists so that each list has the same length.
        Pads with the first element of the list or nullFillValue if
        the list has no elements.   Modifies in place so returns None

        Used by extractChordDataMultiAxis

        >>> l0 = [2, 3, 4]
        >>> l1 = [10, 20, 30, 40, 50]
        >>> l2 = []
        >>> listOfLists = [l0, l1, l2]
        >>> graph.plot.PlotStream.fillValueLists(listOfLists)
        >>> listOfLists
        [[2,   3,  4,  2,  2],
         [10, 20, 30, 40, 50],
         [0,   0,  0,  0,  0]]
        c                ó,   — g | ]}t          |¦  «        ‘ŒS ra   ru   )rb   Úvals     r1   re   z2PlotStreamMixin.fillValueLists.<locals>.<listcomp>j  s   € Ð;Ð;Ð; c�˜S™œÐ;Ð;Ð;r3   r   N)r   rY   )r�   ÚnullFillValueÚ	maxLengthrœ   ÚshortAmountÚfillVals         r1   r–   zPlotStreamMixin.fillValueListsW  s{   € õ& Ð;Ð;¨]Ð;Ñ;Ô;Ñ<Ô<ˆ	Ø ð 	/ð 	/ˆCØ#¥c¨#¡h¤hÑ.ˆKØð (Ø˜aœ&��à'�Øð /Ø˜�y ;Ñ.Ñ.�øð	/ð 	/r3   c                óX   — | j         }| j        D ]}|€Œ|j        d         }|d|z   z  }Œ|S )a"  
        Each PlotStream has a unique id that consists of its class name and
        the class names of the axes:

        >>> s = stream.Stream()
        >>> pScatter = graph.plot.ScatterPitchClassQuarterLength(s)
        >>> pScatter.id
        'scatter-quarterLength-pitchClass'
        Nr   ú-)Ú	graphTyperB   Ú
quantities)r,   ÚidNamer0   r.   s       r1   ÚidzPlotStreamMixin.idu  sF   € ð ”ˆà”|ð 	%ð 	%ˆGØˆØØÔ)¨!Ô,ˆHØ�c˜H‘nÑ$ˆFˆFàˆr3   )NT)r4   r5   ©rD   rE   )rn   rp   )rn   rp   ry   r†   r‡   rˆ   r4   r‰   ©r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚAxisr   Ú__annotations__r2   r:   ÚpropertyrB   rS   rL   rM   rh   r~   rj   Ústaticmethodr“   r}   r–   r¦   ra   r3   r1   r   r   <   sh  € € € € € € ðð ð 59´IÀDÄIÐ.NÐ.N€KÐNÐNÐNÑNð&ð &ð &ð &ð$ #ð  #ð  #ð  #ðD ðð ñ „Xðð$ *.ð ð ð ð ð ð ð, Cð  Cð  CðHFð Fð Fð0)ð )ð )ð )ðV	ð 	ð 	ð 	ð'ð 'ð 'ð ðð ñ „\ðð<ð ð ð< ð/ð /ð /ñ „\ð/ð: ðð ñ „Xðð ð r3   r   c                  ó   — e Zd ZdZdd„ZdS )Ú
PlotStreamz#
    A generic stream plotter.
    Nc                óŽ   — t          j        j        | fi |¤Ž t          j        | |fi |¤Ž t	          j        | d¦  «        | _        d S )Nr   )r   rG   r2   r   r   Ú
OffsetAxisr<   ©r,   r#   r-   s      r1   r2   zPlotStream.__init__�  sP   € ÝÔÔ! $Ð3Ð3¨(Ð3Ð3Ð3ÝÔ   yÐ=Ð=°HÐ=Ð=Ð=å”_ T¨3Ñ/Ô/ˆŒ
ˆ
ˆ
r3   ©N©r©   rª   r«   r¬   r2   ra   r3   r1   r²   r²   Œ  s2   € € € € € ðð ð0ð 0ð 0ð 0ð 0ð 0r3   r²   c                  ó   — e Zd ZdZdd„ZdS )ÚScatterz*
    Base class for 2D scatter plots.
    Nc                óZ   — t          j        j        | fi |¤Ž t          j        | |fi |¤Ž d S r¶   )r   ÚGraphScatterr2   r   rµ   s      r1   r2   zScatter.__init__Ÿ  s?   € ÝÔÔ(¨Ð:Ð:°Ð:Ð:Ð:ÝÔ   yÐ=Ð=°HÐ=Ð=Ð=Ð=Ð=r3   r¶   r·   ra   r3   r1   r¹   r¹   š  s2   € € € € € ðð ð>ð >ð >ð >ð >ð >r3   r¹   c                  óN   ‡ — e Zd ZU dZej        ej        dœZded<   dˆ fd„	Z	ˆ xZ
S )ÚScatterPitchSpaceQuarterLengthaX  
    A scatter plot of pitch space and quarter length

    >>> s = corpus.parse('bach/bwv324.xml')
    >>> p = graph.plot.ScatterPitchSpaceQuarterLength(s)
    >>> p.doneAction = None #_DOCS_HIDE
    >>> p.id
    'scatter-quarterLength-pitchSpace'
    >>> p.run()

    .. image:: images/ScatterPitchSpaceQuarterLength.*
        :width: 600
    r   r   r   Nc                ó„   •—  t          ¦   «         j        |fi |¤Ž d| j        _        d|vrd| _        d|vr	d| _        d S d S )NTÚ
figureSize©é   rÁ   ÚtitlezPitch by Quarter Length Scatter)Úsuperr2   r<   ÚuseLogScaler¿   rÂ   ©r,   r#   r-   Ú	__class__s      €r1   r2   z'ScatterPitchSpaceQuarterLength.__init__·  s\   ø€ Ø�‰ŒÔ˜Ð/Ð/ hÐ/Ð/Ð/Ø!%ˆŒ
Ôà˜xÐ'Ð'Ø$ˆDŒOØ˜(Ð"Ð"Ø:ˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   r   ÚQuarterLengthAxisÚPitchSpaceAxisr   r®   r2   Ú__classcell__©rÆ   s   @r1   r½   r½   ¤  sw   ø€ € € € € € ðð ð Ô#ØÔ ð/ð /€Kð ð ð ñ ð
;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r3   r½   c                  óN   ‡ — e Zd ZU dZej        ej        dœZded<   dˆ fd„	Z	ˆ xZ
S )ÚScatterPitchClassQuarterLengthaÓ  
    A scatter plot of pitch class and quarter length

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.ScatterPitchClassQuarterLength(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('bach/bwv57.8')
    >>> #_DOCS_SHOW p = graph.plot.ScatterPitchClassQuarterLength(s)
    >>> p.id
    'scatter-quarterLength-pitchClass'
    >>> p.run()

    .. image:: images/ScatterPitchClassQuarterLength.*
        :width: 600
    r   r   r   Nc                óV   •—  t          ¦   «         j        |fi |¤Ž d|vr	d| _        d S d S )NrÂ   z%Pitch Class by Quarter Length Scatter)rÃ   r2   rÂ   rÅ   s      €r1   r2   z'ScatterPitchClassQuarterLength.__init__×  s@   ø€ Ø�‰ŒÔ˜Ð/Ð/ hÐ/Ð/Ð/Ø˜(Ð"Ð"Ø@ˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   r   rÇ   ÚPitchClassAxisr   r®   r2   rÉ   rÊ   s   @r1   rÌ   rÌ   Ã  s�   ø€ € € € € € ðð ð Ô#ØÔ ð/ð /€Kð ð ð ñ ð
Að Að Að Að Að Að Að Að Að Ar3   rÌ   c                  óN   ‡ — e Zd ZU dZej        ej        dœZded<   dˆ fd„	Z	ˆ xZ
S )ÚScatterPitchClassOffseta¯  
    A scatter plot of pitch class and offset

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.ScatterPitchClassOffset(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('bach/bwv57.8')
    >>> #_DOCS_SHOW p = graph.plot.ScatterPitchClassOffset(s)
    >>> p.id
    'scatter-offset-pitchClass'
    >>> p.run()

    .. image:: images/ScatterPitchClassOffset.*
        :width: 600
    r   r   r   Nc                ó‚   •—  t          ¦   «         j        |fi |¤Ž d|vrd| _        d|vrd| _        d|vr	d| _        d S d S )Nr¿   )é
   é   rÂ   zPitch Class by Offset ScatterÚalphaçffffffæ?©rÃ   r2   r¿   rÂ   rÔ   rÅ   s      €r1   r2   z ScatterPitchClassOffset.__init__ñ  sf   ø€ Ø�‰ŒÔ˜Ð/Ð/ hÐ/Ð/Ð/ð ˜xÐ'Ð'Ø%ˆDŒOØ˜(Ð"Ð"Ø8ˆDŒJØ˜(Ð"Ð"ØˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   r   r´   rÎ   r   r®   r2   rÉ   rÊ   s   @r1   rÐ   rÐ   Ý  sv   ø€ € € € € € ðð ð Œ_ØÔ ð/ð /€Kð ð ð ñ ð
	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r3   rÐ   c                  óX   ‡ — e Zd ZU dZdZej        ej        dœZde	d<   d	ˆ fd„	Z
d„ Zˆ xZS )
ÚScatterPitchSpaceDynamicSymbolaH  
    A graph of dynamics used by pitch space.

    >>> s = converter.parse('tinynotation: 4/4 C4 d E f', makeNotation=False) #_DOCS_HIDE
    >>> s.insert(0.0, dynamics.Dynamic('pp')) #_DOCS_HIDE
    >>> s.insert(2.0, dynamics.Dynamic('ff')) #_DOCS_HIDE
    >>> p = graph.plot.ScatterPitchSpaceDynamicSymbol(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('schumann_robert/opus41no1/movement2.xml')
    >>> #_DOCS_SHOW p = graph.plot.ScatterPitchSpaceDynamicSymbol(s)
    >>> p.run()

    .. image:: images/ScatterPitchSpaceDynamicSymbol.*
        :width: 600
    )é   rÁ   r   r   r   Nc                ó¤   •—  t          ¦   «         j        |fi |¤Ž d| j        _        d|vr| j        | _        d|vrd| _        d|vr	d| _        d S d S )NFr¿   rÂ   zDynamics by Pitch ScatterrÔ   rÕ   )rÃ   r2   r<   ÚshowEnharmonicÚfigureSizeDefaultr¿   rÂ   rÔ   rÅ   s      €r1   r2   z'ScatterPitchSpaceDynamicSymbol.__init__  sq   ø€ Ø�‰ŒÔ˜Ð/Ð/ hÐ/Ð/Ð/à$)ˆŒ
Ô!à˜xÐ'Ð'Ø"Ô4ˆDŒOØ˜(Ð"Ð"Ø4ˆDŒJØ˜(Ð"Ð"ØˆDŒJˆJˆJð #Ð"r3   c                ó�  — t          j        | j        ¦  «        }|                     d¬¦  «        }g | _        |D ]"\  }}| j                             ||i f¦  «         Œ#d„ | j        D ¦   «         }d„ | j        D ¦   «         }| j                             |¦  «         | j                             |¦  «         |  	                    ¦   «          d S )NT©Ú
dataPointsc                ó   — g | ]
}|d          ‘ŒS r¨   ra   ©rb   rc   s     r1   re   z>ScatterPitchSpaceDynamicSymbol.extractData.<locals>.<listcomp>'  ó   € Ð)Ð)Ð)˜!��1”Ð)Ð)Ð)r3   c                ó   — g | ]
}|d          ‘ŒS ©rV   ra   rá   s     r1   re   z>ScatterPitchSpaceDynamicSymbol.extractData.<locals>.<listcomp>(  râ   r3   )
r   ÚActivityMatchr#   ÚpitchToDynamicr'   r?   r<   rl   r=   rj   )r,   ÚamÚamDatar   r   ÚxValsÚyValss          r1   rM   z*ScatterPitchSpaceDynamicSymbol.extractData  sÑ   € åÔ$ T¤^Ñ4Ô4ˆØ×"Ò"¨dÐ"Ñ3Ô3ˆØˆŒ	Øð 	)ð 	)‰DˆAˆqØŒI×Ò˜a  B˜ZÑ(Ô(Ð(Ð(à)Ð)˜tœyÐ)Ñ)Ô)ˆØ)Ð)˜tœyÐ)Ñ)Ô)ˆàŒ
×(Ò(¨Ñ/Ô/Ð/ØŒ
×(Ò(¨Ñ/Ô/Ð/Ø×ÒÑÔÐÐÐr3   r¶   )r©   rª   r«   r¬   rÜ   r   rÈ   ÚDynamicsAxisr   r®   r2   rM   rÉ   rÊ   s   @r1   rØ   rØ   ý  sŒ   ø€ € € € € € ðð ð  ÐàÔ ØÔð/ð /€Kð ð ð ñ ð

ð 
ð 
ð 
ð 
ð 
ðð ð ð ð ð ð r3   rØ   c                  óX   — e Zd ZU dZej        ej        dœZded<   dd„Z	ddœdd„Z
d„ ZdS )Ú	HistogramzH
    Base class for histograms that plot one axis against its count
    r   r   r   Nc                ót   — t          j        j        | fi |¤Ž t          j        | |fi |¤Ž d|vr	d| _        d S d S )NrÔ   ç      ð?)r   ÚGraphHistogramr2   r   rÔ   rµ   s      r1   r2   zHistogram.__init__:  sW   € ÝÔ!Ô*¨4Ð<Ð<°8Ð<Ð<Ð<ÝÔ   yÐ=Ð=°HÐ=Ð=Ð=à˜(Ð"Ð"ØˆDŒJˆJˆJð #Ð"r3   TrC   rD   rE   c               ó  — t           j        r"t          | d¦  «        rt          | d¦  «        sJ ‚|                      ¦   «          |                      ¦   «          |                      d| j                             ¦   «         ¦  «         |                      ¦   «         }|                      d|¦  «         |  	                    d| j        j
        ¦  «         |  	                    d| j        j
        ¦  «         |r|                      ¦   «          dS dS )zK
        Override run method to remap X data into individual bins.
        r<   r=   r   r   N)rH   rI   r"   rL   rM   rN   r=   rO   ÚremapXTicksDatarP   rQ   r<   rR   )r,   rD   r-   Ú	xTicksNews       r1   rS   zHistogram.runA  sø   € õ Œ?ð 	EÝ˜4 Ñ)Ô)ÐD­g°d¸GÑ.DÔ.DÐDÐDÐDà×ÒÑÔÐØ×ÒÑÔÐØ�Š�c˜4œ:×+Ò+Ñ-Ô-Ñ.Ô.Ð.Ø×(Ò(Ñ*Ô*ˆ	Ø�Š�c˜9Ñ%Ô%Ð%Ø×Ò˜#˜tœzÔ/Ñ0Ô0Ð0Ø×Ò˜#˜tœzÔ/Ñ0Ô0Ð0àð 	Ø�LŠL‰NŒNˆNˆNˆNð	ð 	r3   c                ó  — | j                              ¦   «         }d„ |D ¦   «         }g }t          | j         d¦  «        r&| j         j        du s| j         j        �| j         j        €yt          t          | j        ¦  «        ¦  «        D ]V}| j        |         }|d         }|dz   f|dd…         z   | j        |<   ||v r"|dz   ||         f}| 	                    |¦  «         ŒWn®ddl
m} t          t          | j         j        ¦  «        t          | j         j        ¦  «        dz   ¦  «        D ]f}||v r	||         }	n>t          | j         d¦  «        r'| j         j        s|                     |¦  «        j        }	nd	}	||	f}| 	                    |¦  «         Œg|S )
z[
        Changes the ticks and data so that they both run
        1, 2, 3, 4, etc.
        c                ó,   — i | ]}|d          |d         “ŒS )r   rV   ra   )rb   Úvs     r1   ú
<dictcomp>z-Histogram.remapXTicksData.<locals>.<dictcomp>Z  s"   € Ð4Ð4Ð4 A�Q�q”T˜1˜Qœ4Ð4Ð4Ð4r3   Ú
hideUnusedTNr   rV   )ÚpitchÚblankLabelUnusedÚ )r<   rO   r"   rø   ÚminValueÚmaxValuerz   rY   r'   r?   Úmusic21rù   Úintrú   ÚPitchÚname)
r,   Ú
xTicksOrigÚ	xTickDictró   rd   ÚdataValÚxDataValÚnewTickrù   rQ   s
             r1   rò   zHistogram.remapXTicksDataS  s²  € ð ”Z×%Ò%Ñ'Ô'ˆ
Ø4Ð4¨Ð4Ñ4Ô4ˆ	Øˆ	å˜œ \Ñ2Ô2ð 	*°d´jÔ6KÈtÐ6SÐ6SØ”:Ô&Ð.Ø”:Ô&Ð.Ý�3˜tœy™>œ>Ñ*Ô*ð .ð .�Øœ) Aœ,�Ø" 1œ:�Ø ! A¡˜x¨'°!°"°"¬+Ñ5�”	˜!‘Ø˜yÐ(Ð(Ø  1™u i°Ô&9Ð:�GØ×$Ò$ WÑ-Ô-Ð-øð.ð &Ð%Ð%Ð%Ð%Ð%Ý�3˜tœzÔ2Ñ3Ô3µS¸¼Ô9LÑ5MÔ5MÐPQÑ5QÑRÔRð *ð *�Ø˜	�>�>Ø% aœL�E�EÝ˜TœZÐ);Ñ<Ô<ð ÀTÄZÔE`ð Ø!ŸKšK¨™NœNÔ/�E�Eà�EØ˜e˜*�Ø× Ò  Ñ)Ô)Ð)Ð)àÐr3   r¶   r§   )r©   rª   r«   r¬   r   r­   ÚCountingAxisr   r®   r2   rS   rò   ra   r3   r1   rí   rí   1  s“   € € € € € € ðð ð ŒYØÔð/ð /€Kð ð ð ñ ð
ð ð ð ð *.ð ð ð ð ð ð ð$ ð  ð  ð  ð  r3   rí   c                  óT   ‡ — e Zd ZU dZi ej        ¥dej        i¥Zded<   dˆ fd„	Z	ˆ xZ
S )ÚHistogramPitchSpaceaÒ  
    A histogram of pitch space.

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.HistogramPitchSpace(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('bach/bwv57.8')
    >>> #_DOCS_SHOW p = graph.plot.HistogramPitchSpace(s)
    >>> p.id
    'histogram-pitchSpace-count'
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/HistogramPitchSpace.*
        :width: 600
    r   r   r   Nc                ó„   •—  t          ¦   «         j        |fi |¤Ž d| j        _        d|vrd| _        d|vr	d| _        d S d S )NFr¿   ©rÒ   rÁ   rÂ   zPitch Histogram)rÃ   r2   r<   rÛ   r¿   rÂ   rÅ   s      €r1   r2   zHistogramPitchSpace.__init__Š  s\   ø€ Ø�‰ŒÔ˜Ð/Ð/ hÐ/Ð/Ð/Ø$)ˆŒ
Ô!à˜xÐ'Ð'Ø%ˆDŒOØ˜(Ð"Ð"Ø*ˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   rí   r   r   rÈ   r®   r2   rÉ   rÊ   s   @r1   r	  r	  v  s�   ø€ € € € € € ðð ð/Ø
Ô
ð/àˆTÔ ð/ð /€Kð ð ð ñ ð
+ð +ð +ð +ð +ð +ð +ð +ð +ð +r3   r	  c                  óT   ‡ — e Zd ZU dZi ej        ¥dej        i¥Zded<   dˆ fd„	Z	ˆ xZ
S )ÚHistogramPitchClassaÒ  
    A histogram of pitch class

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.HistogramPitchClass(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('bach/bwv57.8')
    >>> #_DOCS_SHOW p = graph.plot.HistogramPitchClass(s)
    >>> p.id
    'histogram-pitchClass-count'
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/HistogramPitchClass.*
        :width: 600

    r   r   r   Nc                ón   •—  t          ¦   «         j        |fi |¤Ž d| j        _        d|vr	d| _        d S d S )NFrÂ   zPitch Class Histogram)rÃ   r2   r<   rÛ   rÂ   rÅ   s      €r1   r2   zHistogramPitchClass.__init__©  sJ   ø€ Ø�‰ŒÔ˜Ð/Ð/ hÐ/Ð/Ð/Ø$)ˆŒ
Ô!Ø˜(Ð"Ð"Ø0ˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   rí   r   r   rÎ   r®   r2   rÉ   rÊ   s   @r1   r  r  ”  s�   ø€ € € € € € ðð ð/Ø
Ô
ð/àˆTÔ ð/ð /€Kð ð ð ñ ð
1ð 1ð 1ð 1ð 1ð 1ð 1ð 1ð 1ð 1r3   r  c                  óT   ‡ — e Zd ZU dZi ej        ¥dej        i¥Zded<   dˆ fd„	Z	ˆ xZ
S )ÚHistogramQuarterLengthaß  
    A histogram of pitch class.

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.HistogramQuarterLength(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('bach/bwv57.8')
    >>> #_DOCS_SHOW p = graph.plot.HistogramQuarterLength(s)
    >>> p.id
    'histogram-quarterLength-count'
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/HistogramQuarterLength.*
        :width: 600

    r   r   r   Nc                ó¢   •—  t          ¦   «         j        |fi |¤Ž t          j        | d¦  «        | _        d| j        _        d|vr	d| _        d S d S )Nr   FrÂ   zQuarter Length Histogram)rÃ   r2   r   rÇ   r<   rÄ   rÂ   rÅ   s      €r1   r2   zHistogramQuarterLength.__init__Å  s^   ø€ Ø�‰ŒÔ˜Ð/Ð/ hÐ/Ð/Ð/ÝÔ+¨D°#Ñ6Ô6ˆŒ
Ø!&ˆŒ
ÔØ˜(Ð"Ð"Ø3ˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   rí   r   r   rÇ   r®   r2   rÉ   rÊ   s   @r1   r  r  °  s�   ø€ € € € € € ðð ð/Ø
Ô
ð/àˆTÔ#ð/ð /€Kð ð ð ñ ð
4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4r3   r  c                  óP   — e Zd ZU dZej        ej        ej        dœZded<   dd„Z	dS )ÚScatterWeightedz“
    Base class for histograms that plot one axis against its count.

    The count is stored as the Z axis, though it is represented as size.
    ©r   r   Úzr   r   Nc                ór   — t          j        j        | fi |¤Ž t          j        | |fi |¤Ž d| j        _        d S ©Nr   )r   ÚGraphScatterWeightedr2   r   r>   Ú	countAxesrµ   s      r1   r2   zScatterWeighted.__init__Ü  sI   € ÝÔ'Ô0°ÐBÐB¸ÐBÐBÐBÝÔ   yÐ=Ð=°HÐ=Ð=Ð=à)ˆŒ
ÔÐÐr3   r¶   )
r©   rª   r«   r¬   r   r­   r  r   r®   r2   ra   r3   r1   r  r  Ð  sf   € € € € € € ðð ð ŒYØŒYØÔð/ð /€Kð ð ð ñ ð*ð *ð *ð *ð *ð *r3   r  c                  ó`   ‡ — e Zd ZU dZi ej        ¥ej        ej        dœ¥Zde	d<   dˆ fd„	Z
ˆ xZS )Ú&ScatterWeightedPitchSpaceQuarterLengthaï  
    A graph of event, sorted by pitch, over time.

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.ScatterWeightedPitchSpaceQuarterLength(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('bach/bwv57.8')
    >>> #_DOCS_SHOW p = graph.plot.ScatterWeightedPitchSpaceQuarterLength(s)
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/ScatterWeightedPitchSpaceQuarterLength.*
        :width: 600
    r   r   r   Nc                ó‚   •—  t          ¦   «         j        |fi |¤Ž d|vrd| _        d|vrd| _        d|vr	d| _        d S d S )Nr¿   ©é   r  rÂ   z!Count of Pitch and Quarter LengthrÔ   çš™™™™™é?rÖ   rÅ   s      €r1   r2   z/ScatterWeightedPitchSpaceQuarterLength.__init__ö  sr   ø€ Ø�‰ŒÔØð	#ð 	#Ø!ð	#ð 	#ð 	#ð ˜xÐ'Ð'Ø$ˆDŒOØ˜(Ð"Ð"Ø<ˆDŒJØ˜(Ð"Ð"ØˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   r  r   r   rÇ   rÈ   r®   r2   rÉ   rÊ   s   @r1   r  r  ã  sŠ   ø€ € € € € € ðð ð/Ø
Ô
%ð/àÔ#ØÔ ð/ð /ð /€Kð ð ð ñ ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r3   r  c                  ó`   ‡ — e Zd ZU dZi ej        ¥ej        ej        dœ¥Zde	d<   dˆ fd„	Z
ˆ xZS )Ú&ScatterWeightedPitchClassQuarterLengthaö  
    A graph of event, sorted by pitch class, over time.

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.ScatterWeightedPitchClassQuarterLength(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('bach/bwv57.8')
    >>> #_DOCS_SHOW p = graph.plot.ScatterWeightedPitchClassQuarterLength(s)
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/ScatterWeightedPitchClassQuarterLength.*
        :width: 600

    r   r   r   Nc                ó‚   •—  t          ¦   «         j        |fi |¤Ž d|vrd| _        d|vrd| _        d|vr	d| _        d S d S )Nr¿   r  rÂ   ú'Count of Pitch Class and Quarter LengthrÔ   r  rÖ   rÅ   s      €r1   r2   z/ScatterWeightedPitchClassQuarterLength.__init__  sr   ø€ Ø�‰ŒÔØð	#ð 	#Ø!ð	#ð 	#ð 	#ð ˜xÐ'Ð'Ø$ˆDŒOØ˜(Ð"Ð"ØBˆDŒJØ˜(Ð"Ð"ØˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   r  r   r   rÇ   rÎ   r®   r2   rÉ   rÊ   s   @r1   r!  r!    sŠ   ø€ € € € € € ðð ð/Ø
Ô
%ð/àÔ#ØÔ ð/ð /ð /€Kð ð ð ñ ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r3   r!  c                  óf   ‡ — e Zd ZU dZi ej        ¥ej        ej        dœ¥Zde	d<   dˆ fd„	Z
d„ Zˆ xZS )	Ú&ScatterWeightedPitchSpaceDynamicSymbolaœ  
    A graph of dynamics used by pitch space.

    >>> #_DOCS_SHOW s = corpus.parse('schumann_robert/opus41no1/movement2.xml')
    >>> s = converter.parse('tinynotation: 4/4 C4 d E f', makeNotation=False) #_DOCS_HIDE
    >>> s.insert(0.0, dynamics.Dynamic('pp')) #_DOCS_HIDE
    >>> s.insert(2.0, dynamics.Dynamic('ff')) #_DOCS_HIDE
    >>> p = graph.plot.ScatterWeightedPitchSpaceDynamicSymbol(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW p = graph.plot.ScatterWeightedPitchSpaceDynamicSymbol(s)
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/ScatterWeightedPitchSpaceDynamicSymbol.*
        :width: 600

    r   r   r   Nc                ó°   •—  t          ¦   «         j        |fi |¤Ž d| j        _        d|vrd| _        d|vrd| _        d|vrd| _        d|vr	d	| _        d S d S )
NFr¿   )rÒ   rÒ   rÂ   r#  rÔ   r  ÚtickFontSizer  )rÃ   r2   r<   rÛ   r¿   rÂ   rÔ   r'  rÅ   s      €r1   r2   z/ScatterWeightedPitchSpaceDynamicSymbol.__init__9  s“   ø€ Ø�‰ŒÔØð	#ð 	#Ø!ð	#ð 	#ð 	#ð %*ˆŒ
Ô!ð ˜xÐ'Ð'Ø&ˆDŒOØ˜(Ð"Ð"ØBˆDŒJØ˜(Ð"Ð"ØˆDŒJà Ð)Ð)Ø !ˆDÔÐÐð *Ð)r3   c                ón  — t          j        | j        ¦  «        }|                     d¬¦  «        | _        d„ | j        D ¦   «         }d„ | j        D ¦   «         }d„ | j        D ¦   «         | _        | j                             |¦  «         | j                             |¦  «         |                      ¦   «          d S )NTrÞ   c                ó   — g | ]\  }}|‘ŒS ra   ra   )rb   r   Úunused_ys      r1   re   zFScatterWeightedPitchSpaceDynamicSymbol.extractData.<locals>.<listcomp>N  s   € Ð0Ð0Ð0‘{�q˜(�Ð0Ð0Ð0r3   c                ó   — g | ]\  }}|‘ŒS ra   ra   )rb   Úunused_xr   s      r1   re   zFScatterWeightedPitchSpaceDynamicSymbol.extractData.<locals>.<listcomp>O  s   € Ð0Ð0Ð0‘{�x �Ð0Ð0Ð0r3   c                ó   — g | ]
\  }}||d g‘ŒS rä   ra   )rb   r   r   s      r1   re   zFScatterWeightedPitchSpaceDynamicSymbol.extractData.<locals>.<listcomp>P  s"   € Ð5Ð5Ð5¡4 1 a�a˜˜A�YÐ5Ð5Ð5r3   )	r   rå   r#   ræ   r'   r<   rl   r=   rj   )r,   rç   ré   rê   s       r1   rM   z2ScatterWeightedPitchSpaceDynamicSymbol.extractDataJ  s±   € åÔ$ T¤^Ñ4Ô4ˆØ×%Ò%°Ð%Ñ6Ô6ˆŒ	Ø0Ð0 d¤iÐ0Ñ0Ô0ˆØ0Ð0 d¤iÐ0Ñ0Ô0ˆØ5Ð5¨4¬9Ð5Ñ5Ô5ˆŒ	àŒ
×(Ò(¨Ñ/Ô/Ð/ØŒ
×(Ò(¨Ñ/Ô/Ð/Ø×ÒÑÔÐÐÐr3   r¶   )r©   rª   r«   r¬   r  r   r   rÈ   rë   r®   r2   rM   rÉ   rÊ   s   @r1   r%  r%  #  s™   ø€ € € € € € ðð ð/Ø
Ô
%ð/àÔ ØÔð/ð /ð /€Kð ð ð ñ ð"ð "ð "ð "ð "ð "ð"
ð 
ð 
ð 
ð 
ð 
ð 
r3   r%  c                  ó´   ‡ — e Zd ZU dZdZej        j        dz   Zdej	        iZ
ded<   ej        Zded<   dd
„Zed„ ¦   «         Zddœdd„Zd„ Zd„ Zdˆ fd„	Zˆ xZS )ÚWindowedAnalysiszS
    Base Plot for windowed analysis routines such as Key Analysis or Ambitus.
    Ú	colorGrid)Ú	minWindowÚ	maxWindowÚ
windowStepÚ
windowTypeÚcompressLegendÚprocessorClassÚgraphLegendr   r   r   ztype[discrete.DiscreteAnalysis]ÚprocessorClassDefaultNc                ó  — | j         | _        d | _        d | _        d| _        d | _        d| _        d| _        d| _        t          j
        j        | fi |¤Ž t          j        | |fi |¤Ž t          j        | d¦  «        | _        d S )NrV   Úpow2ÚoverlapTr   )r8  r6  Ú
_processorr7  r1  r2  r3  r4  r5  r   ÚGraphColorGridr2   r   r   r´   r<   rµ   s      r1   r2   zWindowedAnalysis.__init__h  sŽ   € Ø"Ô8ˆÔØˆŒàˆÔØˆŒØˆŒØ ˆŒØ#ˆŒØ"ˆÔåÔ!Ô*¨4Ð<Ð<°8Ð<Ð<Ð<ÝÔ   yÐ=Ð=°HÐ=Ð=Ð=å”_ T¨3Ñ/Ô/ˆŒ
ˆ
ˆ
r3   c                ón   — | j         sd S | j        s|                       | j        ¦  «        | _        | j        S r¶   )r6  r<  r#   )r,   s    r1   Ú	processorzWindowedAnalysis.processorx  s<   € àÔ"ð 	Ø�4ØŒð 	BØ"×1Ò1°$´.ÑAÔAˆDŒOØŒÐr3   TrC   rD   rE   c               óô  — | j         dk    r6| j        r/| j        j        d| j                             ¦   «         › d�z   | _         |                      ¦   «         \  }}|| _        |                      d|¦  «         | j                             ¦   «          | j         	                    ¦   «         }t          |¦  «        dk    r d|d         d         fd|d         d         fg}t                               d	|g¦  «         |                      d
|¦  «         |                      dd¦  «         |                      d
d| j        j        › d�¦  «         |                      ¦   «         | _        |r|                      ¦   «          dS dS )z-
        Actually creates the graph.
        zMusic21 Graphz (ú)r   rW   r   rV   éÿÿÿÿÚxTicksr   zWindow Size
(Quarter Lengths)z	Windows (z Span)N)rÂ   r?  r  ÚsolutionUnitStringrM   r'   rN   r<   rl   rO   rY   ÚenvironLocalÚ
printDebugrP   rQ   Ú
_getLegendr7  rR   )r,   rD   r-   r'   ÚyTicksrC  s         r1   rS   zWindowedAnalysis.run€  st  € ð Œ:˜Ò(Ð(¨T¬^Ð(Øœ.Ô-ØG ¤×!BÒ!BÑ!DÔ!DÐGÐGÐGñHˆDŒJð ×'Ò'Ñ)Ô)‰ˆˆfØˆŒ	Ø�Š�c˜6Ñ"Ô"Ð"àŒ
×(Ò(Ñ*Ô*Ð*Ø”×!Ò!Ñ#Ô#ˆåˆv‰;Œ;˜!ÒÐØ˜& œ) Aœ,Ð'¨!¨V°B¬Z¸¬]Ð);Ð<ˆFÝ×Ò ¨6Ð 2Ñ3Ô3Ð3Ø�Š�c˜6Ñ"Ô"Ð"Ø×Ò˜#Ð?Ñ@Ô@Ð@Ø×Ò˜#ÐC¨4¬:Ô+;ÐCÐCÐCÑDÔDÐDàŸ?š?Ñ,Ô,ˆÔØð 	Ø�LŠL‰NŒNˆNˆNˆNð	ð 	r3   c                ó†  — t          j        | j        | j        ¦  «        }|                     | j        | j        | j        | j        ¬¦  «        \  }}}t          |¦  «        dk    r/t          dt          |¦  «        t          |¦  «        dz  ¦  «        }nt          t          |¦  «        ¦  «        }t                               d|g¦  «         d}g }|D ]m}||         d         }	|                     |dg¦  «         |                     |dz   t          |	¦  «        g¦  «         |                     |dz   dg¦  «         |d	z  }Œn||fS )
z–
        Extract data actually calls the processing routine.

        Returns two element tuple of the data (colorMatrix) and the yTicks list
        )r4  rÙ   r   Ú	tickRangeÚ
windowSizerû   rV   rW   rU   )r   r/  r#   r?  rR   r1  r2  r3  r4  rY   rz   rE  rF  r?   r5   )
r,   ÚwaÚunused_solutionMatrixÚcolorMatrixÚ
metaMatrixrJ  ÚposrH  r   ÚthisWindowSizes
             r1   rM   zWindowedAnalysis.extractDataœ  sE  € õ Ô& t¤~°t´~ÑFÔFˆØ9;¿ºÀDÄNØDHÄNØDHÄOØOSÌð :Dñ :`ô :`Ñ6Ð˜{¨Jõ ˆz‰?Œ?˜RÒÐÝ˜a¥ Z¡¤µ#°j±/´/ÀRÑ2GÑHÔHˆIˆIå�c *™oœoÑ.Ô.ˆIå×Ò ¨iÐ 8Ñ9Ô9Ð9ð ˆØˆàð 	ð 	ˆAØ'¨œ]¨<Ô8ˆNà�MŠM˜3 ˜)Ñ$Ô$Ð$Ø�MŠM˜3 ™7¥C¨Ñ$7Ô$7Ð8Ñ9Ô9Ð9Ø�MŠM˜3 ™7 B˜-Ñ(Ô(Ð(Ø�1‰HˆCˆCà˜FÐ"Ð"r3   c                óŠ   — t          j        d| j        ¬¦  «        }| j                             | j        ¬¦  «        }||_        |S )zB
        Returns a solution legend for a WindowedAnalysis
        N©Ú
doneActionrÂ   )Úcompress)r   ÚGraphColorGridLegendrÂ   r?  ÚsolutionLegendr5  r'   )r,   r7  Ú	graphDatas      r1   rG  zWindowedAnalysis._getLegend¿  sN   € õ !Ô5ÀØ<@¼JðHñ Hô Hˆà”N×1Ò1¸4Ô;NÐ1ÑOÔOˆ	Ø$ˆÔØÐr3   c                ó¤  •— t          ¦   «                              |¦  «         |€t                               dd¬¦  «        }nt	          j        |d¬¦  «        }t          j                             |¦  «        \  }}t          j         	                    |d|z   ¦  «        }| j
                             ¦   «          | j
                             |¦  «         dS )zI
        Overrides the normal write method here to add a legend.
        Nú.pngT)ÚreturnPathlibzlegend-)rÃ   ÚwriterE  ÚgetTempFiler
   Ú	cleanpathÚosÚpathÚsplitÚjoinr7  rR   )r,   ÚfpÚ	directoryÚfnÚfpLegendrÆ   s        €r1   r\  zWindowedAnalysis.writeÉ  s±   ø€ õ
 	‰Œ�Š�bÑÔÐàˆ:Ý×)Ò)¨&ÀÐ)ÑEÔEˆBˆBåÔ! "°DÐ9Ñ9Ô9ˆBåœŸš bÑ)Ô)‰ˆ	�2Ý”7—<’< 	¨9°r©>Ñ:Ô:ˆàÔ× Ò Ñ"Ô"Ð"ØÔ×Ò˜xÑ(Ô(Ð(Ð(Ð(r3   r¶   r§   )r©   rª   r«   r¬   Úformatr   r=  ÚkeywordConfigurablesr   r´   r   r®   r   ÚKrumhanslSchmucklerr8  r2   r¯   r?  rS   rM   rG  r\  rÉ   rÊ   s   @r1   r/  r/  [  s  ø€ € € € € € ðð ð €Fà%Ô4ÔIð M)ñ )Ðð 03°D´OÐ.D€KÐDÐDÐDÑDØ=EÔ=YÐÐYÐYÐYÑYð0ð 0ð 0ð 0ð  ðð ñ „Xðð *.ð ð ð ð ð ð ð8!#ð !#ð !#ðFð ð ð)ð )ð )ð )ð )ð )ð )ð )ð )ð )r3   r/  c                  ó    — e Zd ZdZej        ZdS )ÚWindowedKeya¡  
    Stream plotting of windowed version of Krumhansl-Schmuckler analysis routine.
    See :class:`~music21.analysis.discrete.KrumhanslSchmuckler` for more details.

    >>> s = corpus.parse('bach/bwv66.6')
    >>> p = graph.plot.WindowedKey(s.parts[0])
    >>> p.doneAction = None #_DOCS_HIDE
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/WindowedKrumhanslSchmuckler.*
        :width: 600

    .. image:: images/legend-WindowedKrumhanslSchmuckler.*

    Set the processor class to one of the following for different uses:

    >>> p = graph.plot.WindowedKey(s.parts.first())
    >>> p.processorClass = analysis.discrete.AardenEssen
    >>> p.processorClass = analysis.discrete.SimpleWeights
    >>> p.processorClass = analysis.discrete.BellmanBudge
    >>> p.processorClass = analysis.discrete.TemperleyKostkaPayne
    >>> p.doneAction = None #_DOCS_HIDE
    >>> p.run()

    N)r©   rª   r«   r¬   r   ri  r8  ra   r3   r1   rk  rk  Ü  s%   € € € € € ðð ð2 %Ô8ÐÐÐr3   rk  c                  ó    — e Zd ZdZej        ZdS )ÚWindowedAmbitusaq  
    Stream plotting of basic pitch span.

    >>> s = corpus.parse('bach/bwv66.6')
    >>> p = graph.plot.WindowedAmbitus(s.parts.first())
    >>> p.doneAction = None #_DOCS_HIDE
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/WindowedAmbitus.*
        :width: 600

    .. image:: images/legend-WindowedAmbitus.*

    N)r©   rª   r«   r¬   r   ÚAmbitusr8  ra   r3   r1   rm  rm  ù  s%   € € € € € ðð ð %Ô,ÐÐÐr3   rm  c                  ó„   ‡ — e Zd ZU dZej        ej        dœZded<   	 dddœdd„Z	ddœdˆ fd„Z
dd„Zd ˆ fd„Zˆ fd„Zˆ xZS )!ÚHorizontalBarz½
    A graph of events, sorted by pitch, over time.

    If colorByPart is True, then each part will get its own color from
    `self.colors` (unless there are more parts than colors).
    r   r   r   NF©ÚcolorByPartr#   ústream.Stream | Noner4   r‰   c               ó’   — || _         i | _        |  t          j        j        | fi |¤Ž t          j        | |fi |¤Ž d| j        _        d S )NF)rr  Ú_partsToColorr   ÚGraphHorizontalBarr2   r   r=   rø   )r,   r#   rr  r-   s       r1   r2   zHorizontalBar.__init__  sa   € ð 'ˆÔØ57ˆÔàÐ'åÔ%Ô.¨tÐ@Ð@°xÐ@Ð@Ð@ÝÔ   yÐ=Ð=°HÐ=Ð=Ð=à %ˆŒ
ÔÐÐr3   TrC   rD   rE   c               ót   •— | j         r|                      ¦   «           t          ¦   «         j        dd|i|¤Ž dS )zV
        Optionally assign colors to Part objects and then do the normal run.
        rD   Nra   )rr  ÚassignColorsToPartsrÃ   rS   )r,   rD   r-   rÆ   s      €r1   rS   zHorizontalBar.run+  sI   ø€ ð Ôð 	'Ø×$Ò$Ñ&Ô&Ð&Ø�‰ŒŒÐ8Ð8 Ð8¨xÐ8Ð8Ð8Ð8Ð8r3   údict[stream.Part, str]c                óÀ   — | j         }t          | j        ¦  «        }t          |t          j                 ¦  «        D ]\  }}| j        ||z           | j        |<   Œ| j        S )a;  
        Give a different color for each part, if self.colorByPart is True.

        Returns the assignment for any further manipulation.

        Currently, two piano hands (PartStaff objects) get different colors.

        >>> bach = corpus.parse('bwv66.6')
        >>> plot = graph.plot.HorizontalBar(bach, colorByPart=True)
        >>> plot.assignColorsToParts()
        {<music21.stream.Part Soprano>: '#605c7f',
         <music21.stream.Part Alto>: '#5c7f60',
         <music21.stream.Part Tenor>: '#988969',
         <music21.stream.Part Bass>: '#628297'}
        )r#   rY   Úcolorsrk   r   ÚPartru  )r,   r8   Ú	numColorsrd   Úps        r1   rx  z!HorizontalBar.assignColorsToParts3  s_   € ð  ŒNˆÝ˜œÑ$Ô$ˆ	Ý˜a¥¤œnÑ-Ô-ð 	?ð 	?‰DˆAˆqØ$(¤K°°I±Ô$>ˆDÔ˜qÑ!Ð!ØÔ!Ð!r3   rn   rp   ry   r†   r‡   rˆ   c                óè   •—  t          ¦   «         j        ||g|¢R Ž  | j        rL|                     t          j        ¦  «        }|�-| j                             || j        d         ¦  «        |d<   dS dS dS )zG
        Assign colors to each element if colorByPart is True.
        Nr   Úcolor)	rÃ   r~   rr  ÚgetContextByClassr   r|  ru  Úgetr{  )r,   rn   ry   r‡   ÚpartrÆ   s        €r1   r~   z HorizontalBar.postProcessElementJ  s�   ø€ ð 	#�‰ŒÔ" 2 zÐ;°FÐ;Ð;Ð;Ð;ØÔð 	MØ×'Ò'­¬Ñ4Ô4ˆDØÐØ&*Ô&8×&<Ò&<¸TØ=A¼[È¼^ñ'Mô 'M�
˜7Ñ#Ð#Ð#ð	Mð 	MàÐr3   c                óV  •— t          ¦   «                              ¦   «          | j                             d„ | j        D ¦   «         ¦  «         | j                             ¦   «         }i }g }i }| j        D ]6\  }}}||vr
g ||<   i ||<   g |¢|‘R }||                              |¦  «         Œ7|                     ¦   «         D ]\  }	}
|
                     d„ ¬¦  «         Œ|D ]F\  }}||v r%|                     |||         ||         g¦  «         Œ.|                     |g i g¦  «         ŒG|| _        dS )rŒ   c                ó   — g | ]
}|d          ‘ŒS rä   ra   rá   s     r1   re   z1HorizontalBar.postProcessData.<locals>.<listcomp>]  s   € Ð)BÐ)BÐ)B°1¨!¨A¬$Ð)BÐ)BÐ)Br3   c                ó"   — | d         | d         fS )Nr   rV   ra   )Úpoints    r1   ú<lambda>z/HorizontalBar.postProcessData.<locals>.<lambda>q  s   €  e¨A¤h°°a´Ð%9€ r3   )ÚkeyN)	rÃ   rj   r=   rl   r'   rO   r?   r(   Úsort)r,   rH  ÚpitchSpanDictÚnewDataÚdictOfFormatDictsÚpositionDataÚ	pitchDatary   ÚpositionDataWithFormatDictÚunused_krö   ÚnumericValuerQ   rÆ   s                €r1   rj   zHorizontalBar.postProcessDataX  s�  ø€ õ 	‰Œ×ÒÑ!Ô!Ð!ØŒ
×(Ò(Ð)BÐ)B¸¼	Ð)BÑ)BÔ)BÑCÔCÐCØ”×!Ò!Ñ#Ô#ˆàˆØˆØÐà37´9ð 	Hð 	HÑ/ˆL˜) ZØ Ð-Ð-Ø+-�˜iÑ(Ø/1Ð! )Ñ,à)D¨<Ð)D¸Ð)DÐ)DÐ&Ø˜)Ô$×+Ò+Ð,FÑGÔGÐGÐGð
 )×.Ò.Ñ0Ô0ð 	;ð 	;‰KˆH�aà�FŠFÐ9Ð9ˆFÑ:Ô:Ð:Ð:ð $*ð 	0ð 	0ÑˆL˜%ð ˜}Ð,Ð,Ø—’ Ø -¨lÔ ;Ø 1°,Ô ?ð Añ Bô Bð Bð Bð —’  r¨2˜Ñ/Ô/Ð/Ð/ð ˆŒ	ˆ	ˆ	r3   r¶   )r#   rs  r4   r‰   r§   )r4   ry  )rn   rp   ry   r†   r‡   rˆ   )r©   rª   r«   r¬   r   ÚOffsetEndAxisrÈ   r   r®   r2   rS   rx  r~   rj   rÉ   rÊ   s   @r1   rp  rp    s  ø€ € € € € € ðð ð ÔØÔ ð/ð /€Kð ð ð ñ ð )-ð&ð ð	&ð &ð &ð &ð &ð &ð" *.ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð"ð "ð "ð "ð.Mð Mð Mð Mð Mð Mð2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2r3   rp  c                  óZ   ‡ — e Zd ZU dZi ej        ¥dej        i¥Zded<   d	ddœˆ fd„Z	ˆ xZ
S )
ÚHorizontalBarPitchClassOffsetaÜ  
    A graph of events, sorted by pitch class, over time.

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.HorizontalBarPitchClassOffset(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('bach/bwv57.8')
    >>> #_DOCS_SHOW p = graph.plot.HorizontalBarPitchClassOffset(s)
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/HorizontalBarPitchClassOffset.*
        :width: 600

    r   r   r   NFrq  c               ó¼   •—  t          ¦   «         j        |fd|i|¤Ž t          j        | d¦  «        | _        d| j        _        d|vrd| _        d|vr	d| _        d S d S )Nrr  r   Fr¿   ©rÒ   é   rÂ   z-Note Quarter Length and Offset by Pitch Class)rÃ   r2   r   rÎ   r=   rø   r¿   rÂ   ©r,   r#   rr  r-   rÆ   s       €r1   r2   z&HorizontalBarPitchClassOffset.__init__   sw   ø€ Ø�‰ŒÔ˜ÐHÐH°ÐH¸xÐHÐHÐHÝÔ(¨¨sÑ3Ô3ˆŒ
Ø %ˆŒ
Ôð ˜xÐ'Ð'Ø%ˆDŒOØ˜(Ð"Ð"ØHˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   rp  r   r   rÎ   r®   r2   rÉ   rÊ   s   @r1   r•  r•  �  s™   ø€ € € € € € ðð ð/Ø
Ô
#ð/àˆTÔ ð/ð /€Kð ð ð ñ ð
	I°eð 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ir3   r•  c                  ó*   ‡ — e Zd ZdZdddœˆ fd„Zˆ xZS )ÚHorizontalBarPitchSpaceOffseta   
    A graph of events, sorted by pitch space, over time, generally called
    a "piano roll".

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.HorizontalBarPitchSpaceOffset(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW s = corpus.parse('bach/bwv57.8')
    >>> #_DOCS_SHOW p = graph.plot.HorizontalBarPitchSpaceOffset(s)
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/HorizontalBarPitchSpaceOffset.*
        :width: 600
    NFrq  c               óp   •—  t          ¦   «         j        |fd|i|¤Ž d|vrd| _        d|vr	d| _        d S d S )Nrr  r¿   r  rÂ   zNote Quarter Length by Pitch©rÃ   r2   r¿   rÂ   r™  s       €r1   r2   z&HorizontalBarPitchSpaceOffset.__init__»  sW   ø€ Ø�‰ŒÔ˜ÐHÐH°ÐH¸xÐHÐHÐHà˜xÐ'Ð'Ø%ˆDŒOØ˜(Ð"Ð"Ø7ˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   r2   rÉ   rÊ   s   @r1   r›  r›  ¬  sS   ø€ € € € € ðð ð8°eð 8ð 8ð 8ð 8ð 8ð 8ð 8ð 8ð 8ð 8ð 8r3   r›  c                  ó\   — e Zd ZU dZdej        iZded<   ej	        j
        dz   Z
d	d„Zd„ ZdS )
ÚHorizontalBarWeightedz™
    A base class for plots of Scores with weighted (by height) horizontal bars.
    Many weighted segments represent a dynamic parameter of a Part.
    r   r   r   )ÚfillByMeasureÚnormalizeByPartÚ
partGroupsÚsegmentByTargetNc                ó’   — d| _         d| _        d| _        d | _        t	          j        j        | fi |¤Ž t          j        | |fi |¤Ž d S )NFT)r   r£  r¡  r¢  r   ÚGraphHorizontalBarWeightedr2   r   rµ   s      r1   r2   zHorizontalBarWeighted.__init__Ò  s^   € Ø"ˆÔØ#ˆÔØ$ˆÔØˆŒåÔ-Ô6°tÐHÐH¸xÐHÐHÐHÝÔ   yÐ=Ð=°HÐ=Ð=Ð=Ð=Ð=r3   c                ó6  — t          | j        t          j        ¦  «        st	          d¦  «        ‚t          j        | j        | j        | j        | j	        | j
        ¬¦  «        }|                     ¦   «          |                     ¦   «         }g }|D ]R\  }}|D ]J}|d         }|d         }||vr|                     |¦  «         ||z   |vr|                     ||z   ¦  «         ŒKŒSt          |¦  «        | j        _        t#          |¦  «        | j        _        || _        dS )z3
        Extract the data from the Stream.
        zprovided Stream must be Score)r¢  r   r£  r¡  r   rV   N)rK   r#   r   ÚScorer   r   ÚPartReductionr¢  r   r£  r¡  rR   Ú!getGraphHorizontalBarWeightedDatar?   Úminr<   rü   r   rý   r'   )	r,   Úprr'   ÚuniqueOffsetsÚ
unused_keyr‘   ro   ÚstartÚdurs	            r1   rM   z!HorizontalBarWeighted.extractDataÛ  s4  € õ ˜$œ.­&¬,Ñ7Ô7ð 	BÝ Ð!@ÑAÔAÐAåÔ$ØŒNØ”ØÔ,Ø Ô0Ø Ô0ð2ñ 2ô 2ˆð 	�
Š
‰ŒˆØ×3Ò3Ñ5Ô5ˆàˆØ!%ð 	6ð 	6ÑˆJ˜Ø!ð 6ð 6�Ø  œ�Ø˜q”k�Ø Ð-Ð-Ø!×(Ò(¨Ñ/Ô/Ð/Ø˜3‘; mÐ3Ð3Ø!×(Ò(¨°©Ñ5Ô5Ð5øð6õ " -Ñ0Ô0ˆŒ
ÔÝ! -Ñ0Ô0ˆŒ
ÔØˆŒ	ˆ	ˆ	r3   r¶   )r©   rª   r«   r¬   r   r´   r   r®   r   r¥  rh  r2   rM   ra   r3   r1   rŸ  rŸ  Å  st   € € € € € € ðð ð 03°D´OÐ.D€KÐDÐDÐDÑDØ%Ô@ÔUð Yñ Ðð>ð >ð >ð >ðð ð ð ð r3   rŸ  c                  ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )ÚDolanaô  
    A graph of the activity of a parameter of a part (or a group of parts) over time.
    The default parameter graphed is Dynamics. Dynamics are assumed to extend activity
    to the next change in dynamics.

    Numerous parameters can be configured based on functionality encoded in
    the :class:`~music21.analysis.reduction.PartReduction` object.

    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.

    >>> s = corpus.parse('bwv66.6')
    >>> dyn = ['p', 'mf', 'f', 'ff', 'mp', 'fff', 'ppp']
    >>> i = 0
    >>> for p in s.parts:
    ...     for m in p.getElementsByClass(stream.Measure):
    ...         m.insert(0, dynamics.Dynamic(dyn[i % len(dyn)]))
    ...         i += 1
    ...
    >>> #_DOCS_SHOW s.plot('dolan', fillByMeasure=True, segmentByTarget=True)

    .. image:: images/Dolan.*
        :width: 600

    Nc                ó"  •—  t          ¦   «         j        |fi |¤Ž |�|                      ¦   «          d|vrd| _        d|vrAd| _        | j        r3| j        j        �'| j        j        j        �| j        j        j        | _        d|vr	d| _        d S d S )Nr¿   r—  rÂ   ÚInstrumentationÚ	hideYGridT)rÃ   r2   Ú_getPartGroupsr¿   rÂ   r#   Úmetadatar´  rÅ   s      €r1   r2   zDolan.__init__  s¯   ø€ Ø�‰ŒÔ˜Ð/Ð/ hÐ/Ð/Ð/ð
 Ð Ø×ÒÑ!Ô!Ð!à˜xÐ'Ð'Ø%ˆDŒOà˜(Ð"Ð"Ø*ˆDŒJØŒ~ð ? $¤.Ô"9Ð"EØ”>Ô*Ô0Ð<Ø!%¤Ô!8Ô!>�D”JØ˜hÐ&Ð&Ø!ˆDŒNˆNˆNð 'Ð&r3   c                óÄ  — ddl m} | j        rdS | j        rdS | j                             ¦   «                              |j        ¦  «        }|sdS t          |¦  «        dk    r?| j                             d¦  «        �%ddddgd	œd
dddgd	œdddgd	œdddgd	œg}|| _        dS t          |¦  «        dk    r@| j                             d¦  «        �&ddg d¢d	œddg d¢d	œdddgd	œddg d¢d	œg}|| _        dS t          |¦  «        dk    rZdddd gd	œd!d"d#d$gd	œd%dd&d'gd	œd(dd)d*gd	œd+dd,d-gd	œd.d/g d0¢d	œd1d/d2gd	œd3d4dd	œd5dd6d7gd	œd8d9d:d;gd	œdd<dd	œd=d>d?d@gd	œg}|| _        dS dS )Az‹
        Examine the instruments in the Score and determine if there
        is a good match for a default configuration of parts.
        r   )Ú
instrumentNr˜  ÚSopranoÚpurpleÚsopranoÚ0)r  r€  ÚmatchÚAltoÚorangeÚaltoÚ1ÚTenorÚ
lightgreenÚtenorÚBassÚ
mediumblueÚbassÚViolaz
1st Violin)z
1st violinr¼  zviolin 1úviolin iz
2nd Violin)z
2nd violinrÁ  zviolin 2ú	violin iiÚviolaÚCello)ÚcelloÚvioloncelloz'cellorÒ   ÚFlutez#C154C1Úflautozflute \dÚOboeÚblueÚoboezoboe \dÚClarinetÚ
clarinettozclarinet in \w* \dÚBassoonÚfagottoz
bassoon \dÚHornsÚcornozhorn in \w* \dÚTrumpetÚred)Útrombaz
trumpet \dztrumpet in \w* \dÚTromboneztrombone \dÚTimpaniz#5C3317zViolin Iz	violino irÉ  z	Violin IIÚgreenz
violino iirÊ  ÚforestgreenzVioloncello & CBz
dark greenrÎ  Úcontrabasso)	rþ   r¸  r¢  r#   Úflattenrg   Ú
InstrumentrY   ÚgetElementById)r,   r¸  Ú
instStreamÚpgOrcs       r1   rµ  zDolan._getPartGroups3  sŠ  € ð
 	'Ð&Ð&Ð&Ð&Ð&àŒ?ð 	ØˆFØŒ>ð 	Ø�4Ø”^×+Ò+Ñ-Ô-×@Ò@ÀÔAVÑWÔWˆ
Øð 	ØˆFåˆz‰?Œ?˜aÒÐ D¤N×$AÒ$AÀ)Ñ$LÔ$LÐ$Xà"¨XÀÈCÐ@PÐQÐQØ¨(¸fÀc¸]ÐKÐKØ ¨<À7À)ÐLÐLØ¨,À&ÀÐJÐJð	ˆEð $ˆDŒOˆOˆOå�‰_Œ_ Ò!Ð! d¤n×&CÒ&CÀGÑ&LÔ&LÐ&Xà%°ØHÐHÐHðJð Jà%°ØIÐIÐIðKð Kà ¨<À7À)ÐLÐLØ ¨<Ø?Ð?Ð?ðAð AðˆEð $ˆDŒOˆOˆOå�‰_Œ_˜rÒ!Ð!à ¨9ÀÈ+Ð?VÐWÐWØ¨&¸FÀJÐ;OÐPÐPØ#¨lØ'Ð)>Ð?ðAð Aà"¨XÀÈMÐ@ZÐ[Ð[à ¨8¸wÐHYÐ>ZÐ[Ð[Ø"¨UØIÐIÐIðKð Kà#¨e¸~Ð>NÐOÐOØ"¨YÀÐFÐFð $¨lÀkÐS]ÐE^Ð_Ð_Ø$¨wÀ,ÐP[ÐA\Ð]Ð]Ø ¨=À4ÐHÐHØ+°lØ(¨-Ð8ð:ð :ð#ˆEð* $ˆDŒOˆOˆOð- "Ð!r3   r¶   )r©   rª   r«   r¬   r2   rµ  rÉ   rÊ   s   @r1   r±  r±  ú  sW   ø€ € € € € ð"ð "ðH"ð "ð "ð "ð "ð "ð(:$ð :$ð :$ð :$ð :$ð :$ð :$r3   r±  c                  óP   — e Zd ZU dZej        ej        ej        dœZde	d<   dd„Z
dS )Ú
Plot3DBarsz1
    Base class for Stream plotting classes.
    r  r   r   Nc                ór   — t          j        j        | fi |¤Ž t          j        | |fi |¤Ž d| j        _        d S r  )r   ÚGraph3DBarsr2   r   r>   r  rµ   s      r1   r2   zPlot3DBars.__init__}  sI   € ÝÔÔ'¨Ð9Ð9°Ð9Ð9Ð9ÝÔ   yÐ=Ð=°HÐ=Ð=Ð=à)ˆŒ
ÔÐÐr3   r¶   )r©   rª   r«   r¬   r   rÇ   rÎ   r  r   r®   r2   ra   r3   r1   rè  rè  s  sh   € € € € € € ðð ð Ô#ØÔ ØÔð/ð /€Kð ð ð ñ ð*ð *ð *ð *ð *ð *r3   rè  c                  óT   ‡ — e Zd ZU dZi ej        ¥dej        i¥Zded<   dˆ fd„	Z	ˆ xZ
S )Ú!Plot3DBarsPitchSpaceQuarterLengthae  
    A scatter plot of pitch and quarter length

    >>> s = corpus.parse('bach/bwv324.xml') #_DOCS_HIDE
    >>> p = graph.plot.Plot3DBarsPitchSpaceQuarterLength(s, doneAction=None) #_DOCS_HIDE
    >>> #_DOCS_SHOW from music21.musicxml import testFiles
    >>> #_DOCS_SHOW s = converter.parse(testFiles.mozartTrioK581Excerpt)
    >>> #_DOCS_SHOW p = graph.plot.Plot3DBarsPitchSpaceQuarterLength(s)
    >>> p.id
    '3DBars-quarterLength-pitchSpace-count'
    >>> p.run()  # with defaults and proper configuration, will open graph

    .. image:: images/Plot3DBarsPitchSpaceQuarterLength.*
        :width: 600
    r   r   r   Nc                ól   •—  t          ¦   «         j        |fi |¤Ž d|vrd| _        d|vr	d| _        d S d S )Nr¿   rÀ   rÂ   zPitch by Quarter Length Countr�  rÅ   s      €r1   r2   z*Plot3DBarsPitchSpaceQuarterLength.__init__™  sT   ø€ Ø�‰ŒÔ˜Ð/Ð/ hÐ/Ð/Ð/ð ˜xÐ'Ð'Ø$ˆDŒOØ˜(Ð"Ð"Ø8ˆDŒJˆJˆJð #Ð"r3   r¶   )r©   rª   r«   r¬   rè  r   r   rÈ   r®   r2   rÉ   rÊ   s   @r1   rì  rì  „  s�   ø€ € € € € € ðð ð/Ø
Ô
 ð/àˆTÔ ð/ð /€Kð ð ð ñ ð
9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9r3   rì  c                  ó0   — e Zd ZU dZi Zded<   dd„Zd„ ZdS )ÚMultiStreama+  
    Approaches to plotting and graphing multiple Streams.
    A base class from which Stream plotting Classes inherit.

    Not yet integrated into the 2017 system, unfortunately.

    Provide a list of Streams as an argument. Optionally
    provide an additional list of labels for each list.
    r   r   Nc                ó  — t          j        j        | fi |¤Ž t                               | d ¦  «         |€g }d | _        |                      |¦  «        }|s(t          |¦  «        t          |¦  «        k    r|| _        n|| _        d | _        d S r¶   )	r   ÚGraphGroupedVerticalBarr2   r   Ú
streamListÚparseStreamsrY   Ú	labelListr'   )r,   rò  rô  r-   Ú
foundPathss        r1   r2   zMultiStream.__init__²  s”   € ÝÔ*Ô3°DÐEÐE¸HÐEÐEÐEÝ× Ò   tÑ,Ô,Ð,àÐØˆIØˆŒØ×&Ò& zÑ2Ô2ˆ
ð ð 	'�S ™_œ_µ°J±´Ò?Ð?Ø'ˆDŒNˆNà&ˆDŒNàˆŒ	ˆ	ˆ	r3   c                ó\  — g | _         g }|D �]}t          |t          ¦  «        r{|                     t          j                             |¦  «        ¦  «         t          j                             |¦  «        rt          j	        |¦  «        }n†t          j	        |¦  «        }nqt          |t          j        ¦  «        rW|                     |j        ¦  «         |                     ¦   «         rt          j	        |¦  «        }nt          j	        |¦  «        }| j                              |¦  «         �Œ |S r¶   )rò  rK   r5   r?   r_  r`  ÚbasenameÚexistsr   Úparser   ÚpathlibÚPathr  )r,   rò  rõ  r8   s       r1   ró  zMultiStream.parseStreamsÃ  s   € ØˆŒØˆ
Øð 	&ñ 	&ˆAå˜!�SÑ!Ô!ð (Ø×!Ò!¥"¤'×"2Ò"2°1Ñ"5Ô"5Ñ6Ô6Ð6Ý”7—>’> !Ñ$Ô$ð (Ý!œ¨Ñ*Ô*�A�Aåœ Q™œ�A�AÝ˜A�wœ|Ñ,Ô,ð (Ø×!Ò! !¤&Ñ)Ô)Ð)Ø—8’8‘:”:ð (Ý!œ¨Ñ*Ô*�A�Aåœ Q™œ�AàŒO×"Ò" 1Ñ%Ô%Ð%Ñ%ØÐr3   r¶   )r©   rª   r«   r¬   r   r®   r2   ró  ra   r3   r1   rï  rï  ¦  sV   € € € € € € ðð ð /1€KÐ0Ð0Ð0Ñ0ðð ð ð ð"ð ð ð ð r3   rï  c                  ó<   ‡ — e Zd ZdZdZdˆ fd„	Zddœdd	„Zd
„ Zˆ xZS )ÚFeatureszh
    Plots the output of a set of feature extractors.

    FeatureExtractors can be ids or classes.
    r   Nc                ó®   •— |€g } t          ¦   «         j        ||fi |¤Ž || _        d| _        d| _        d| _        d|vrd| _        d|vr	d | _        d S d S )NéZ   ÚleftÚtopr¿   r  rÂ   )rÃ   r2   ÚfeatureExtractorsÚxTickLabelRotationÚxTickLabelHorizontalAlignmentÚxTickLabelVerticalAlignmentr¿   rÂ   )r,   rò  r  rô  r-   rÆ   s        €r1   r2   zFeatures.__init__á  s�   ø€ ØÐØˆIà�‰ŒÔ˜ YÐ;Ð;°(Ð;Ð;Ð;à!2ˆÔà"$ˆÔØ-3ˆÔ*Ø+0ˆÔ(ð ˜xÐ'Ð'Ø%ˆDŒOØ˜(Ð"Ð"ØˆDŒJˆJˆJð #Ð"r3   TrC   rD   rE   c               óþ   — |                       ¦   «          |                      ¦   «         \  | _        }}d| _        |                      d|¦  «         |                      d|¦  «         |r|                      ¦   «          d S d S )NFr   r   )rL   rM   r'   ÚgridrN   rR   )r,   rD   r-   rC  rH  s        r1   rS   zFeatures.runö  s€   € à×ÒÑÔÐà$(×$4Ò$4Ñ$6Ô$6Ñ!ˆŒ	�6˜6àˆŒ	à�Š�c˜6Ñ"Ô"Ð"Ø�Š�c˜6Ñ"Ô"Ð"àð 	Ø�LŠL‰NŒNˆNˆNˆNð	ð 	r3   c                óô  — t          | j        ¦  «        t          | j        ¦  «        k    r,d„ t          t          | j        ¦  «        ¦  «        D ¦   «         }n| j        }g }| j        D ]k}t          |t          ¦  «        r7t          j        |¦  «        }|D ]}| 	                     |¦   «         ¦  «         Œ ŒN| 	                     |¦   «         ¦  «         Œlg }| j        D ]+}t          j
        |¦  «        }| 	                    |¦  «         Œ,g }	t          |¦  «        D ]§\  }
}t          j        ¦   «         }|D ]m}||_        |                     ¦   «         j        }t          |¦  «        dk    r|d         ||j        <   ŒFt%          |¦  «        t          |¦  «        z  ||j        <   Œn||
         |g}|	 	                    |¦  «         Œ¨g }t          |¦  «        D ] \  }}| 	                    |dz   |› g¦  «         Œ!g }|	||fS )Nc                ó   — g | ]}|d z   ‘ŒS rä   ra   )rb   r   s     r1   re   z(Features.extractData.<locals>.<listcomp>  s   € ÐDÐDÐD 1˜˜Q™ÐDÐDÐDr3   rV   r   ç      à?)rY   rô  rò  rz   r  rK   r5   r   ÚextractorsByIdr?   ÚDataInstancerk   ÚcollectionsÚOrderedDictr'   ÚextractÚvectorr  Úsum)r,   rô  ÚfeListÚfeÚpostÚsubÚdiListr8   Údir'   rd   rö   Ú	dataPointrC  r   rQ   rH  s                    r1   rM   zFeatures.extractData  s  € ÝˆtŒ~ÑÔ¥# d¤oÑ"6Ô"6Ò6Ð6ØDÐD­­c°$´/Ñ.BÔ.BÑ(CÔ(CÐDÑDÔDˆIˆIàœˆIàˆØÔ(ð 	$ð 	$ˆBÝ˜"�cÑ"Ô"ð $ÝÔ.¨rÑ2Ô2�Øð )ð )�CØ—M’M # #¡%¤%Ñ(Ô(Ð(Ð(ð)ð —’˜b˜b™dœdÑ#Ô#Ð#Ð#ð ˆØ”ð 	ð 	ˆAÝÔ& qÑ)Ô)ˆBØ�MŠM˜"ÑÔÐÐàˆÝ˜vÑ&Ô&ð 	#ð 	#‰EˆAˆrÝÔ)Ñ+Ô+ˆCØð 3ð 3�Ø�”Ø—J’J‘L”LÔ'�Ý�q‘6”6˜Q’;�;Ø#$ Q¤4�C˜œ‘L�Lõ $' q¡6¤6­C°©F¬F¡?�C˜œ‘L�LØ" 1œ sÐ+ˆIØ�KŠK˜	Ñ"Ô"Ð"Ð"ð ˆÝ! )Ñ,Ô,ð 	1ð 	1‰HˆAˆuð �MŠM˜1˜s™7 u JÐ/Ñ0Ô0Ð0Ð0àˆØ�V˜VÐ#Ð#r3   r¶   r§   )	r©   rª   r«   r¬   rg  r2   rS   rM   rÉ   rÊ   s   @r1   rý  rý  Ù  s€   ø€ € € € € ðð ð
 €Fðð ð ð ð ð ð* *.ð ð ð ð ð ð ð,$ð ,$ð ,$ð ,$ð ,$ð ,$ð ,$r3   rý  c                  óP   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ ZdS )ÚTestExternalManualc                óØ   — t          j        d¦  «        }t          |j        d         d¬¦  «        }|                     ¦   «          t          |d¬¦  «        }|                     ¦   «          d S )Núbach/bwv57.8r   úBach (soprano voice)©rÂ   zBach (all parts))r   rù  r›  ÚpartsrS   ©r,   ÚaÚbs      r1   Ú!testHorizontalBarPitchSpaceOffsetz4TestExternalManual.testHorizontalBarPitchSpaceOffset7  s[   € ÝŒL˜Ñ(Ô(ˆå)¨!¬'°!¬*Ð<RÐSÑSÔSˆØ	�Š‰Œˆå)¨!Ð3EÐFÑFÔFˆØ	�Š‰Œˆˆˆr3   c                ó>  — t          j        d¦  «        }t          |j        d         d¬¦  «        }|                     ¦   «          t          j        d¦  «        }t          |j        d                              dd¦  «        d¬¦  «        }|                     ¦   «          d S )Nr  r   r  r  rU   rÁ   zBach (soprano voice, mm 3-6))r   rù  r•  r  rS   Úmeasuresr   s      r1   Ú!testHorizontalBarPitchClassOffsetz4TestExternalManual.testHorizontalBarPitchClassOffset@  s‰   € ÝŒL˜Ñ(Ô(ˆÝ)¨!¬'°!¬*Ð<RÐSÑSÔSˆØ	�Š‰ŒˆåŒL˜Ñ(Ô(ˆÝ)¨!¬'°!¬*×*=Ò*=¸aÀÑ*CÔ*CØ4RðTñ Tô Tˆà	�Š‰Œˆˆˆr3   c                ó6  — t          j        d¦  «        j        d                              ¦   «         }dD ]d}t	          |d¬¦  «        }||j        _        |                     ¦   «          t          |d¬¦  «        }||j        _        |                     ¦   «          Œed S )Nr  r   ©TFz Pitch Space Bach (soprano voice)r  z Pitch Class Bach (soprano voice))	r   rù  r  râ  r  r<   rÄ   rS   r!  )r,   r!  ÚxLogr"  s       r1   Ú*testScatterWeightedPitchSpaceQuarterLengthz=TestExternalManual.testScatterWeightedPitchSpaceQuarterLengthJ  s¦   € ÝŒL˜Ñ(Ô(Ô.¨qÔ1×9Ò9Ñ;Ô;ˆØ!ð 	ð 	ˆDÝ6ØÐ;ðñ ô ˆAð #'ˆAŒGÔØ�EŠE‰GŒGˆGå6ØÐ;ðñ ô ˆAð #'ˆAŒGÔØ�EŠE‰GŒGˆGˆGð	ð 	r3   c                ó²   — t          j        d¦  «        }t          |j        d                              ¦   «         d¬¦  «        }|                     ¦   «          d S ©Nr  r   r  r  ©r   rù  r	  r  râ  rS   r   s      r1   ÚtestPitchSpacez!TestExternalManual.testPitchSpaceY  óG   € ÝŒL˜Ñ(Ô(ˆÝ ¤¨¤
× 2Ò 2Ñ 4Ô 4Ð<RÐSÑSÔSˆØ	�Š‰Œˆˆˆr3   c                ó²   — t          j        d¦  «        }t          |j        d                              ¦   «         d¬¦  «        }|                     ¦   «          d S r,  ©r   rù  r  r  râ  rS   r   s      r1   ÚtestPitchClassz!TestExternalManual.testPitchClass^  r/  r3   c                ó²   — t          j        d¦  «        }t          |j        d                              ¦   «         d¬¦  «        }|                     ¦   «          d S r,  ©r   rù  r  r  râ  rS   r   s      r1   ÚtestQuarterLengthz$TestExternalManual.testQuarterLengthc  sG   € ÝŒL˜Ñ(Ô(ˆÝ" 1¤7¨1¤:×#5Ò#5Ñ#7Ô#7Ð?UÐVÑVÔVˆØ	�Š‰Œˆˆˆr3   c                óp  — dD ]²}t          j        d¦  «        }t          |j        d                              ¦   «         d¬¦  «        }||j        _        |                     ¦   «          t          |j        d                              ¦   «         d¬¦  «        }||j        _        |                     ¦   «          Œ³d S )Nr(  r  r   r  r  )	r   rù  r½   r  râ  r<   rÄ   rS   rÌ   )r,   r)  r!  r"  s       r1   Ú"testScatterPitchSpaceQuarterLengthz5TestExternalManual.testScatterPitchSpaceQuarterLengthh  s°   € Ø!ð 	ð 	ˆDå”˜^Ñ,Ô,ˆAÝ.¨q¬w°q¬z×/AÒ/AÑ/CÔ/CÐKað 1ñ 1ô 1ˆAà"&ˆAŒGÔØ�EŠE‰GŒGˆGå.¨q¬w°q¬z×/AÒ/AÑ/CÔ/CÐKað 1ñ 1ô 1ˆAà"&ˆAŒGÔØ�EŠE‰GŒGˆGˆGð	ð 	r3   c                ó²   — t          j        d¦  «        }t          |j        d                              ¦   «         d¬¦  «        }|                     ¦   «          d S r,  )r   rù  rÐ   r  râ  rS   r   s      r1   ÚtestScatterPitchClassOffsetz.TestExternalManual.testScatterPitchClassOffsetv  sG   € ÝŒL˜Ñ(Ô(ˆÝ# A¤G¨A¤J×$6Ò$6Ñ$8Ô$8Ð@VÐWÑWÔWˆØ	�Š‰Œˆˆˆr3   c                ó8  — t          j        dd¦  «        }t          |j        d                              ¦   «         d¬¦  «        }|                     ¦   «          t          |j        d                              ¦   «         d¬¦  «        }|                     ¦   «          d S )Núschumann_robert/opus41no1rW   r   zRobert Schumann (soprano voice)r  ©r   rù  rØ   r  râ  rS   r%  r   s      r1   Ú"testScatterPitchSpaceDynamicSymbolz5TestExternalManual.testScatterPitchSpaceDynamicSymbol{  sŽ   € ÝŒLÐ4°aÑ8Ô8ˆÝ*ØŒG�AŒJ×ÒÑ Ô Ø3ð
ñ 
ô 
ˆð 	
�Š‰Œˆå2ØŒG�AŒJ×ÒÑ Ô Ø3ð5ñ 5ô 5ˆð 	
�Š‰Œˆˆˆr3   c                óÂ   — t          j        dd¦  «        }t          |                     ¦   «                              ¦   «         d¬¦  «        }|                     ¦   «          d S )Núschoenberg/opus19rÁ   zSchoenberg pitch spacer  )r   rù  rì  râ  Ú	stripTiesrS   r   s      r1   Ú&testPlot3DPitchSpaceQuarterLengthCountz9TestExternalManual.testPlot3DPitchSpaceQuarterLengthCountˆ  sU   € ÝŒLÐ,¨aÑ0Ô0ˆÝ-¨a¯iªi©k¬k×.CÒ.CÑ.EÔ.EØ4LðNñ Nô Nˆà	�Š‰Œˆˆˆr3   c                ód  — ddl m} t          ddft          ddft          ddft
          ddft          ddft          ddft          t          j
        dd¦  «        dft          ddft          ddft          ddft          ddft          t          j
        dd¦  «        dft           |j        dft$          t          j
        d¦  «        d	ft&          t          j
        d¦  «        d	fg}t          j        d
¦  «        }|D ]º\  }}}|€|}nt+          j        |¦  «        }|� ||d|¬¦  «        }n ||d¬¦  «        }|                     ¦   «          |j        j        dz   }	t3          t4                               ¦   «         |	z  ¦  «        }
t4                               d|
g¦  «         |                     |
¦  «         Œ»dS )z—
        Write a graphic file for all graphs, naming them after the appropriate class.
        This is used to generate documentation samples.
        r   )Ú	testFilesNr;  rW   zRobert Schumann Opus 41 No 1zMozart Trio K581 Excerptzbach/bwv66.6.xmlzBach BWV 66.6r  rS  ©rT  rZ  zwriting fp:)Úmusic21.musicxmlrC  r	  r  r  r½   rÌ   rÐ   rØ   r   ÚgetWorkr›  r•  r  r!  r%  rì  ÚmozartTrioK581Excerptrk  rm  rù  r   rS   rÆ   r©   r5   rE  ÚgetRootTempDirrF  r\  )r,   rC  ÚplotClassesÚsDefaultÚplotClassNameÚworkÚtitleStrr8   Úobjre  rc  s              r1   ÚwriteAllPlotsz TestExternalManual.writeAllPlotsŽ  sæ  € ð 	/Ð.Ð.Ð.Ð.Ð.õ ! $¨Ð-Ý  $¨Ð-Ý# T¨4Ð0å+¨T°4Ð8Ý+¨T°4Ð8Ý$ d¨DÐ1å.Ý”Ø/°ñô ð /ðõ +¨D°$Ð7Ý*¨D°$Ð7å3°T¸4Ð@Ý3°T¸4Ð@Ý3ÝŒ^Ð7¸Ñ;Ô;Ø+ð-õ /ØÔ,Ø'ð)õ �&œ.Ð);Ñ<Ô<¸oÐNÝ�fœnÐ-?Ñ@Ô@À/ÐRðE$
ˆõL ”< Ñ/Ô/ˆà-8ð 	ð 	Ñ)ˆM˜4 Øˆ|Ø��õ ”O DÑ)Ô)�àÐ#Ø#�m A°$¸hÐGÑGÔG��à#�m A°$Ð7Ñ7Ô7�à�GŠG‰IŒIˆIØ”Ô'¨&Ñ0ˆBÝ•\×0Ò0Ñ2Ô2°RÑ7Ñ8Ô8ˆBÝ×#Ò# ]°BÐ$7Ñ8Ô8Ð8Ø�IŠI�b‰MŒMˆMˆMð!	ð 	r3   N)r©   rª   r«   r#  r&  r*  r.  r2  r5  r7  r9  r=  rA  rO  ra   r3   r1   r  r  5  s¾   € € € € € ðð ð ðð ð ðð ð ðð ð ð
ð ð ð
ð ð ð
ð ð ðð ð ð
ð ð ðð ð ð@ð @ð @ð @ð @r3   r  c                  ó|   — e 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„ Zd„ Z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.commonTestrS  Úglobals)r,   rS  s     r1   ÚtestCopyAndDeepcopyzTest.testCopyAndDeepcopyÓ  s0   € Ø7Ð7Ð7Ð7Ð7Ð7Øˆ�D�'™)œ)Ñ$Ô$Ð$Ð$Ð$r3   c                ó´   — t          j        d¦  «        }t          |j        d                              ¦   «         d d¬¦  «        }|                     ¦   «          d S ©Nr  r   r  rS  )r   rù  r  r  râ  rS   r   s      r1   ÚtestPitchSpaceDurationCountz Test.testPitchSpaceDurationCount×  sS   € ÝŒL˜Ñ(Ô(ˆÝ2°1´7¸1´:×3EÒ3EÑ3GÔ3GÐTXØ9OðQñ Qô Qˆà	�Š‰Œˆˆˆr3   c                ó´   — t          j        d¦  «        }t          |j        d                              ¦   «         d d¬¦  «        }|                     ¦   «          d S )NÚbachr   r  rS  r-  r   s      r1   r.  zTest.testPitchSpaceÝ  sI   € ÝŒL˜Ñ Ô ˆÝ ¤¨¤
× 2Ò 2Ñ 4Ô 4ÀÐMcÐdÑdÔdˆØ	�Š‰Œˆˆˆr3   c                ó´   — t          j        d¦  «        }t          |j        d                              ¦   «         d d¬¦  «        }|                     ¦   «          d S rX  r1  r   s      r1   r2  zTest.testPitchClassâ  sR   € ÝŒL˜Ñ(Ô(ˆÝ ¤¨¤
× 2Ò 2Ñ 4Ô 4Ø+/Ø&<ð>ñ >ô >ˆð 	
�Š‰Œˆˆˆr3   c                ó´   — t          j        d¦  «        }t          |j        d                              ¦   «         d d¬¦  «        }|                     ¦   «          d S rX  r4  r   s      r1   r5  zTest.testQuarterLengthé  sU   € ÝŒL˜Ñ(Ô(ˆÝ" 1¤7¨1¤:×#5Ò#5Ñ#7Ô#7Ø.2Ø)?ðAñ Aô Aˆð 	
�Š‰Œˆˆˆr3   c                ó<  — t          j        dd¦  «        }t          |j        d                              ¦   «         d d¬¦  «        }|                     ¦   «          t          |j        d                              ¦   «         d d¬¦  «        }|                     ¦   «          d S )Nr?  rW   r   zSchoenberg (piano)rS  r<  r   s      r1   ÚtestPitchDurationzTest.testPitchDurationð  s˜   € ÝŒLÐ,¨aÑ0Ô0ˆÝ*¨1¬7°1¬:×+=Ò+=Ñ+?Ô+?Ø6:Ø1EðGñ Gô Gˆð 	
�Š‰Œˆå2°1´7¸1´:×3EÒ3EÑ3GÔ3GØ>BØ9MðOñ Oô Oˆð 	
�Š‰Œˆˆˆr3   Nc                ó   — t          j        d¦  «        }d}d}t          |                     ¦   «         |d||d¬¦  «        }|                     ¦   «          |                      |j        j        dg d¢gdg d	¢gg¦  «         d S )
Núbach/bwv66.6é   rV   i,  )rÂ   r1  r3  rT  ÚdpiÚMajor))zC#z#f0727a)ÚDz#ffd752)ÚEz#eeff9a)zF#z#b9f0ff)ÚAz#bb9aff)ÚBz#ffb5ffÚMinor))úc#z#8c0e16©rû   z#ffffffrk  )zf#z#558caark  )r"  z#9b519b)r   rù  rk  râ  rS   ÚassertEqualr7  r'   )r,   rT  r!  re  r3  r"  s         r1   ÚtestWindowedzTest.testWindowedü  s´   € ÝŒL˜Ñ(Ô(ˆØˆØˆ
õ ˜Ÿ	š	™œ¨2Ø"#°
Ø#-°3ð8ñ 8ô 8ˆð 	
�Š‰ŒˆØ×Ò˜œÔ+àðð ð ðð
 ðð ð ððñ	
ô 	
ð 	
ð 	
ð 	
r3   c                ób   — g d¢}g d¢}t          ||d ¬¦  «        }|                     ¦   «          d S )N)ra  zschoenberg/opus19/movement2zcorelli/opus3no1/1grave)Úql1Úql2Úql3)r  rT  )rý  rS   )r,   rò  r  r~  s       r1   ÚtestFeatureszTest.testFeatures  s=   € Ø_Ð_Ð_ˆ
Ø&Ð&Ð&ˆå�Z°6ÀdÐKÑKÔKˆØ	�Š‰Œˆˆˆr3   c                ó    — t          j        d¦  «        }|                     ¦   «         }t          |d ¬¦  «        }|                     ¦   «          d S )Nz0josquin/laDeplorationDeLaMorteDeJohannesOckeghemrD  )r   rù  ÚmergeScoresr•  rS   )r,   Úor8   r"  s       r1   ÚtestPianoRollFromOpuszTest.testPianoRollFromOpus   sB   € ÝŒLÐKÑLÔLˆØ�MŠM‰OŒOˆå)¨!¸Ð=Ñ=Ô=ˆØ	�Š‰Œˆˆˆr3   c           
     óÚ  — ddl m} |                     d¦  «        }t          t	          j        ¦   «         d ¬¦  «        }t          j        g d¢¦  «        }t          j	        |d¦  «        |_
        |                      |                     |j
        |i ¦  «        g d¢¦  «         t	          j        ¦   «         }|                     t          j        g d¢¦  «        ¦  «         |                     t          j        d	¦  «        ¦  «         |                     t          j        d
¦  «        ¦  «         t!          |d ¬¦  «        }|                     ¦   «          |                      |j        ddi fddi fddi fddi fddi fg¦  «         t	          j        ¦   «         }|                     |                     dd¦  «        ¦  «         |                     t          j        d	¦  «        ¦  «         |                     t          j        d	¦  «        ¦  «         t)          |d ¬¦  «        }|                     ¦   «          |                      |j        ddi fddi fddi fddi fddi fg¦  «         t	          j        ¦   «         }|                     |                     ddd¬¦  «        ¦  «         |                     t          j        d	d¬¦  «        ¦  «         t+          |d ¬¦  «        }|                     ¦   «          |                      |j        ddi fddi fg¦  «         t-          t	          j        ¦   «         d ¬¦  «        }t          j	        |d¦  «        |_
        t          j        |d¦  «        |_        d|j        _        t          j        g d¢d¬¦  «        }|                      |                     |i ¦  «        g d¢g d¢g¦  «         d|_        |                      |                     |i ¦  «        g d¢dgg¦  «         d S )Nr   ©ÚscaleÚc4rD  )r"  r�   rc   r   )éG   é<   é>   )r"  rj  rc   Úc3Úc5rV   rW   rU   r˜  rÓ   Úe3Úa3©ÚquarterLengthr
  r   F)r
  r
  r
  )rþ   ry  Ú
MajorScalerí   r   ÚStreamr	   r!   r   rÈ   r<   rl  r“   r?   r   r    r	  rS   r'   ÚgetChordr  r  r¹   rÇ   r=   rÄ   r}   r&   )r,   ry  Úscr"  r�   r8   s         r1   ÚtestChordsAzTest.testChordsA'  sš  € Ø!Ð!Ð!Ð!Ð!Ð!Ø×Ò˜dÑ#Ô#ˆå•f”m‘o”o°$Ð7Ñ7Ô7ˆÝŒK˜˜˜Ñ(Ô(ˆÝÔ% a¨Ñ-Ô-ˆŒØ×Ò˜×2Ò2°1´7¸A¸rÑBÔBÀLÀLÀLÑQÔQÐQåŒM‰OŒOˆØ	�Š•”Ð-Ð-Ð-Ñ.Ô.Ñ/Ô/Ð/Ø	�Š•”˜4‘”Ñ!Ô!Ð!Ø	�Š•”˜4‘”Ñ!Ô!Ð!Ý ¨dÐ3Ñ3Ô3ˆØ	�Š‰Œˆð 	×Ò˜œ 1 a¨ *¨q°!°R¨j¸1¸aÀ¸*ÀqÈ!ÈRÀjÐSTÐVWÐY[ÐR\Ð!]Ñ^Ô^Ð^åŒM‰OŒOˆØ	�Š�—’˜T 4Ñ(Ô(Ñ)Ô)Ð)Ø	�Š•”˜4‘”Ñ!Ô!Ð!Ø	�Š•”˜4‘”Ñ!Ô!Ð!Ý ¨dÐ3Ñ3Ô3ˆØ	�Š‰Œˆð 	×Ò˜œ 1 a¨ *¨q°!°R¨j¸1¸aÀ¸*ÀqÈ!ÈRÀjÐSTÐVWÐY[ÐR\Ð!]Ñ^Ô^Ð^åŒM‰OŒOˆØ	�Š�—’˜T 4°q�Ñ9Ô9Ñ:Ô:Ð:Ø	�Š•”˜4¨sÐ3Ñ3Ô3Ñ4Ô4Ð4Ý" 1°Ð6Ñ6Ô6ˆØ	�Š‰Œˆð 	×Ò˜œ 1 a¨ *¨q°!°R¨jÐ!9Ñ:Ô:Ð:õ •F”M‘O”O°Ð5Ñ5Ô5ˆÝÔ% a¨Ñ-Ô-ˆŒÝÔ(¨¨CÑ0Ô0ˆŒØ#ˆŒÔÝŒK˜˜˜°sÐ;Ñ;Ô;ˆà×Ò˜×4Ò4°Q¸Ñ;Ô;Ø&˜,˜,¨¨¨Ð8ñ	:ô 	:ð 	:ð &+ˆÔ"Ø×Ò˜×4Ò4°Q¸Ñ;Ô;¸l¸l¸lÈSÈEÐ=RÑSÔSÐSÐSÐSr3   c                ól  — ddl m} |                     d¦  «        }t          j        ¦   «         }|                     |                     ddd¬¦  «        ¦  «         |                     |                     dd	d
¬¦  «        ¦  «         |                     t          j        dd¬¦  «        ¦  «         t          |d ¬¦  «        }d|j
        _        |                     ¦   «          ddi fddi fddi fddi fd
di fd
di fd
di fd
di fd
di fd
di fd
di fd
di fd
di fddi fg}|                      |j        |¦  «         d S )Nr   rx  rz  r€  r�  r
  r‚  Úb3r  ç      ø?r~  rW   rD  Fç      J@ç     €J@ç     €K@ç     €L@ç     €M@ç      N@ç      O@ç      P@ç     @P@ç     ÀP@ç     @Q@ç     ÀQ@ç      R@ç       @ç      H@)rþ   ry  r„  r   r…  r?   r†  r   r    r½   r<   rÄ   rS   rl  r'   ©r,   ry  r‡  r8   r"  r½  s         r1   ÚtestChordsA2zTest.testChordsA2\  sb  € Ø!Ð!Ð!Ð!Ð!Ð!Ø×Ò˜dÑ#Ô#ˆåŒM‰OŒOˆØ	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š•”˜4¨qÐ1Ñ1Ô1Ñ2Ô2Ð2Ý*¨1¸Ð>Ñ>Ô>ˆØ#ˆŒÔØ	�Š‰Œˆà�t˜R� 3¨¨b /°C¸¸r°?ÀSÈ$ÐPRÀOØ�t˜R� 3¨¨b /Ø�t˜R� 3¨¨b /Ø�t˜R� 3¨¨b /Ø�t˜R� 3¨¨b /°C¸¸r°?Ø�t˜R�ð"ˆð 	×Ò˜œ Ñ'Ô'Ð'Ð'Ð'r3   c                ól  — ddl m} |                     d¦  «        }t          j        ¦   «         }|                     |                     ddd¬¦  «        ¦  «         |                     |                     dd	d
¬¦  «        ¦  «         |                     t          j        dd¬¦  «        ¦  «         t          |d ¬¦  «        }d|j
        _        |                     ¦   «          ddi fddi fddi fddi fd
di fd
di fd
di fd
di fd
di fd
di fd
di fd
di fd
di fddi fg}|                      |j        |¦  «         d S )Nr   rx  rz  r€  r�  r
  r‚  rŠ  r  r‹  r~  rW   rD  Fr˜  rÓ   r  é	   é   r™  )rþ   ry  r„  r   r…  r?   r†  r   r    rÌ   r<   rÄ   rS   rl  r'   r›  s         r1   ÚtestChordsA3zTest.testChordsA3q  sa  € Ø!Ð!Ð!Ð!Ð!Ð!Ø×Ò˜dÑ#Ô#ˆåŒM‰OŒOˆØ	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š•”˜4¨qÐ1Ñ1Ô1Ñ2Ô2Ð2Ý*¨1¸Ð>Ñ>Ô>ˆØ#ˆŒÔØ	�Š‰Œˆà�q˜"�  Q¨˜|¨c°1°b¨\¸CÀÀB¸<Ø�r˜2�  a¨ ¨s°A°r¨l¸SÀ!ÀR¸LÈ3ÐPQÐSUÈ,Ø�q˜"�  Q¨˜|¨c°2°r¨]¸SÀ!ÀR¸LØ�q˜"�ðˆð 	×Ò˜œ Ñ'Ô'Ð'Ð'Ð'r3   c                óÊ  — ddl m} |                     d¦  «        }t          j        ¦   «         }|                     |                     ddd¬¦  «        ¦  «         |                     t          j        dd	¬¦  «        ¦  «         |                     |                     d
dd¬¦  «        ¦  «         |                     t          j        dd	¬¦  «        ¦  «         |  	                    d„ |D ¦   «         g d¢¦  «         t          |d ¬¦  «        }|                     ¦   «          ddi fddi fddi fddi fddi fddi fddi fdd	i fddi fdd	i fg
}|  	                    |j        |¦  «         d S )Nr   rx  rz  r€  r�  r
  r‚  r~  rW   rŠ  Úe4r‹  Úd3c                ó   — g | ]	}|j         ‘Œ
S ra   )Úoffset)rb   Úes     r1   re   z%Test.testChordsA4.<locals>.<listcomp>�  s   € Ð.Ð.Ð. q˜!œ(Ð.Ð.Ð.r3   )ç        r
  ç      @ç      @rD  r§  r˜  rÓ   r  rž  r¨  rŸ  r©  )rþ   ry  r„  r   r…  r?   r†  r   r    rl  rÐ   rS   r'   r›  s         r1   ÚtestChordsA4zTest.testChordsA4„  s„  € Ø!Ð!Ð!Ð!Ð!Ð!Ø×Ò˜dÑ#Ô#ˆåŒM‰OŒOˆØ	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š•”˜4¨qÐ1Ñ1Ô1Ñ2Ô2Ð2Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š•”˜4¨qÐ1Ñ1Ô1Ñ2Ô2Ð2Ø×ÒÐ.Ð.¨AÐ.Ñ.Ô.Ð0DÐ0DÐ0DÑEÔEÐEõ $ A°$Ð7Ñ7Ô7ˆØ	�Š‰Œˆà�q˜"�  Q¨˜|¨c°1°b¨\¸CÀÀB¸<Ø�q˜"�Ø�r˜2�  a¨ ¨s°A°r¨l¸SÀ!ÀR¸LØ�q˜"�ðˆð 	×Ò˜œ Ñ'Ô'Ð'Ð'Ð'r3   c                óŠ  — ddl m} |                     d¦  «        }t          j        ¦   «         }|                     t          j        d¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     t          j        d	¦  «        ¦  «         |                     |                     d
dd¬¦  «        ¦  «         t          |d ¬¦  «        }| 
                    ¦   «          |                      |j        ddi fddi fddi fddi fddi fddi fddi fddi fddi fddi fddi fddi fg¦  «         d S )Nr   rx  rz  Úfr€  r�  r
  r‚  r~  rŠ  r¢  r‹  rD  é4   é   é5   é7   é9   é;   rÓ   r|  r}  é@   )rþ   ry  r„  r   r…  r?   r   ÚDynamicr†  rØ   rS   rl  r'   ©r,   ry  r‡  r8   r"  s        r1   ÚtestChordsA5zTest.testChordsA5š  si  € Ø!Ð!Ð!Ð!Ð!Ð!Ø×Ò˜dÑ#Ô#ˆåŒM‰OŒOˆØ	�Š•Ô! #Ñ&Ô&Ñ'Ô'Ð'Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<à	�Š•Ô! #Ñ&Ô&Ñ'Ô'Ð'Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<õ +¨1¸Ð>Ñ>Ô>ˆØ	�Š‰Œˆà×Ò˜œ 2 q¨" +°°A°r¨{¸RÀÀB¸KØ#% q¨" +°°A°r¨{¸RÀÀB¸KØ#% q¨" +°°A°r¨{¸RÀÀB¸KØ#% q¨" +°°A°r¨{¸RÀÀB¸Kð"Iñ 	Jô 	Jð 	Jð 	Jð 	Jr3   c                ó  — ddl m} |                     d¦  «        }t          j        ¦   «         }|                     t          j        d¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     |                     d	d
d¬¦  «        ¦  «         t          |d ¬¦  «        }| 
                    ¦   «          dddi fddi fgi gdg i gdddi fgi gdg i gdddi fddi fgi gdddi fgi gdg i gdddi fgi gdg i gdddi fgi gdg i gdddi fgi gg}|                      |j        |¦  «         t          j        ¦   «         }|                     t          j        d¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     |                     d	d
d¬¦  «        ¦  «         t          |d ¬¦  «        }| 
                    ¦   «          dddi fgi gdg i gdg i gdg i gdddi fgi gdddi fgi gdg i gdddi fgi gdg i gdddi fgi gdg i gdddi fgi gdddi fgi gdg i gdddi fgi gdg i gdddi fgi gg}|                      |j        |¦  «         t          j        ¦   «         }|                     t          j        d¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     |                     d	d
d¬¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     t          j        dd¬¦  «        ¦  «         t          |d ¬¦  «        }d |j        _        | 
                    ¦   «          |                      |j        dd!…         dd"d#i fdd$d#i fdd%d#i fdd&d#i fdd'd#i fdd(d#i fdd)d#i fg¦  «         t          j        ¦   «         }|                     t          j        d¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     |                     d	d
d¬¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     t          j        dd¬¦  «        ¦  «         t#          |d ¬¦  «        }d |j        _        | 
                    ¦   «          |                      |j        dd*…         dd+d#i fdd,d#i fdd!d#i fdd-d#i fddd#i fddd#i fdd.d#i fdd+d#i fg¦  «         d S )/Nr   rx  rz  r~  r€  r�  r
  r‚  rŠ  r¢  r‹  rD  ÚCr§  g      î?g      ÷?rû   re  rf  rï   g      Ü?ÚFÚGrg  rh  ÚC3ÚC4Úf4Úg5rU   r  Fr  rŒ  rV   r�  rŽ  r�  rš  r�  r‘  r®  r˜  rÓ   rž  rW   )rþ   ry  r„  r   r…  r?   r   r    r†  r•  rS   rl  r'   r›  r  r<   rÄ   r!  r›  s         r1   ÚtestChordsBzTest.testChordsB°  s\  € Ø!Ð!Ð!Ð!Ð!Ð!Ø×Ò˜dÑ#Ô#ˆåŒM‰OŒOˆØ	�Š•”˜4‘”Ñ!Ô!Ð!Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<à	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<å)¨!¸Ð=Ñ=Ô=ˆØ	�Š‰Œˆà˜˜f bÐ)¨C°¸Ð+<Ð=¸rÐBØ�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/Ø�b˜"�Ø˜˜f bÐ)¨C°¸Ð+<Ð=¸rÐBØ˜˜f bÐ)Ð*¨BÐ/Ø�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/Ø�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/Ø�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/ð1ˆð 	×Ò˜œ Ñ'Ô'Ð'õ ŒM‰OŒOˆØ	�Š•”˜4‘”Ñ!Ô!Ð!Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<à	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<å)¨!¸Ð=Ñ=Ô=ˆØ	�Š‰ŒˆØ˜#˜v rÐ*Ð+¨RÐ0Ø�b˜"�Ø�b˜"�Ø�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/Ø˜˜f bÐ)Ð*¨BÐ/Ø�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/Ø�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/Ø�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/Ø˜#˜v rÐ*Ð+¨RÐ0Ø�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/Ø�b˜"�Ø˜˜f bÐ)Ð*¨BÐ/ð!1ˆð$ 	×Ò˜œ Ñ'Ô'Ð'õ ŒM‰OŒOˆØ	�Š•”˜4‘”Ñ!Ô!Ð!Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<à	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š�—’˜T 4°q�Ñ9Ô9Ñ:Ô:Ð:Ø	�Š�—’˜T 4°q�Ñ9Ô9Ñ:Ô:Ð:Ø	�Š•”˜4¨qÐ1Ñ1Ô1Ñ2Ô2Ð2å2°1ÀÐFÑFÔFˆØ#ˆŒÔØ	�Š‰Œˆà×Ò˜œ  ! œ¨¨T°1°bÐ'9¸CÀÀqÈ"Ð;MÐPSÐUYÐ[\Ð^`ÐOaØ(+¨T°1°bÐ'9¸CÀÀqÈ"Ð;MÐPSÐUYÐ[\Ð^`ÐOaØ(+¨T°1°bÐ'9ð';ñ 	<ô 	<ð 	<õ
 ŒM‰OŒOˆØ	�Š•”˜4‘”Ñ!Ô!Ð!Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<à	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š�—’˜T 4°q�Ñ9Ô9Ñ:Ô:Ð:Ø	�Š�—’˜T 4°q�Ñ9Ô9Ñ:Ô:Ð:Ø	�Š•”˜4¨qÐ1Ñ1Ô1Ñ2Ô2Ð2å2°1ÀÐFÑFÔFˆØ#ˆŒÔØ	�Š‰Œˆà×Ò˜œ  ! œ¨¨Q°°2 ¸¸aÀÀB¸È#ÈqÐRSÐUWÈØ(+¨Q°°2 Ø(+¨Q°°2 Ø(+¨Q°°2 ¸¸aÀÀB¸È#ÈqÐRSÐUWÈð'Zñ 	[ô 	[ð 	[ð 	[ð 	[r3   c           !     óZ  — ddl m} |                     d¦  «        }t          j        ¦   «         }|                     t          j        d¦  «        ¦  «         |                     ddd¬¦  «        }|  	                    t          |¦  «        d	¦  «         |  	                    d
„ |D ¦   «         g d¢¦  «         |                     |¦  «         |                     t          j        d¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     t          j        d¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     |                     ddd¬¦  «        ¦  «         |                     t          j        dd¬¦  «        ¦  «         t          |d ¬¦  «        }d|j        _        |                     ¦   «          dddi fdddi fdddi fdddi fdddi fdddi fdddi fdddi fd ddi fd ddi fd!ddi fd!ddi fd"d#d$i fd"ddi fd%d#d$i fd%ddi fd&d#d$i fd&ddi fd'd#d$i fd'ddi fd(d#di fd(ddi fd)d#d$i fd)ddi fd*d#d$i fd*ddi fd+d#d$i fd+ddi fd,d#d$i fd,ddi fg}d-| _        |  	                    |j        |¦  «         d S ).Nr   rx  rz  r¬  r€  r�  r
  r‚  z!<music21.chord.Chord E3 F3 G3 A3>c                ó&   — g | ]}|j         j        ‘ŒS ra   )rù   Úps)rb   r’   s     r1   re   z%Test.testChordsB2.<locals>.<listcomp>  s   € Ð0Ð0Ð0¨˜!œ'œ*Ð0Ð0Ð0r3   )rŒ  r�  rŽ  r�  ÚmfrŠ  r¢  r‹  Úppr½  r¾  rU   r  rD  FrŒ  r®  rV   r�  rŽ  r�  r�  r  r‘  r’  r“  r”  r˜  rW   r•  r–  r—  r˜  g     €R@g      S@g     @S@g     ÀS@i   )rþ   ry  r„  r   r…  r?   r   r´  r†  rl  r7   r   r    r%  r<   rÄ   rS   ÚmaxDiffr'   )r,   ry  r‡  r8   r�   r"  r½  s          r1   ÚtestChordsB2zTest.testChordsB2  s;  € Ø!Ð!Ð!Ð!Ð!Ð!Ø×Ò˜dÑ#Ô#ˆåŒM‰OŒOˆØ	�Š•Ô! #Ñ&Ô&Ñ'Ô'Ð'à�KŠK˜˜d°#ˆKÑ6Ô6ˆØ×Ò�˜a™œÐ"EÑFÔFÐFØ×ÒÐ0Ð0¨aÐ0Ñ0Ô0Ð2JÐ2JÐ2JÑKÔKÐKØ	�Š�‰Œˆà	�Š•Ô! $Ñ'Ô'Ñ(Ô(Ð(Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š•Ô! $Ñ'Ô'Ñ(Ô(Ð(Ø	�Š�—’˜T 4°q�Ñ9Ô9Ñ:Ô:Ð:Ø	�Š�—’˜T 4°q�Ñ9Ô9Ñ:Ô:Ð:Ø	�Š•”˜4¨qÐ1Ñ1Ô1Ñ2Ô2Ð2å2°1ÀÐFÑFÔFˆØ#ˆŒÔØ	�Š‰ŒˆØ˜˜1˜bÐ! D¨!¨Q°Ð#3°d¸A¸qÀ"Ð5EÈÈaÐQRÐTVÐGWØ˜˜1˜bÐ! D¨!¨Q°Ð#3°d¸A¸qÀ"Ð5EÈÈaÐQRÐTVÐGWØ˜˜1˜bÐ! D¨!¨Q°Ð#3°d¸A¸qÀ"Ð5EÈÈaÐQRÐTVÐGWØ˜˜1˜bÐ! D¨!¨Q°Ð#3Ø˜˜1˜bÐ! D¨!¨Q°Ð#3Ø˜˜1˜bÐ! D¨!¨Q°Ð#3°d¸A¸qÀ"Ð5EÈÈaÐQRÐTVÐGWØ˜˜1˜bÐ! D¨!¨Q°Ð#3°d¸A¸qÀ"Ð5EÈÈaÐQRÐTVÐGWØ˜˜1˜bÐ! D¨!¨Q°Ð#3°d¸A¸qÀ"Ð5EÈÈaÐQRÐTVÐGWØ˜˜1˜bÐ! D¨!¨Q°Ð#3ð5ˆð ˆŒà×Ò˜œ Ñ'Ô'Ð'Ð'Ð'r3   c                óš  — ddl m} |                     d¦  «        }t          j        ¦   «         }|                     t          j        d¦  «        ¦  «         |                     t          j	        d¦  «        ¦  «         |                     | 
                    ddd¬	¦  «        ¦  «         |                     t          j        d
¦  «        ¦  «         |                     | 
                    ddd¬	¦  «        ¦  «         |                     t          j        d¦  «        ¦  «         |                     | 
                    ddd¬	¦  «        ¦  «         |                     t          j	        dd¬	¦  «        ¦  «         t          |d ¬¦  «        }d|j        _        |                     ¦   «          |                      |j        d         dddi f¦  «         d S )Nr   rx  rz  r¬  r~  r€  r�  r
  r‚  rÃ  rŠ  r¢  r‹  rÄ  r½  r¾  rU   r  rD  FrŒ  rV   )rþ   ry  r„  r   r…  r?   r   r´  r   r    r†  rì  r<   rÄ   rS   rl  r'   rµ  s        r1   ÚtestChordsB3zTest.testChordsB33  s„  € Ø!Ð!Ð!Ð!Ð!Ð!Ø×Ò˜dÑ#Ô#ˆåŒM‰OŒOˆØ	�Š•Ô! #Ñ&Ô&Ñ'Ô'Ð'Ø	�Š•”˜4‘”Ñ!Ô!Ð!Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š•Ô! $Ñ'Ô'Ñ(Ô(Ð(Ø	�Š�—’˜T 4°s�Ñ;Ô;Ñ<Ô<Ð<Ø	�Š•Ô! $Ñ'Ô'Ñ(Ô(Ð(Ø	�Š�—’˜T 4°q�Ñ9Ô9Ñ:Ô:Ð:Ø	�Š•”˜4¨qÐ1Ñ1Ô1Ñ2Ô2Ð2å-¨a¸DÐAÑAÔAˆØ#ˆŒÔØ	�Š‰Œˆà×Ò˜œ œ S¨$°°2Ð$6Ñ7Ô7Ð7Ð7Ð7r3   c                óz   — t          j        d¦  «        }t          |dd ¬¦  «        }|                     ¦   «          d S )Nr  ÚBach)rÂ   rT  )r   rù  r±  rS   r   s      r1   Ú
testDolanAzTest.testDolanAH  s6   € ÝŒL˜Ñ(Ô(ˆÝ�!˜6¨dÐ3Ñ3Ô3ˆØ	�Š‰Œˆˆˆr3   r¶   )r©   rª   r«   rV  rY  r.  r2  r5  r_  rm  rr  rv  rˆ  rœ  r   rª  r¶  r¿  rÆ  rÈ  rË  ra   r3   r1   rQ  rQ  Ñ  s6  € € € € € ð%ð %ð %ðð ð ðð ð ð
ð ð ðð ð ð
ð 
ð 
ð
ð 
ð 
ð 
ð:ð ð ðð ð ð2Tð 2Tð 2Tðj(ð (ð (ð*(ð (ð (ð&(ð (ð (ð,Jð Jð Jð,[[ð [[ð [[ð|"(ð "(ð "(ðJ8ð 8ð 8ð*ð ð ð ð r3   rQ  Ú__main__)Nr¬   Ú
__future__r   r  Únumbersr_  rú  ÚtypingrH   ÚunittestÚmusic21.analysisr   r   r   r   rþ   r   r	   r
   r   r   r   r   r   r   r   r   Úmusic21.graphr   r   Úmusic21.graph.utilitiesr   r   ÚEnvironmentrE  ÚProtoM21Objectr   rG   r²   r»   r¹   r½   rÌ   rÐ   rØ   rð   rí   r	  r  r  r  r  r  r!  r%  r=  r/  rk  rm  rv  rp  r•  r›  r¥  rŸ  r±  rê  rè  rì  rñ  rï  rý  ÚTestCaser  rQ  Ú
_DOC_ORDERr©   ÚmainTestra   r3   r1   ú<module>rÙ     s‰  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€à &Ð &Ð &Ð &Ð &Ð &Ø %Ð %Ð %Ð %Ð %Ð %Ø &Ð &Ð &Ð &Ð &Ð &Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ Ið 'ˆ{Ô& |Ñ4Ô4€ðLð Lð Lð Lð L�gÔ,ñ Lô Lð Lð`
0ð 0ð 0ð 0ð 0�Ô! ?ñ 0ô 0ð 0ð>ð >ð >ð >ð >ˆjÔ% ñ >ô >ð >ð;ð ;ð ;ð ;ð ; Wñ ;ô ;ð ;ð>Að Að Að Að AÐ%Cñ Aô Að Að4ð ð ð ð ˜gñ ô ð ð@/ð /ð /ð /ð / Wñ /ô /ð /ðhBð Bð Bð Bð B�
Ô)¨?ñ Bô Bð BðJ+ð +ð +ð +ð +˜)ñ +ô +ð +ð<1ð 1ð 1ð 1ð 1˜)ñ 1ô 1ð 1ð84ð 4ð 4ð 4ð 4˜Yñ 4ô 4ð 4ð@*ð *ð *ð *ð *�jÔ5°ñ *ô *ð *ð&ð ð ð ð ¨_ñ ô ð ð>ð ð ð ð ¨_ñ ô ð ðB1ð 1ð 1ð 1ð 1¨_ñ 1ô 1ð 1ðp~)ð ~)ð ~)ð ~)ð ~)�zÔ0°/ñ ~)ô ~)ð ~)ðB9ð 9ð 9ð 9ð 9Ð"ñ 9ô 9ð 9ð:-ð -ð -ð -ð -Ð&ñ -ô -ð -ð*|ð |ð |ð |ð |�JÔ1°?ñ |ô |ð |ð~Ið Ið Ið Ið I Mñ Iô Ið Ið>8ð 8ð 8ð 8ð 8 Mñ 8ô 8ð 8ð22ð 2ð 2ð 2ð 2˜JÔAÀ?ñ 2ô 2ð 2ðjs$ð s$ð s$ð s$ð s$Ð!ñ s$ô s$ð s$ðr*ð *ð *ð *ð *�Ô'¨ñ *ô *ð *ð"9ð 9ð 9ð 9ð 9¨
ñ 9ô 9ð 9ðD0ð 0ð 0ð 0ð 0�*Ô4°oñ 0ô 0ð 0ðfW$ð W$ð W$ð W$ð W$ˆ{ñ W$ô W$ð W$ðxYð Yð Yð Yð Y˜Ô*ñ Yô Yð Yðxzð zð zð zð zˆ8Ôñ zô zð zðD ØØàØà"Ø"ØØ"à!Ø!Ø	à*Ø*Ø*à%ð+€
ð2 ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr3   