
    3j-                      U d Z ddlmZ ddlmZ ddlZddlZddlZddlZ	ddlm
Z
 ddlZddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ e	j2                  rddlmZ  ej6                  d      Ze	j:                  d   ZddddddddZde d<   dZ!dddd d!d"d#dZ"d$e d%<   h d&Z#d'e d(<   dd)dd*ddd+dZ$de d,<   d-Z%d+Z&d.Z'd/Z(d0d1d2d3d4d5d6d7d8d9d:d;d<d=Z)e)jU                         D  ci c]  \  } }|| 
 c}} Z+ ed4 e,d>       e,d>      z   fd3d? e,d>      z   fd2 e,d>      fd:d? e,d@      z   fdAd9 e,d@      fd8 e,dB       e,dB      z   fdCd6 e,dB      fd<dD e,d@      z   fdEd; e,d@      fdFg      Z-i dGdHdIdJdKdLdMdNdOdPdQdRdSdRdTdUdVdWdXdYdZd[d\d[d]d[d^d_d`d_dad_dbd_dcdcdcdddddddddeZ.df Z/ e/       Z0ddgZ1ddhZ2	 	 	 	 ddiZ3ddjZ4ddkZ5	 	 	 	 ddlZ6ddmZ7ddnZ8	 	 	 d	 	 	 	 	 ddoZ9e9fddpZ:e9fddqZ;e9dfdrZ< G ds dtejz                        Z> G du dvejz                        Z? G dw dxejz                        Z@ G dy dzej                  e      ZB G d{ d|ej                  ej                        ZD G d} d~ej                        ZE G d dej                        ZGeEeDeBgZHeIdk(  rddlZ ej                  eG       yyc c}} w )a+  
Classes for representing and manipulating pitches, pitch-space, and accidentals.

Each :class:`~music21.note.Note` object has a `Pitch` object embedded in it.
Some methods below, such as `Pitch.name`, `Pitch.step`, etc. are
made available directly in the `Note` object, so they will seem familiar.
    )annotations)OrderedDictN)overload)base)common)SlottedObjectMixin)StepName)defaults)environment)exceptions21)interval)prebase)stylenotepitch)aAtTbBeE            	      CDr   FGr   r   zdict[StepName, int]STEPREF)r   r   r   r   r   r   r    r"   r#   r   r$   r%   r   r   zdict[int, StepName]STEPREF_REVERSED>   r   r   r"   r#   r   r$   r%   zset[StepName]	STEPNAMES         STEP_TO_DNN_OFFSETgcyْ?() #z##z###z####-z-----z----~z#~`z-`)naturalsharpdouble-sharptriple-sharpquadruple-sharpflatdouble-flattriple-flatquadruple-flat
half-sharpone-and-a-half-sharp	half-flatone-and-a-half-flati*    ♯i2 )r0   rB   i+ )r2      ♭rC   )r1   rC   )r/   u   ♮nr5   isr6   isisr7   isisisr8   isisisisr9   esr:   r   esesr;   esesesr<   esesesesr=   quarter-sharpr>   ih	semisharpthree-quarter-sharpr?   three-quarters-sharpisihsesquisharpr@   rA   )quarter-flatehsemiflatthree-quarter-flatthree-quarters-flateseh
sesquiflatc                     dD ]@  } g }t         j                         D ]"  }t        |      | k(  s|j                  |       $ |c S  y )N)r   r*   r   r)   )accidentalNameToModifiervalueslenappend)iamssyms      :/DATA/.local/lib/python3.12/site-packages/music21/pitch.py_sortModifiersrd      sA    +224C3x1}

3 5 
     c                V    | t         v ry| t         j                         v ry| t        v ryy)a  
    Check if name is a valid accidental name string that can
    be used to initialize an Accidental.

    Standard accidental names are valid:

    >>> pitch.isValidAccidentalName('double-flat')
    True

    Accidental modifiers are valid:

    >>> pitch.isValidAccidentalName('--')
    True

    Alternate accidental names are valid:

    >>> pitch.isValidAccidentalName('eses')
    True

    Anything else is not valid:

    >>> pitch.isValidAccidentalName('two flats')
    False
    TF)r\   r]   alternateNameToAccidentalNamenames    rc   isValidAccidentalNamerj      s8    4 '' '..00 ,,re   c                x    | t         v r| S | t        v r	t        |    S | t        v r	t        |    S t        d|  d      )a  
    Convert a valid accidental name to the standard accidental name.
    Raises AccidentalException if name is not a valid accidental name.

    >>> pitch.standardizeAccidentalName('double-flat')
    'double-flat'

    >>> pitch.standardizeAccidentalName('--')
    'double-flat'

    >>> pitch.standardizeAccidentalName('eses')
    'double-flat'

    >>> pitch.standardizeAccidentalName('two flats')
    Traceback (most recent call last):
    music21.pitch.AccidentalException: 'two flats' is not a supported accidental type
    'z$' is not a supported accidental type)r\   modifierToAccidentalNamerg   AccidentalExceptionrh   s    rc   standardizeAccidentalNamero      sO    $ '''''--,,,T22
$'KL
MMre   c                \    t        | t        t        f      r| S | dv ry| dv ryt        |       S )a  
    Given a pitch class string
    return the pitch class representation.
    Ints and floats are returned unchanged;

    >>> pitch._convertPitchClassToNumber(3)
    3
    >>> pitch._convertPitchClassToNumber('a')
    10
    >>> pitch._convertPitchClassToNumber('B')
    11
    >>> pitch._convertPitchClassToNumber('3')
    3
    >>> pitch._convertPitchClassToNumber(3.5)
    3.5
    )r   r   r   r   
   )r   r   r   r   r    )
isinstanceintfloatpss    rc   _convertPitchClassToNumberrw      s8    & "sEl#	%%%%2wre   c                    | dz  } | dS )z
    Given a pitch class number, return a string.

    >>> pitch.convertPitchClassToStr(3)
    '3'
    >>> pitch.convertPitchClassToStr(10)
    'A'
       X )pcs    rc   convertPitchClassToStrr}     s     
bBVre   c                j    t        | t              } t        t        j                  | dz              dz
  S )a  
    Utility conversion; does not process internals.
    Converts a midiNote number to an octave number.
    Assume C4 middle C, so 60 returns 4

    >>> [pitch._convertPsToOct(59), pitch._convertPsToOct(60), pitch._convertPsToOct(61)]
    [3, 4, 4]
    >>> [pitch._convertPsToOct(12), pitch._convertPsToOct(0), pitch._convertPsToOct(-12)]
    [0, -1, -2]
    >>> pitch._convertPsToOct(135)
    10

    Note that while this is basically a floor operation, we only treat 6 digits as significant
    (PITCH_SPACE_SIGNIFICANT_DIGITS)

    >>> pitch._convertPsToOct(71.999)
    4
    >>> pitch._convertPsToOct(71.99999999)
    5
    >>> pitch._convertPsToOct(72)
    5
    ry   r)   )roundPITCH_SPACE_SIG_DIGITSrs   mathfloorru   s    rc   _convertPsToOctr     s.    0 
r)	*Btzz"r'"#a''re   c                V   t        | t              r
| dz  }d}d}n| t        |       k(  rt        |       dz  }d}d}n~t        | t              } | dz  }t	        |d      \  }}t        |      }t        |d      dk(  rd}||z
  }n8d|cxk  rdk  rn nd}||z
  }n"d|cxk  rdk  rn nd}||z
  }n|dkD  rd}nd}d}d}|dk(  r|d	v rt        d      }|dz   dz  }|d
k(  rd}n|t        v rt        d|z         }|}n|dz
  dv r|dk\  rt        |dz
        }|dz   }nd|dz
  dv rt        d|z         }|dz
  }nI|dz   dv r|dk  rt        d|z         }|dz
  }n)|dz   dv rt        d|z         }|dz   }nt        d|       t        |   }	|dk7  rt        |dz        }
nt        d      }
|	||
|fS )a  
    Utility conversion; does not process internal representations.

    Takes in a pitch space floating-point value or a MIDI note number (Assume
    C4 middle C, so 60 returns 4).

    Returns a tuple of Step, an Accidental object, a Microtone object or
    None, and an int representing octave shift (which is nearly always zero, but can be 1
    for a B with very high microtones).

    >>> pitch._convertPsToStep(60)
    ('C', <music21.pitch.Accidental natural>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(66)
    ('F', <music21.pitch.Accidental sharp>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(67)
    ('G', <music21.pitch.Accidental natural>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(68)
    ('G', <music21.pitch.Accidental sharp>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(-2)
    ('B', <music21.pitch.Accidental flat>, <music21.pitch.Microtone (+0c)>, 0)

    >>> pitch._convertPsToStep(60.5)
    ('C', <music21.pitch.Accidental half-sharp>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(62)
    ('D', <music21.pitch.Accidental natural>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(62.5)
    ('D', <music21.pitch.Accidental half-sharp>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(135)
    ('E', <music21.pitch.Accidental flat>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(70)
    ('B', <music21.pitch.Accidental flat>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(70.2)
    ('B', <music21.pitch.Accidental flat>, <music21.pitch.Microtone (+20c)>, 0)
    >>> pitch._convertPsToStep(70.5)
    ('B', <music21.pitch.Accidental half-flat>, <music21.pitch.Microtone (+0c)>, 0)

    Here is a case where perhaps D half-flat would be better:

    >>> pitch._convertPsToStep(61.5)
    ('C', <music21.pitch.Accidental one-and-a-half-sharp>, <music21.pitch.Microtone (+0c)>, 0)

    Note that Microtones can have negative and positive zeros.

    >>> pitch._convertPsToStep(43.00001)
    ('G', <music21.pitch.Accidental natural>, <music21.pitch.Microtone (+0c)>, 0)
    >>> pitch._convertPsToStep(42.999739)
    ('G', <music21.pitch.Accidental natural>, <music21.pitch.Microtone (-0c)>, 0)

    A case where octave shift is not zero.  Here the ps of 59.8 would normally
    imply octave 3, but because it is being represented by a C, it must appear
    in the octave above what is implied by the ps.

    >>> pitch._convertPsToStep(59.8)
    ('C', <music21.pitch.Accidental natural>, <music21.pitch.Microtone (-20c)>, 1)

    A number very close to 60, however, is rounded, and gets no octave shift.

    >>> pitch._convertPsToStep(59.9999999)
    ('C', <music21.pitch.Accidental natural>, <music21.pitch.Microtone (+0c)>, 0)
    ry           r)         ?g      ?g      ?      ?r   )r   r    r    )r   r   r   )r    r   zcannot match condition for pc: d   )
rr   rs   r   r   divmod
AccidentalNATURAL_PCSPitchExceptionr'   	Microtone)rv   r|   altermicropcRealpc_floatoctShiftaccpcNameri   microObjs              rc   _convertPsToStepr   7  s   D "c"W	s2wWr\ 2-.b +%] ?c!E EMEE D EEMEUQEEMEQYE EE
 HzbGmmq&B 8H	{	U#
q&Y	5A:#a
q&Y	U#a
q&W	"U#a
q&W	e$a>rdCDDF#D zUS[)Q<h((re   c                r   t        |       }d}|dkD  rt        |d      \  }}||z  }n|dk  r|dk  r|dz  }|dz  }|dk  r|dk  rd}|dz   }nZd|cxk  rd	k  rn nd
}|dz   }nDd	|cxk  rdk  rn nd}|}n1d|cxk  rdk  rn nd}|dz
  }n|dkD  rd}|dz
  }nt        d|       ||z   t        |      fS )a  
    Given any floating point value, split into accidental and microtone components.

    >>> pitch._convertCentsToAlterAndCents(125)
    (1.0, 25.0)
    >>> pitch._convertCentsToAlterAndCents(-75)
    (-0.5, -25.0)
    >>> pitch._convertCentsToAlterAndCents(-125)
    (-1.0, -25.0)
    >>> pitch._convertCentsToAlterAndCents(-200)
    (-2.0, 0.0)
    >>> pitch._convertCentsToAlterAndCents(235)
    (2.5, -15.0)
    r      r   ijr   i            Y@i      g      I@   K   r   2   zvalue exceeded range: )rt   r   
ValueError)shiftvaluealterAdd	increment
alterShiftcentss         rc   _convertCentsToAlterAndCentsr     s     %LEHs{!%-	5I	ckSLEOH ck s{
			
			
	e	r	

	
1%9:: %,..re   c                j    | dk  rdt        |       z  } t        dt        j                  |       z        S )a  
    Given a harmonic number, return the total number shift in cents
    assuming 12 tone equal temperament.

    >>> pitch._convertHarmonicToCents(8)
    3600
    >>> [pitch._convertHarmonicToCents(x) for x in [5, 6, 7, 8]]
    [2786, 3102, 3369, 3600]
    >>> [pitch._convertHarmonicToCents(x) for x in [16, 17, 18, 19]]
    [4800, 4905, 5004, 5098]

    >>> [pitch._convertHarmonicToCents(x) for x in range(1, 33)]
    [0, 1200, 1902, 2400, 2786, 3102, 3369, 3600, 3804, 3986, 4151,
     4302, 4441, 4569, 4688, 4800, 4905, 5004, 5098, 5186, 5271, 5351,
     5428, 5502, 5573, 5641, 5706, 5769, 5830, 5888, 5945, 6000]

    Works with subHarmonics as well by specifying them as either 1/x or negative numbers.
    note that -2 is the first subharmonic, since -1 == 1:

    >>> [pitch._convertHarmonicToCents(1 / x) for x in [1, 2, 3, 4]]
    [0, -1200, -1902, -2400]
    >>> [pitch._convertHarmonicToCents(x) for x in [-1, -2, -3, -4]]
    [0, -1200, -1902, -2400]

    So the fifth subharmonic of the 7th harmonic,
    which is C2->C3->G3->C4->E4->G4->B\`4 --> B\`3->E\`3->B\`2->G-\`2

    >>> pitch._convertHarmonicToCents(7 / 5)
    583
    >>> pitch._convertHarmonicToCents(7.0) - pitch._convertHarmonicToCents(5.0)
    583
    r   r)   i  )absr   r   log2)r   s    rc   _convertHarmonicToCentsr     s3    B qySZ 		%(())re   c                p   d}d}d}g }| sy|r@| D cg c]  }t        |j                         }	}t        d |	D              t        |       z  }|s|rf	 g }t	        j
                  | d      D ]I  \  }
}t        j                  |      }d|_        t        j                  |
|      }|j                  |       K 	 |rQ|D ]>  }t        j                  |      }t        j                   |j"                        dz  }||z  }@ |t        |       z  }|rc|D ]P  }|j$                  j&                  }|j(                  j*                  dz  }|dk(  r
|d	v r|d
z  }A|dk(  sG|dv sL|d
z  }R |t        |       z  }||z   |z   t-        ||z   |z         z  S c c}w # t        j                  $ r t        j                  cY S w xY w)a  
    Calculates the 'dissonance' of a list of pitches based on three criteria:
    it is considered more consonant if 1. the numerator and denominator of the
    Pythagorean ratios of its containing intervals are small (`smallPythagoreanRatio`);
    2. it shows few double- or triple-accidentals (`accidentalPenalty`); 3. it shows
    thirds that can form some triad (`triadAward`)
    r   c              3  .   K   | ]  }|d kD  r|nd  yw)r)   r   Nr{   .0r   s     rc   	<genexpr>z#_dissonanceScore.<locals>.<genexpr>>  s     G;aQU 1;s   r   N)	noteStartnoteEndg!a"k?ry   r*   )r*   r   r   r+   )   r   )r   r   sumr^   	itertoolscombinationscopydeepcopyoctaver   Intervalr_   IntervalExceptionr   infintervalToPythagoreanRatiologdenominatorgenericsimpleDirected	chromatic	semitonesrs   )pitchessmallPythagoreanRatioaccidentalPenalty
triadAwardscore_accidentalsscore_ratioscore_triad	intervalspaccidentalsp1p2this_intervalratiopenaltysimple_directedinterval_semitoness                    rc   _dissonanceScorer   '  s    KK)+I-45Ws177|W5G;GG#g,V
	I#00!<B]]2& 	 ( 1 1B K  /	 = &M77FEhhu001MAG7"K	 ' 	s7|#&M+33BBO!.!8!8!B!BR!G!#(:f(Ds" A%*<*Fs" ' 	s7|#+k9SAVCTBUWaBb >c c cE 6 )) 	88O	s   F
A$F #F54F5c                      dd D cg c]  }|g|j                         z    }}t        j                  | }t        | fd      } dd t	        |      z   S c c}w )zV
    A brute-force way of simplifying -- useful if there are fewer than 5 pitches
    r)   Nc                2     d d t        |       z         S )Nr)   )list)x
oldPitches	scoreFuncs    rc   <lambda>z._bruteForceEnharmonicsSearch.<locals>.<lambda>i  s    9ZPRQR^VZ[\V]E];^re   key)getAllCommonEnharmonicsr   productminr   )r   r   r   all_possible_pitchesall_pitch_combinations
newPitchess   ``    rc   _bruteForceEnharmonicsSearchr   c  sp     HRRSRT~V~!QC!";";"==~V&..0DE+1^_Jbq>D,,, Ws   Ac                    | d d | dd  D ]8  }|g|j                         z   }t        |fd      }j                  |       : S )Nr)   c                     | gz         S Nr{   )r   r   r   s    rc   r   z*_greedyEnharmonicsSearch.<locals>.<lambda>q  s    :;K1Lre   r   )r   r   r_   )r   r   oldPitch
candidatesnewPitchr   s    `   @rc   _greedyEnharmonicsSearchr   m  sV    BQJqrNZ("B"B"DD
z'LM(# # re   c                V   | D cg c]  }t        |t              r|n
t        |      ! }}|r"|j                  d      j                  g|z   }d}nd}t	        |      dk  rt        ||      }nt        ||      }t        ||      D ]  \  }}|j                  |_         |r|dd }|S c c}w )a	  
    Tries to simplify the enharmonic spelling of a list of pitches, pitch-
    or pitch-class numbers according to a given criterion.

    A function can be passed as an argument to `criterion`, that is tried to be
    minimized in a greedy left-to-right fashion.

    >>> pitch.simplifyMultipleEnharmonics([11, 3, 6])
    [<music21.pitch.Pitch B>, <music21.pitch.Pitch D#>, <music21.pitch.Pitch F#>]

    >>> pitch.simplifyMultipleEnharmonics([3, 8, 0])
    [<music21.pitch.Pitch E->, <music21.pitch.Pitch A->, <music21.pitch.Pitch C>]

    >>> pitch.simplifyMultipleEnharmonics([pitch.Pitch('G3'),
    ...                                    pitch.Pitch('C-4'),
    ...                                    pitch.Pitch('D4')])
    [<music21.pitch.Pitch G3>, <music21.pitch.Pitch B3>, <music21.pitch.Pitch D4>]

    >>> pitch.simplifyMultipleEnharmonics([pitch.Pitch('A3'),
    ...                                    pitch.Pitch('B#3'),
    ...                                    pitch.Pitch('E4')])
    [<music21.pitch.Pitch A3>, <music21.pitch.Pitch C4>, <music21.pitch.Pitch E4>]

    The attribute `keyContext` is for supplying a KeySignature or a Key
    which is used in the simplification:

    >>> pitch.simplifyMultipleEnharmonics([6, 10, 1], keyContext=key.Key('B'))
    [<music21.pitch.Pitch F#>, <music21.pitch.Pitch A#>, <music21.pitch.Pitch C#>]

    >>> pitch.simplifyMultipleEnharmonics([6, 10, 1], keyContext=key.Key('C-'))
    [<music21.pitch.Pitch G->, <music21.pitch.Pitch B->, <music21.pitch.Pitch D->]

    Note that if there's no key context, then we won't simplify everything (at least
    for now; this behavior may change, ).

    >>> pitch.simplifyMultipleEnharmonics([pitch.Pitch('D--3'),
    ...                                    pitch.Pitch('F-3'),
    ...                                    pitch.Pitch('A--3')])
    [<music21.pitch.Pitch D--3>, <music21.pitch.Pitch F-3>, <music21.pitch.Pitch A--3>]

    >>> pitch.simplifyMultipleEnharmonics([pitch.Pitch('D--3'),
    ...                                    pitch.Pitch('F-3'),
    ...                                    pitch.Pitch('A--3')],
    ...                                    keyContext=key.Key('C'))
    [<music21.pitch.Pitch C3>, <music21.pitch.Pitch E3>, <music21.pitch.Pitch G3>]

    * Changed in v7.3: fixed a bug with compound intervals (such as formed against
      the tonic of a KeySignature defaulting to octave 4):

    >>> pitch.simplifyMultipleEnharmonics([pitch.Pitch('B5')], keyContext=key.Key('D'))
    [<music21.pitch.Pitch B5>]
    majorTFr   r)   N)	rr   PitchasKeytonicr^   r   r   zipspellingIsInferred)	r   	criterion
keyContextr   r   remove_firstsimplifiedPitchesoldPnewPs	            rc   simplifyMultipleEnharmonicsr   v  s    l DKK7az!U+!q97JK &&w/556C

:8YO4ZK *&78
d"&"9"9 9 -ab1) Ls   $B&c                      e Zd Zy)rn   N__name__
__module____qualname__r{   re   rc   rn   rn         re   rn   c                      e Zd Zy)r   Nr   r{   re   rc   r   r     r   re   r   c                      e Zd Zy)MicrotoneExceptionNr   r{   re   rc   r  r    r   re   r  c                      e Zd ZdZdZ	 	 d	 ddZd Zd Zd Zd Z	d Z
d	 Zed
        Zed        Zed        Zej                   d        Zy)r   ap  
    The Microtone object defines a pitch transformation above or below a
    standard Pitch and its Accidental.

    >>> m = pitch.Microtone(20)
    >>> m.cents
    20

    >>> m.alter
    0.2...

    >>> print(m)
    (+20c)
    >>> m
    <music21.pitch.Microtone (+20c)>

    Microtones can be shifted according to the harmonic. Here we take the 3rd
    harmonic of the previous microtone

    >>> m.harmonicShift = 3
    >>> m.harmonicShift
    3
    >>> m
    <music21.pitch.Microtone (+20c+3rdH)>

    >>> m.cents
    1922

    >>> m.alter
    19.2...

    Microtonal changes can be positive or negative.  Both Positive and negative
    numbers can optionally be placed in parentheses Negative numbers in
    parentheses still need the minus sign.

    >>> m = pitch.Microtone('(-33.333333)')
    >>> m
    <music21.pitch.Microtone (-33c)>

    >>> m = pitch.Microtone('33.333333')
    >>> m
    <music21.pitch.Microtone (+33c)>

    Note that we round the display of microtones to the nearest cent, but we
    keep the exact alteration in both .cents and .alter:

    >>> m.cents
    33.333...

    >>> m.alter
    0.3333...

    )
_centShift_harmonicShiftc                ~    d| _         || _        t        |t        t        f      r|| _         y | j                  |       y Nr   )r  r  rr   rs   rt   _parseString)selfcentsOrStringharmonicShifts      rc   __init__zMicrotone.__init__  s6     &'#0mc5\2+DOm,re   c                    t        |       t        u r t        | j                  | j                        S t	        j
                  | |      S r   )typer   r  r  r   defaultDeepcopy)r
  memos     rc   __deepcopy__zMicrotone.__deepcopy__#  s8    :"T__d.A.ABB))$55re   c                X    	 |j                   | j                   k(  ryy# t        $ r Y yw xY w)a  
        Compare cents (including harmonicShift)

        >>> m1 = pitch.Microtone(20)
        >>> m2 = pitch.Microtone(20)
        >>> m3 = pitch.Microtone(21)
        >>> m1 == m2
        True
        >>> m1 == m3
        False

        >>> m2.harmonicShift = 3
        >>> m1 == m2
        False

        Cannot compare True to a non-Microtone:

        >>> m1 == pitch.Accidental(1)
        False
        TF)r   AttributeErrorr
  others     rc   __eq__zMicrotone.__eq__)  s/    *	{{djj( 		s    	))c                \    | j                   | j                  t        |       f}t        |      S r   )r  r  r  hashr
  
hashValuess     rc   __hash__zMicrotone.__hash__E  s-    OOJ


 Jre   c                    t        |       S r   strr
  s    rc   _reprInternalzMicrotone._reprInternalN      4yre   c                8   d}t        | j                        }| j                  dk\  rd| d}n| j                  dk  r| d}|dk(  rd}| j                  dk7  r4t        j                  | j                        }|d| j                   | dz  }t
         | t         S )	z
        Return a string representation.

        >>> m1 = pitch.Microtone(20)
        >>> print(m1)
        (+20c)

        Differs from the representation:

        >>> m1
        <music21.pitch.Microtone (+20c)>
        r/   r   +c0cz-0cr)   H)r   r  r  r   ordinalAbbreviationMICROTONE_OPENMICROTONE_CLOSE)r
  sub
roundShiftordAbbreviations       rc   __str__zMicrotone.__str__Q  s     4??+
??aj\#C__q L"Cd{ !#$889L9LMOQt**+O+<A>>C !#&788re   c                   |j                  t        d      }|j                  t        d      }d}|d   dk(  s|d   j                         r@t	        j
                  |d      \  }}|dk(  rt        d|       t        |      }|| _        y	|d   dk(  r+t	        j
                  |dd	 d      \  }}t        |      d
z  }|| _        y	)z0
        Parse a string representation.
        r/   r   r$  z0123456789.)numbersz"no numbers found in string value: r1   r)   Nr   )	replacer)  r*  isdigitr   getNumFromStrr  rt   r  )r
  r   	centValuenumunused_nonNums        rc   r	  zMicrotone._parseStringp  s    
 nb1or2	 8s?eAh..0!'!5!5e]!SCby(+MeW)UVVc
I $ 1X_!'!5!5eABi!WCc
RI#re   c                     | j                   dz  S )z{
        Return the microtone value in accidental alter values.

        >>> pitch.Microtone(20).alter
        0.2
        {Gz?)r   r   s    rc   r   zMicrotone.alter  s     zzD  re   c                F    t        | j                        | j                  z   S )z
        Return the microtone value in cents.  This is not a settable property.
        To set the value in cents, simply use that value as a creation
        argument.

        >>> pitch.Microtone(20).cents
        20
        )r   r  r  r   s    rc   r   zMicrotone.cents  s     't':':;dooMMre   c                    | j                   S )zG
        Set or get the harmonic shift, altering the microtone
        r  r   s    rc   r  zMicrotone.harmonicShift  s    
 """re   c                    || _         y r   r;  r
  r   s     rc   r  zMicrotone.harmonicShift  s
    #re   N)r   r)   )r  zstr | int | float)r   r   r   __doc__	__slots__r  r  r  r  r!  r.  r	  propertyr   r   r  setterr{   re   rc   r   r     s    4pI 12 	- -	-68 9>$. ! ! 	N 	N # # $ $re   r   c                      e Zd ZU dZej
                  ZdZg dZddddZ	de
d	<   d(d) fd
Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed        ZdddZd Zd Zd Zed*d       Zej<                  d        Zed+d       Zej<                  d        Zed*d        Z e j<                  d!        Z ed*d"       Z!e!j<                  d,d#       Z!ed$        Z"e"j<                  d%        Z"ed&        Z#ed'        Z$ xZ%S )-r   a?  
    Accidental class, representing the symbolic and numerical representation of
    pitch deviation from a pitch name (e.g., G, B).

    Two accidentals are considered equal if their names are equal.

    Accidentals have three defining attributes: a name, a modifier, and an
    alter.  For microtonal specifications, the name and modifier are the same
    except in the case of half-sharp, half-flat, one-and-a-half-flat, and
    one-and-a-half-sharp.

    Accidentals up to quadruple-sharp and quadruple-flat are allowed.

    Natural-sharp etc. (for canceling a previous flat) are not yet supported officially.

    >>> a = pitch.Accidental('sharp')
    >>> a.name, a.alter, a.modifier
    ('sharp', 1.0, '#')
    >>> a.style.color = 'red'

    >>> import copy
    >>> b = copy.deepcopy(a)
    >>> b.style.color
    'red'
    )	_alter_displayStatus_displayType	_modifier_name_clientdisplayLocationdisplaySizedisplayStyle)ri   modifierr   setz1Size in display: "cue", "large", or a percentage.z3Style of display: "parentheses", "bracket", "both".z3Location of accidental: "normal", "above", "below".)rJ  rK  rI  dict[str, str]	_DOC_ATTRc                    t         |           d| _        d | _        d| _        d| _        d| _        d | _        d| _        d| _	        d| _
        | j                  |       y )Nnormalfullr/   r   )superr  rE  rD  rK  rJ  rI  rH  rG  rF  rC  rM  )r
  	specifier	__class__s     rc   r  zAccidental.__init__  sf    $ # %!  ( $(
re   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  fS r   )rC  rD  rE  rF  rG  rI  rJ  rK  r   s    rc   _hashValueszAccidental._hashValues  sN    KKNNJJ  	
 		
re   c                4    t        | j                               S r   )r  rW  r   s    rc   r  zAccidental.__hash__  s    D$$&''re   c           	         t        |       t        u rGt        j                  t              }| j                         D ]  }t	        ||t        | |              |S t        j                  | |      S r   )r  r   __new___getSlotsRecursivesetattrgetattrr   r  )r
  r  newss       rc   r  zAccidental.__deepcopy__  s\    :#$$Z0C,,.Qa 01 /J))$55re   c                Z    t        |t              sy| j                  |j                  k(  ryy)a  
        Equality. Needed for pitch comparisons.

        >>> a = pitch.Accidental('double-flat')
        >>> b = pitch.Accidental('double-flat')
        >>> c = pitch.Accidental('double-sharp')
        >>> a == b
        True

        >>> a == c
        False
        FT)rr   r   ri   r  s     rc   r  zAccidental.__eq__  s'     %,99

"re   c                J    | j                  |      xs | j                  |      S )z
        Greater than or equal.  Based on the accidentals' alter function.

        >>> a = pitch.Accidental('sharp')
        >>> b = pitch.Accidental('flat')
        >>> a >= b
        True

        )__gt__r  r  s     rc   __ge__zAccidental.__ge__!  s!     {{5!7T[[%77re   c                ^    |t        |t              sy| j                  |j                  kD  ryy)z
        Greater than.  Based on the accidentals' alter function.

        >>> a = pitch.Accidental('sharp')
        >>> b = pitch.Accidental('flat')
        >>> a < b
        False

        >>> a > b
        True

        >>> a > 5
        False
        FTrr   r   r   r  s     rc   rb  zAccidental.__gt__-  +     =
5* =::#re   c                J    | j                  |      xs | j                  |      S )a  
        Less than or equal.  Based on the accidentals' alter function.

        >>> a = pitch.Accidental('sharp')
        >>> b = pitch.Accidental('flat')
        >>> c = pitch.Accidental('sharp')
        >>> a <= b
        False

        >>> a <= c
        True
        )__lt__r  r  s     rc   __le__zAccidental.__le__C  s!     {{5!7T[[%77re   c                ^    |t        |t              sy| j                  |j                  k  ryy)z
        Less than. based on alter.

        >>> a = pitch.Accidental('natural')
        >>> b = pitch.Accidental('flat')
        >>> a > b
        True

        >>> a < b
        False

        >>> a < 5
        False
        FTre  r  s     rc   rh  zAccidental.__lt__R  rf  re   c                    | j                   S r   rh   r   s    rc   r!  zAccidental._reprInternalh      yyre   c                    | j                   S r   rh   r   s    rc   r.  zAccidental.__str__k  rl  re   c                .    t        d t        D              S )a.  
        Returns a list of accidental names that have any sort of
        semantic importance in music21.

        You may choose a name not from this list (1/7th-sharp) but
        if it's not on this list don't expect it to do anything for you.

        This is a class method, so you may call it directly on the class:

        Listed in alphabetical order. (TODO: maybe from lowest to highest
        or something implying importance?)

        >>> pitch.Accidental.listNames()
         ['double-flat', 'double-sharp', 'flat', 'half-flat',
          'half-sharp', 'natural', 'one-and-a-half-flat', 'one-and-a-half-sharp',
          'quadruple-flat', 'quadruple-sharp', 'sharp', 'triple-flat', 'triple-sharp']

        Or call on an instance of an accidental:

        >>> f = pitch.Accidental('flat')
        >>> f.listNames()
         ['double-flat', 'double-sharp', 'flat', 'half-flat', 'half-sharp', 'natural',
          'one-and-a-half-flat', 'one-and-a-half-sharp', 'quadruple-flat', 'quadruple-sharp',
          'sharp', 'triple-flat', 'triple-sharp']
        c              3  <   K   | ]  }|j                           y wr   )lowerr   s     rc   r   z'Accidental.listNames.<locals>.<genexpr>  s     B)AAaggi)As   )sortedr\   )clss    rc   	listNameszAccidental.listNamesn  s    6 B)ABBBre   FallowNonStandardValuec                  t        |t              r|j                         }|dv rd| _        d| _        n|dt
        d   ddfv rd| _        d| _        n|dt
        d   d	d
fv rd| _        d| _        n|dt
        d   dddfv rd| _        d| _        no|dt
        d   ddfv rd| _        d| _        nP|dt
        d   ddddfv rd| _        d| _        n/|dt
        d   dddddfv rd| _        d| _        n|d t
        d    d!d"d#d$fv rd | _        d$| _        n|d%t
        d%   d&d'd(d)d*fv rd%| _        d*| _        n|d+t
        d+   d,d-fv rd+| _        d.| _        n|d/t
        d/   d0d1fv rd/| _        d2| _        n|d3t
        d3   d4d5fv rd3| _        d6| _        nr|d7t
        d7   d8d9fv rd7| _        d:| _        nT|st        | d;      t        |t              r|| _        y<t        |t        t        f      r|| _        y<t        | d;      t
        | j                     | _	        | j                  r| j                  j                          y<y<)=aC  
        Change the type of the Accidental.  Strings, numbers, and Lilypond (German-like)
        abbreviations are all accepted.  All other values will change
        after setting.

        >>> a = pitch.Accidental()
        >>> a.set('sharp')
        >>> a.alter
        1.0

        >>> a = pitch.Accidental()
        >>> a.set(2)
        >>> a.modifier == '##'
        True

        >>> a = pitch.Accidental()
        >>> a.set(2.0)
        >>> a.modifier == '##'
        True

        >>> a = pitch.Accidental('--')
        >>> a.alter
        -2.0
        >>> a.set('half-sharp')
        >>> a.alter
        0.5
        >>> a.name
        'half-sharp'

        Setting an illegal name is generally an error:

        >>> a.set('flat-flat-up')
        Traceback (most recent call last):
        music21.pitch.AccidentalException: flat-flat-up is not a supported accidental type

        But if 'allowNonStandardValue' is True then other names (if strings) or alters (if numbers)
        are allowed:

        >>> a.set('quintuple-sharp', allowNonStandardValue=True)
        >>> a.set(5.0, allowNonStandardValue=True)
        >>> a.name
        'quintuple-sharp'
        >>> a.alter
        5.0

        This is the argument that .name and .alter use to allow non-standard names

        * Changed in v5: added allowNonStandardValue.
        )r5   rD   r   r5   r   r6   rE   r)   r   r7   rF   r          @r:   rI   r   r   r   r;   rJ   g       r>   rM   rN   rO   r   r?   rP   rQ   rR   rS   g      ?r@   rT   rU   rV   r   rA   rW   rX   rY   rZ   g      r8   rG   r*         @r9   rH   r         @r<   rK   g      r=   rL   g      z# is not a supported accidental typeN)rr   r  rp  rG  rC  r\   rn   rs   rt   rF  rH  informClient)r
  ri   ru  s      rc   rM  zAccidental.set  s   d dC ::<D&&"DJDKg7@$JJ DJDKn&>~&Na! !'DJDKf6v>c2NNDJDKm%=m%Lb" "&DJDKl$<\$J%t[#? ?%DJDK,./EF+-CV#S* * 0DJDKk#;K#H$dJ> >$DJDK+./DE*,A6"D* * /DJDKn&>~&N# #'DJDK'./@A:qR R*DJDKm%=m%L$ $&DJDK&./?@*bR R)DJDK()TF2U*VWW$$!
D3,/")TF2U*VWW1$**=<<LL%%' re   c                "    | j                   dv ryy)a  
        Return a boolean if this Accidental describes a twelve-tone, non-microtonal pitch.

        >>> a = pitch.Accidental('half-flat')
        >>> a.isTwelveTone()
        False

        >>> a = pitch.Accidental('###')
        >>> a.isTwelveTone()
        True
        )r>   r?   r@   rA   FTrh   r   s    rc   isTwelveTonezAccidental.isTwelveTone	  s     99 = =re   c                    |dvrt        d| d      |dk(  rt        |      }d|z   }t        | ||       | j                  r| j                  j	                          yy)aR  
        Set an attribute of 'name', 'alter', and 'modifier', independently
        of the other attributes.

        >>> a = pitch.Accidental('natural')
        >>> a.setAttributeIndependently('alter', 1.0)
        >>> a.alter
        1.0
        >>> a.name
        'natural'

        >>> a.setAttributeIndependently('name', 'sori')
        >>> a.setAttributeIndependently('modifier', '$')
        >>> a.modifier
        '$'
        >>> a.name
        'sori'
        >>> a.alter
        1.0

        Only 'name', 'alter', and 'modifier' can be set independently:

        >>> a.setAttributeIndependently('color', 'red')
        Traceback (most recent call last):
        music21.pitch.AccidentalException: Cannot set attribute color independently of other parts.

        * New in v5: needed because .name, .alter, and .modifier run .set().
        )ri   r   rL  zCannot set attribute z independently of other parts.r   _N)rn   rt   r\  rH  r}  )r
  	attributer   privateAttrNames       rc   setAttributeIndependentlyz$Accidental.setAttributeIndependently  sm    : 99%'	{2PQS S %LE	/ou-<<LL%%' re   c                J    |!dD ]  }t        ||      }t        | ||        yy)a  
        Given another Accidental object, inherit all the display properties
        of that object.

        This is needed when transposing Pitches: we need to retain accidental display properties.

        >>> a = pitch.Accidental('double-flat')
        >>> a.displayType = 'always'
        >>> b = pitch.Accidental('sharp')
        >>> b.inheritDisplay(a)
        >>> b.displayType
        'always'
        N)displayTypedisplayStatusrK  rJ  rI  )r]  r\  )r
  r  attrr   s       rc   inheritDisplayzAccidental.inheritDisplayE  s5     Kt,dE*K re   c                    | j                   S )a  
        Get or set the name of the Accidental, like 'sharp' or 'double-flat'

        If the name is set to a standard name then it changes alter and modifier.

        If set to a non-standard name, then it does not change them:

        >>> a = pitch.Accidental()
        >>> a.name = 'flat'
        >>> a.alter
        -1.0
        >>> a.modifier
        '-'
        >>> a.name = 'flat-flat-up'
        >>> a.alter
        -1.0

        * Changed in v5: changing the name here changes other values, conditionally.
        )rG  r   s    rc   ri   zAccidental.name]  s    * zzre   c                *    | j                  |d       y NTrt  rM  r=  s     rc   ri   zAccidental.namet  s    d3re   c                    | j                   S )a  
        Get or set the alter of the Accidental,
        or the semitone shift caused by the Accidental where 1.0
        is a shift up of one semitone, and -1.0 is the shift down of
        one semitone.

        >>> sharp = pitch.Accidental('sharp')
        >>> sharp.alter
        1.0

        >>> sharp.alter = -1

        After changing alter to a known other value, name changes:

        >>> sharp.name
        'flat'

        But changing it to an unusual value does not change the name:

        >>> notSoFlat = pitch.Accidental('flat')
        >>> notSoFlat.alter = -0.9
        >>> notSoFlat.name
        'flat'

        * Changed in v5: changing the alter here changes other values, conditionally.
        )rC  r   s    rc   r   zAccidental.alterx  s    8 {{re   c                *    | j                  |d       y r  r  r=  s     rc   r   zAccidental.alter  s     	d3re   c                    | j                   S )a  
        Get or set the alter of the modifier, or the string symbol
        used to modify the pitch name, such as "#" or
        "-" for sharp and flat, respectively.  For a representation
        likely to be read by non-music21 users, see `.unicode`.

        >>> f = pitch.Accidental('flat')
        >>> f.modifier
        '-'
        >>> f.modifier = '#'
        >>> f.name
        'sharp'

        However, an unknown modifier does not change anything but is preserved:

        >>> f.modifier = '&'
        >>> f.modifier
        '&'
        >>> f.name
        'sharp'

        * Changed in v5: changing the modifier here changes other values, conditionally.
        )rF  r   s    rc   rL  zAccidental.modifier  s    2 ~~re   c                X    	 | j                  |d       y # t        $ r
 || _        Y y w xY w)NFrt  )rM  rn   rF  r=  s     rc   rL  zAccidental.modifier  s-    	#HHU%H8" 	#"DN	#s    ))c                    | j                   S )ax  
        Returns or sets the display type of the accidental

        `"normal"` (default) displays it if it is the first in measure,
        or is needed to contradict a previous accidental, etc.

        other valid terms:

        * "always"
        * "never"
        * "unless-repeated" (show always unless
          the immediately preceding note is the same)
        * "even-tied" (stronger than always: shows even
          if it is tied to the previous note)
        * "if-absolutely-necessary" (display only if it is absolutely necessary,
          like an F-natural after an F-sharp in the same measure, but not an
          F-natural following an F-sharp directly across a barline.  Nor an
          F-natural in a different octave immediately following an F-sharp).
          This is not yet implemented.

        >>> a = pitch.Accidental('flat')
        >>> a.displayType = 'unless-repeated'
        >>> a.displayType
        'unless-repeated'
        >>> a.displayType = 'underwater'
        Traceback (most recent call last):
        music21.pitch.AccidentalException: Supplied display type is not supported: 'underwater'
        )rE  r   s    rc   r  zAccidental.displayType  s    <    re   c                6    |dvrt        d|      || _        y )N)rQ  alwaysneverzunless-repeated	even-tiedif-absolutely-necessaryz(Supplied display type is not supported: )rn   rE  r=  s     rc   r  zAccidental.displayType  s.     T T%(PQVPY&Z[[!re   c                    | j                   S )a  
        Determines if this Accidental is to be displayed;
        can be None (for not set), True, or False.  In general do not
        set this, set .displayType instead.  Music21 will change displayStatus
        at any time without warning.

        While `.displayType` gives general rules about when this accidental
        should be displayed or not, `displayStatus` determines whether after
        applying those rules this accidental will be displayed.

        In general, a `displayStatus` of `None` means that no high-level
        processing of accidentals has happened.

        Can be set to True or False (or None) directly for contexts where
        the next program down the line cannot evaluate displayType.  See
        stream.makeAccidentals() for more information.

        Example:

        >>> n0 = note.Note('C#4')
        >>> n1 = note.Note('C#4')
        >>> print(n0.pitch.accidental.displayStatus)
        None
        >>> print(n1.pitch.accidental.displayStatus)
        None
        >>> s = stream.Stream()
        >>> s.append([n0, n1])
        >>> s.makeAccidentals(inPlace=True)
        >>> n0.pitch.accidental.displayStatus
        True
        >>> n1.pitch.accidental.displayStatus
        False

        >>> n1.pitch.accidental.displayStatus = 2
        Traceback (most recent call last):
        music21.pitch.AccidentalException: Supplied display status is not supported: 2
        )rD  r   s    rc   r  zAccidental.displayStatus  s    N """re   c                6    |dvrt        d|       || _        y )N)TFNz*Supplied display status is not supported: )rn   rD  r=  s     rc   r  zAccidental.displayStatus  s(    ++%(RSXRY&Z[[#re   c                d    | j                   t        v rt        | j                      S | j                   S )u  
        Return a unicode representation of this accidental
        or the best unicode representation if that is not possible.

        >>> flat = pitch.Accidental('flat')
        >>> flat.unicode
        '♭'

        Compare:

        >>> sharp = pitch.Accidental('sharp')
        >>> sharp.modifier
        '#'
        >>> sharp.unicode
        '♯'

        Some accidentals, such as double sharps, produce code points outside
        the 2-byte set (so called "astral plane" unicode) and thus cannot be
        used in every circumnstance.

        >>> sharp = pitch.Accidental('quadruple-flat')
        >>> sharp.unicode
        '𝄫𝄫'
        )rL  unicodeFromModifierr   s    rc   unicodezAccidental.unicode  s*    8 ==//&t}}55== re   c                    | j                   S )a  
        Return the most complete representation of this Accidental.

        >>> a = pitch.Accidental('double-flat')
        >>> a.fullName
        'double-flat'

        Note that non-standard microtone names are converted to standard ones:

        >>> a = pitch.Accidental('quarter-flat')
        >>> a.fullName
        'half-flat'

        For now this is the same as `.name`.
        rh   r   s    rc   fullNamezAccidental.fullName5  s    $ yyre   )r5   )rT  zint | str | floatreturnr  r  rt   r   r  )&r   r   r   r>  r   	TextStyle_styleClassr?  
_DOC_ORDERrO  __annotations__r  rW  r  r  r  rc  rb  ri  rh  r!  r.  classmethodrs  rM  r  r  r  r@  ri   rA  r   rL  r  r  r  r  __classcell__)rU  s   @rc   r   r     s   2 //K
I 6J KMP!I~ 0

(6(
8,8, C C< 27 y(x$'(T+0  , 
[[4 4  : \\4 4  4 __# # ! !> " " &# &#P $ $
 ! !@  re   r   c            
         e Zd ZU dZg dZeZddiZded<   	 dmddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dnd	Z	d
 Z
d ZdodZd Zd ZdpdZdpdZdpdZdpdZedqd       Zej*                  drd       Zedsd       Zej*                  dtd       Zedud       Zej*                  dvd       ZdpdZdwdZedxd       ZdddZdddZed         Zej*                  d!        Zed"        Zej*                  d#        Zedyd$       Zej*                  dzd%       Zedyd&       Z edyd'       Z!e!j*                  d{d(       Z!edyd)       Z"ed*        Z#ed|d+       Z$e$j*                  d}d,       Z$edwd-       Z%e%j*                  d~d.       Z%edyd/       Z&e&j*                  d0        Z&edd1       Z'e'j*                  dd2       Z'edwd3       Z(edyd4       Z)edyd5       Z*dyd6Z+d7d8d9d:d;d<d=d>Z,d?ed@<   edydA       Z-d7d8d9dBd;d<d=d>Z.d?edC<   edydD       Z/edxdE       Z0e0j*                  ddF       Z0edxdG       Z1e1j*                  ddH       Z1ddIZ2	 	 	 	 ddJZ3	 dm	 	 	 ddKZ4	 	 	 	 ddLZ5	 	 	 	 ddMZ6ddNZ7i Z8dOedP<   e9	 	 	 	 	 	 ddQ       Z:e9	 	 	 	 	 	 ddR       Z:	 	 	 	 	 	 ddSZ:e9ddT       Z;e9ddU       Z;ddddVZ;e9ddW       Z<e9ddX       Z<ddddYZ<dddZ	 dd[Z=dddd\Z>d] Z?ddd^Z@edwd_       ZAeAj*                  dd`       ZAe9	 	 	 	 	 	 dda       ZBe9dd	 	 	 	 	 ddb       ZBdd	 	 	 	 	 ddcZBdddd	 ddeZCdddd	 ddfZDdg ZEdh ZFdddddidddiddj		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddkZGdl ZHy)r   a2  
    A fundamental object that represents a single pitch.

    `Pitch` objects are most often created by passing in a note name
    (C, D, E, F, G, A, B), an optional accidental (one or more "#"s or "-"s,
    where "-" means flat), and an optional octave number:

    >>> highEflat = pitch.Pitch('E-6')
    >>> highEflat.name
    'E-'
    >>> highEflat.step
    'E'
    >>> highEflat.accidental
    <music21.pitch.Accidental flat>
    >>> highEflat.octave
    6

    The `.nameWithOctave` property gives back what we put in, `'E-6'`:

    >>> highEflat.nameWithOctave
    'E-6'

    `Pitch` objects represent themselves as the class name followed
    by the `.nameWithOctave`:

    >>> p1 = pitch.Pitch('a#4')
    >>> p1
    <music21.pitch.Pitch A#4>

    Printing a `pitch.Pitch` object or converting it
    to a string gives a more compact form:

    >>> print(p1)
    A#4
    >>> str(p1)
    'A#4'

    .. warning:: A `Pitch` without an accidental has a `.accidental` of None,
        not Natural.  This can lead to problems if you assume that every
        `Pitch` or `Note` has a `.accidental` that you can call `.alter`
        or something like that on:

        >>> c = pitch.Pitch('C4')
        >>> c.accidental is None
        True

        >>> alters = []
        >>> for pName in ['G#5', 'B-5', 'C6']:
        ...     p = pitch.Pitch(pName)
        ...     alters.append(p.accidental.alter)
        Traceback (most recent call last):
        AttributeError: 'NoneType' object has no attribute 'alter'
        >>> alters
        [1.0, -1.0]

    If a `Pitch` doesn't have an associated octave, then its
    `.octave` value is None.  This means that it represents
    any G#, regardless of octave.  Transposing this note up
    an octave doesn't change anything.

    >>> anyGSharp = pitch.Pitch('G#')
    >>> anyGSharp.octave is None
    True
    >>> print(anyGSharp.transpose('P8'))
    G#

    Sometimes we need an octave for a `Pitch` even if it's not
    specified.  For instance, we can't play an octave-less `Pitch`
    in MIDI or display it on a staff.  So there is an `.implicitOctave`
    tag to deal with these situations; by default it's always 4 (unless
    defaults.pitchOctave is changed)

    >>> anyGSharp.implicitOctave
    4

    If a `Pitch` has its `.octave` explicitly set, then `.implicitOctave`
    always equals `.octave`.

    >>> highEflat.implicitOctave
    6

    If an integer or float >= 12 is passed to the constructor then it is
    used as the `.ps` attribute, which is for most common piano notes, the
    same as a MIDI number:

    >>> pitch.Pitch(65)
    <music21.pitch.Pitch F4>

    >>> pitch.Pitch(65.5).accidental
    <music21.pitch.Accidental half-sharp>

    A `pitch.Pitch` object can also be created using only a number
    from 0-11, that number is taken to be a `pitchClass`, where
    0 = C, 1 = C#/D-, etc. and no octave is set.

    >>> p2 = pitch.Pitch(3)
    >>> p2
    <music21.pitch.Pitch E->
    >>> p2.octave is None
    True

    Since in instantiating pitches from numbers,
    `pitch.Pitch(3)` could be either a D# or an E-flat,
    this `Pitch` object has an attribute called `.spellingIsInferred` that
    is set to `True`.  That means that when it is transposed or
    displayed, other functions or programs should feel free to substitute an
    enharmonically equivalent pitch in its place:

    >>> p2.spellingIsInferred
    True
    >>> p1.spellingIsInferred
    False

    As MIDI numbers < 12 are almost unheard of in actual music,
    there is unlikely to be confusion between
    a pitchClass instantiation and a MIDI number instantiation, but if one must be
    clear, use `midi=` in the constructor:

    >>> lowE = pitch.Pitch(midi=3)
    >>> lowE.name, lowE.octave
    ('E-', -1)

    Instead of using a single string or integer for creating the object, a succession
    of named keywords can be used instead:

    >>> p3 = pitch.Pitch(name='C', accidental='#', octave=7, microtone=-30)
    >>> p3.fullName
    'C-sharp in octave 7 (-30c)'

    The full list of supported keywords are: `name`, `accidental` (which
    can be a string or an :class:`~music21.pitch.Accidental` object), `octave`,
    microtone (which can be a number or a :class:`~music21.pitch.Microtone` object),
    `pitchClass` (0-11), `fundamental` (another `Pitch` object representing the
    fundamental for this harmonic; `harmonic` is not yet supported, but should be),
    and `midi` or `ps` (two ways of specifying nearly the same thing, see below).

    Using keywords to create `Pitch` objects is especially important if
    extreme pitches might be found.  For instance, the first `Pitch` is B-double flat
    in octave 3, not B-flat in octave -3.  The second object creates that low `Pitch`
    properly:

    >>> p4 = pitch.Pitch('B--3')
    >>> p4.accidental
    <music21.pitch.Accidental double-flat>
    >>> p4.octave
    3

    >>> p5 = pitch.Pitch(step='B', accidental='-', octave=-3)
    >>> p5.accidental
    <music21.pitch.Accidental flat>
    >>> p5.octave
    -3

    Internally, pitches are represented by their
    scale step (`self.step`), their octave, and their
    accidental. `Pitch` objects use these three elements to figure out their
    pitch space representation (`self.ps`); altering any
    of the first three changes the pitch space (ps) representation.
    Similarly, altering the .ps representation
    alters the first three.

    >>> aSharp = pitch.Pitch('A#5')
    >>> aSharp.ps
    82.0

    >>> aSharp.octave = 4
    >>> aSharp.ps
    70.0

    >>> aSharp.ps = 60.0
    >>> aSharp.nameWithOctave
    'C4'

    Two Pitches are equal if they represent the same
    pitch and are spelled the same (enharmonics do not count).
    A Pitch is greater than another Pitch if its `.ps` is greater than
    the other.  Thus, C##4 > D-4.

    >>> pitch.Pitch('C#5') == pitch.Pitch('C#5')
    True
    >>> pitch.Pitch('C#5') == pitch.Pitch('D-5')
    False
    >>> pitch.Pitch('C##5') > pitch.Pitch('D-5')
    True

    A consequence of comparing enharmonics for equality but .ps for comparisons
    is that a `Pitch` can be neither less than
    nor greater than another `Pitch` without being equal:

    >>> pitch.Pitch('C#5') == pitch.Pitch('D-5')
    False
    >>> pitch.Pitch('C#5') > pitch.Pitch('D-5')
    False
    >>> pitch.Pitch('C#5') < pitch.Pitch('D-5')
    False

    To check for enharmonic equality, use the .ps attribute:

    >>> pitch.Pitch('C#5').ps == pitch.Pitch('D-5').ps
    True

    Advanced construction of pitch with keywords:

    >>> pitch.Pitch(name='D', accidental=pitch.Accidental('double-flat'))
    <music21.pitch.Pitch D-->
    >>> f = pitch.Pitch(pitchClass=5, octave=4,
    ...                 microtone=pitch.Microtone(30), fundamental=pitch.Pitch('B-2'))
    >>> f
    <music21.pitch.Pitch F4(+30c)>
    >>> f.fundamental
    <music21.pitch.Pitch B-2>

    If contradictory keyword attributes (like `name='E-', accidental='#'`) are passed in,
    behavior is not defined, but unlikely to make you happy.

    Pitches are ProtoM21Objects, so they retain some attributes there
    such as .classes and .groups, but they don't have Duration or Sites objects
    and cannot be put into Streams
    )ri   nameWithOctavestep
pitchClassr   midigermanfrenchspanishitaliandutchr   a  
            Returns True or False about whether enharmonic spelling
            Has been inferred on pitch creation or whether it has
            been specified directly.

            MIDI 61 is C# or D- equally.

            >>> p = pitch.Pitch('C4')
            >>> p.spellingIsInferred
            False
            >>> p.ps = 61
            >>> p.spellingIsInferred
            True
            >>> p.name
            'C#'
            >>> p.name = 'C#'
            >>> p.spellingIsInferred
            False

            This makes a difference in transposing.  For instance:

            >>> pInferred = pitch.Pitch(61)
            >>> pNotInferred = pitch.Pitch('C#4')
            >>> pInferred.nameWithOctave, pNotInferred.nameWithOctave
            ('C#4', 'C#4')
            >>> pInferred.spellingIsInferred, pNotInferred.spellingIsInferred
            (True, False)

            >>> inferredTransposed = pInferred.transpose('A1')
            >>> inferredTransposed.nameWithOctave
            'D4'
            >>> notInferredTransposed = pNotInferred.transpose('A1')
            >>> notInferredTransposed.nameWithOctave
            'C##4'

            An operation like diatonic transposition should retain the spelling is inferred
            for the resulting object

            >>> inferredTransposed.spellingIsInferred, notInferredTransposed.spellingIsInferred
            (True, False)

            But Chromatic transposition can change an object to inferred spelling:

            >>> p3 = notInferredTransposed.transpose(1)  # C## -> E- not to C###
            >>> p3.nameWithOctave
            'E-4'
            >>> p3.spellingIsInferred
            True
        rN  rO  N)r  r   
accidental	microtoner  r  rv   fundamentalc               d   d | _         t        j                  | _        d | _        d | _        d | _        d | _        d| _        d | _	        d | _
        |Vt        |t              r|| _        nGt        |      dd \  | _        | _        d| _        |dk\  r t!        |dz        dz
  | _        n	||| _        ||| _        |(t        |t"              r|| _        nt#        |      | _        |(t        |t&              r|| _        nt'        |      | _        ||| _        |	|	| _	        ||| _        ||| _        y y )NFr   r   Try   r)   )_groupsr
   	pitchStep_step_overridden_freq440_accidental
_microtone_octaver   r  rH  rr   r  ri   r   r  rs   r   r  r   r  r  r  rv   )r
  ri   r  r   r  r  r  r  rv   r  keywordss              rc   r  zPitch.__init__g  sK    *.  (11
/3 
 -1*. "& #( (, (, $$ 	 /?t.DQq.I+	4+*.'2:#&tby>A#5DLDI!DL!*j1",",Z"8 )Y/!*!*9!5!(DO"*DDI>DG re   c                    t        |       S r   r  r   s    rc   r!  zPitch._reprInternal  r"  re   c                    | j                   }| j                  1| j                  j                  dk7  r|t        | j                        z   S |S r  )r  r  r   r  r
  ri   s     rc   r.  zPitch.__str__  sA    ""??&4??+@+@A+E#doo...Kre   c                    t        |t              st        S | j                  |j                  k(  rL| j                  |j                  k(  r3| j
                  |j
                  k(  r| j                  |j                  k(  ryy)a  
        Are two pitches equal?

        They must both sound the same and be spelled the same.
        Enharmonic equivalence is not equality, nor is impliedOctave
        or is a pitch without an accidental equal to a pitch with a
        natural accidental.  (See `:meth:`~music21.pitch.Pitch.isEnharmonic` for
        a method that does not require spelling equivalence, and for an example
        of how to compare notes without accidentals to notes with natural
        accidentals.)

        >>> c = pitch.Pitch('C2')
        >>> c.octave
        2
        >>> cs = pitch.Pitch('C#4')
        >>> cs.octave
        4
        >>> c == cs
        False
        >>> c != cs
        True

        >>> seven = 7
        >>> c == seven
        False

        >>> c != seven
        True

        >>> df = pitch.Pitch('D-4')
        >>> cs == df
        False

        Implied octaves do not equal explicit octaves

        >>> c4 = pitch.Pitch('C4')
        >>> cImplied = pitch.Pitch('C')
        >>> c4 == cImplied
        False
        >>> c4.ps == cImplied.ps
        True

        Note: currently spellingIsInferred and fundamental
        are not checked -- this behavior may change in the future.
        TF)rr   r   NotImplementedr   r  r  r  r  s     rc   r  zPitch.__eq__  s]    \ %'!!KK5<<'II+OOu'7'77NNeoo5re   c           	     n   t        |       t        u rt        j                  t              }| j                  D ]e  }t	        | |d      }|dv rt        |||       "|dk(  rt        ||d       5|t        ||d       Et        ||t        j                  ||             g |S t        j                  | |      S )a$  
        highly optimized -- it knows exactly what can only have a scalar value and
        just sets that directly, only running deepcopy on the other bits.

        And _client should NOT be deepcopied.  In fact, it is cleared to nothing.
        deepcopy of note will set it back.
        N)r  r  r  r   rH  )
r  r   rZ  __dict__r]  r\  r   r   r   r  )r
  r  r^  kvs        rc   r  zPitch.__deepcopy__  s     :--&C]]D!T* : :CA&)^CD)YCD)CDMM!T$:; # J))$55re   c           	         | j                   | j                  | j                  | j                  | j                  | j
                  t        |       f}t        |      S r   )r  r  r   r  r   r  r  r  r  s     rc   r  zPitch.__hash__  sK    OO##NNKKIIJ

 Jre   c                d    t        |t              st        S | j                  |j                  k  ryy)z
        Accepts enharmonic equivalence. Based entirely on pitch space
        representation.

        >>> a = pitch.Pitch('c4')
        >>> b = pitch.Pitch('c#4')
        >>> a < b
        True
        TFrr   r   r  rv   r  s     rc   rh  zPitch.__lt__   s*     %'!!77UXXre   c                h    | j                  |      }|t        u rt        S |ry| j                  |      S )a{  
        Less than or equal.  Based on the accidentals' alter function.
        Note that to be equal enharmonics must be the same. So two pitches can
        be neither lt nor gt and not equal to each other!

        >>> a = pitch.Pitch('d4')
        >>> b = pitch.Pitch('d8')
        >>> c = pitch.Pitch('d4')
        >>> b <= a
        False
        >>> a <= b
        True
        >>> a <= c
        True

        >>> d = pitch.Pitch('c##4')
        >>> c >= d
        False
        >>> c <= d
        False

        Do not rely on this behavior -- it may be changed in a future version
        to create a total ordering.
        T)rh  r  r  )r
  r  	lt_results      rc   ri  zPitch.__le__1  s5    2 KK&	&!!{{5!!re   c                d    t        |t              st        S | j                  |j                  kD  ryy)z
        Accepts enharmonic equivalence. Based entirely on pitch space
        representation.

        >>> a = pitch.Pitch('d4')
        >>> b = pitch.Pitch('d8')
        >>> a > b
        False
        TFr  r  s     rc   rb  zPitch.__gt__Q  s*     %'!!77UXXre   c                h    | j                  |      }|t        u rt        S |ry| j                  |      S )a  
        Greater than or equal.  Based on the accidentals' alter function.
        Note that to be equal enharmonics must be the same. So two pitches can
        be neither lt nor gt and not equal to each other!

        >>> a = pitch.Pitch('d4')
        >>> b = pitch.Pitch('d8')
        >>> c = pitch.Pitch('d4')
        >>> a >= b
        False
        >>> b >= a
        True
        >>> a >= c
        True
        >>> c >= a
        True

        >>> d = pitch.Pitch('c##4')
        >>> c >= d
        False
        >>> c <= d
        False

        Do not rely on this behavior -- it may be changed in a future version
        to create a total ordering.
        T)rb  r  r  )r
  r  	gt_results      rc   rc  zPitch.__ge__c  s5    6 KK&	&!!{{5!!re   c                d    | j                   t        j                         | _         | j                   S )zW
        Similar to Groups on music21 object, returns or sets a Groups object.
        )r  r   Groupsr   s    rc   groupszPitch.groups  s%    
 <<;;=DL||re   c                    || _         y r   )r  )r
  r^  s     rc   r  zPitch.groups  s	    re   c                    | j                   S )a(  
        Stores an optional accidental object contained within the
        Pitch object.  This might return None, which is different
        from a natural accidental:

        >>> a = pitch.Pitch('E-')
        >>> a.accidental.alter
        -1.0
        >>> a.accidental.modifier
        '-'

        >>> b = pitch.Pitch('C4')
        >>> b.accidental is None
        True
        >>> b.accidental = pitch.Accidental('natural')
        >>> b.accidental is None
        False
        >>> b.accidental
        <music21.pitch.Accidental natural>
        )r  r   s    rc   r  zPitch.accidental  s    , re   c                   t        |t              r|| _        n|d | _        nt        |t              rt        |      | _        nt        |t              rt        |      | _        d | _        n^t        |t              r@t        |dz        \  }}t        |      | _        t        |      dkD  rt        |      | _
        nt        d|      | j                          y )Nr   r8  z/Accidental should be an Accidental object, not )rr   r   r  r  rs   r  rt   r   r   r   r  r   r}  )r
  r   r   r   s       rc   r  zPitch.accidental  s    eZ($D]#Ds#)%0Ds#)%0D"DOu%7FLE5)%0D5zD !*5!1NuiXYYre   c                Z    | j                   t        d      }|| _         |S | j                   S )a  
        Returns or sets the microtone object contained within the
        Pitch object. Microtones must be supplied in cents.

        >>> p = pitch.Pitch('E-4')
        >>> p.microtone.cents == 0
        True
        >>> p.ps
        63.0
        >>> p.microtone = 33  # adjustment in cents
        >>> str(p)
        'E-4(+33c)'
        >>> p.microtone
        <music21.pitch.Microtone (+33c)>

        >>> (p.name, p.nameWithOctave)  # these representations are unchanged
        ('E-', 'E-4')
        >>> p.microtone = '(-12c'  # adjustment in cents
        >>> p
        <music21.pitch.Pitch E-4(-12c)>
        >>> p.microtone = pitch.Microtone(-30)
        >>> p
        <music21.pitch.Pitch E-4(-30c)>
        r   )r  r   )r
  mts     rc   r  zPitch.microtone  s-    4 ??"1B DOI??"re   c                    t        |t        t        t        f      rt	        |      | _        y |t	        d      | _        y t        |t              r|| _        y t        d|       )Nr   z#Cannot get a microtone object from )rr   r  rt   rs   r   r  r   r=  s     rc   r  zPitch.microtone  sS    ec5#./'.DO]'lDOy)#DO #Fug!NOOre   c                    | j                   | j                   j                         sy| j                  | j                  j                  dk7  ryy)a  
        Return True if this Pitch is
        one of the twelve tones available on a piano
        keyboard. Returns False if it instead
        has a non-zero microtonal adjustment or
        has a quarter tone accidental.

        >>> p = pitch.Pitch('g4')
        >>> p.isTwelveTone()
        True
        >>> p.microtone = -20
        >>> p.isTwelveTone()
        False

        >>> p2 = pitch.Pitch('g~4')
        >>> p2.isTwelveTone()
        False
        Fr   T)r  r  r  r  r   r   s    rc   r  zPitch.isTwelveTone  sB    & ??&??//1??&4>>+?+?1+Dre   c                    | j                   | j                  z
  }|dk  r|dz  }|dk  r|dkD  r|dz  }|dkD  rt        |dz        S )a  
        Get cent deviation of this pitch from MIDI pitch.

        >>> p = pitch.Pitch('c~4')
        >>> p.ps
        60.5
        >>> p.midi  # midi values automatically round up at 0.5
        61
        >>> p.getCentShiftFromMidi()
        -50
        >>> p.microtone = -25
        >>> p.ps
        60.25
        >>> p.midi
        60
        >>> p.getCentShiftFromMidi()
        25

        >>> p = pitch.Pitch('c#4')
        >>> p.microtone = -25
        >>> p.ps
        60.75
        >>> p.midi
        61
        >>> p.getCentShiftFromMidi()
        -25

        >>> p = pitch.Pitch('c#~4')
        >>> p.ps
        61.5
        >>> p.midi
        62
        >>> p.getCentShiftFromMidi()
        -50
        >>> p.microtone = -3
        >>> p.ps
        61.47
        >>> p.midi
        61
        >>> p.getCentShiftFromMidi()
        47
        >>> p.microtone = 3
        >>> p.ps
        61.53
        >>> p.midi
        62
        >>> p.accidental
        <music21.pitch.Accidental one-and-a-half-sharp>
        >>> p.getCentShiftFromMidi()
        -47

        >>> p = pitch.Pitch('c`4')  # quarter tone flat
        >>> p.getCentShiftFromMidi()
        -50
        >>> p.microtone = 3
        >>> p.getCentShiftFromMidi()
        -47

        Absurd octaves that MIDI can't handle will still give the right sounding pitch
        out of octave:

        >>> p = pitch.Pitch('c~4')
        >>> p.octave = 10
        >>> p.ps
        132.5
        >>> p.midi
        121
        >>> p.getCentShiftFromMidi()
        -50
        >>> p.octave = -1
        >>> p.getCentShiftFromMidi()
        -50
        >>> p.octave = -2
        >>> p.getCentShiftFromMidi()
        -50
        g      &g      (@g      &@r   )rv   r  r   )r
  midiDistances     rc   getCentShiftFromMidizPitch.getCentShiftFromMidi
	  sc    Z ww* U"D L U"T!D L T! \C'((re   c                    d}| j                   || j                   j                  z  }| j                  || j                  j                  z  }|S )a7  
        Get the number of half-steps shifted
        by this pitch, such as 1.0 for a sharp, -1.0 for a flat,
        0.0 for a natural, 2.0 for a double sharp,
        and -0.5 for a quarter tone flat.

        Thus, the alter value combines the pitch change
        suggested by the Accidental and the Microtone combined.

        >>> p = pitch.Pitch('g#4')
        >>> p.alter
        1.0
        >>> p.microtone = -25  # in cents
        >>> p.alter
        0.75

        To change the alter value, change either the accidental
        or the microtone.
        r   )r  r   r  r  )r
  posts     rc   r   zPitch.altera	  sJ    * ??&DOO)))D??&DNN(((Dre   FinPlacec               n   |r| }nt        j                  |       }|j                  |j                  j                  dk(  r&d|_        |j                  j
                  dz
  |_        n|j                  j                  dk(  r&d|_        |j                  j
                  dz   |_        n}|j                  j                  dk(  r&d|_        |j                  j
                  dz   |_        n>|j                  j                  dk(  r%d|_        |j                  j
                  dz
  |_        |s|S | j                          y)	aY  
        Convert any quarter tone Accidentals to Microtones.

        tilde is the symbol for half-sharp, so G#~ is G three-quarters sharp.

        >>> p = pitch.Pitch('G#~')
        >>> str(p), p.microtone
        ('G#~', <music21.pitch.Microtone (+0c)>)
        >>> p.convertQuarterTonesToMicrotones(inPlace=True)
        >>> p.ps
        68.5
        >>> str(p), p.microtone
        ('G#(+50c)', <music21.pitch.Microtone (+50c)>)

        >>> p = pitch.Pitch('A')
        >>> p.accidental = pitch.Accidental('half-flat')  # back-tick
        >>> str(p), p.microtone
        ('A`', <music21.pitch.Microtone (+0c)>)
        >>> x = p.convertQuarterTonesToMicrotones(inPlace=False)
        >>> str(x), x.microtone
        ('A(-50c)', <music21.pitch.Microtone (-50c)>)
        >>> str(p), p.microtone
        ('A`', <music21.pitch.Microtone (+0c)>)
        Nr@   r   r>   r?   r   rA   r   )r   r   r  ri   r  r   r}  )r
  r  	returnObjs      rc   convertQuarterTonesToMicrotonesz%Pitch.convertQuarterTonesToMicrotones}	  s   2 Id+I+##((K7'+	$&/&9&9&?&?"&D	#%%**l:'+	$&/&9&9&?&?"&D	#%%**.DD'*	$&/&9&9&?&?"&D	#%%**.CC'+	$&/&9&9&?&?"&D	#re   c               >   |r| }nt        j                  |       }|j                  j                  }t	        |      \  }}|j
                  (t        |j
                  j                  |z         |_        nt        |      |_        ||_        |s|S | j                          y)a  
        Convert any Microtones available to quarter tones, if possible.

        >>> p = pitch.Pitch('g3')
        >>> p.microtone = 78
        >>> str(p)
        'G3(+78c)'
        >>> p.convertMicrotonesToQuarterTones(inPlace=True)
        >>> str(p)
        'G#3(-22c)'

        >>> p = pitch.Pitch('d#3')
        >>> p.microtone = 46
        >>> p
        <music21.pitch.Pitch D#3(+46c)>
        >>> p.convertMicrotonesToQuarterTones(inPlace=True)
        >>> p
        <music21.pitch.Pitch D#~3(-4c)>

        >>> p = pitch.Pitch('f#2')
        >>> p.microtone = -38
        >>> p.convertMicrotonesToQuarterTones(inPlace=True)
        >>> str(p)
        'F~2(+12c)'

        N)	r   r   r  r   r   r  r   r   r}  )r
  r  r  r   r   r   s         rc   convertMicrotonesToQuarterTonesz%Pitch.convertMicrotonesToQuarterTones	  s    6 Id+I##))8?
E+#-$$**Z7$9I  $.j#9I #	re   c                    | j                   }t        | j                  dz   dz  t        |   z         }| j                  || j                  j
                  z   }| j                  || j                  j
                  z   }|S )a  
        The ps property permits getting and setting
        a pitch space value, a floating point number
        representing pitch space, where 60.0 is C4, middle C,
        61.0 is C#4 or D-4, and floating point values are
        microtonal tunings (0.01 is equal to one cent), so
        a quarter-tone sharp above C5 is 72.5.

        Note that the choice of 60.0 for C4 makes it identical
        to the integer value of 60 for .midi, but .midi
        does not allow for microtones and is limited to 0-127
        while .ps allows for notes before midi 0 or above midi 127.

        >>> a = pitch.Pitch('C4')
        >>> a.ps
        60.0

        Changing the ps value for `a` will change the step and octave:

        >>> a.ps = 45
        >>> a
        <music21.pitch.Pitch A2>
        >>> a.ps
        45.0

        Notice that ps 61 represents both
        C# and D-flat.  Thus, "spellingIsInferred"
        will be true after setting our pitch to 61:

        >>> a.ps = 61
        >>> a
        <music21.pitch.Pitch C#4>
        >>> a.ps
        61.0
        >>> a.spellingIsInferred
        True

        Microtonal accidentals and pure Microtones are allowed, as are extreme ranges:

        >>> b = pitch.Pitch('B9')
        >>> b.accidental = pitch.Accidental('half-flat')
        >>> b
        <music21.pitch.Pitch B`9>
        >>> b.ps
        130.5

        >>> p = pitch.Pitch('c4')
        >>> p.microtone = 20
        >>> print(f'{p.ps:.1f}')
        60.2

        Octaveless pitches use their .implicitOctave attributes:

        >>> d = pitch.Pitch('D#')
        >>> d.octave is None
        True
        >>> d.implicitOctave
        4
        >>> d.ps
        63.0

        >>> d.octave = 5
        >>> d.ps
        75.0

        Setting with microtones

        >>> p = pitch.Pitch()
        >>> p.ps = 61
        >>> p.ps
        61.0
        >>> p.spellingIsInferred
        True
        >>> p.ps = 61.5  # get a quarter tone
        >>> p
        <music21.pitch.Pitch C#~4>
        >>> p.ps = 61.7  # set a microtone
        >>> print(p)
        C#~4(+20c)
        >>> p.ps = 61.4  # set a microtone
        >>> print(p)
        C#~4(-10c)

        The property is called when self.step, self.octave
        or self.accidental are changed.
        r)   ry   )r  rt   implicitOctaver&   r  r   r  r  )r
  r  rv   s      rc   rv   zPitch.ps	  sr    p zzT((1,2gdmCD??&doo+++B??&dnn***B	re   c                    t        |      \  | _        }| _        }|j                  dk(  rd | _        n|| _        t        |      |z   | _        d| _        y )Nr5   T)r   r  r  ri   r  r   r   r   )r
  r   r   r   s       rc   rv   zPitch.psB
  sS     5EU4K1	3 88y "DO!DO%e,x7 #'re   c                    d } || j                         }|dkD  rd|dz  z   }|dk  r|dz  }|S |dk  r
d|dz  z   }|S |}|S )a  
        Get or set a pitch value in MIDI.
        MIDI pitch values are like ps values (pitchSpace) rounded to
        the nearest integer; while the ps attribute will accommodate floats.

        >>> c = pitch.Pitch('C4')
        >>> c.midi
        60
        >>> c.midi =  23.5
        >>> c.midi
        24

        Note that like ps (pitchSpace), MIDI notes do not distinguish between
        sharps and flats, etc.

        >>> dSharp = pitch.Pitch('D#4')
        >>> dSharp.midi
        63
        >>> eFlat = pitch.Pitch('E-4')
        >>> eFlat.midi
        63

        Midi values are constrained to the space 0-127.  Higher or lower
        values will be transposed octaves to fit in this space.

        >>> veryHighFHalfFlat = pitch.Pitch('F')
        >>> veryHighFHalfFlat.octave = 12
        >>> veryHighFHalfFlat.accidental = pitch.Accidental('half-flat')
        >>> veryHighFHalfFlat
        <music21.pitch.Pitch F`12>
        >>> veryHighFHalfFlat.ps
        160.5
        >>> veryHighFHalfFlat.midi
        125
        >>> veryHighFHalfFlat.octave = 9
        >>> veryHighFHalfFlat.midi
        125

        >>> notAsHighNote = pitch.Pitch()
        >>> notAsHighNote.ps = veryHighFHalfFlat.midi
        >>> notAsHighNote
        <music21.pitch.Pitch F9>

        Note that the conversion of improper midi values to proper
        midi values is done before assigning .ps:

        >>> a = pitch.Pitch()
        >>> a.midi = -10
        >>> a.midi
        2
        >>> a.ps
        2.0
        >>> a.spellingIsInferred
        True

        More absurd octaves:

        >>> p = pitch.Pitch('c~4')
        >>> p.octave = -1
        >>> p.ps
        0.5
        >>> p.midi
        1
        >>> p.octave = -2
        >>> p.ps
        -11.5
        >>> p.midi
        1
        c                2    t        j                  | dz         S )aq  
            This is round "up" at 0.5 (regardless of negative or positive)

            Python 3 now uses rounding mechanisms so that odd numbers round one way, even another.
            But we needed a consistent direction for all half-sharps/flats to go,
            and now long after Python 2 is no longer supported, this behavior is grandfathered in.
            r   )r   r   )r   s    rc   schoolYardRoundingz&Pitch.midi.<locals>.schoolYardRounding
  s     ::a#g&&re      l   ry   s   r   ru   )r
  r  	roundedPSr   s       rc   r  z
Pitch.midiR
  so    N	' 'tww/	s?	B/E!
 	 ]R(E  Ere   c                    t        |      }|dkD  rd|dz  z   }|dk  r|dz  }n|dk  rd|dz  z   }|| _        d| _        y)zi
        midi values are constrained within the range of 0 to 127
        floating point values,
        r  r  ry   r  r   TN)r   rv   r   r=  s     rc   r  z
Pitch.midi
  sY     e3;
+E!QY$E #'re   c                x    | j                   #| j                  | j                   j                  z   S | j                  S )a  
        Gets or sets the name (pitch name with accidental but
        without octave) of the Pitch.

        >>> p = pitch.Pitch('D#5')
        >>> p.name
        'D#'

        >>> p.name = 'C#'
        >>> p.name
        'C#'

        >>> a = pitch.Pitch('G#')
        >>> a.name
        'G#'

        Does not simplify enharmonics

        >>> a = pitch.Pitch('B---')
        >>> a.name
        'B---'
        )r  r  rL  r   s    rc   ri   z
Pitch.name
  s1    0 ??&99t777799re   c           	         	 |j                         }g }g }d}|D ]<  }|dv r#|st        d|d      |j	                  |       *d}|j	                  |       > dj                  |      }dj                  |      }t        |      d	k(  r|| _        d
| _        n:t        |      d	kD  r|d   | _        t        |d	d
       | _        nt        d|      |rt        |      }|| _        y
y
# t        $ r t        d|dt        |       d      w xY w)zu
        Set name, which may be provided with or without octave values. C4 or D-3
        are both accepted.
        zArgument to name, z, must be a string, not .F
0123456789z.Cannot have octave given before pitch name in Tr/   r)   Nr   zCannot make a name out of )stripr  r   r  r_   joinr^   r  r  r   r   rs   r   )r
  usrStroctFoundoctNotfoundNonOctavecharoctFoundStrr   s           rc   ri   z
Pitch.name
  s1   	e\\^F
 !D|#%$'UV\U__`%abb%!%d#  ggh'v;!DI"DO[1_q	DI(4DO #=fZ!HII%F DK ;  	e1&;STXY_T`Saabcdd	es   C( (%Dc                x    | j                   #| j                  | j                   j                  z   S | j                  S )u   
        Name presently returns pitch name and accidental without octave.

        >>> a = pitch.Pitch('G#')
        >>> a.unicodeName
        'G♯'
        )r  r  r  r   s    rc   unicodeNamezPitch.unicodeName  s1     ??&99t666699re   c                v    | j                   | j                  S | j                  t        | j                         z   S )a  
        Return or set the pitch name with an octave designation.
        If no octave as been set, no octave value is returned.

        >>> gSharp = pitch.Pitch('G#4')
        >>> gSharp.nameWithOctave
        'G#4'

        >>> dFlatFive = pitch.Pitch()
        >>> dFlatFive.step = 'D'
        >>> dFlatFive.accidental = pitch.Accidental('flat')
        >>> dFlatFive.octave = 5
        >>> dFlatFive.nameWithOctave
        'D-5'
        >>> dFlatFive.nameWithOctave = 'C#6'
        >>> dFlatFive.name
        'C#'
        >>> dFlatFive.octave
        6

        N.B. -- it's generally better to set the name and octave separately, especially
        since you may at some point encounter very low pitches such as "A octave -1", which
        will be interpreted as "A-flat, octave 1".  Our crude setting algorithm also does
        not support octaves above 9.

        >>> lowA = pitch.Pitch()
        >>> lowA.name = 'A'
        >>> lowA.octave = -1
        >>> lowA.nameWithOctave
        'A-1'
        >>> lowA.nameWithOctave = lowA.nameWithOctave
        >>> lowA.name
        'A-'
        >>> lowA.octave
        1

        Octave must be included in nameWithOctave or an exception is raised:

        >>> a = pitch.Pitch()
        >>> a.nameWithOctave = 'C#9'
        >>> a.nameWithOctave = 'C#'
        Traceback (most recent call last):
        music21.pitch.PitchException: Cannot set a nameWithOctave with 'C#'

        Set octave to None explicitly instead.
        )r   ri   r  r   s    rc   r  zPitch.nameWithOctave  s1    ` ;;9999s4;;///re   c                    	 t        |      }|d|dz
   }t        |d         }|| _        || _        y # t        t
        f$ r}t        d|      |d }~ww xY w)Nr   r)   r   z!Cannot set a nameWithOctave with )r^   rs   ri   r   r   r   )r
  r   lenValri   r   r   s         rc   r  zPitch.nameWithOctaveJ  si    	WZF6A:&Dr^FDI DKN+ 	W #DUI!NOUVV	Ws   /2 AAAc                v    | j                   | j                  S | j                  t        | j                         z   S )u   
        Return the pitch name with octave with unicode accidental symbols,
        if available.

        Read-only property.

        >>> p = pitch.Pitch('C#4')
        >>> p.unicodeNameWithOctave
        'C♯4'
        )r   r  r  r   s    rc   unicodeNameWithOctavezPitch.unicodeNameWithOctaveU  s4     ;;#####c$++&666re   c                   | j                   }| j                  |d| j                  j                   z  }| j                  |d| j                   z  }| j                  +| j
                  j                  dk7  r|d| j                   z  }|S )ax  
        Return the most complete representation of this Pitch,
        providing name, octave, accidental, and any
        microtonal adjustments.

        >>> p = pitch.Pitch('A-3')
        >>> p.microtone = 33.33
        >>> p.fullName
        'A-flat in octave 3 (+33c)'

        >>> p = pitch.Pitch('A`7')
        >>> p.fullName
        'A-half-flat in octave 7'
        r1   z in octave r    )r  r  r  r   r  r  r   r  s     rc   r  zPitch.fullNamef  s      yy??&a00122D;;"k$++//D??&4>>+?+?1+Da())Dre   c                    | j                   S )az  
        The diatonic name of the note; i.e. does not give the
        accidental or octave.

        >>> a = pitch.Pitch('B-3')
        >>> a.step
        'B'

        Upper-case or lower-case names can be given to `.step` -- they
        will be converted to upper-case

        >>> b = pitch.Pitch()
        >>> b.step = 'c'
        >>> b.step
        'C'

        Changing the `.step` does not change the `.accidental` or
        `.octave`:

        >>> a = pitch.Pitch('F#5')
        >>> a.step = 'D'
        >>> a.nameWithOctave
        'D#5'

        Giving a value that includes an accidental raises a PitchException.
        Use .name instead to change that.

        >>> b = pitch.Pitch('E4')
        >>> b.step = 'B-'
        Traceback (most recent call last):
        music21.pitch.PitchException: Cannot make a step out of 'B-'

        This is okay though:

        >>> b.name = 'B-'

        Note that if spelling is inferred, setting the step does NOT
        give that enharmonic.  Perhaps it should, but best to make people use
        .getLowerEnharmonic or .getHigherEnharmonic instead.

        >>> b.ps = 60
        >>> b.nameWithOctave
        'C4'
        >>> b.spellingIsInferred
        True
        >>> b.step = 'B'
        >>> b.accidental is None  # maybe this should set to B#? But that could be screwy.
        True
        >>> b.spellingIsInferred
        False
        )r  r   s    rc   r  z
Pitch.step  s    j zzre   c                    |j                         j                         }t        |      dk(  r|t        v r|| _        d| _        nt        d|      | j                          y)zF
        This does not change octave or accidental, only step
        r)   FzCannot make a step out of N)r  upperr^   r(   r  r   r   r}  )r
  r  s     rc   r  z
Pitch.step  sY    
 %%'v;!) 3DJ&+D# #=fZ!HIIre   c                2    t        | j                        dz  S )a
  
        Returns or sets the integer value for the pitch, 0-11, where C=0,
        C#=1, D=2, etc. to B=11. Can be set using integers (0-11) or 'A' or 'B'
        for 10 or 11.

        >>> a = pitch.Pitch('a3')
        >>> a.pitchClass
        9
        >>> dis = pitch.Pitch('d3')
        >>> dis.pitchClass
        2
        >>> dis.accidental = pitch.Accidental('#')
        >>> dis.pitchClass
        3

        If a string "A" or "B" is given to pitchClass, it is
        still returned as an int.

        >>> dis.pitchClass = 'A'
        >>> dis.pitchClass
        10
        >>> dis.name
        'B-'

        Extreme octaves will not affect pitchClass

        >>> dis.octave = -10
        >>> dis.pitchClass
        10

        In the past, certain microtones and/or octaves were returning pc 12!
        This is now fixed.

        >>> flattedC = pitch.Pitch('C4')
        >>> flattedC.microtone = -4
        >>> print(flattedC)
        C4(-4c)
        >>> flattedC.pitchClass
        0
        >>> print(flattedC.ps)
        59.96
        >>> flattedC.octave = -3
        >>> print(flattedC.ps)
        -24.04
        >>> flattedC.pitchClass
        0

        Note that the pitchClass of a microtonally altered pitch is the pitch class of
        the nearest pitch.  Python 3 uses the "round-to-even" method so C~4 (C half sharp 4)
        is pitchClass 0, since 60.5 rounds to 60.0

        >>> p = pitch.Pitch('C~4')
        >>> p.ps
        60.5
        >>> p.pitchClass
        0

        However, for backwards compatability, the MIDI number of a microtone
        is created by using "schoolyard" rounding which always rounds 0.5 upwards, which
        can cause some unusual behavior:

        >>> p.midi
        61
        >>> pitch.Pitch(midi=p.midi).pitchClass
        1

        This means that pitchClass + microtone is NOT a good way to estimate the frequency
        of a pitch.  For instance, if we take a pitch that is 90% of the way between pitchClass
        0 (C) and pitchClass 1 (C#/D-flat), this formula gives an inaccurate answer of 1.9, not
        0.9:

        >>> p = pitch.Pitch('C4')
        >>> p.microtone = 90
        >>> p
        <music21.pitch.Pitch C4(+90c)>
        >>> p.pitchClass + (p.microtone.cents / 100.0)
        1.9

        More examples of setting the pitchClass.

        >>> a = pitch.Pitch('a3')
        >>> a.pitchClass = 3
        >>> a
        <music21.pitch.Pitch E-3>
        >>> a.spellingIsInferred
        True
        >>> a.pitchClass = 'A'
        >>> a
        <music21.pitch.Pitch B-3>

        Changing pitchClass does not remove microtones.

        >>> a.microtone = 20
        >>> a.pitchClass = 1
        >>> a
        <music21.pitch.Pitch C#3(+20c)>
        ry   )r   rv   r   s    rc   r  zPitch.pitchClass  s    F TWW~""re   c                ^    t        |      }t        |      dd \  | _        | _        d| _        y )Nr   r   T)rw   r   r  r  r   )r
  r   valueOuts      rc   r  zPitch.pitchClass-  s3     9?&6x&@1&E#	4# #'re   c                ,    t        | j                        S )a1  
        Returns or sets a string representation of the pitch class,
        where integers greater than 10 are replaced by A and B,
        respectively. Can be used to set pitch class by a
        string representation as well (though this is also
        possible with :attr:`~music21.pitch.Pitch.pitchClass`).

        >>> a = pitch.Pitch('a#3')
        >>> a.pitchClass
        10
        >>> a.pitchClassString
        'A'

        We can set the pitchClassString as well:

        >>> a.pitchClassString = 'B'
        >>> a.pitchClass
        11
        )r}   r  r   s    rc   pitchClassStringzPitch.pitchClassString8  s    * &doo66re   c                    || _         y r   )r  )r
  r  s     rc   r  zPitch.pitchClassStringO  s	    re   c                    | j                   S )a  
        Returns or sets the octave of the note.
        Setting the octave updates the pitchSpace attribute.

        >>> a = pitch.Pitch('g')
        >>> a.octave is None
        True
        >>> a.implicitOctave
        4
        >>> a.ps  ## will use implicitOctave
        67.0
        >>> a.name
        'G'

        >>> a.octave = 14
        >>> a.octave
        14
        >>> a.implicitOctave
        14
        >>> a.name
        'G'
        >>> a.ps
        187.0
        )r  r   s    rc   r   zPitch.octaveT  s    4 ||re   c                X    |t        |      | _        nd | _        | j                          y r   )rs   r  r}  r=  s     rc   r   zPitch.octavep  s&    u:DLDLre   c                R    | j                   t        j                  S | j                   S )ae  
        Returns the octave of the Pitch, or defaultOctave if
        octave was never set. To set an octave, use .octave.
        Default octave is usually 4.

        >>> p = pitch.Pitch('C#')
        >>> p.octave is None
        True
        >>> p.implicitOctave
        4

        Cannot be set.  Instead, just change the `.octave` of the pitch
        )r   r
   pitchOctaver   s    rc   r  zPitch.implicitOctavex  s$     ;;''';;re   c                D   | j                   | j                   j                  }nd}| j                  }|t        |      k7  rt	        d      t        |      }|dk(  r|dk7  rd}n|dz  }|dk(  r|S |dkD  r
||dz  z   }|S |dv rd	}nd
}t        |      dz
  }||z   |d	z  z   }|S )u  
        Read-only property. Returns a unicode string of the name
        of a Pitch in the German system
        (where B-flat = B, B = H, etc.)
        (Microtones and Quarter tones raise an error).  Note that
        Ases is used instead of the also acceptable Asas.

        >>> print(pitch.Pitch('B-').german)
        B
        >>> print(pitch.Pitch('B').german)
        H
        >>> print(pitch.Pitch('E-').german)
        Es
        >>> print(pitch.Pitch('C#').german)
        Cis
        >>> print(pitch.Pitch('A--').german)
        Ases
        >>> p1 = pitch.Pitch('C')
        >>> p1.accidental = pitch.Accidental('half-sharp')
        >>> p1.german
        Traceback (most recent call last):
        music21.pitch.PitchException:
            Es geht nicht "german" zu benutzen mit Microtönen.  Schade!

        Note these rarely used pitches:

        >>> print(pitch.Pitch('B--').german)
        Heses
        >>> print(pitch.Pitch('B#').german)
        His
        r   u<   Es geht nicht "german" zu benutzen mit Microtönen.  Schade!r   r   r'  r)   rE   )r"   r#   r$   r%   r'  rI   r_  )r  r   r  rs   r   r   )r
  	tempAltertempSteptempNamefirstFlatNamemultipleFlatss         rc   r  zPitch.german  s    B ??&--II		I& !_``	N	s?BQ	>O]9t#34HO44 $ #	NQ.M-/=43GHHOre   c                n   | j                   | j                   j                  }nd}| j                  }|t        |      k7  rt	        d      t        |      }ddddd}dd	d
ddddd}|dk(  r||   S |dkD  r|dkD  rt	        d      ||   ||   z   dz   S |dz  }|dkD  rt	        d      ||   ||   z   dz   S )a  
        Read-only attribute. Returns the name
        of a Pitch in the Italian system
        (F-sharp is fa diesis, C-flat is do bemolle, etc.)
        (Microtones and Quarter tones raise an error).

        >>> print(pitch.Pitch('B-').italian)
        si bemolle
        >>> print(pitch.Pitch('B').italian)
        si
        >>> print(pitch.Pitch('E-9').italian)
        mi bemolle
        >>> print(pitch.Pitch('C#').italian)
        do diesis
        >>> print(pitch.Pitch('A--4').italian)
        la doppio bemolle
        >>> p1 = pitch.Pitch('C')
        >>> p1.accidental = pitch.Accidental('half-sharp')
        >>> p1.italian
        Traceback (most recent call last):
        music21.pitch.PitchException: Non si puo usare `italian` con microtoni

        Note these rarely used pitches:

        >>> print(pitch.Pitch('E####').italian)
        mi quadruplo diesis
        >>> print(pitch.Pitch('D---').italian)
        re triplo bemolle
        r   z(Non si puo usare `italian` con microtonir  z doppio z triplo z quadruplo )r)   r   r*   r   doremifasollasir!   r   zEntirely too many sharpsdiesisr   zEntirely too many flatsbemolle)r  r   r  rs   r   )r
  r  r  cardinalityMapsolfeggeMaps        rc   r  zPitch.italian  s    @ ??&--II		I& !KLL	N	 ZJ=Q t$T!49 >x((]1}$%?@@x(>)+DDxOO!BI1}$%>??x(>)+DDyPPre   c                    | j                   yt        | j                   j                        }|dk(  ry|dk(  ry|dk(  ry|dk(  ryy)	Nr/   r)   r   z dobler*    tripler   u    cuádruple)r  r   r   )r
  r`   s     rc   _getSpanishCardinalzPitch._getSpanishCardinal  sN    ??"DOO))*AAvaa a$re   r  r   r  r  r  r  r  )r   r   r"   r#   r   r$   r%   zdict[StepName, str]_SPANISH_DICTc                <   | j                   | j                   j                  }nd}| j                  | j                     }|t	        |      k7  rt        d      |dk(  r|S |dv r|| j                         z   dz   S |dv r|| j                         z   dz   S t        d      )a#  
        Read-only attribute. Returns the name
        of a Pitch in Spanish
        (Microtones and Quarter tones raise an error).

        >>> print(pitch.Pitch('B-').spanish)
        si bemol
        >>> print(pitch.Pitch('E-').spanish)
        mi bemol
        >>> print(pitch.Pitch('C#').spanish)
        do sostenido
        >>> print(pitch.Pitch('A--').spanish)
        la doble bemol
        >>> p1 = pitch.Pitch('C')
        >>> p1.accidental = pitch.Accidental('half-sharp')
        >>> p1.spanish
        Traceback (most recent call last):
        music21.pitch.PitchException: Unsupported accidental type.

        Note these rarely used pitches:

        >>> print(pitch.Pitch('B--').spanish)
        si doble bemol
        >>> print(pitch.Pitch('B#').spanish)
        si sostenido
        r   zUnsupported accidental type.>   r|  r{  rx  r   z bemol>   r)   r   r*   r   z
 sostenido)r  r   r(  r  rs   r   r'  )r
  r  solfeges      rc   r  zPitch.spanish   s    8 ??&--II$$TYY/I& !?@@>N**T5577(BB,&T5577,FF !?@@re   u   ré_FRENCH_DICTc                   | j                   | j                   j                  }nd}| j                  | j                     }|t	        |      k7  rt        d      t        |      dkD  rt        d      t	        |      }|dk(  r|S t        |      dk(  r|}nJt        |      dk(  r|dz   }n6t        |      dk(  r|d	z   }n"t        |      dk(  r|d
z   }nt        d|       |t        |      z  dk(  r|dz   }|S |dz   }|S )uw  
        Read-only attribute. Returns the name
        of a Pitch in the French system
        (where A = la, B = si, B-flat = si bémol, C-sharp = do dièse, etc.)
        (Microtones and Quarter tones raise an error).  Note that
        do is used instead of the also acceptable ut.

        >>> print(pitch.Pitch('B-').french)
        si bémol

        >>> print(pitch.Pitch('B').french)
        si

        >>> print(pitch.Pitch('E-').french)
        mi bémol

        >>> print(pitch.Pitch('C#').french)
        do dièse

        >>> print(pitch.Pitch('A--').french)
        la double bémol

        >>> p1 = pitch.Pitch('C')
        >>> p1.accidental = pitch.Accidental('half-sharp')
        >>> p1.french
        Traceback (most recent call last):
        music21.pitch.PitchException: On ne peut pas utiliser les microtones avec "french."
            Quelle Dommage!
        r   zEOn ne peut pas utiliser les microtones avec "french." Quelle Dommage!rz  ux   On ne peut pas utiliser les altération avec puissance supérieure à quatre avec "french." Ça me fait une belle jambe!r   rw  z doublery  r&  z
 quadruplezCannot deal with tempStep: u    dièseu    bémol)r  r   r+  r  rs   r   r   )r
  r  r  tempNumberedStepr  s        rc   r  zPitch.frenchX  s&   @ ??&--II))$))4I& WY Y y>C @  	N	>O^s"'^s"')3^s"')3^s"',6 #>xj!IJJs9~%,')3HO')3HOre   c                    | j                   S )a,  
        The frequency property gets or sets the frequency of
        the pitch in hertz.

        If the frequency has not been overridden, then
        it is computed based on A440Hz and equal temperament

        >>> a = pitch.Pitch()
        >>> a.frequency = 440.0
        >>> a.frequency
        440.0
        >>> a.name
        'A'
        >>> a.octave
        4

        Microtones are captured if the frequency doesn't correspond to any standard note.

        >>> a.frequency = 450.0
        >>> a
        <music21.pitch.Pitch A~4(-11c)>
        freq440r   s    rc   	frequencyzPitch.frequency  s    0 ||re   c                    || _         y r   r/  r=  s     rc   r1  zPitch.frequency  s	    re   c                t    | j                   r| j                   S | j                  dz
  }d| j                  |z  z  S )a  
        Gets the frequency of the note as if it's in an equal temperament
        context where A4 = 440hz.  The same as .frequency so long
        as no other temperaments are currently being used.

        Since we don't have any other temperament objects at present,
        this is the same as .frequency always.

        >>> a = pitch.Pitch('A4')
        >>> a.freq440
        440.0
        E        {@)r  rv   _twelfth_root_of_two)r
  A4offsets     rc   r0  zPitch.freq440  s>     ##+++ ww|HD55ABBre   c                    dt        j                  |dz        t        j                  d      z  z  dz   }t        |t              }|| _        y )Nry   r5  r   r4  )r   r   r   r   rv   )r
  r   r  r   s       rc   r0  zPitch.freq440  sA    TXXeem,txx{:;b@ 4/0re   c                F   t        |      }t        j                  |       }|dk(  r|S | j                  (t	        |j
                  j                  |z         |_        nt	        |      |_        t               }|j                  |_        t        j                  |       |_	        |S )a  
        Return a Pitch object representing the harmonic found above this Pitch.

        >>> p = pitch.Pitch('a4')
        >>> print(p.getHarmonic(2))
        A5
        >>> print(p.getHarmonic(3))
        E6(+2c)
        >>> print(p.getHarmonic(4))
        A6
        >>> print(p.getHarmonic(5))
        C#7(-14c)
        >>> print(p.getHarmonic(6))
        E7(+2c)
        >>> print(p.getHarmonic(7))
        F#~7(+19c)
        >>> print(p.getHarmonic(8))
        A7

        >>> p2 = p.getHarmonic(2)
        >>> p2
        <music21.pitch.Pitch A5>
        >>> p2.fundamental
        <music21.pitch.Pitch A4>
        >>> p2.transpose('p5', inPlace=True)
        >>> p2
        <music21.pitch.Pitch E6>
        >>> p2.fundamental
        <music21.pitch.Pitch E5>

        Or we can iterate over a list of the next 8 odd harmonics:

        >>> allHarmonics = ''
        >>> for i in [9, 11, 13, 15, 17, 19, 21, 23]:
        ...     allHarmonics += ' ' + str(p.getHarmonic(i))
        >>> print(allHarmonics)
        B7(+4c) D~8(+1c) F~8(-9c) G#8(-12c) B-8(+5c) C9(-2c) C#~9(+21c) E`9(-22c)

        Microtonally adjusted notes also generate harmonics:

        >>> q = pitch.Pitch('C4')
        >>> q.microtone = 10
        >>> q.getHarmonic(2)
        <music21.pitch.Pitch C5(+10c)>
        >>> q.getHarmonic(3)
        <music21.pitch.Pitch G5(+12c)>

        The fundamental is stored with the harmonic.

        >>> h7 = pitch.Pitch('A4').getHarmonic(7)
        >>> print(h7)
        F#~7(+19c)
        >>> h7.fundamental
        <music21.pitch.Pitch A4>
        >>> h7.harmonicString()
        '7thH/A4'
        >>> h7.harmonicString('A3')
        '14thH/A3'

        >>> h2 = h7.getHarmonic(2)
        >>> h2
        <music21.pitch.Pitch F#~8(+19c)>
        >>> h2.fundamental
        <music21.pitch.Pitch F#~7(+19c)>
        >>> h2.fundamental.fundamental
        <music21.pitch.Pitch A4>
        >>> h2.transpose(-24, inPlace=True)
        >>> h2
        <music21.pitch.Pitch F#~6(+19c)>
        >>> h2.fundamental.fundamental
        <music21.pitch.Pitch A2>
        r   )
r   r   r   r  r   r  r   r   r1  r  )r
  number	centShifttempfinals        rc   getHarmoniczPitch.getHarmonic  s    R ,F3	mmD)>K??&&t~~';';i'GHDN&y1DN .. MM$/ re   c                0   t        |t              rt        |      }| }|j                  |j                  k  rt	        d| d|  d      g }t        dd      D ]A  }|j                  |      }|j                  ||f       |j                  |j                  kD  sA n t        |      dk  rq|d   \  }}|j                  |j                  kD  r|j                  |j                  z
  }n|j                  |j                  k  r|j                  |j                  z
  }njd}ng|d   \  }	}
|d	   \  }}|j                  |
j                  z
  }|j                  |j                  z
  }||k  r|
}t        |       }|	}n|}t        |      }|}t        |t              d
z  }||fS )ah  
        Given another Pitch as a fundamental, find the harmonic
        of that pitch that is equal to this Pitch.

        Returns a tuple of harmonic number and the number of cents that
        the first Pitch object would have to be shifted to be the exact
        harmonic of this fundamental.

        Microtones applied to the fundamental are irrelevant,
        as the fundamental may be microtonally shifted to find a match to this Pitch.

        Example: G4 is the third harmonic of C3, albeit 2 cents flatter than
        the true 3rd harmonic.

        >>> p = pitch.Pitch('g4')
        >>> f = pitch.Pitch('c3')
        >>> p.harmonicFromFundamental(f)
        (3, 2.0)
        >>> p.microtone = p.harmonicFromFundamental(f)[1]  # adjust microtone
        >>> int(f.getHarmonic(3).frequency) == int(p.frequency)
        True

        The shift from B-5 to the 7th harmonic of C3 is more substantial
        and likely to be noticed by the audience.  To make p the 7th harmonic
        it'd have to be lowered by 31 cents.  Note that the
        second argument is a float, but because the default rounding of
        music21 is to the nearest cent, the 0.0 is not a significant digit.
        I.e. it might be more like 31.3 cents.

        >>> p = pitch.Pitch('B-5')
        >>> f = pitch.Pitch('C3')
        >>> p.harmonicFromFundamental(f)
        (7, -31.0)
        z6cannot find an equivalent harmonic for a fundamental (z ) that is not above this Pitch (r.   r)       r   r   rx  r   r   )rr   r  r   rv   r   ranger>  r_   r^   r   r   r   )r
  r  targetfoundr`   r   harmonicMatchmatchgapharmonicLowercandidateLowerharmonicHighercandidateHigherdistanceLowerdistanceHighers                  rc   harmonicFromFundamentalzPitch.harmonicFromFundamental@  s   N k3',K 99& = @aI  q"A''*ALL!Q ttfii  u:>#(8 M5xx&))#hh*FII%ii%((*,1"I)M>.3Bi+NO"II(9(99M,//&));N .&=)) - (.) .C/036c!!re   c                    |#| j                   t        d      | j                   }t        |t              rt	        |      }| j                  |      \  }}t        |       }t        j                  |      }|dk(  r	| | d| S | | d| d| S )a0  
        Return a string representation of a harmonic equivalence.

        N.B. this has nothing to do with what string a string player
        would use to play the harmonic on.  (Perhaps should be
        renamed).

        >>> pitch.Pitch('g4').harmonicString('c3')
        '3rdH(-2c)/C3'

        >>> pitch.Pitch('c4').harmonicString('c3')
        '2ndH/C3'

        >>> p = pitch.Pitch('c4')
        >>> p.microtone = 20  # raise 20
        >>> p.harmonicString('c3')
        '2ndH(+20c)/C3'

        >>> p.microtone = -20  # lower 20
        >>> p.harmonicString('c3')
        '2ndH(-20c)/C3'

        >>> p = pitch.Pitch('c4')
        >>> f = pitch.Pitch('c3')
        >>> f.microtone = -20
        >>> p.harmonicString(f)
        '2ndH(+20c)/C3(-20c)'
        >>> f.microtone = +20
        >>> p.harmonicString(f)
        '2ndH(-20c)/C3(+20c)'

        >>> p = pitch.Pitch('A4')
        >>> p.microtone = 69
        >>> p.harmonicString('c2')
        '7thH/C2'

        >>> p = pitch.Pitch('A4')
        >>> p.harmonicString('c2')
        '7thH(-69c)/C2'
        zDno fundamental is defined for this Pitch: provide one as an argumentr   H/r'  /)	r  r   rr   r  r   rM  r   r   r(  )r
  r  harmonicr   r  abbrs         rc   harmonicStringzPitch.harmonicString  s    V '$ &D E E**Kk3',K66{C%uf%	))(3A:ZvR}55ZvQyk;-@@re   c                   t        |t              rt        |      }nt        j                  |      }| j                  |      \  }}| }|j                  "|j                  j                  |z   |_        ||fS |dk7  r||_        ||fS )a=  
        Given a Pitch that is a plausible target for a fundamental,
        return the harmonic number and a potentially shifted fundamental
        that describes this Pitch.

        >>> g4 = pitch.Pitch('g4')
        >>> g4.harmonicAndFundamentalFromPitch('c3')
        (3, <music21.pitch.Pitch C3(-2c)>)
        r   )rr   r  r   r   r   rM  r  r   )r
  rB  rQ  r   s       rc   harmonicAndFundamentalFromPitchz%Pitch.harmonicAndFundamentalFromPitch  s     fc"6]F]]6*F66v>% '  &//55=F  z#( re   c                f    | j                  |      \  }}t        j                  |      }| | d| S )a  
        Given a Pitch that is a plausible target for a fundamental,
        find the harmonic number and a potentially shifted fundamental
        that describes this Pitch. Return a string representation.

        >>> pitch.Pitch('g4').harmonicAndFundamentalStringFromPitch('c3')
        '3rdH/C3(-2c)'

        >>> pitch.Pitch('c4').harmonicAndFundamentalStringFromPitch('c3')
        '2ndH/C3'

        >>> p = pitch.Pitch('c4')
        >>> p.microtone = 20  # raise 20
        >>> p.harmonicAndFundamentalStringFromPitch('c3')
        '2ndH/C3(+20c)'

        >>> p.microtone = -20  # lower 20
        >>> p.harmonicAndFundamentalStringFromPitch('c3')
        '2ndH/C3(-20c)'

        >>> p = pitch.Pitch('c4')
        >>> f = pitch.Pitch('c3')
        >>> f.microtone = -20
        >>> p.harmonicAndFundamentalStringFromPitch(f)
        '2ndH/C3'
        >>> f.microtone = +20
        >>> p.harmonicAndFundamentalStringFromPitch(f)
        '2ndH/C3'

        >>> p = pitch.Pitch('A4')
        >>> p.microtone = 69
        >>> p.harmonicAndFundamentalStringFromPitch('c2')
        '7thH/C2'

        >>> p = pitch.Pitch('A4')
        >>> p.harmonicAndFundamentalStringFromPitch('c2')
        '7thH/C2(-69c)'
        rO  )rU  r   r(  )r
  r  rQ  rR  s       rc   %harmonicAndFundamentalStringFromPitchz+Pitch.harmonicAndFundamentalStringFromPitch  s?    T !% D D[ Q+))(3D6K=11re   c                    |j                   | j                   |j                  | j                  z
  dz  dk(  S |j                  | j                  k(  S )a  
        Return True if another Pitch is an enharmonic equivalent of this Pitch.

        >>> p1 = pitch.Pitch('C#3')
        >>> p2 = pitch.Pitch('D-3')
        >>> p3 = pitch.Pitch('D#3')
        >>> p1.isEnharmonic(p2)
        True
        >>> p2.isEnharmonic(p1)
        True
        >>> p3.isEnharmonic(p1)
        False

        Pitches are enharmonics of themselves:

        >>> pC = pitch.Pitch('C4')
        >>> pC.isEnharmonic(pC)
        True

        Notes that sound in different octaves are not enharmonics:

        >>> pitch.Pitch('C#4').isEnharmonic( pitch.Pitch('D-5') )
        False

        However, different octave numbers can be the same enharmonic,
        because octave number is relative to the `step` (natural form) of the pitch.

        >>> pitch.Pitch('C4').isEnharmonic( pitch.Pitch('B#3') )
        True
        >>> pitch.Pitch('C4').isEnharmonic( pitch.Pitch('B#4') )
        False

        If either pitch is octaveless, then a pitch in any octave will match:

        >>> pitch.Pitch('C#').isEnharmonic( pitch.Pitch('D-9') )
        True
        >>> pitch.Pitch('C#4').isEnharmonic( pitch.Pitch('D-') )
        True

        Quarter tone enharmonics work as well:

        >>> pC.accidental = pitch.Accidental('one-and-a-half-sharp')
        >>> pC
        <music21.pitch.Pitch C#~4>
        >>> pD = pitch.Pitch('D4')
        >>> pD.accidental = pitch.Accidental('half-flat')
        >>> pD
        <music21.pitch.Pitch D`4>
        >>> pC.isEnharmonic(pD)
        True

        Microtonally altered pitches do not return True unless the microtones are the same:

        >>> pSharp = pitch.Pitch('C#4')
        >>> pSharp.microtone = 20
        >>> pFlat = pitch.Pitch('D-4')
        >>> pSharp.isEnharmonic(pFlat)
        False

        >>> pFlat.microtone = 20
        >>> pSharp.isEnharmonic(pFlat)
        True

        Extreme enharmonics also work:

        >>> p4 = pitch.Pitch('B##3')
        >>> p5 = pitch.Pitch('E---4')
        >>> p4.isEnharmonic(p5)
        True

        If either pitch has no octave then the comparison is done without
        regard to octave:

        >>> pSharp4 = pitch.Pitch('C#4')
        >>> pFlatNoOctave = pitch.Pitch('D-')
        >>> pSharp4.isEnharmonic(pFlatNoOctave)
        True
        >>> pFlatNoOctave.isEnharmonic(pSharp4)
        True

        `isEnharmonic` can be combined with a test to see if two pitches have the
        same step to ensure that they both sound the same and are written
        the same, without regard to the presence or absence of an accidental
        (this is used in `:meth:~music21.stream.base.Stream.stripTies`):

        >>> pD4 = pitch.Pitch('D4')
        >>> pDNatural4 = pitch.Pitch('D4', accidental=pitch.Accidental('natural'))
        >>> pD4 == pDNatural4
        False
        >>> pD4.isEnharmonic(pDNatural4) and pD4.step == pDNatural4.step
        True
        >>> pEbb4 = pitch.Pitch('E--4')
        >>> pD4.isEnharmonic(pEbb4) and pD4.step == pEbb4.step
        False
        ry   r   )r   rv   r  s     rc   isEnharmoniczPitch.isEnharmonic=  sJ    @ <<4;;#6HHtww&",11 88tww&&re   z/dict[t.Literal['d2', '-d2'], interval.Interval]_transpositionIntervalsc                     y r   r{   r
  r  ups      rc   _getEnharmonicHelperzPitch._getEnharmonicHelper       	re   c                     y r   r{   r\  s      rc   r^  zPitch._getEnharmonicHelper  r_  re   c                   d}|sd}|| j                   vr"t        j                  |      | j                   |<   | j                   |   }| j                  }|j	                  | d      }|s|d|_        |S |j
                  | _        |j                  | _        |j                  |j                  | _        |d| _        y|j                  | _        y)zX
        abstracts the code from `getHigherEnharmonic` and `getLowerEnharmonic`
        d2z-d2N)maxAccidental)rZ  r   r   r   transposePitchr  r  r  )r
  r  r]  intervalStringintervalObjoctaveStoredr   s          rc   r^  zPitch._getEnharmonicHelper  s     26"N!=!==;C;L;L^;\D((822>B{{&&t4&@#HDIllDO{{&!"#"   hhre   c                   | S r   r{   r
  r  s     rc   getHigherEnharmoniczPitch.getHigherEnharmonic      re   c                    y r   r{   ri  s     rc   rj  zPitch.getHigherEnharmonic      re   c               T    |r| j                  dd       y| j                  dd      S )aM  
        Returns an enharmonic `Pitch` object that is a higher
        enharmonic.  That is, the `Pitch` a diminished-second above
        the current `Pitch`.

        >>> p1 = pitch.Pitch('C#3')
        >>> p2 = p1.getHigherEnharmonic()
        >>> print(p2)
        D-3

        We can also set it in place (in which case it returns None):

        >>> p1 = pitch.Pitch('C#3')
        >>> p1.getHigherEnharmonic(inPlace=True)
        >>> print(p1)
        D-3

        The method even works for certain CRAZY enharmonics

        >>> p3 = pitch.Pitch('D--3')
        >>> p4 = p3.getHigherEnharmonic()
        >>> print(p4)
        E----3

        But not for things that are just utterly insane:

        >>> p4.getHigherEnharmonic()
        Traceback (most recent call last):
        music21.pitch.AccidentalException: -5 is not a supported accidental type

        Note that half accidentals (~ = half-sharp, ` = half-flat)
        get converted to microtones:

        >>> pHalfSharp = pitch.Pitch('D~4')
        >>> p3QuartersFlat = pHalfSharp.getHigherEnharmonic()
        >>> print(p3QuartersFlat)
        E-4(-50c)

        OMIT_FROM_DOCS

        (Same thing if done in place; prior bug)

        >>> pHalfSharp = pitch.Pitch('D~4')
        >>> pHalfSharp.getHigherEnharmonic(inPlace=True)
        >>> print(pHalfSharp)
        E-4(-50c)
        Tr  r]  NFr^  ri  s     rc   rj  zPitch.getHigherEnharmonic  s4    b %%dt%<,,Ut,DDre   c                   | S r   r{   ri  s     rc   getLowerEnharmoniczPitch.getLowerEnharmonic  rk  re   c                    y r   r{   ri  s     rc   rr  zPitch.getLowerEnharmonic  rm  re   c               T    |r| j                  dd       y| j                  dd      S )ac  
        returns a Pitch enharmonic that is a diminished second
        below the current note

        If `inPlace` is set to true, changes the current Pitch and returns None.

        >>> p1 = pitch.Pitch('E-')
        >>> p2 = p1.getLowerEnharmonic()
        >>> print(p2)
        D#

        The lower enharmonic can have a different octave than
        the original.

        >>> p1 = pitch.Pitch('C-3')
        >>> p2 = p1.getLowerEnharmonic()
        >>> print(p2)
        B2

        >>> p1 = pitch.Pitch('C#3')
        >>> p1.getLowerEnharmonic(inPlace=True)
        >>> print(p1)
        B##2
        TFro  Nrp  ri  s     rc   rr  zPitch.getLowerEnharmonic  s3    4 %%du%=,,Uu,EEre   r  
mostCommonc               @   |r| }nt        j                  |       }|j                  Wt        |j                  j                        dk  r|j
                  dvrn&| j                  }| j                  |_        |d|_        |r|j
                  dk(  rd|_        t        d      |_        nt|j
                  dk(  rd|_        t        d      |_        nM|j
                  d	k(  rd
|_        t        d      |_        n&|j
                  dk(  rd|_        t        d      |_        |ry|S )a  
        Returns a new Pitch (or sets the current one if inPlace is True)
        that is either the same as the current pitch or has fewer
        sharps or flats if possible.  For instance, E# returns F,
        while A# remains A# (i.e., does not take into account that B- is
        more common than A#).  Useful to call if you ever have an
        algorithm that might take your piece far into the realm of
        double or triple flats or sharps.

        If mostCommon is set to True, then the most commonly used
        enharmonic spelling is chosen (that is, the one that appears
        first in key signatures as you move away from C on the circle
        of fifths).  Thus, G-flat becomes F#, A# becomes B-flat,
        D# becomes E-flat, D-flat becomes C#, G# and A-flat are left
        alone.

        >>> p1 = pitch.Pitch('B#5')
        >>> p1.simplifyEnharmonic().nameWithOctave
        'C6'

        >>> p2 = pitch.Pitch('A#2')
        >>> p2.simplifyEnharmonic(inPlace=True)
        >>> p2
        <music21.pitch.Pitch A#2>

        >>> p3 = pitch.Pitch('E--3')
        >>> p4 = p3.transpose(interval.Interval('-A5'))
        >>> p4.simplifyEnharmonic()
        <music21.pitch.Pitch F#2>

        Setting `mostCommon` = `True` simplifies enharmonics
        even further.

        >>> pList = [pitch.Pitch('A#4'), pitch.Pitch('B-4'),
        ...          pitch.Pitch('G-4'), pitch.Pitch('F#4')]
        >>> [str(p.simplifyEnharmonic(mostCommon=True)) for p in pList]
        ['B-4', 'B-4', 'F#4', 'F#4']

        Note that pitches with implicit octaves retain their implicit octaves.
        This might change the pitch space for B#s and C-s.

        >>> pList = [pitch.Pitch('B'), pitch.Pitch('C#'), pitch.Pitch('G'), pitch.Pitch('A--')]
        >>> [str(p.simplifyEnharmonic()) for p in pList]
        ['B', 'C#', 'G', 'G']

        >>> pList = [pitch.Pitch('C-'), pitch.Pitch('B#')]
        >>> [p.ps for p in pList]
        [59.0, 72.0]
        >>> [p.simplifyEnharmonic().ps for p in pList]
        [71.0, 60.0]
        Nrw  )zE#zB#zC-zF-zD#r   r:   zA#r   zG-r$   r6   zD-r"   )
r   r   r  r   r   ri   r   rv   r  r   )r
  r  rv  r  
saveOctaves        rc   simplifyEnharmoniczPitch.simplifyEnharmonic8  s   t Id+I+I((../#5!.FF "[[
#ww	%'+I$~~%!$	'1&'9	$4'!$	'1&'9	$4'!$	'1'':	$4'!$	'1'':	$re   c                  |r| }nt        j                  |       }|j                  |j                  j                  dkD  r|j	                  d       n|j                  j                  dk  r|j                  d       ng| j                  dv r|j                  d       nF|j	                  d       n3| j                  dv r|j                  d       n|j	                  d       |r| j                          y|S )a  
        Returns a new Pitch that is the(/an) enharmonic equivalent of this Pitch.
        Can be thought of as flipEnharmonic or something like that.

        N.B.: n1.name == getEnharmonic(getEnharmonic(n1)).name is not necessarily true.
        For instance:

            getEnharmonic(E##) => F#
            getEnharmonic(F#) => G-
            getEnharmonic(A--) => G
            getEnharmonic(G) => F##

        However, for all cases not involving double sharps or flats
        (and even many that do), getEnharmonic(getEnharmonic(n)) = n

        For the most ambiguous cases, it's good to know that these are the enharmonics:

               C <-> B#, D <-> C##, E <-> F-; F <-> E#, G <-> F##, A <-> B--, B <-> C-

        However, isEnharmonic() for A## and B certainly returns True.

        >>> p = pitch.Pitch('d#')
        >>> print(p.getEnharmonic())
        E-
        >>> p = pitch.Pitch('e-8')
        >>> print(p.getEnharmonic())
        D#8

        Other tests:

        >>> print(pitch.Pitch('c-3').getEnharmonic())
        B2
        >>> print(pitch.Pitch('e#2').getEnharmonic())
        F2
        >>> print(pitch.Pitch('f#2').getEnharmonic())
        G-2
        >>> print(pitch.Pitch('c##5').getEnharmonic())
        D5
        >>> print(pitch.Pitch('g3').getEnharmonic())
        F##3
        >>> print(pitch.Pitch('B7').getEnharmonic())
        C-8

        Octaveless Pitches remain octaveless:

        >>> p = pitch.Pitch('a-')
        >>> p.getEnharmonic()
        <music21.pitch.Pitch G#>
        >>> p = pitch.Pitch('B#')
        >>> p.getEnharmonic()
        <music21.pitch.Pitch C>

        Works with half-sharps, but converts them to microtones:

        >>> dHalfSharp = pitch.Pitch('D~')
        >>> print(dHalfSharp.getEnharmonic())
        E-(-50c)
        Nr   Tr  )r"   r#   r%   )r   r   r  r   rj  rr  r  r}  )r
  r  r  s      rc   getEnharmoniczPitch.getEnharmonic  s    x D==&D??&$$q((((6&&*'''599/++D+9,,T,:yyO+'''5(((6Kre   c                R    | j                   | j                   j                          yy)z\
        if this pitch is attached to a note, then let it know that it has changed.
        N)rH  pitchChangedr   s    rc   r}  zPitch.informClient  s#     <<#LL%%' $re   c                P   g }| j                  d      }||S |j                  | j                  k7  r|j                  |       | }	 	 |j                  d      }|nG|j
                  #t        |j
                  j                        |kD  rn||vr|j                  |       nn]| }	 	 |j                  d      }|	 |S |j
                  %t        |j
                  j                        |kD  r	 |S ||vr|j                  |       n	 |S c# t        $ r Y qw xY w# t        $ r Y |S w xY w)a  
        Return all common unique enharmonics for a pitch,
        or those that do not involve more than two accidentals.

        >>> p = pitch.Pitch('c#3')
        >>> p.getAllCommonEnharmonics()
        [<music21.pitch.Pitch D-3>, <music21.pitch.Pitch B##2>]

        "Higher" enharmonics are listed before "Lower":

        >>> p = pitch.Pitch('G4')
        >>> p.getAllCommonEnharmonics()
        [<music21.pitch.Pitch A--4>, <music21.pitch.Pitch F##4>]

        By setting `alterLimit` to a higher or lower number we
        can limit the maximum number of notes to return:

        >>> p = pitch.Pitch('G-6')
        >>> p.getAllCommonEnharmonics(alterLimit=1)
        [<music21.pitch.Pitch F#6>]

        If you set `alterLimit` to 3 or 4, you're stretching the name of
        the method; some of these are certainly not *common* enharmonics:

        >>> p = pitch.Pitch('G-6')
        >>> enharmonics = p.getAllCommonEnharmonics(alterLimit=3)
        >>> [str(enh) for enh in enharmonics]
        ['A---6', 'F#6', 'E##6']

        Music21 does not support accidentals beyond quadruple sharp/flat, so
        `alterLimit` = 4 is the most you can use. (Thank goodness!)
        Fr  )	ry  ri   r_   rj  rn   r  r   r   rr  )r
  
alterLimitr  r%  s       rc   r   zPitch.getAllCommonEnharmonics  sY   B  ##E#29K66TYYKKN))%)8 y||'q||))*Z7}A  (((7 y  ||'q||))*Z7
 	 }A  '   '  s$   D	 'D 		DD	D%$D%c                N    t         | j                     dz   d| j                  z  z   S )ux  
        Returns (or takes) an integer that uniquely identifies the
        diatonic version of a note, that is ignoring accidentals.
        The number returned is the diatonic interval above C0 (the lowest C on
        a Bösendorfer Imperial Grand), so G0 = 5, C1 = 8, etc.
        Numbers can be negative for very low notes.

        C4 (middleC) = 29, C#4 = 29, C##4 = 29, D-4 = 30, D4 = 30, etc.

        >>> c = pitch.Pitch('c4')
        >>> c.diatonicNoteNum
        29

        Unlike MIDI numbers (or `.ps`), C and C# has the same `diatonicNoteNum`:

        >>> c = pitch.Pitch('c#4')
        >>> c.diatonicNoteNum
        29

        But D-double-flat has a different `diatonicNoteNum` than C.

        >>> d = pitch.Pitch('d--4')
        >>> d.accidental.name
        'double-flat'
        >>> d.diatonicNoteNum
        30

        >>> lowC = pitch.Pitch('c1')
        >>> lowC.diatonicNoteNum
        8

        >>> b = pitch.Pitch()
        >>> b.step = 'B'
        >>> b.octave = -1
        >>> b.diatonicNoteNum
        0

        An `implicitOctave` of 4 is used if octave is not set:

        >>> c = pitch.Pitch('C')
        >>> c.diatonicNoteNum
        29

        `diatonicNoteNum` can also be set.  Changing it
        does not change the Accidental associated with the `Pitch`.

        >>> lowDSharp = pitch.Pitch('C#7')  # start high !!!
        >>> lowDSharp.diatonicNoteNum = 9  # move low
        >>> lowDSharp.octave
        1
        >>> lowDSharp.name
        'D#'

        Negative diatonicNoteNums are possible,
        in case, like John Luther Adams, you want
        to notate the sounds of sub-sonic Earth rumblings.

        >>> lowLowA = pitch.Pitch('A')
        >>> lowLowA.octave = -1
        >>> lowLowA.diatonicNoteNum
        -1

        >>> lowLowLowD = pitch.Pitch('D')
        >>> lowLowLowD.octave = -3
        >>> lowLowLowD.diatonicNoteNum
        -19
        r)   r   )r,   r  r  r   s    rc   diatonicNoteNumzPitch.diatonicNoteNumB  s)    J "$)),q0A8K8K4KLLre   c                f    t        |dz
  dz        }|dz
  d|z  z
  }d}||   }|| _        || _        y )Nr)   r   r!   )rs   r   r  )r
  newNumr   noteNameNum	pitchListnoteNames         rc   r  zPitch.diatonicNoteNum  sD    fqjA%&qjAJ/*M	&{3	re   c                    y r   r{   r
  r   r  s      rc   	transposezPitch.transpose       	re   c                    y r   r{   r  s      rc   r  zPitch.transpose  r  re   c               8   t        |t        j                        r|}nt        j                  |      }|j	                  |       }t        |t
              s| j                  |_        |j                  du r|j                  dd       |s|S |j                  | _        | j                  |j                  | _	        |j                  | _
        |j                  | _        |j                  | _        |j                  $t        j                  |j                        | _        y)a  
        Transpose the pitch by the user-provided value.  If the value is an
        integer, the transposition is treated in half steps. If the value is a
        string, any Interval string specification can be provided.
        Alternatively, a :class:`music21.interval.Interval` object can be
        supplied.

        >>> aPitch = pitch.Pitch('g4')
        >>> bPitch = aPitch.transpose('m3')
        >>> bPitch
        <music21.pitch.Pitch B-4>
        >>> cPitch = bPitch.transpose(interval.GenericInterval(2))
        >>> cPitch
        <music21.pitch.Pitch C-5>

        An interval object can also be a certain number of semitones,
        in which case, the spelling of the resulting note (sharp or flat, etc.)
        is up to the system to choose.

        >>> aInterval = interval.Interval(-6)
        >>> bPitch = aPitch.transpose(aInterval)
        >>> bPitch
        <music21.pitch.Pitch C#4>

        Transpose fFlat down 5 semitones -- sort of like a Perfect 4th, but
        should be respelled:

        >>> fFlat = pitch.Pitch('F-4')
        >>> newPitch = fFlat.transpose(-5)
        >>> newPitch
        <music21.pitch.Pitch B3>

        >>> aPitch
        <music21.pitch.Pitch G4>

        >>> aPitch.transpose(aInterval, inPlace=True)
        >>> aPitch
        <music21.pitch.Pitch C#4>

        Implicit octaves remain implicit:

        >>> anyGSharp = pitch.Pitch('G#')
        >>> print(anyGSharp.transpose('P8'))
        G#
        >>> print(anyGSharp.transpose('P5'))
        D#

        If the accidental of a pitch is chosen by music21, not
        given by the user, then after transposing, music21 will
        simplify the spelling again:

        >>> pc6 = pitch.Pitch(6)
        >>> pc6
        <music21.pitch.Pitch F#>
        >>> pc6.spellingIsInferred
        True
        >>> pc6.transpose('-m2')
        <music21.pitch.Pitch F>

        OMIT_FROM_DOCS

        Test to make sure that extreme ranges work

        >>> dPitch = pitch.Pitch('D2')
        >>> lowC = dPitch.transpose('m-23')
        >>> lowC
        <music21.pitch.Pitch C#-1>

        >>> otherPitch = pitch.Pitch('D2')
        >>> otherPitch.transpose('m-23', inPlace=True)
        >>> print(otherPitch)
        C#-1

        Test an issue with inPlace not setting spellingIsInferred

        >>> pc6.transpose(10, inPlace=True)
        >>> pc6.spellingIsInferred
        True

        Test an issue with inPlace not setting microtone.

        >>> flatAndAHalf = pitch.Accidental('one-and-a-half-flat')
        >>> dFlatAndAHalf = pitch.Pitch('D2')
        >>> dFlatAndAHalf.accidental = flatAndAHalf
        >>> dPitch = pitch.Pitch('D2')
        >>> intv = interval.Interval(dFlatAndAHalf, dPitch)
        >>> dPitch.transpose(intv, inPlace=True)
        >>> dPitch
        <music21.pitch.Pitch D#2(+50c)>

        Tru  N)rr   r   IntervalBaser   rd  rs   r   ry  ri   r   r  r  r  r   r   )r
  r   r  rf  r   s        rc   r  zPitch.transpose  s    D eX223K"++E2K&&t,%%#'#:#:A 4'  $ ?H
 DI{{&hhllDO }}D&'&:&:D#||'"&--"=re   )minimizer  c               ^   | j                   t        d      |r| }nt        j                  |       }|j                   J 	 |j                  |j                  z
  dk  rn|xj                   dz  c_         3|r4	 |j                  |j                  z
  dk  rn|xj                   dz  c_         3|s|S y)a  
        Given a source Pitch, shift it down some number of octaves until it is below the
        target.

        If `minimize` is True, a pitch below the target will move up to the
        nearest octave.

        >>> higherG = pitch.Pitch('G5')
        >>> lowerG = higherG.transposeBelowTarget(pitch.Pitch('C#4'))
        >>> lowerG
        <music21.pitch.Pitch G3>
        >>> higherG
        <music21.pitch.Pitch G5>

        To change the pitch itself, set inPlace to True:

        >>> p = pitch.Pitch('G5')
        >>> p.transposeBelowTarget(pitch.Pitch('C#4'), inPlace=True)
        >>> p
        <music21.pitch.Pitch G3>

        If already below the target, make no change:

        >>> pitch.Pitch('G#3').transposeBelowTarget(pitch.Pitch('C#6'))
        <music21.pitch.Pitch G#3>

        Below target includes being the same as the target

        >>> pitch.Pitch('g#8').transposeBelowTarget(pitch.Pitch('g#1'))
        <music21.pitch.Pitch G#1>

        This does nothing because it is already low enough:

        >>> pitch.Pitch('g#2').transposeBelowTarget(pitch.Pitch('f#8'))
        <music21.pitch.Pitch G#2>

        But with minimize=True, it will actually RAISE the pitch so that it is the closest
        pitch to the target

        >>> target = pitch.Pitch('f#8')
        >>> pitch.Pitch('g#2').transposeBelowTarget(target, minimize=True)
        <music21.pitch.Pitch G#7>

        >>> pitch.Pitch('f#2').transposeBelowTarget(target, minimize=True)
        <music21.pitch.Pitch F#8>

        If the original pitch is octaveless, raises a PitchException:

        >>> pitch.Pitch('d').transposeBelowTarget(pitch.Pitch('e2'), minimize=True)
        Traceback (most recent call last):
        music21.pitch.PitchException: Cannot call transposeBelowTarget with an octaveless Pitch.

        If the target pitch is octaveless, assumes it has the default of octave 4.
        (The reason for this asymmetry is that the target pitch is never altered
        while the original pitch (or its copy) is).

        >>> pitch.Pitch('f4').transposeBelowTarget(pitch.Pitch('e'), minimize=True)
        <music21.pitch.Pitch F3>

        * Changed in v3: default for inPlace=False.
        Nz:Cannot call transposeBelowTarget with an octaveless Pitch.r   r)   ry   r   r   r   r   rv   r
  rB  r  r  srcs        rc   transposeBelowTargetzPitch.transposeBelowTarget(  s    J ;; !]^^C--%Czz%%% vv		!Q&JJ!OJ  99svv%*JJ!OJ	  Jre   c               ^   | j                   t        d      |r| }nt        j                  |       }|j                   J 	 |j                  |j                  z
  dk\  rn|xj                   dz  c_         3|r4	 |j                  |j                  z
  dk  rn|xj                   dz  c_         3|s|S y)ak  
        Given a source Pitch, shift it up octaves until it is above the target.

        If `minimize` is True, a pitch above the target will move down to the
        nearest octave.

        >>> pitch.Pitch('d2').transposeAboveTarget(pitch.Pitch('e4'))
        <music21.pitch.Pitch D5>

        To change the pitch itself, set inPlace to True:

        >>> p = pitch.Pitch('d2')
        >>> p.transposeAboveTarget(pitch.Pitch('e4'), inPlace=True)
        >>> p
        <music21.pitch.Pitch D5>

        If already above the target, make no change:

        >>> pitch.Pitch('d7').transposeAboveTarget(pitch.Pitch('e2'))
        <music21.pitch.Pitch D7>

        Accept the same pitch:

        >>> pitch.Pitch('d2').transposeAboveTarget(pitch.Pitch('d8'))
        <music21.pitch.Pitch D8>

        If minimize is True, we go the closest position:

        >>> pitch.Pitch('d#8').transposeAboveTarget(pitch.Pitch('d2'), minimize=True)
        <music21.pitch.Pitch D#2>

        >>> pitch.Pitch('d7').transposeAboveTarget(pitch.Pitch('e2'), minimize=True)
        <music21.pitch.Pitch D3>

        >>> pitch.Pitch('d0').transposeAboveTarget(pitch.Pitch('e2'), minimize=True)
        <music21.pitch.Pitch D3>

        If the original pitch is octaveless, raises a PitchException:

        >>> pitch.Pitch('d').transposeAboveTarget(pitch.Pitch('e2'), minimize=True)
        Traceback (most recent call last):
        music21.pitch.PitchException: Cannot call transposeAboveTarget with an octaveless Pitch.

        If the target pitch is octaveless, assumes it has the default of octave 4.
        (The reason for this asymmetry is that the target pitch is never altered
        while the original pitch (or its copy) is).

        >>> pitch.Pitch('d4').transposeAboveTarget(pitch.Pitch('e'), minimize=True)
        <music21.pitch.Pitch D5>

        * Changed in v3: default for inPlace=False.
        Nz:Cannot call transposeAboveTarget with an octaveless Pitch.r   r)   ry   r  r  s        rc   transposeAboveTargetzPitch.transposeAboveTarget  s    r ;; !]^^C--%Czz%%%  vv		!Q&JJ!OJ  66FII%*JJ!OJ	  Jre   c                    | j                   y|D ]K  }|j                  | j                  k(  s|j                   j                  | j                   j                  k(  sK y y)ac  
        Determine if this pitch is in the collection of supplied altered
        pitches, derived from a KeySignature object

        >>> ks = key.KeySignature(2)
        >>> altered = ks.alteredPitches
        >>> altered
        [<music21.pitch.Pitch F#>, <music21.pitch.Pitch C#>]

        >>> cs = pitch.Pitch('c#')
        >>> gs = pitch.Pitch('g#')
        >>> cs._nameInKeySignature(altered)
        True
        >>> gs._nameInKeySignature(altered)
        False

        Note that False is returned regardless of the name if the
        key signature has no entry for the pitch:

        >>> pitch.Pitch('G')._nameInKeySignature(altered)
        False

        Other accidentals for pitches whose `.step` is in the
        key signature also do not match:

        >>> f = pitch.Pitch('F')
        >>> f._nameInKeySignature(altered)
        False
        >>> f.accidental = pitch.Accidental('natural')
        >>> f._nameInKeySignature(altered)
        False
        >>> pitch.Pitch('F##')._nameInKeySignature(altered)
        False
        >>> pitch.Pitch('C-')._nameInKeySignature(altered)
        False
        FT)r  r  ri   r
  alteredPitchesr   s      rc   _nameInKeySignaturezPitch._nameInKeySignature  sP    J ??"Avv"<<$$(<(<<   re   c                H    |D ]  }|j                   | j                   k(  s y y)au  
        Determine if this pitch is in the collection of supplied altered
        pitches, derived from a KeySignature object

        >>> a = pitch.Pitch('c')
        >>> b = pitch.Pitch('g')
        >>> ks = key.KeySignature(2)
        >>> a._stepInKeySignature(ks.alteredPitches)
        True

        >>> b._stepInKeySignature(ks.alteredPitches)
        False

        TF)r  r  s      rc   _stepInKeySignaturezPitch._stepInKeySignature  s&      Avv"   re   T)		pitchPastpitchPastMeasureotherSimultaneousPitchesr  cautionaryPitchClasscautionaryAlloverrideStatuscautionaryNotImmediateRepeatlastNoteWasTiedc       	        n     j                    fddfd}
|g }|g }|g }d}||z   }|du rnj                  nj                  dv ryj                  dk(  rd_        y|	du r"j                  dk7  rd_        yd_        yy|r|rt         fd	|D              r	 |
d       y|sN|sj                  d
v r>j                  dk(  r j                  |      _        y j                  |       _        y'j                  du r j                  |      rd_        yj                  dk(  r j                  |      r |
d       yt        |      D ]Z  }|j                   j                  k(  s|j                   j                  k(  s7|j                   j                  k7  r
 |
d        y n |du sj                  dv r	 |
d       yd}|du r.j                  dk7  rt         j                        }|_         n }t        |      }t        t        |      dz
  dd      D ]  }||k  rd}d}Pj                  dk(  rA nd}t        |t        |            D ]"  }||   j                   j                  k7  s d} n d}|du r j                  |      s	d_         y|du r>j                  dk7  r-t        ||   j                        }||   j                   |_         n||   }|j                  |j                  k7  r j                  ||   j                  k(  rd}nd}|du r/|j                   #|j                   j                  du rd_         y|du r|j                   z|j                   nl|j                   j                  |j                   j                  k(  r? j                  |      du r |du s|j                   j                  du rd}d_        d} n3|j                   |j                   j                  dk(  r|j                   |j                   j                  dk(  r|du r* j                  |      du r|du r	 |
d       nWUd_        nM j                  |      du r|du r	 |
d       n- j                  |      du r|du r|du r	 |
d       n	d_        d} ni|j                   |j                  |j                  k7  rk|j                   j                  dk7  rR|j                   |j                   j                  du r.|du r|du r|du rj                  dk(  r |
d       d} n|j                   |j                   j                  dk(  r31|j                   %|j                   j                  dk7  rd_        d} n|j                   b|j                   V|j                   j                  |j                   j                  k7  r)'|s|j                   j                  dk7  rd_        d} n|j                   I|j                   =;|j                   j                  dk(  r j                  |      _        nd_        d} n|du r|j                   |j                   |j                   j                  |j                   j                  k(  rrp|du rl|du r%|j                   j                  durd_        d}d} nF|j                   j                  du rd}ǉ j                  |      sd_        d} yd_        d} y |du r' j                  |      du r	 |
d       yd_        yy|s@>j                  dk(  r j                  |      _        y j                  |       _        y|s j                  |      r	 |
d       yyyy)a_  
        Given an ordered list of Pitch objects in `pitchPast`, determine if
        this pitch's Accidental object needs to be created or updated with a
        natural or other cautionary accidental.

        Changes to this Pitch object's Accidental object are made in-place.

        `pitchPast` is a list of pitches preceding this pitch in the same measure.
        If None, a new list will be made.

        `pitchPastMeasure` is a list of pitches preceding this pitch but in a
        previous measure. If None, a new list will be made.

        `otherSimultaneousPitches` is a list of other pitches in this simultaneity, for use
        when `cautionaryPitchClass` is True.

        The `alteredPitches` list supplies pitches from a :class:`~music21.key.KeySignature`
        object using the :attr:`~music21.key.KeySignature.alteredPitches` property.
        If None, a new list will be made.

        If `cautionaryPitchClass` is True, comparisons to past accidentals are
        made regardless of register. That is, if a past sharp is found two
        octaves above a present natural, a natural sign is still displayed.
        Note that this has nothing to do with whether a sharp (not in the key
        signature) is found in a different octave from the same note in a
        different octave.  The sharp must always be displayed.  Notes
        with displayType = 'if-absolutely-necessary' will ignore the True
        setting.

        If `overrideStatus` is True, this method will ignore any current
        `displayStatus` setting found on the Accidental. By default, this does
        not happen. If `displayStatus` is set to None, the Accidental's
        `displayStatus` is set.

        If `cautionaryNotImmediateRepeat` is True, cautionary accidentals will
        be displayed for an altered pitch even if that pitch had already been
        displayed as altered (unless it's an immediate repetition).  Notes
        with displayType = 'if-absolutely-necessary' will ignore the True
        setting.

        If `lastNoteWasTied` is True then this note will be treated as
        immediately following a tie.

        >>> a = pitch.Pitch('a')
        >>> past = [pitch.Pitch('a#'), pitch.Pitch('c#'), pitch.Pitch('c')]
        >>> a.updateAccidentalDisplay(pitchPast=past, cautionaryAll=True)
        >>> a.accidental, a.accidental.displayStatus
        (<music21.pitch.Accidental natural>, True)

        >>> b = pitch.Pitch('a')
        >>> past = [pitch.Pitch('a#'), pitch.Pitch('c#'), pitch.Pitch('c')]
        >>> b.updateAccidentalDisplay(pitchPast=past)  # should add a natural
        >>> b.accidental, b.accidental.displayStatus
        (<music21.pitch.Accidental natural>, True)

        In this example, the method will not add a natural because the match is
        pitchSpace and our octave is different.

        >>> a4 = pitch.Pitch('a4')
        >>> past = [pitch.Pitch('a#3'), pitch.Pitch('c#'), pitch.Pitch('c')]
        >>> a4.updateAccidentalDisplay(pitchPast=past, cautionaryPitchClass=False)
        >>> a4.accidental is None
        True

        v8 -- made keyword-only and added `otherSimultaneousPitches`.
        c                 0     t        d        _        y y )Nr5   )r   r  )r   r
  s   rc   none_to_naturalz6Pitch.updateAccidentalDisplay.<locals>.none_to_naturalv  s    { +"% re   c                *             J | _         y r   )r  )newDisplayStatusr   r  s    rc   set_displayStatusz8Pitch.updateAccidentalDisplay.<locals>.set_displayStatus|  s    ?"? 0Cre   NF)TFr  Tr  c              3     K   | ]8  }|j                   j                   k(  xr |j                  j                  k7   : y wr   )r  r  )r   pSimultr
  s     rc   r   z0Pitch.updateAccidentalDisplay.<locals>.<genexpr>  s=      97G LLDII-W'2D2D2WW7s   >A)FNr5   )r  r  r  r)   r   )r  bool)r  r  r  anyri   r  r  reversedr  r   r   r^   rA  r  )r
  r  r  r  r  r  r  r  r  r  r  (displayAccidentalIfNoPreviousAccidentalspitchPastAll	thisPPastsetFromPitchPastpSelfoutOfMeasureLengthr`   pPastInMeasurecontinuousRepeatsInMeasurejpPastoctaveMatchr   r  s   `                      @@rc   updateAccidentalDisplayzPitch.updateAccidentalDisplay#  s   b oo	&	1 I#!!N 490')3U"{""*""m3 ?s'9 %Cd"??k1(-C%  )-C% %$ 979 9 d#  '3+<+<+M88y((,(@(@(PC%   -1,D,D^,T(TC%  /''4/..~>$)!  ;#((i"7..~>!$' "),I~~*y/?/?4;;/N>>TYY.%d+ - T!OO'>>d# ! D([+DD$))$E"EE !!12 s<(1,b"5A %%!&-2*?s:S'S  "&q#l"34A $A559L9LL5:2 5 26. %' 44^D$(! %,;T(Tl1o223 $0?#=#= $Q zzUZZ' {{l1o444"# +d2((4((66$>?(-C% -4&&2&&2o&&++u/?/?/D/DD ,,^<E$-!,,::eC?C<(-C%'+$ "".&&++y8''/**//9<-5 00@DH +u 4)$/?05C- ..~>$F6$>%d+
 ..~>$F6%?(E1%d+
 ,1)#'  "".jjEJJ.&&++y8''/**88EA%',@E,I5(OOO/HH!$'#'  ##+&&++y8''3'',,	9$(!#'  "".&&2&&++u/?/?/D/DDo"e&6&6&B&BF_&_$(!#' 
 ""*&&2o##((I5(,(@(@(PC%(,C%#' 
 -5&&2&&2&&++u/?/?/D/DDo!T)0E9!,,::%G ).C%?D<'+$%%33u<?C<33NC,0) (,$ -2)'+$ g 6p 4t; ''75@!$'?(-C% # "coxx9$$($<$<^$L!(,(@(@(P$P! "ck''7!$' 8 '2!re   c                   ddl m} ddl m} |j                  }d}|j	                  |d         dk(  rd}|syt        j                  |d   |d         }|j                  dk(  r|d   j                  d	      }n|j                  d
k(  r|d   j                  d      }n|j                  dk(  r|d   j                  d      }n|j                  dk(  r|d   j                  d      }nq|j                  dk(  r|d   j                  d      }nM|j                  dk(  r|d   j                  d
      }n)|j                  dk(  r|d   j                  d      }n|d   } |j                  |j                        }d|_        d|_        d|_         |j                  |d   j                        }	 |j                  |d   j                        }
|j	                  |d         |
_        |j                  |	|
|g      }|S )a  
        Given a chord, determines whether the chord constitutes a string
        harmonic and then returns a new chord with the proper sounding pitch
        added.

        >>> n1 = note.Note('d3')
        >>> n2 = note.Note('g3')
        >>> n2.notehead = 'diamond'
        >>> n2.noteheadFill = False
        >>> p1 = pitch.Pitch('d3')
        >>> harmChord = chord.Chord([n1, n2])
        >>> harmChord.quarterLength = 1
        >>> newChord = p1.getStringHarmonic(harmChord)
        >>> newChord.quarterLength = 1
        >>> pitchList = newChord.pitches
        >>> pitchList
        (<music21.pitch.Pitch D3>, <music21.pitch.Pitch G3>, <music21.pitch.Pitch D5>)

        otherwise returns False

        r   r   )chordFr)   diamondTry   r   r   r*   r   r   r+   r   noStem)music21r   r  r   getNoteheadr   notesToChromaticintervalClassr>  Noter  noteheadParenthesisnoteheadFillstemDirectionnoteheadChord)r
  chordInr   r  r  isStringHarmonicchordIntsoundingPitchnoteOutnote1note2chordOuts               rc   getStringHarmoniczPitch.getStringHarmonic  s   0 	!!OO	 y|,	9#,,Yq\9Q<H!!R'%aL44Q7M##q(%aL44Q7M##q(%aL44Q7M##q(%aL44Q7M##q(%aL44Q7M##q(%aL44Q7M##q(%aL44Q7M &aLM$))M889&*## (		)A,556		)A,556 ,,Yq\: ;;ug67re   r   )ri   zstr | int | float | Noner  zStepName | Noner   
int | Noner  z%Accidental | str | int | float | Noner  zMicrotone | int | float | Noner  zint | PitchClassString | Noner  r  rv   zfloat | Noner  zPitch | None)r  object)r  r  )r  base.Groups)r^  r  )r  zAccidental | None)r   z%str | Accidental | None | int | float)r  r   )r   z$float | int | str | None | Microtone)r  rs   r  r  )r  r  r  )r  r	   )r  r	   r  None)r   zint | PitchClassString)r  r  )r   zint | float | None)r   int | float)r:  rs   r  r   )r  str | Pitchr  ztuple[int, float])r  zstr | Pitch | Noner  r  )rB  r  r  ztuple[int, Pitch])r  r  r  r  )r  r   r  r  )r  t.Literal[True]r]  r  r  r  )r  t.Literal[False]r]  r  r  t.Self)r  r  r]  r  r  t.Self | None)r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  )r   )r  rs   r  zlist[t.Self])r  rs   )r   !interval.IntervalBase | str | intr  r  r  r  )r   r  r  r  r  r  )r   r  r  r  r  r  )r  list[Pitch] | Noner  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )Ir   r   r   r>  r  TWELFTH_ROOT_OF_TWOr6  rO  r  r  r!  r.  r  r  r  rh  ri  rb  rc  r@  r  rA  r  r  r  r  r   r  r  rv   r  ri   r  r  r  r  r  r  r  r   r  r  r  r'  r(  r  r+  r  r1  r0  r>  rM  rS  rU  rW  rY  rZ  r   r^  rj  rr  ry  r{  r}  r   r  r  r  r  r  r  r  r  r{   re   rc   r   r   M  s   Zx;J / 	 02!I~ 2j -1P (,$(=A7;9="&"&+/P)P %P "	P
 ;P 5P 7P  P  P )Pd5p62
 ""@$!"H   ]]     .  , # #@ P P4U)n  6 :? 2 h :? - b ] ]~ YY' ' Y Yv 
[[' '$  8 
[[&! &!P   20 20h W W 7 7   8 4 4l 
[[  b# b#H ' ' 7 7,    6 ]]   ( : :z 7Q 7Qr" *M&  *A *AZ )L%  B BH  2   C C( ^^ aF`"-6`"%6`"d 6::A$2:A:Ax   
 @,2",2 
,2`d'N PRLQ&5!%*. 
 &6!%*0 
&*!%*5<     6; 5Ep     5: FF 	\
 
\| (- Vr(HV DM DML   , !	
 
  
 %*	, "	
 
  	, 	
 
P _ 
_H ',%*	T 0;	Tp,\. '+-159+/%)#$-1 %E( $E( +	E(
 #3E( )E( #E( E( E( '+E( E(NEre   r   c                      e Zd Zd Zy)Testc                2    ddl m}  || t                      y )Nr   )testCopyAll)music21.test.commonTestr  globals)r
  r  s     rc   testCopyAndDeepcopyzTest.testCopyAndDeepcopy6  s    7D')$re   N)r   r   r   r  r{   re   rc   r  r  5  s    %re   r  __main__)ri   r  r  r  )ri   r  r  r  )rv   zint | float | PitchClassStringr  r  )r|   rs   r  r  )rv   r  r  rs   )rv   r  r  z+tuple[StepName, Accidental, Microtone, int])r  ztuple[float, float])r   r  r  rs   )TTT)r   list[Pitch]r   r  r   r  r   r  )r   r  )Kr>  
__future__r   collectionsr   r   r   r   typingr   r   unittestr  r   r   music21.common.objectsr   music21.common.typesr	   r
   r   r   r   r   r   TYPE_CHECKINGr   EnvironmentenvironLocalLiteralPitchClassStringr&   r  r   r'   r(   r,   r  r   r)  r*  r\   itemsrm   chrr  rg   rd   accidentalModifiersSortedrj   ro   rw   r}   r   r   r   r   r   r   r   r   Music21Exceptionrn   r   r  ProtoM21Objectr   
StyleMixinr   r   TestCaser  r  r   mainTest)r  r  s   00rc   <module>r     s   # #         5 )       ??&{&&w/99CD  
	
	
	
	
	
	 	  %





) %  ?	= >	
	
	
	
	
	
	
+ '  &   
      .F-K-K-MN-MTQAqD-MN !S\CL()
Hs7|#$	3w<	8c'l"##g,S\CL()	3w<	8c'l"##g,#   !!'! N! n	!
 !! 	&! ! M! m!  ! \! 	,! ! 1! 2!  "!!" )#!$  
/0!'1! : +, %NNJ"<(8W)W)W)t+/\#*R 48/3(,9c,09c(,9c "&9cx EU - AQ  4DPT J^	,77 		\22 		66 	R$&&(: R$j^
'')9)9 ^
Hb;G"" b;Pw%8 % Z+
 zGT mf Os   <K