§
    ƒØjå*  ã                  ó@  — d dl mZ g d¢Zd dlZd dlZd dlZd dlZ G d„ dej        ¦  «        Z G d„ de	¦  «        Z
dd iZ G d	„ d
¦  «        Z G d„ d¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ d¦  «        Zedk    rd dlZ ej        ¦   «          dS dS )é    )Úannotations)ÚdefaultlistÚSingletonCounterÚRelativeCounterÚSlottedObjectMixinÚEqualSlottedObjectMixinÚFrozenObjectÚTimerNc                  ó4   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zˆ xZS )r   a  
    A counter that iterates from most common to least common
    and can return new RelativeCounters that adjust for proportion or percentage.

    >>> l = ['b', 'b', 'a', 'a', 'a', 'a', 'c', 'd', 'd', 'd'] + ['e'] * 10
    >>> rc = common.RelativeCounter(l)
    >>> for k in rc:
    ...     print(k, rc[k])
    e 10
    a 4
    d 3
    b 2
    c 1

    Ties are iterated according to which appeared first in the generated list.

    >>> rcProportion = rc.asProportion()
    >>> rcProportion['b']
    0.1
    >>> rcProportion['e']
    0.5
    >>> rcPercentage = rc.asPercentage()
    >>> rcPercentage['b']
    10.0
    >>> rcPercentage['e']
    50.0

    >>> for k, perc in rcPercentage.items():
    ...     print(k, perc)
    e 50.0
    a 20.0
    d 15.0
    b 10.0
    c 5.0
    c              #  ó„   •‡ K  — t          t          ¦   «                              ¦   «         ˆ fd„d¬¦  «        }|E d {V —† d S )Nc                ó   •— ‰|          S ©N© )ÚxÚselfs    €ú‹/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/common/objects.pyú<lambda>z*RelativeCounter.__iter__.<locals>.<lambda>D   s   ø€ ¸dÀ1¼g€ ó    T)ÚkeyÚreverse)ÚsortedÚsuperÚ__iter__)r   Ú
sortedKeysÚ	__class__s   ` €r   r   zRelativeCounter.__iter__C   sT   øøè è € Ý�E™GœG×,Ò,Ñ.Ô.Ð4EÐ4EÐ4EÐ4EÈtÐTÑTÔTˆ
ØÐÐÐÐÐÐÐÐÐr   c              #  ó,   K  — | D ]}|| |         fV — Œd S r   r   )r   Úks     r   ÚitemszRelativeCounter.itemsG   s6   è è € Øð 	ð 	ˆAØ�T˜!”W�*ÐÐÐÐð	ð 	r   c                ó’   ‡ — t          ˆ fd„‰ D ¦   «         ¦  «        }i }‰ D ]}‰ |         |z  ||<   Œ‰                      |¦  «        }|S )Nc              3  ó(   •K  — | ]}‰|         V — Œd S r   r   ©Ú.0r   r   s     €r   ú	<genexpr>z/RelativeCounter.asProportion.<locals>.<genexpr>L   ó'   øè è € Ð,Ð, !�d˜1”gÐ,Ð,Ð,Ð,Ð,Ð,r   ©Úsumr   ©r   ÚselfLenÚoutDictÚyÚnews   `    r   ÚasProportionzRelativeCounter.asProportionK   sc   ø€ ÝÐ,Ð,Ð,Ð, tÐ,Ñ,Ô,Ñ,Ô,ˆØˆØð 	+ð 	+ˆAØ˜aœ 7Ñ*ˆG�A‰JˆJà�nŠn˜WÑ%Ô%ˆØˆ
r   c                ó˜   ‡ — t          ˆ fd„‰ D ¦   «         ¦  «        }i }‰ D ]}‰ |         dz  |z  ||<   Œ‰                      |¦  «        }|S )Nc              3  ó(   •K  — | ]}‰|         V — Œd S r   r   r!   s     €r   r#   z/RelativeCounter.asPercentage.<locals>.<genexpr>U   r$   r   éd   r%   r'   s   `    r   ÚasPercentagezRelativeCounter.asPercentageT   sg   ø€ ÝÐ,Ð,Ð,Ð, tÐ,Ñ,Ô,Ñ,Ô,ˆØˆØð 	1ð 	1ˆAØ˜aœ 3™¨Ñ0ˆG�A‰JˆJà�nŠn˜WÑ%Ô%ˆØˆ
r   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r,   r0   Ú__classcell__©r   s   @r   r   r      sp   ø€ € € € € ð"ð "ðJð ð ð ð ðð ð ðð ð ðð ð ð ð ð ð r   r   c                  ó4   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zˆ xZS )r   z�
    Call a function for every time something is missing:

    >>> a = common.defaultlist(lambda:True)
    >>> a[5]
    True
    c                óV   •— t          ¦   «                              ¦   «          || _        d S r   )r   Ú__init__Ú_fx)r   Úfxr   s     €r   r9   zdefaultlist.__init__f   s$   ø€ Ý‰Œ×ÒÑÔÐØˆŒˆˆr   c                ó¤   — t          | ¦  «        |k    r<|                      |                      ¦   «         ¦  «         t          | ¦  «        |k    °:d S d S r   )ÚlenÚappendr:   ©r   Úindexs     r   Ú_fillzdefaultlist._fillj   sL   € Ý�$‰iŒi˜5Ò Ð Ø�KŠK˜Ÿš™
œ
Ñ#Ô#Ð#õ �$‰iŒi˜5Ò Ð Ð Ð Ð Ð r   c                óh   — |                       |¦  «         t                               | ||¦  «         d S r   )rA   ÚlistÚ__setitem__)r   r@   Úvalues      r   rD   zdefaultlist.__setitem__n   s2   € Ø�
Š
�5ÑÔÐÝ×Ò˜˜u eÑ,Ô,Ð,Ð,Ð,r   c                ób   — |                       |¦  «         t                               | |¦  «        S r   )rA   rC   Ú__getitem__r?   s     r   rG   zdefaultlist.__getitem__r   s*   € Ø�
Š
�5ÑÔÐÝ×Ò  eÑ,Ô,Ð,r   )	r1   r2   r3   r4   r9   rA   rD   rG   r5   r6   s   @r   r   r   ^   so   ø€ € € € € ðð ðð ð ð ð ð$ð $ð $ð-ð -ð -ð-ð -ð -ð -ð -ð -ð -r   r   rE   c                  ó   — e Zd ZdZd„ Zd„ ZdS )r   aW  
    A simple counter that can produce unique numbers (in ascending order)
    regardless of how many instances exist.

    Instantiate and then call it.

    >>> sc = common.SingletonCounter()
    >>> v0 = sc()
    >>> v1 = sc()
    >>> v1 > v0
    True
    >>> sc2 = common.SingletonCounter()
    >>> v2 = sc2()
    >>> v2 > v1
    True
    c                ó   — d S r   r   ©r   s    r   r9   zSingletonCounter.__init__‹   s   € Øˆr   c                óJ   — t           d         }t           dxx         dz  cc<   |S )NrE   é   )Ú_singletonCounter)r   Úposts     r   Ú__call__zSingletonCounter.__call__Ž   s-   € Ý  Ô)ˆÝ˜'Ð"Ð"Ô" aÑ'Ð"Ð"Ñ"Øˆr   N)r1   r2   r3   r4   r9   rO   r   r   r   r   r   z   s<   € € € € € ðð ð ð ð ðð ð ð ð r   r   c                  ó4   — e Zd ZU dZdZded<   d„ Zd„ Zd„ ZdS )	r   a¼  
    Provides template for classes implementing slots allowing it to be pickled
    properly, even if there are weakrefs in the slots, or it is subclassed
    by something that does not define slots.

    Only use SlottedObjectMixins for objects that we expect to make so many of
    that memory storage and speed become an issue. Thus, unless you are Xenakis,
    Glissdata is probably not the best example:

    >>> import pickle
    >>> class Glissdata(common.SlottedObjectMixin):
    ...     __slots__ = ('time', 'frequency')
    >>> s = Glissdata()
    >>> s.time = 0.125
    >>> s.frequency = 440.0
    >>> #_DOCS_SHOW out = pickle.dumps(s)
    >>> #_DOCS_SHOW pickleLoad = pickle.loads(out)
    >>> pickleLoad = s #_DOCS_HIDE -- cannot define classes for pickling in doctests
    >>> pickleLoad.time, pickleLoad.frequency
    (0.125, 440.0)

    OMIT_FROM_DOCS

    >>> class BadSubclass(Glissdata):
    ...     pass

    >>> bsc = BadSubclass()
    >>> bsc.amplitude = 2
    >>> #_DOCS_SHOW out = pickle.dumps(bsc)
    >>> #_DOCS_SHOW outLoad = pickle.loads(out)
    >>> outLoad = bsc #_DOCS_HIDE -- cannot define classes for pickling in doctests
    >>> outLoad.amplitude
    2

    This is in OMIT
    r   útuple[str, ...]Ú	__slots__c                ó8  — t          | dd ¦  «        �| j                             ¦   «         }ni }|                      ¦   «         }|D ]U}t          | |d ¦  «        }t	          |t
          j        ¦  «        r# |¦   «         }t          d| ›d|› d�dz   ¦  «         |||<   ŒV|S )NÚ__dict__z#Warning: uncaught weakref found in z - z, zwill not be wrapped again)ÚgetattrrT   ÚcopyÚ_getSlotsRecursiveÚ
isinstanceÚweakrefÚReferenceTypeÚprint)r   ÚstateÚslotsÚslotÚsValues        r   Ú__getstate__zSlottedObjectMixin.__getstate__Â   s¿   € Ý�4˜ TÑ*Ô*Ð6Ø”M×&Ò&Ñ(Ô(ˆEˆEàˆEØ×'Ò'Ñ)Ô)ˆØð 	!ð 	!ˆDÝ˜T 4¨Ñ.Ô.ˆFÝ˜&¥'Ô"7Ñ8Ô8ð 5Ø˜™œ�ÝÐO¸DÐOÐOÀtÐOÐOÐOØ3ñ4ñ 5ô 5ð 5à ˆE�$‰KˆKØˆr   c                ó\   — |                      ¦   «         D ]\  }}t          | ||¦  «         Œd S r   )r   Úsetattr)r   r\   r^   rE   s       r   Ú__setstate__zSlottedObjectMixin.__setstate__Ñ   s<   € Ø Ÿ;š;™=œ=ð 	'ð 	'‰KˆD�%Ý�D˜$ Ñ&Ô&Ð&Ð&ð	'ð 	'r   c                ó¢   — t          ¦   «         }| j                             ¦   «         D ]&}|                     t	          |dd¦  «        ¦  «         Œ'|S )aA  
        Find all slots recursively.

        A private attribute so as not to change the contents of inheriting
        objects private interfaces:

        >>> b = beam.Beam()
        >>> sSet = b._getSlotsRecursive()

        sSet is a set -- independent order.  Thus, for the doctest
        we need to preserve the order:

        >>> sorted(list(sSet))
        ['_editorial', '_style', 'direction', 'id', 'independentAngle', 'number', 'type']

        When a normal Beam won't cut it:

        >>> class FunkyBeam(beam.Beam):
        ...     __slots__ = ('funkiness', 'groovability')

        >>> fb = FunkyBeam()
        >>> sSet = fb._getSlotsRecursive()
        >>> sorted(list(sSet))
        ['_editorial', '_style', 'direction', 'funkiness', 'groovability',
            'id', 'independentAngle', 'number', 'type']
        rR   r   )Úsetr   ÚmroÚupdaterU   )r   r]   Úclss      r   rW   z%SlottedObjectMixin._getSlotsRecursiveÕ   sP   € õ6 ‘”ˆØ”>×%Ò%Ñ'Ô'ð 	8ð 	8ˆCØ�LŠL�  k°2Ñ6Ô6Ñ7Ô7Ð7Ð7Øˆr   N)	r1   r2   r3   r4   rR   Ú__annotations__r`   rc   rW   r   r   r   r   r   –   sa   € € € € € € ð#ð #ðN "$€IÐ#Ð#Ð#Ñ#ðð ð ð'ð 'ð 'ðð ð ð ð r   r   c                  ó.   — e Zd ZU dZdZded<   d„ Zd„ ZdS )r   zâ
    Same as above, but __eq__ and __ne__ functions are defined based on the slots.

    Slots are the only things compared, so do not mix with a __dict__ based object.

    The equal comparison ignores differences in .id
    r   rQ   rR   c                óÌ   — t          | ¦  «        t          |¦  «        urdS |                      ¦   «         D ].}|dk    rŒ	t          | |¦  «        t          ||¦  «        k    r dS Œ/dS )NFÚidT)ÚtyperW   rU   )r   ÚotherÚthisSlots      r   Ú__eq__zEqualSlottedObjectMixin.__eq__   sx   € Ý�‰:Œ:�T %™[œ[Ð(Ð(Ø�5Ø×/Ò/Ñ1Ô1ð 	ð 	ˆHØ˜4ÒÐØÝ�t˜XÑ&Ô&­'°%¸Ñ*BÔ*BÒBÐBØ�u�uð Càˆtr   c                ó   — | |k     S )zS
        Defining __ne__ explicitly so that it inherits the same as __eq__
        r   )r   rn   s     r   Ú__ne__zEqualSlottedObjectMixin.__ne__
  s   € ð ˜E’MÐ"Ð"r   N)r1   r2   r3   r4   rR   ri   rp   rr   r   r   r   r   r   ö   sQ   € € € € € € ðð ð "$€IÐ#Ð#Ð#Ñ#ðð ð ð#ð #ð #ð #ð #r   r   c                  ób   ‡ — e Zd ZU dZded<   ddd„Zdˆ fd
„Zdˆ fd„Zˆ fd„Zˆ fd„Z	dd„Z
ˆ xZS )r	   r   rQ   rR   NÚreturnÚboolc                ó&  — |dk    rdS t          | dd¦  «        sdS t          j        ¦   «         D ]F}|j        j        j        dv r1d|j        j        v r#|j        j        d         j        | j        k    r dS ŒGt          d| j        j	        › d�¦  «        ‚)Nr   TÚfrozen)r9   Ú__new__rc   r   zThis z instance is immutable.)
rU   ÚinspectÚstackÚframeÚf_codeÚco_nameÚf_localsr   Ú	TypeErrorr1   )r   r   Ústs      r   Ú_check_initzFrozenObject._check_init  s¤   € Ø�+ÒÐØ�4Ý�t˜X tÑ,Ô,ð 	Ø�4å”-‘/”/ð 	ð 	ˆBØ””Ô'Ð+RÐRÐRØ "¤(Ô"3Ð3Ð3ØœÔ)¨&Ô1Ô;¸t¼~ÒMÐMØ�t�tøÝÐP ¤Ô 7ÐPÐPÐPÑQÔQÐQr   r   Ústrc                óv   •— |                       |¦  «         t          ¦   «                              ||¦  «         d S r   )r�   r   Ú__setattr__©r   r   rE   r   s      €r   r„   zFrozenObject.__setattr__#  s7   ø€ Ø×Ò˜ÑÔÐÝ‰Œ×Ò˜C Ñ'Ô'Ð'Ð'Ð'r   c                ót   •— |                       |¦  «         t          ¦   «                              |¦  «         d S r   )r�   r   Ú__delattr__©r   r   r   s     €r   r‡   zFrozenObject.__delattr__'  s5   ø€ Ø×Ò˜ÑÔÐÝ‰Œ×Ò˜CÑ Ô Ð Ð Ð r   c                óÖ   •— t          t          ¦   «         d¦  «        r6|                      ¦   «          t          ¦   «                              ||¦  «         t	          | j        › d�¦  «        ‚)NrD   ú object is not subscriptable)Úhasattrr   r�   rD   r   r   r…   s      €r   rD   zFrozenObject.__setitem__+  s^   ø€ Ý•5‘7”7˜MÑ*Ô*ð 	,Ø×ÒÑÔÐÝ‰GŒG×Ò  UÑ+Ô+Ð+Ý˜4œ>ÐGÐGÐGÑHÔHÐHr   c                óÔ   •— t          t          ¦   «         d¦  «        r5|                      ¦   «          t          ¦   «                              |¦  «         t	          | j        › d�¦  «        ‚)NÚ__delitem__rŠ   )r‹   r   r�   r�   r   r   rˆ   s     €r   r�   zFrozenObject.__delitem__1  s\   ø€ Ý•5‘7”7˜MÑ*Ô*ð 	%Ø×ÒÑÔÐÝ‰GŒG×Ò Ñ$Ô$Ð$Ý˜4œ>ÐGÐGÐGÑHÔHÐHr   Úintc                ó¶   — g }|                       ¦   «         D ]'}|                     |t          | |¦  «        f¦  «         Œ(t          t	          |¦  «        ¦  «        S r   )rW   r>   rU   ÚhashÚtuple)r   ÚoutÚss      r   Ú__hash__zFrozenObject.__hash__7  sZ   € ØˆØ×(Ò(Ñ*Ô*ð 	.ð 	.ˆAØ�JŠJ˜�7 4¨Ñ+Ô+Ð,Ñ-Ô-Ð-Ð-Ý•E˜#‘J”JÑÔÐr   r   )rt   ru   )r   r‚   )rt   rŽ   )r1   r2   r3   rR   ri   r�   r„   r‡   rD   r�   r”   r5   r6   s   @r   r	   r	     sÜ   ø€ € € € € € Ø!#€IÐ#Ð#Ð#Ñ#ðRð Rð Rð Rð Rð(ð (ð (ð (ð (ð (ð!ð !ð !ð !ð !ð !ðIð Ið Ið Ið IðIð Ið Ið Ið Ið ð  ð  ð  ð  ð  ð  ð  r   r	   c                  ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	r
   aG  
    An object for timing. Call it to get the current time since starting.

    >>> timer = common.Timer()
    >>> now = timer()
    >>> import time  #_DOCS_HIDE
    >>> time.sleep(0.01)  #_DOCS_HIDE  -- some systems are extremely fast or have wide deltas
    >>> nowNow = timer()
    >>> nowNow > now
    True

    Call `stop` to stop it. Calling `start` again will reset the number

    >>> timer.stop()
    >>> stopTime = timer()
    >>> stopNow = timer()
    >>> stopTime == stopNow
    True

    All this had better take less than one second!

    >>> stopTime < 1
    True
    c                óR   — t          j         ¦   «         | _        d| _        d | _        d S ©Nr   )ÚtimeÚ_tStartÚ_tDifÚ_tStoprJ   s    r   r9   zTimer.__init__X  s!   € å”y‘{”{ˆŒØˆŒ
ØˆŒˆˆr   c                óR   — t          j         ¦   «         | _        d| _        d| _        dS )zu
        Explicit start method; will clear previous values.

        Start always happens on initialization.
        Nr   )r˜   r™   r›   rš   rJ   s    r   ÚstartzTimer.start^  s#   € õ ”y‘{”{ˆŒØˆŒØˆŒ
ˆ
ˆ
r   c                ó^   — t          j         ¦   «         | _        | j        | j        z
  | _        d S r   )r˜   r›   r™   rš   rJ   s    r   Ústopz
Timer.stoph  s#   € Ý”i‘k”kˆŒØ”[ 4¤<Ñ/ˆŒ
ˆ
ˆ
r   c                ó0   — d | _         d| _        d | _        d S r—   )r›   rš   r™   rJ   s    r   ÚclearzTimer.clearl  s   € ØˆŒØˆŒ
ØˆŒˆˆr   c                óZ   — | j         €t          j        ¦   «         | j        z
  }n| j        }|S )zD
        Reports current time or, if stopped, stopped time.
        )r›   r˜   r™   rš   ©r   ÚtimeDifferences     r   rO   zTimer.__call__q  s-   € ð
 Œ;ÐÝ!œY™[œ[¨4¬<Ñ7ˆNˆNà!œZˆNØÐr   c                ó�   — | j         €t          j        ¦   «         | j        z
  }n| j        }t	          t          |d¦  «        ¦  «        S )Né   )r›   r˜   r™   rš   r‚   Úroundr£   s     r   Ú__str__zTimer.__str__|  s=   € ØŒ;ÐÝ!œY™[œ[¨4¬<Ñ7ˆNˆNà!œZˆNÝ•5˜¨Ñ+Ô+Ñ,Ô,Ð,r   N)
r1   r2   r3   r4   r9   r�   rŸ   r¡   rO   r¨   r   r   r   r
   r
   ?  sx   € € € € € ðð ð0ð ð ðð ð ð0ð 0ð 0ðð ð ð
	ð 	ð 	ð-ð -ð -ð -ð -r   r
   Ú__main__)Ú
__future__r   Ú__all__Úcollectionsry   r˜   rY   ÚCounterr   rC   r   rM   r   r   r   r	   r
   r1   Úmusic21ÚmainTestr   r   r   ú<module>r°      sÍ  ðð #Ð "Ð "Ð "Ð "Ð "ðð ð €ð Ð Ð Ð Ø €€€Ø €€€Ø €€€ð>ð >ð >ð >ð >�kÔ)ñ >ô >ð >ðB-ð -ð -ð -ð -�$ñ -ô -ð -ð2 ˜a�LÐ ðð ð ð ð ñ ô ð ð8]ð ]ð ]ð ]ð ]ñ ]ô ]ð ]ð@#ð #ð #ð #ð #Ð0ñ #ô #ð #ð:( ð ( ð ( ð ( ð ( Ð*ñ ( ô ( ð ( ðXB-ð B-ð B-ð B-ð B-ñ B-ô B-ð B-ðJ ˆzÒÐØ€N€N€NØ€GÔÑÔÐÐÐð Ðr   