§
    ƒØjÕd  ã            	      óJ  — U d Z ddlmZ ddlmZm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 ej        rdd
l	mZ  ej        d¦  «        ZdZ G d„ dej        ¦  «        Z G d„ de
j        ¦  «        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¦  «        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¦  «        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#¦  «        Z& G d/„ d0e#¦  «        Z' G d1„ d2e#¦  «        Z( G d3„ d4e¦  «        Z) G d5„ d6e)¦  «        Z* G d7„ d8e)¦  «        Z+ G d9„ d:e)¦  «        Z, G d;„ d<e)¦  «        Z- G d=„ d>e)¦  «        Z.deee"ddgde$e%e&e'e(gddde*e+e.gdddddegd?œZ/d@e0dA<   dKdLdC„Z1	 	 dMdNdG„Z2 G dH„ dIej3        ¦  «        Z4eee+gZ5e6dJk    rddl	Z	 e	j7        e4¦  «         dS dS )OzÕ
This module defines numerous subclasses of
:class:`~music21.clef.Clef`, providing object representations for all
commonly used clefs. Clef objects are often found
within :class:`~music21.stream.Measure` objects.
é    )Úannotations)ÚIterableÚSequenceN)Úbase)Úexceptions21)Úenvironment)Úpitch)Ústyle)ÚstreamÚclefé#   c                  ó   — e Zd ZdS )ÚClefExceptionN)Ú__name__Ú
__module__Ú__qualname__© ó    ú�/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/clef.pyr   r   (   s   € € € € € Ø€Dr   r   c                  ó¸   ‡ — e Zd ZU dZdZdddœZded<   ej        Z	dZ
dˆ fd„Zd„ Zedd„¦   «         Zej        dd„¦   «         Zedd„¦   «         Zdddœd d„Zˆ xZS )!ÚClefaŠ  
    A Clef is a basic `music21` object for representing musical clefs
    (Treble, Bass, etc.)

    Some clefs only represent the graphical element of the clef,
    such as G clef, which is subclassed by TrebleClef() and FrenchViolinClef().

    >>> tc = clef.TrebleClef()
    >>> tc
    <music21.clef.TrebleClef>
    >>> tc.sign
    'G'
    >>> tc.line
    2

    Most clefs also have a "lowestLine" function which represents the
    :attr:`~music21.pitch.Pitch.diatonicNoteNum` of the note that would fall on the
    lowest line if the Clef were put on a five-line staff. (Where C4,C#4,C##4,C-4
    etc. = 29, all types of D4 = 30, etc.)

    >>> tc.lowestLine
    31

    **Equality**

    Two Clefs are equal if their class is the same, their sign is the same,
    their line is the same and their octaveChange is the same.

    >>> c1 = clef.PercussionClef()
    >>> c2 = clef.NoClef()
    >>> c1 == c2
    False
    >>> c3 = clef.TrebleClef()
    >>> c4 = clef.TrebleClef()
    >>> c3 == c4
    True
    >>> c4.octaveChange = -1
    >>> c3 == c4
    False

    Note that these are not equal:

    >>> clef.TrebleClef() == clef.GClef(line=2)
    False
    )ÚsignÚlineÚoctaveChangea¾  
            The sign of the clef, generally, 'C', 'G', 'F', 'percussion', 'none' or None.

            >>> alto = clef.AltoClef()
            >>> alto.sign
            'C'
            >>> percussion = clef.PercussionClef()
            >>> percussion.sign
            'percussion'

            Note the difference here:

            >>> clef.Clef().sign is None
            True
            >>> clef.NoClef().sign
            'none'

            a  
            The line, counting from the bottom up, that the clef resides on.

            >>> clef.AltoClef().line
            3
            >>> clef.TenorClef().line
            4

            May be None:

            >>> print(clef.NoClef().line)
            None
            )r   r   údict[str, str]Ú	_DOC_ATTRr   ÚreturnÚNonec                ód   •—  t          ¦   «         j        di |¤Ž d | _        d | _        d| _        d S )Nr   r   )ÚsuperÚ__init__r   r   Ú_octaveChange©ÚselfÚkeywordsÚ	__class__s     €r   r!   zClef.__init__‚   s<   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$Ø"ˆŒ	à"ˆŒ	Ø"#ˆÔÐÐr   c                ó   — dS )NÚ r   ©r$   s    r   Ú_reprInternalzClef._reprInternal‹   s   € Øˆrr   Úintc                ó   — | j         S )zÓ
        The number of octaves that the clef "transposes", generally 0.

        >>> tc = clef.TrebleClef()
        >>> tc.octaveChange
        0
        >>> clef.Treble8vbClef().octaveChange
        -1
        ©r"   r)   s    r   r   zClef.octaveChangeŽ   s   € ð Ô!Ð!r   ÚnewValuec                ó   — || _         d S ©Nr-   )r$   r.   s     r   r   zClef.octaveChange›   s   € à%ˆÔÐÐr   Ústrc                ó”   — | j         j                             dd¦  «        }|r%|d                              ¦   «         |dd…         z   S dS )as  
        Returns the "name" of the clef, from the class name

        >>> tc = clef.TrebleClef()
        >>> tc.name
        'treble'

        >>> tc = clef.Treble8vbClef()
        >>> tc.name
        'treble8vb'

        >>> tc = clef.MezzoSopranoClef()
        >>> tc.name
        'mezzoSoprano'

        OMIT_FROM_DOCS

        >>> clef.Clef().name
        ''
        r   r(   r   é   N)r&   r   ÚreplaceÚlower)r$   Ú	classNames     r   Únamez	Clef.nameŸ   sN   € ð, ”NÔ+×3Ò3°F¸BÑ?Ô?ˆ	Øð 	Ø˜Q”<×%Ò%Ñ'Ô'¨)°A°B°B¬-Ñ7Ð7à�2r   TF©ÚfirstLastOnlyÚextremePitchOnlyÚpitchesú#pitch.Pitch | Sequence[pitch.Pitch]r9   Úboolr:   c               ó´  — t          |t          j        ¦  «        r|g}n|}|st          d¦  «        ‚|r)t	          |d„ ¬¦  «        }t          |d„ ¬¦  «        }||g}n(|r$t          |¦  «        dk    r|d         |d         g}n|}d}t          | t          t          f¦  «        r| j	        �| j	        d	z   }	nt          }	|D ]}
|
j        |	z
  }||z  }Œ|dk    rd
S dS )aˆ  
        Return a string representing the stem direction for a single
        :class:`~music21.pitch.Pitch` object or a list/tuple/Stream of pitches.

        >>> P = pitch.Pitch
        >>> bc = clef.BassClef()
        >>> bc.getStemDirectionForPitches(P('C3'))
        'up'

        For two pitches, the most extreme pitch determines the direction:

        >>> pitchList = [P('C3'), P('B3')]
        >>> bc.getStemDirectionForPitches(pitchList)
        'down'

        If `firstLastOnly` is True (as by default) then only the first and last pitches are
        examined, as in a beam group.  Here we have C3, B3, C3, so despite the B in bass
        clef being much farther from the center line than either of the Cs, it is stem up:

        >>> pitchList.append(P('C3'))
        >>> bc.getStemDirectionForPitches(pitchList)
        'up'

        If `firstLastOnly` is False, then each of the pitches has a weight on the process

        >>> bc.getStemDirectionForPitches(pitchList, firstLastOnly=False)
        'down'

        If extremePitchOnly is True, then whatever pitch is farthest from the center line
        determines the direction, regardless of order.  (default False).

        >>> bc.getStemDirectionForPitches(pitchList, extremePitchOnly=True)
        'down'
        >>> pitchList.insert(1, P('C2'))
        >>> bc.getStemDirectionForPitches(pitchList, extremePitchOnly=True)
        'up'
        z:getStemDirectionForPitches cannot operate on an empty listc                ó   — | j         S r0   ©ÚdiatonicNoteNum©Úpps    r   ú<lambda>z1Clef.getStemDirectionForPitches.<locals>.<lambda>ó   ó	   € °RÔ5G€ r   )Úkeyc                ó   — | j         S r0   r@   rB   s    r   rD   z1Clef.getStemDirectionForPitches.<locals>.<lambda>ô   rE   r   r3   r   éÿÿÿÿNé   ÚdownÚup)Ú
isinstancer	   ÚPitchÚ
ValueErrorÚminÚmaxÚlenÚPercussionClefÚ	PitchClefÚ
lowestLineÚTREBLE_MID_LINE_DNNrA   )r$   r;   r9   r:   Ú	pitchListÚpitchMinÚpitchMaxÚrelevantPitchesÚdifferenceSumÚmidLineÚpÚdistanceFromMidLines               r   ÚgetStemDirectionForPitcheszClef.getStemDirectionForPitches»   s'  € õ\ �g�uœ{Ñ+Ô+ð 	 Ø ˜	ˆIˆIàˆIð ð 	[ÝÐYÑZÔZÐZàð 	(Ý˜9Ð*GÐ*GÐHÑHÔHˆHÝ˜9Ð*GÐ*GÐHÑHÔHˆHØ'¨Ð2ˆOˆOØð 	(�s 9™~œ~°Ò1Ð1Ø(¨œ|¨Y°r¬]Ð;ˆOˆOà'ˆOàˆå�d�^­YÐ7Ñ8Ô8ð 	*¸T¼_Ð=XØ”o¨Ñ)ˆGˆGå)ˆGà ð 	1ð 	1ˆAØ"#Ô"3°gÑ"=ÐØÐ0Ñ0ˆMˆMà˜AÒÐØ�6à�4r   ©r   r   ©r   r+   ©r.   r+   )r   r1   )r;   r<   r9   r=   r:   r=   r   r1   )r   r   r   Ú__doc__ÚequalityAttributesr   Ú__annotations__r
   Ú	TextStyleÚ_styleClassÚclassSortOrderr!   r*   Úpropertyr   Úsetterr7   r^   Ú__classcell__©r&   s   @r   r   r   -   s.  ø€ € € € € € ð,ð ,ðZ :Ððð$ð' !ð  !€Ið  ð  ð  ñ  ðD ”/€KØ€Nð$ð $ð $ð $ð $ð $ðð ð ð ð
"ð 
"ð 
"ñ „Xð
"ð Ôð&ð &ð &ñ Ôð&ð ðð ð ñ „Xðð> #Ø!&ðNð Nð Nð Nð Nð Nð Nð Nð Nð Nr   r   c                  óv   ‡ — e Zd ZU dZddiZded<   dˆ fd„Zedˆ fd
„¦   «         Zej	        dd„¦   «         Zˆ xZ
S )rS   zD
    Superclass for all other clef subclasses that use pitches.
    rT   z©
            The diatonicNoteNumber of the lowest line of the clef.
            (Can be `None`)

            >>> clef.TrebleClef().lowestLine
            31
            r   r   r   r   c                óH   •—  t          ¦   «         j        di |¤Ž d| _        d S )Né   r   )r    r!   rT   r#   s     €r   r!   zPitchClef.__init__  s+   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$Ø!ˆŒˆˆr   r+   c                ó*   •— t          ¦   «         j        S )aË  
        The number of octaves that the clef "transposes", generally 0.

        >>> tc = clef.TrebleClef()
        >>> tc.octaveChange
        0
        >>> clef.Treble8vbClef().octaveChange
        -1

        Changing octaveChange changes lowestLine (but not vice versa)

        >>> tc.lowestLine
        31
        >>> tc.octaveChange = 1
        >>> tc.lowestLine
        38
        >>> tc.octaveChange = -1
        >>> tc.lowestLine
        24
        )r    r   )r$   r&   s    €r   r   zPitchClef.octaveChange#  s   ø€ õ, ‰wŒwÔ#Ð#r   r.   c                ó`   — | j         }|| _         | j        �| xj        ||z
  dz  z  c_        d S d S )Né   )r"   rT   )r$   r.   ÚoldOctaveChanges      r   r   zPitchClef.octaveChange;  s@   € àÔ,ˆØ%ˆÔØŒ?Ð&ØˆOŒO ¨?Ñ :¸aÑ?Ñ?ˆOŒOˆOˆOð 'Ð&r   r_   r`   ra   )r   r   r   rb   r   rd   r!   rh   r   ri   rj   rk   s   @r   rS   rS     sÄ   ø€ € € € € € ðð ð 	ð ð!€Ið ð ð ñ ð"ð "ð "ð "ð "ð "ð ð$ð $ð $ð $ð $ñ „Xð$ð. Ôð@ð @ð @ñ Ôð@ð @ð @ð @ð @r   rS   c                  ó2   ‡ — e Zd ZU dZi Zded<   ˆ fd„Zˆ xZS )rR   aô  
    represents a Percussion clef.

    >>> pc = clef.PercussionClef()
    >>> pc.sign
    'percussion'
    >>> pc.line is None
    True

    Percussion clefs should not, technically have a
    "lowestLine," but it is a common usage to assume that
    in pitch-centric contexts to use the pitch numbers
    from treble clef for percussion clefs.  Thus:

    >>> pc.lowestLine == clef.TrebleClef().lowestLine
    True

    * Changed in v7.3: setting `octaveChange` no longer affects `lowestLine`.
    r   r   c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )NÚ
percussionrn   r   )r    r!   r   rT   r#   s     €r   r!   zPercussionClef.__init__Y  s2   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$Ø ˆŒ	Ø%ˆŒˆˆr   ©r   r   r   rb   r   rd   r!   rj   rk   s   @r   rR   rR   C  sW   ø€ € € € € € ðð ð& !#€IÐ"Ð"Ð"Ñ"ð&ð &ð &ð &ð &ð &ð &ð &ð &r   rR   c                  ó2   ‡ — e Zd ZU dZi Zded<   ˆ fd„Zˆ xZS )ÚNoClefzÆ
    represents the absence of a Clef.

    >>> nc = clef.NoClef()
    >>> nc.sign
    'none'

    Note that the sign is the string 'none' not the None object

    >>> nc.sign is None
    False
    r   r   c                óH   •—  t          ¦   «         j        di |¤Ž d| _        d S )NÚnoner   ©r    r!   r   r#   s     €r   r!   zNoClef.__init__n  s+   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆŒ	ˆ	ˆ	r   rv   rk   s   @r   rx   rx   _  sW   ø€ € € € € € ðð ð !#€IÐ"Ð"Ð"Ñ"ðð ð ð ð ð ð ð ð r   rx   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )Ú
JianpuClefz§
    Jianpu notation does not use a clef, but musicxml marks it
    with a specialized "jianpu" sign.

    >>> jc = clef.JianpuClef()
    >>> jc.sign
    'jianpu'
    c                óH   •—  t          ¦   «         j        di |¤Ž d| _        d S )NÚjianpur   r{   r#   s     €r   r!   zJianpuClef.__init__}  s+   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆŒ	ˆ	ˆ	r   ©r   r   r   rb   r!   rj   rk   s   @r   r}   r}   s  sB   ø€ € € € € ðð ðð ð ð ð ð ð ð ð r   r}   c                  ó2   ‡ — e Zd ZdZˆ fd„Zdddœdd„Zˆ xZS )ÚTabClefz[
    represents a Tablature clef.

    >>> a = clef.TabClef()
    >>> a.sign
    'TAB'
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )NÚTABé   r   )r    r!   r   r   r#   s     €r   r!   zTabClef.__init__‹  s2   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆŒ	ØˆŒ	ˆ	ˆ	r   TFr8   rV   ú#pitch.Pitch | Iterable[pitch.Pitch]r9   r=   r:   r   r1   c               ó   — dS )zE
        Overridden to simply return 'down' for guitar tabs.
        rJ   r   )r$   rV   r9   r:   s       r   r^   z"TabClef.getStemDirectionForPitches�  s	   € ð ˆvr   )rV   r†   r9   r=   r:   r=   r   r1   )r   r   r   rb   r!   r^   rj   rk   s   @r   r‚   r‚   ‚  sh   ø€ € € € € ðð ðð ð ð ð ð #Ø!&ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r   r‚   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚGClefz®
    A generic G Clef

    >>> a = clef.GClef()
    >>> a.sign
    'G'

    If not defined, the lowestLine is set as a Treble Clef (E4 = 31)

    >>> a.lowestLine
    31
    c                óH   •—  t          ¦   «         j        di |¤Ž d| _        d S )NÚGr   r{   r#   s     €r   r!   zGClef.__init__­  ó+   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆŒ	ˆ	ˆ	r   r€   rk   s   @r   r‰   r‰   Ÿ  sB   ø€ € € € € ðð ðð ð ð ð ð ð ð ð r   r‰   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚFrenchViolinClefzÜ
    A G Clef that appears in many old French Violin scores,
    appearing on the lowest line, and thus higher than
    a treble clef.

    >>> a = clef.FrenchViolinClef()
    >>> a.sign
    'G'
    >>> a.line
    1
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Nr3   é!   r   ©r    r!   r   rT   r#   s     €r   r!   zFrenchViolinClef.__init__¿  ó2   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆŒ	Ø%ˆŒˆˆr   r€   rk   s   @r   rŽ   rŽ   ²  óB   ø€ € € € € ð
ð 
ð&ð &ð &ð &ð &ð &ð &ð &ð &r   rŽ   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )Ú
TrebleClefzÑ
    The most common clef of all, a treble clef.

    >>> a = clef.TrebleClef()
    >>> a.sign
    'G'
    >>> a.line
    2
    >>> a.lowestLine
    31
    >>> note.Note('E4').pitch.diatonicNoteNum
    31
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Né   rn   r   r‘   r#   s     €r   r!   zTrebleClef.__init__Ô  r’   r   r€   rk   s   @r   r•   r•   Å  sB   ø€ € € € € ðð ð&ð &ð &ð &ð &ð &ð &ð &ð &r   r•   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚTreble8vbClefz�
    A vocal tenor treble clef. Also for guitars.

    >>> a = clef.Treble8vbClef()
    >>> a.sign
    'G'
    >>> a.octaveChange
    -1
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )NrH   é   r   ©r    r!   r   rT   r#   s     €r   r!   zTreble8vbClef.__init__å  s3   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆÔØ%ˆŒˆˆr   r€   rk   s   @r   r™   r™   Ú  óB   ø€ € € € € ðð ð&ð &ð &ð &ð &ð &ð &ð &ð &r   r™   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚTreble8vaClefz‘
    A treble clef an octave up (such as for piccolos)

    >>> a = clef.Treble8vaClef()
    >>> a.sign
    'G'
    >>> a.octaveChange
    1
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Nr3   r›   r   rœ   r#   s     €r   r!   zTreble8vaClef.__init__ö  s3   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆÔØ%ˆŒˆˆr   r€   rk   s   @r   rŸ   rŸ   ë  r�   r   rŸ   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚGSopranoClefz¥
    A G clef on the middle line, formerly occasionally used
    for soprano parts.

    >>> a = clef.GSopranoClef()
    >>> a.sign
    'G'
    >>> a.line
    3
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Né   é   r   r‘   r#   s     €r   r!   zGSopranoClef.__init__  r’   r   r€   rk   s   @r   r¢   r¢   ü  óB   ø€ € € € € ð	ð 	ð&ð &ð &ð &ð &ð &ð &ð &ð &r   r¢   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚCClefz]
    A generic C Clef, with no line set

    >>> a = clef.CClef()
    >>> a.sign
    'C'
    c                óH   •—  t          ¦   «         j        di |¤Ž d| _        d S )NÚCr   r{   r#   s     €r   r!   zCClef.__init__  rŒ   r   r€   rk   s   @r   r¨   r¨     óB   ø€ € € € € ðð ðð ð ð ð ð ð ð ð r   r¨   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚSopranoClefz™
    A soprano clef, with C on the lowest line
    (found in Bach often)

    >>> a = clef.SopranoClef()
    >>> a.sign
    'C'
    >>> a.line
    1
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Nr3   r¥   r   r‘   r#   s     €r   r!   zSopranoClef.__init__*  r’   r   r€   rk   s   @r   r­   r­     r¦   r   r­   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚMezzoSopranoClefz¥
    A C clef with C on the second line.  Perhaps
    the rarest of the C clefs

    >>> a = clef.MezzoSopranoClef()
    >>> a.sign
    'C'
    >>> a.line
    2
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Nr—   é   r   r‘   r#   s     €r   r!   zMezzoSopranoClef.__init__<  r’   r   r€   rk   s   @r   r°   r°   0  r¦   r   r°   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚAltoClefzs
    A C AltoClef, common for violas.

    >>> a = clef.AltoClef()
    >>> a.sign
    'C'
    >>> a.line
    3
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Nr¤   é   r   r‘   r#   s     €r   r!   zAltoClef.__init__M  r’   r   r€   rk   s   @r   r´   r´   B  r�   r   r´   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )Ú	TenorClefz­
    A C Tenor Clef, often used in bassoon and cello parts
    and orchestral trombone parts.

    >>> a = clef.TenorClef()
    >>> a.sign
    'C'
    >>> a.line
    4

    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )NrI   é   r   r‘   r#   s     €r   r!   zTenorClef.__init__`  r’   r   r€   rk   s   @r   r¸   r¸   S  r“   r   r¸   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚCBaritoneClefzŒ
    A Baritone C clef (as opposed to an F Baritone Clef)

    >>> a = clef.CBaritoneClef()
    >>> a.sign
    'C'
    >>> a.line
    5
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Nr…   é   r   r‘   r#   s     €r   r!   zCBaritoneClef.__init__q  r’   r   r€   rk   s   @r   r¼   r¼   f  r�   r   r¼   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚFClefz]
    A generic F-Clef, like a Bass clef

    >>> a = clef.FClef()
    >>> a.sign
    'F'
    c                óH   •—  t          ¦   «         j        di |¤Ž d| _        d S )NÚFr   r{   r#   s     €r   r!   zFClef.__init__�  rŒ   r   r€   rk   s   @r   rÀ   rÀ   x  r«   r   rÀ   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚFBaritoneClefzÜ
    an F Baritone Clef

    >>> a = clef.FBaritoneClef()
    >>> a.sign
    'F'
    >>> a.line
    3
    >>> b = clef.CBaritoneClef()
    >>> a.lowestLine == b.lowestLine
    True
    >>> a.sign == b.sign
    False
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Nr¤   r¾   r   r‘   r#   s     €r   r!   zFBaritoneClef.__init__–  r’   r   r€   rk   s   @r   rÄ   rÄ   †  sB   ø€ € € € € ðð ð&ð &ð &ð &ð &ð &ð &ð &ð &r   rÄ   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚBassClefzR
    A standard Bass Clef

    >>> a = clef.BassClef()
    >>> a.sign
    'F'
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )NrI   é   r   r‘   r#   s     €r   r!   zBassClef.__init__¥  r’   r   r€   rk   s   @r   rÇ   rÇ   œ  óB   ø€ € € € € ðð ð&ð &ð &ð &ð &ð &ð &ð &ð &r   rÇ   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚBass8vbClefzŒ
    A bass clef configured to be an octave lower.

    >>> a = clef.Bass8vbClef()
    >>> a.sign
    'F'
    >>> a.octaveChange
    -1
    c                ód   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d| _        d S )NrI   rH   rÉ   r   ©r    r!   r   r   rT   r#   s     €r   r!   zBass8vbClef.__init__¶  s:   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆŒ	ØˆÔØ%ˆŒˆˆr   r€   rk   s   @r   rÌ   rÌ   «  sB   ø€ € € € € ðð ð&ð &ð &ð &ð &ð &ð &ð &ð &r   rÌ   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚBass8vaClefzj
    A rarely used Bass Clef an octave higher.

    >>> a = clef.Bass8vaClef()
    >>> a.sign
    'F'
    c                ód   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d| _        d S )NrI   r3   rÉ   r   rÎ   r#   s     €r   r!   zBass8vaClef.__init__Æ  s:   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆŒ	ØˆÔØ%ˆŒˆˆr   r€   rk   s   @r   rÐ   rÐ   ½  sB   ø€ € € € € ðð ð&ð &ð &ð &ð &ð &ð &ð &ð &r   rÐ   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚSubBassClefz[
    An F clef on the top line.

    >>> a = clef.SubBassClef()
    >>> a.sign
    'F'
    c                óV   •—  t          ¦   «         j        di |¤Ž d| _        d| _        d S )Nr…   é   r   r‘   r#   s     €r   r!   zSubBassClef.__init__Ö  r’   r   r€   rk   s   @r   rÓ   rÓ   Í  rÊ   r   rÓ   )r‹   rª   rÂ   r„   z"dict[str, list[type[Clef] | None]]ÚCLASS_FROM_TYPEr   c                óh  — |                       ¦   «         }|                     ¦   «         dv r˜|                     ¦   «         dk    rt          ¦   «         S |                     ¦   «         dk    rt          ¦   «         S |                     ¦   «         dk    rt	          ¦   «         S |                     ¦   «         dk    rt          ¦   «         S t          |¦  «        dk    r1|d                              ¦   «         t          |d         ¦  «        }}�nt          |¦  «        dk    r8|d                              ¦   «         }|d	k    rd}nß|d
k    rd}nÖ|dk    rd}nÍd}nÊt          |¦  «        dk    r¨ddl	m
} |                     ¦   «         }t          |¦  «        D ]l}d|vrŒ||                     ¦   «         k    r|dz   |                     ¦   «         k    rŒ;t          ||¦  «        }t          |t          ¦  «        r |¦   «         c S Œmt          d|z   ¦  «        ‚t          d¦  «        ‚|dk    rU|||f}	|	dk    rt!          ¦   «         S |	dk    rt#          ¦   «         S |	dk    rt%          ¦   «         S |	dk    rt'          ¦   «         S |du s|du rt          d|› d�¦  «        ‚|dk     s|dk    rt          d|›�¦  «        ‚|t(          v rÐt(          |         }
t          |
t*          ¦  «        sJ ‚|
|         €j|d	k    rt-          ¦   «         }nM|d
k    rt/          ¦   «         }n8|dk    rt1          ¦   «         }n#|dk    rt          ¦   «         }nt3          ¦   «         }||_        nV|
|         }t6          j        r|€J ‚t;          |t2          ¦  «        sJ ‚ |¦   «         }nt3          ¦   «         }||_        ||_        |dk    r||_        |S )aM  
    Returns a Clef object given a string like "G2" or "F4" etc.

    Does not refer to a violin/guitar string.

    >>> tc = clef.clefFromString('G2')
    >>> tc
    <music21.clef.TrebleClef>
    >>> nonStandard1 = clef.clefFromString('F1')
    >>> nonStandard1
    <music21.clef.FClef>
    >>> nonStandard1.line
    1
    >>> nonStandard2 = clef.clefFromString('D4')
    >>> nonStandard2
    <music21.clef.PitchClef>
    >>> nonStandard2.sign
    'D'
    >>> nonStandard2.line
    4

    >>> tc8vb = clef.clefFromString('G2', -1)
    >>> tc8vb
    <music21.clef.Treble8vbClef>

    Three special clefs, Tab, Percussion, and None are also supported.

    >>> tabClef = clef.clefFromString('TAB')
    >>> tabClef
    <music21.clef.TabClef>

    Case does not matter.

    >>> tc8vb = clef.clefFromString('g2', -1)
    >>> tc8vb
    <music21.clef.Treble8vbClef>

    >>> percussionClef = clef.clefFromString('Percussion')
    >>> percussionClef
    <music21.clef.PercussionClef>

    >>> noClef = clef.clefFromString('None')
    >>> noClef
    <music21.clef.NoClef>

    Invalid line numbers raise an exception:

    >>> invalidClef = clef.clefFromString('F6')
    Traceback (most recent call last):
    music21.clef.ClefException: line number (second character) must be 1-5;
                do not use this function for clefs on special staves such as 'F6'

    Can find any clef in the module

    >>> clef.clefFromString('Treble')
    <music21.clef.TrebleClef>
    >>> clef.clefFromString('trebleclef')
    <music21.clef.TrebleClef>
    >>> clef.clefFromString('treble8vb')
    <music21.clef.Treble8vbClef>
    )Útabru   rz   r   rØ   ru   rz   r   r—   r   r3   r‹   rÂ   rI   rª   r¤   F)r   r   r   zCould not find clef z)Entry has clef info but no clef specified)r‹   r—   rH   )r‹   r—   r3   )rÂ   rI   rH   )rÂ   rI   r3   zcannot read z$ as clef str, should be G2, F4, etc.r…   ziline number (second character) must be 1-5; do not use this function for clefs on special staves such as Nr„   ) Ústripr5   r‚   rR   rx   r}   rQ   Úupperr+   Úmusic21r   ÚdirÚgetattrrL   Útyper   r™   rŸ   rÌ   rÐ   rÖ   Úlistr‰   rÀ   r¨   rS   r   ÚtÚTYPE_CHECKINGÚ
issubclassr   r   )Ú
clefStringÚoctaveShiftÚxnStrÚthisTypeÚlineNumÚmyselfÚxnLowerÚxÚobjTypeÚparamsÚ	line_listÚclefObjÚClefTypes                r   ÚclefFromStringrð   å  sè  € ð| ×ÒÑÔ€EØ‡{‚{�}„}Ð?Ð?Ð?Ø�;Š;‰=Œ=˜EÒ!Ð!Ý‘9”9ÐØ�[Š[‰]Œ]˜lÒ*Ð*Ý!Ñ#Ô#Ð#Ø�[Š[‰]Œ]˜fÒ$Ð$Ý‘8”8ˆOØ�[Š[‰]Œ]˜hÒ&Ð&Ý‘<”<Ðå
ˆ5�z„z�Q‚€Ø$ QœxŸ~š~Ñ/Ô/µ°U¸1´X±´�7ˆ‰Ý	ˆU‰Œ�qŠˆØ˜”8—>’>Ñ#Ô#ˆØ�sŠ?ˆ?ØˆGˆGØ˜Š_ˆ_ØˆGˆGØ˜Š_ˆ_ØˆGˆGàˆGˆGÝ	ˆU‰Œ�aŠˆØ*Ð*Ð*Ð*Ð*Ð*Ø—+’+‘-”-ˆÝ�V‘”ð 	!ð 	!ˆAØ˜QˆˆØØ˜!Ÿ'š'™)œ)Ò#Ð#¨°&Ñ(8¸A¿GºG¹I¼IÒ(EÐ(EØÝ˜f aÑ(Ô(ˆGÝ˜'¥4Ñ(Ô(ð !Ø�w‘y”yÐ Ð Ð ð!õ Ð2°UÑ:Ñ;Ô;Ð;åÐGÑHÔHÐHà�aÒÐØ˜G [Ð1ˆØ�\Ò!Ð!Ý ‘?”?Ð"Ø�{Ò"Ð"Ý ‘?”?Ð"Ø�|Ò#Ð#Ý‘=”=Ð Ø�{Ò"Ð"Ý‘=”=Ð ð �5ÐÐ˜G uÐ,Ð,ÝÐV¨5ÐVÐVÐVÑWÔWÐWà�‚{€{�g ’k�kÝð VØLQðVð Vñ Wô Wð 	Wð •?Ð"Ð"Ý# HÔ-ˆ	Ý˜)¥TÑ*Ô*Ð*Ð*Ð*Ø�WÔÐ%Ø˜3ŠˆÝ™'œ'��Ø˜S’�Ý™'œ'��Ø˜S’�Ý™'œ'��Ø˜UÒ"Ð"Ý!™)œ)��å#™+œ+�Ø"ˆGŒLˆLà  Ô)ˆHÝŒð 7ØÐ+Ð+Ð+Ý! (­IÑ6Ô6Ð6Ð6Ð6Ø�h‘j”jˆGˆGå‘+”+ˆØˆŒØˆŒà�aÒÐØ*ˆÔà€Nr   FÚ	streamObjústream.Streamc                óÂ  — d„ }d}d}|r|                       ¦   «         n|                      ¦   «         }|j        }|D ]}|j        D ]}	|dz  }| ||	¦  «        z  }ŒŒ |dk    rd}
n||z  }
|
dk    rt	          ¦   «         S |r|
dk    rt          ¦   «         S |s|
dk    rt          ¦   «         S |r|
dk    rt          ¦   «         S |
d	k    rt          ¦   «         S t          ¦   «         S )
aL  
    Returns the clef that is the best fit for notes and chords found in this Stream.

    >>> import random
    >>> a = stream.Stream()
    >>> for x in range(30):
    ...    n = note.Note()
    ...    n.pitch.midi = random.randint(70, 81)
    ...    a.insert(n)
    >>> b = clef.bestClef(a)
    >>> b
    <music21.clef.TrebleClef>
    >>> b.line
    2
    >>> b.sign
    'G'

    >>> c = stream.Stream()
    >>> for x in range(10):
    ...    n = note.Note()
    ...    n.pitch.midi = random.randint(45, 54)
    ...    c.insert(n)
    >>> d = clef.bestClef(c)
    >>> d
    <music21.clef.BassClef>
    >>> d.line
    4
    >>> d.sign
    'F'

    This does not automatically get a flat representation of the Stream.

    There are a lot more high notes in `a` (30) than low notes in `c` (10),
    but it will not matter here, because the pitches in `a` will not be found:

    >>> c.insert(0, a)
    >>> clef.bestClef(c)
    <music21.clef.BassClef>

    But with recursion, it will matter:

    >>> clef.bestClef(c, recurse=True)
    <music21.clef.TrebleClef>

    Notes around middle C can get Treble8vb if the setting is allowed:

    >>> clef.bestClef(stream.Stream([note.Note('D4')]))
    <music21.clef.TrebleClef>
    >>> clef.bestClef(stream.Stream([note.Note('D4')]), allowTreble8vb=True)
    <music21.clef.Treble8vbClef>

    Streams of extremely high notes or extremely low notes can get
    Treble8va or Bass8vb clefs:

    >>> clef.bestClef(stream.Stream([note.Note('D7')]))
    <music21.clef.Treble8vaClef>
    >>> clef.bestClef(stream.Stream([note.Note('C0')]))
    <music21.clef.Bass8vbClef>
    c                óV   — | j         }| j         dk    r|dz  }n| j         dk     r|dz  }|S )Nr�   r¤   r›   éýÿÿÿr@   )ÚpInnerÚheights     r   Ú
findHeightzbestClef.<locals>.findHeight½  s?   € ØÔ'ˆØÔ! BÒ&Ð&Ø�a‰KˆFˆFØÔ# bÒ(Ð(Ø�b‰LˆFØˆr   r   r3   g      =@é1   é    é   é   é
   )	ÚrecurseÚiterÚnotesAndRestsr;   rŸ   r•   r™   rÇ   rÌ   )rñ   ÚallowTreble8vbrþ   rø   ÚtotalPitchesÚtotalHeightÚsIterÚnotesÚnr\   ÚaverageHeights              r   ÚbestClefr  ~  s6  € ð~ð ð ð €LØ€Kà#*Ð@ˆI×ÒÑÔÐ°	·²Ñ0@Ô0@€EàÔ€Eàð )ð )ˆØ”ð 	)ð 	)ˆAØ˜AÑˆLØ˜:˜: a™=œ=Ñ(ˆKˆKð	)ð �qÒÐØˆˆà# lÑ2ˆð �rÒÐÝ‰ŒÐØ	ð 	˜M¨BÒ.Ð.Ý‰|Œ|ÐØð  °Ò 2Ð 2Ý‰|Œ|ÐØ	ð ˜M¨BÒ.Ð.Ý‰ŒÐØ	˜Ò	Ð	Ý‰zŒzÐå‰}Œ}Ðr   c                  ó   — e Zd Zd„ ZdS )ÚTestc                óB   — ddl m}  || t          ¦   «         ¦  «         d S )Nr   )ÚtestCopyAll)Úmusic21.test.commonTestr  Úglobals)r$   r  s     r   ÚtestCopyAndDeepcopyzTest.testCopyAndDeepcopyé  s0   € Ø7Ð7Ð7Ð7Ð7Ð7Øˆ�D�'™)œ)Ñ$Ô$Ð$Ð$Ð$r   N)r   r   r   r  r   r   r   r
  r
  ç  s#   € € € € € ð%ð %ð %ð %ð %r   r
  Ú__main__)r   )r   r   )FF)rñ   rò   r   rS   )8rb   Ú
__future__r   Úcollections.abcr   r   Útypingrà   ÚunittestrÛ   r   r   r   r	   r
   rá   r   ÚEnvironmentÚenvironLocalrU   ÚMusic21Exceptionr   ÚMusic21Objectr   rS   rR   rx   r}   r‚   r‰   rŽ   r•   r™   rŸ   r¢   r¨   r­   r°   r´   r¸   r¼   rÀ   rÄ   rÇ   rÌ   rÐ   rÓ   rÖ   rd   rð   r  ÚTestCaser
  Ú
_DOC_ORDERr   ÚmainTestr   r   r   ú<module>r     s5  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð „?ð ØÐÐÐÐÐð 'ˆ{Ô& vÑ.Ô.€àÐ ð	ð 	ð 	ð 	ð 	�LÔ1ñ 	ô 	ð 	ð
\ð \ð \ð \ð \ˆ4Ôñ \ô \ð \ðH/@ð /@ð /@ð /@ð /@�ñ /@ô /@ð /@ðd&ð &ð &ð &ð &�Tñ &ô &ð &ð8ð ð ð ð ˆTñ ô ð ð(ð ð ð ð �ñ ô ð ðð ð ð ð ˆiñ ô ð ð:ð ð ð ð ˆIñ ô ð ð&&ð &ð &ð &ð &�uñ &ô &ð &ð&&ð &ð &ð &ð &�ñ &ô &ð &ð*&ð &ð &ð &ð &�Jñ &ô &ð &ð"&ð &ð &ð &ð &�Jñ &ô &ð &ð"&ð &ð &ð &ð &�5ñ &ô &ð &ð(ð ð ð ð ˆIñ ô ð ð&ð &ð &ð &ð &�%ñ &ô &ð &ð$&ð &ð &ð &ð &�uñ &ô &ð &ð$&ð &ð &ð &ð &ˆuñ &ô &ð &ð"&ð &ð &ð &ð &�ñ &ô &ð &ð&&ð &ð &ð &ð &�Eñ &ô &ð &ð$ð ð ð ð ˆIñ ô ð ð&ð &ð &ð &ð &�Eñ &ô &ð &ð,&ð &ð &ð &ð &ˆuñ &ô &ð &ð&ð &ð &ð &ð &�%ñ &ô &ð &ð$&ð &ð &ð &ð &�%ñ &ô &ð &ð &ð &ð &ð &ð &�%ñ &ô &ð &ð" Ð  *¨l¸DÀ$Ð	GØ
�Ð-¨x¸ÀMÐ	RØ
��d˜M¨8°[Ð	AØ�$˜˜d D¨'Ð2ð	5ð 5€ð ð ð ñ ðVð Vð Vð Vð Vðt "Øðdð dð dð dð dðR%ð %ð %ð %ð %ˆ8Ôñ %ô %ð %ð �J Ð)€
ð ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   