§
    ƒØjÆC  ã                  ó€  — d 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	 i d	d
“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d"“d#d$“d%d&“d'd(“i d)d*“d+d,“d-d.“d/d0“d1d2“d3d“d4d5“d6d7“d8d9“d:d;“d<d=“d>d“d?d@“dAdB“dCdD“dEdF“dGdH“¥ddIdJdKdLdMdNœ¥Z
i d
d	“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d“d"d!“d$d#“d&d%“d(d'“d*d)“d,d+“i d.d-“d0d/“d2d1“d5d4“d7d6“d9d8“d;d:“d=d<“d@d?“dBdA“dDdC“dFdE“dHdG“dIdO“dJdP“dKdQ“dLdR“¥dMdSi¥Zi ddT“d	dU“ddV“ddW“ddX“ddY“ddZ“dd[“dd\“dd]“d%d^“d'd_“d)d`“d1da“d3db“d4dc“d:dd“dedfdgdhdidjdkdldmdnœ	¥Zdo„ Zdp„ Zdq„ Zdr„ Zds„ Zd�dv„Zd‚dw„Zd‚dx„Zd‚dy„Z G dz„ d{ej        ¦  «        Z G d|„ d}¦  «        Z G d~„ dej        ¦  «        ZegZed€k    rddlZ ej        e¦  «         dS dS )ƒzx
Implementation of Walter Hewlett's base40 system for musical intervals.
(See Hewlett and Ann K. Blombach 1989 article)
é    )ÚannotationsN)Úcommon)Úexceptions21)Úinterval)Únote)Úpitché   zC--é   zC-é   ÚCé   zC#é   zC##é   é   zD--é   zD-é	   ÚDé
   zD#é   zD##é   é   zE--é   zE-é   ÚEé   zE#é   zE##é   zF--é   zF-é   ÚFé   zF#é   zF##é   é   zG--é   zG-é   ÚGé   zG#é   zG##é   é   zA--é   zA-é    ÚAé!   zA#é"   zA##zB--zB-ÚBzB#zB##)é#   é$   é%   é&   é'   é(   r3   r4   r5   r6   r7   ÚP1ÚA1Úd2Úm2ÚM2ÚA2Úd3Úm3ÚM3ÚA3Úd4ÚP4ÚA4Úd5ÚP5ÚA5Úd6Úm6ÚM6ÚA6Úd7Úm7ÚM7ÚA7Úd8ÚP8)	r)   r*   r+   r/   r0   r2   r3   r6   r7   c                óØ  — d}| dk     rd}t          | ¦  «        dz  }	 t          |         }t          j        |¦  «        }n-# t          $ r  t          dt          |¦  «        z   ¦  «        ‚w xY wt          | ¦  «        dz  }|j        }t          j        ||j	        d|z  z   z  ¦  «        }|j
        }t          |j        ¦  «        t          |j	        ¦  «        z   }	t          j        |	¦  «        S )aZ  
    Returns a music21 Interval between two Base40 pitch numbers
    given the delta (difference) between them.

    Raises a Base40 Exception if the interval is not handled by Base40.
    Base40 can only handle major, minor, perfect, augmented,
    and diminished intervals. Although not for certain, it seems
    that the engineers that designed this system assumed that
    other intervals (doubly augmented intervals, for instance)
    would be of a very rare occurrence, and extreme intervals
    which would trigger an incorrect answer (C-- to C##, for
    instance, would return a diminished second, even though it's
    a quadruplely augmented unison) just would not occur.

    >>> musedata.base40.base40DeltaToInterval(4)
    <music21.interval.Interval d2>
    >>> musedata.base40.base40DeltaToInterval(11)
    <music21.interval.Interval m3>
    >>> musedata.base40.base40DeltaToInterval(23)
    <music21.interval.Interval P5>
    >>> musedata.base40.base40DeltaToInterval(-23)
    <music21.interval.Interval P-5>
    >>> musedata.base40.base40DeltaToInterval(52)
    <music21.interval.Interval M10>
    >>> musedata.base40.base40DeltaToInterval(-52)
    <music21.interval.Interval M-10>
    >>> musedata.base40.base40DeltaToInterval(77)
    Traceback (most recent call last):
    music21.musedata.base40.Base40Exception: Interval not handled by Base40 37
    r	   r   éÿÿÿÿr7   zInterval not handled by Base40 r   )ÚabsÚbase40IntervalTabler   ÚIntervalÚKeyErrorÚBase40ExceptionÚstrÚgenericÚGenericIntervalÚvalueÚdiatonicÚ	specifier)
ÚdeltaÚ	directionÚsimpleDeltaÚsimpleIntervalNameÚsimpleIntervalÚ
numOctavesÚsgiÚcgiÚsdiÚnewIntervals
             úŒ/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/musedata/base40.pyÚbase40DeltaToIntervalrj   ˜   sõ   € ð@ €IØˆq‚y€yØˆ	å�e‘*”*˜r‘/€KðTÝ0°Ô=ÐÝ!Ô*Ð+=Ñ>Ô>ˆˆøÝð Tð Tð TÝÐ?Å#ÀkÑBRÔBRÑRÑSÔSÐSðTøøøõ �U‘”˜rÑ!€Jà
Ô
 €Cå
Ô
" 9°´	¸AÀ
¹NÑ0JÑ#KÑ
LÔ
L€CØ
Ô
!€Cå�c”mÑ$Ô$¥s¨3¬9¡~¤~Ñ5€KåÔ˜[Ñ)Ô)Ð)s   ž!A  Á *A*c                óÖ   — t          j        ¦   «         }| dz
  dz  dz   |_        | d|j        dz
  z  z
  }t          |         }|�	||_        |S t          dt          | ¦  «        z   ¦  «        ‚)a»  
    Converts a Base40 pitch number into a music21 Pitch.
    The Base40 number is octave specific.

    Raises a Base40 Exception if the Base40 pitch number given doesn't
    have an associated pitch name. There is one unassigned number
    each time the interval between two letters is a whole step.

    >>> musedata.base40.base40ToPitch(1)
    <music21.pitch.Pitch C--1>
    >>> musedata.base40.base40ToPitch(40)
    <music21.pitch.Pitch B##1>
    >>> musedata.base40.base40ToPitch(23)
    Traceback (most recent call last):
    music21.musedata.base40.Base40Exception: Pitch name not assigned to this Base40 number 23
    >>> musedata.base40.base40ToPitch(186)
    <music21.pitch.Pitch G5>
    r	   r7   Nú.Pitch name not assigned to this Base40 number )r   ÚPitchÚoctaveÚbase40EquivalentÚnamerX   rY   )Ú	base40NumÚpÚtableNumÚ	pitchNames       ri   Úbase40ToPitchru   Ð   sp   € õ& 	Œ‰Œ€AØ˜Q‘ "Ñ$¨Ñ)€A„HØ˜2 ¤¨A¡Ñ.Ñ.€HÝ  Ô*€IØÐØˆŒØˆå
ÐJÍSÐQZÉ^Ì^Ñ[Ñ
\Ô
\Ð\ó    c                óæ   — t          | t          ¦  «        rt          j        | ¦  «        } | j        t
          v r$t
          | j                 }d| j        dz
  z  |z   }|S t          d| j        z   ¦  «        ‚)a]  
    Converts a pitch string or a music21 Pitch into a Base40
    pitch number. The Base40 number is octave specific.

    Raises a Base40 Exception if the pitch to convert is outside the set
    of pitches that Base40 can handle; for example, half flats
    and half sharps or triple flats and triple sharps.

    >>> musedata.base40.pitchToBase40(pitch.Pitch('C--5'))
    161
    >>> musedata.base40.pitchToBase40('F##4')
    142
    >>> musedata.base40.pitchToBase40('F###4')
    Traceback (most recent call last):
    music21.musedata.base40.Base40Exception: Base40 cannot handle this pitch F###4
    r7   r	   z Base40 cannot handle this pitch )	Ú
isinstancerY   r   rm   rp   Úbase40Representationrn   rX   ÚnameWithOctave)ÚpitchToConvertrs   rq   s      ri   ÚpitchToBase40r|   î   sw   € õ" �.¥#Ñ&Ô&ð 5Ýœ ^Ñ4Ô4ˆØÔÕ2Ð2Ð2Ý'¨Ô(;Ô<ˆØ˜>Ô0°1Ñ4Ñ5¸ÑAˆ	ØÐõ Ð<¸~Ô?\Ñ\Ñ
]Ô
]Ð]rv   c                ó  — t           | dz
  dz  dz            }t           |dz
  dz  dz            }|| z
  }|€7|€5t          dt          | ¦  «        z   dz   t          |¦  «        z   dz   ¦  «        ‚|€"t          dt          | ¦  «        z   dz   ¦  «        ‚|€"t          dt          |¦  «        z   dz   ¦  «        ‚|dk    rG|d	         |d	         k    r5t          d
t          | ¦  «        z   dz   t          |¦  «        z   dz   ¦  «        ‚t          |¦  «        S )at  
    Returns a music21 Interval between two base40 pitch
    numbers, using their delta (difference) as defined
    in Base40. The interval provided is without direction.

    Raises a Base40 Exception if the delta doesn't correspond
    to an interval in Base40, or if either base40 pitch
    number doesn't correspond to a pitch name.

    >>> musedata.base40.base40Interval(163, 191)
    <music21.interval.Interval m6>

    >>> musedata.base40.base40Interval(186, 174)      # Descending M3
    <music21.interval.Interval M-3>

    Base40 has limitations for intervals smaller than diminished or bigger than augmented.

    >>> musedata.base40.base40Interval(1, 5)
    Traceback (most recent call last):
    music21.musedata.base40.Base40Exception: Base40 cannot compute interval between 1 and 5.

    >>> musedata.base40.base40Interval(1, 3)
    Traceback (most recent call last):
    music21.musedata.base40.Base40Exception: Interval not handled by Base40 2

    >>> musedata.base40.base40Interval(2, 6)
    Traceback (most recent call last):
    music21.musedata.base40.Base40Exception: Pitch name not assigned to this Base40 number 6
        Interval does not exist

    >>> musedata.base40.base40Interval(12, 6)
    Traceback (most recent call last):
    music21.musedata.base40.Base40Exception: Pitch name not assigned to these Base40 numbers
        12 and 6 Interval does not exist
    r	   r7   Nz0Pitch name not assigned to these Base40 numbers z and z Interval does not existrl   r   r   z'Base40 cannot compute interval between ú.)ro   rX   rY   rj   )Ú
base40NumAÚ
base40NumBÚpitchAÚpitchBr_   s        ri   Úbase40Intervalrƒ   
  sh  € õH ˜z¨A™~°Ñ3°aÑ7Ô8€FÝ˜z¨A™~°Ñ3°aÑ7Ô8€Fà˜Ñ#€Eà€~˜&˜.ÝÐPÝ # J¡¤ñ0Ø29ñ:å # J¡¤ñ0à2LñMñ Nô Nð 	Nð €~ÝÐNÝ # J¡¤ñ0Ø2LñMñ Nô Nð 	Nà€~ÝÐNÝ # J¡¤ñ0Ø2LñMñ Nô Nð 	Nàˆq‚y€y�V˜A”Y &¨¤)Ò+Ð+ÝÐGÝ # J¡¤ñ0Ø29ñ:Ý<?À
¹O¼OñLØNQñRñ Sô Sð 	Sõ ! Ñ'Ô'Ð'rv   c                ó  — t          | ¦  «        }t          |¦  «        }t          j        ¦   «         }||_        t          j        ¦   «         }||_        	 t	          j        ||¦  «        S # t          $ r t          d¦  «        ‚w xY w)aA  
    Calculates a music21 Interval between two Base40 pitch
    numbers, as calculated using the music21.interval module.

    Raises a Base40 Exception if (a) Either of the Base40 pitch
    numbers does not correspond to a pitch name or (b) If
    an unusual interval is encountered that can't be handled
    by music21.

    >>> musedata.base40.base40ActualInterval(163, 191)
    <music21.interval.Interval m6>
    >>> musedata.base40.base40ActualInterval(186, 174)  # Descending M3
    <music21.interval.Interval M-3>
    >>> musedata.base40.base40ActualInterval(1, 5)
    <music21.interval.Interval AAAA1>
    >>> musedata.base40.base40ActualInterval(1, 3)
    <music21.interval.Interval AA1>
    >>> musedata.base40.base40ActualInterval(2, 6)
    Traceback (most recent call last):
    music21.musedata.base40.Base40Exception: Pitch name not assigned to this Base40 number 6

    OMIT_FROM_DOCS
    >>> musedata.base40.base40ActualInterval(12, 6)
    Traceback (most recent call last):
    music21.musedata.base40.Base40Exception: Pitch name not assigned to this Base40 number 12
    z0Unusual interval- Limitation of music21.interval)ru   r   ÚNoter   r   rV   Ú
IndexErrorrX   )r   r€   r�   r‚   ÚnoteAÚnoteBs         ri   Úbase40ActualIntervalr‰   D  s‰   € õ6 ˜:Ñ&Ô&€FÝ˜:Ñ&Ô&€FåŒI‰KŒK€EØ€E„KÝŒI‰KŒK€EØ€E„KðRÝÔ  ¨Ñ.Ô.Ð.øÝð Rð Rð RÝÐPÑQÔQÐQðRøøøs   ÁA) Á)BÚupTc                ó"  — |dk    rd}n|dk    rd}nt          d|› �¦  «        ‚g }t          j        | ¦  «        r"| }t                               |d¦  «        } | €d}nt
                               | d¦  «        }|�•||z   dz  }|dk    rd}t                               |d¦  «        }|d	u r|�t          |¦  «        d
k    rd}|€d}nH|d         | d         k    rd}d}|D ]}|d         |d         k    rd}d}Œ|�|                     |¦  «         |­•|S )zX
    Helper function for quickHigherEnharmonicString and quickLowerEnharmonicString
    rŠ   r   ÚdownéüÿÿÿzNot a valid direction, Nr7   r   Fr
   )rX   r   ÚisNumro   Úgetry   ÚlenÚappend)ÚnameStrr`   ÚallowDoubleAccidentalsÚaddNumÚenharmonicsÚ	base40numÚ	base40strÚes           ri   Ú_quickEnharmonicStringr™   m  so  € ð �DÒÐØˆˆØ	�fÒ	Ð	ØˆˆåÐC¸	ÐCÐCÑDÔDÐDà€KÝ„|�GÑÔð <Øˆ	Ý"×&Ò& y°$Ñ7Ô7ˆØˆ?ØˆIøå(×,Ò,¨W°dÑ;Ô;ˆ	à
Ð
Ø Ñ'¨2Ñ-ˆ	Ø˜Š>ˆ>ØˆIå$×(Ò(¨°DÑ9Ô9ˆ	Ø! UÐ*Ð*¨yÐ/DÍÈYÉÌÐZ[ÒI[ÐI[ØˆIàÐØˆIˆIà˜Œ|˜w qœzÒ)Ð)Ø �	Ø �	Ø ð %ð %�Ø˜Q”< 1 Q¤4Ò'Ð'Ø $�IØ $�IøØÐ$Ø×"Ò" 9Ñ-Ô-Ð-ð) Ð
ð, Ðrv   c                ó&   — t          | d|¬¦  «        S )a  
    Takes a name of a string and returns a list of the quick higher enharmonics, limited
    to double sharps and double flats (or to single sharps and single flats if
    allowDoubleAccidentals is False)

    >>> musedata.base40.quickHigherEnharmonicString('F#')
    ['G-']
    >>> musedata.base40.quickHigherEnharmonicString('C##')
    ['D', 'E--']
    >>> musedata.base40.quickHigherEnharmonicString('C##', allowDoubleAccidentals=False)
    ['D']
    >>> musedata.base40.quickHigherEnharmonicString('B#')
    ['C', 'D--']
    rŠ   ©r`   r“   ©r™   ©r’   r“   s     ri   ÚquickHigherEnharmonicStringrž   š  s'   € õ " 'Ø,0Ø9OðQñ Qô Qð Qrv   c                ó&   — t          | d|¬¦  «        S )a  
    Takes a name of a string and returns a list of the quick lower enharmonics, limited
    to double sharps and double flats (or to single sharps and single flats if
    allowDoubleAccidentals is False)

    >>> musedata.base40.quickLowerEnharmonicString('B-')
    ['A#']
    >>> musedata.base40.quickLowerEnharmonicString('G-')
    ['F#', 'E##']
    >>> musedata.base40.quickLowerEnharmonicString('G-', allowDoubleAccidentals=False)
    ['F#']
    >>> musedata.base40.quickLowerEnharmonicString('C-')
    ['B', 'A##']
    rŒ   r›   rœ   r�   s     ri   ÚquickLowerEnharmonicStringr    ®  s'   € õ " 'Ø,2Ø9OðQñ Qô Qð Qrv   c                ól   — t          | |¦  «        }|                     t          | |¦  «        ¦  «         |S )aÄ  
    Takes a name of a string and returns a list of the quick lower and higher enharmonics, limited
    to double sharps and double flats (or to single sharps and single flats if
    allowDoubleAccidentals is False)

    >>> musedata.base40.quickEnharmonicString('C')
    ['B#', 'D--']
    >>> musedata.base40.quickEnharmonicString('C', allowDoubleAccidentals=False)
    ['B#']
    >>> musedata.base40.quickEnharmonicString('G')
    ['F##', 'A--']
    )r    Úextendrž   )r’   r“   ÚharmonicStrings      ri   ÚquickEnharmonicStringr¤   Â  s:   € õ 0°Ð9OÑPÔP€NØ×ÒÕ5°gÐ?UÑVÔVÑWÔWÐWØÐrv   c                  ó   — e Zd ZdS )rX   N©Ú__name__Ú
__module__Ú__qualname__© rv   ri   rX   rX   Ô  ó   € € € € € Ø€Drv   rX   c                  ó   — e Zd Zdd„Zd„ ZdS )ÚBaseNr
   c                ó   — || _         d S )N)Úorder)Úselfr¯   s     ri   Ú__init__zBaseN.__init__Ù  s   € ØˆŒ
ˆ
ˆ
rv   c                óB  — g }dD ]™}t          | j        dd¦  «        D ]}|                     |d|z  z   ¦  «         Œ|                     |¦  «         t          | j        ¦  «        D ] }|                     |d|dz   z  z   ¦  «         Œ!|dvr|                     d ¦  «         Œš|S )N)r   r   r   r    r'   r.   r1   r   rS   ú-ú#r	   )r   r1   )Úranger¯   r‘   )r°   Ú
outLettersÚletterÚis       ri   ÚgenerateLetterszBaseN.generateLettersÜ  sÊ   € Øˆ
Ø9ð 	(ð 	(ˆFÝ˜4œ: q¨"Ñ-Ô-ð 4ð 4�Ø×!Ò! &¨3°©7Ñ"2Ñ3Ô3Ð3Ð3Ø×Ò˜fÑ%Ô%Ð%Ý˜4œ:Ñ&Ô&ð :ð :�Ø×!Ò! &¨3°!°a±%©=Ñ"8Ñ9Ô9Ð9Ð9Ø˜ZÐ'Ð'Ø×!Ò! $Ñ'Ô'Ð'øØÐrv   N)r
   )r§   r¨   r©   r±   r¹   rª   rv   ri   r­   r­   Ø  s7   € € € € € ðð ð ð ð
ð 
ð 
ð 
ð 
rv   r­   c                  ó   — e Zd ZdS )ÚTestNr¦   rª   rv   ri   r»   r»   ë  r«   rv   r»   Ú__main__)rŠ   T)T)Ú__doc__Ú
__future__r   ÚunittestÚmusic21r   r   r   r   r   ro   ry   rU   rj   ru   r|   rƒ   r‰   r™   rž   r    r¤   ÚMusic21ExceptionrX   r­   ÚTestCaser»   Ú
_DOC_ORDERr§   ÚmainTestrª   rv   ri   ú<module>rÅ      sˆ  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€à Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð(�A�uð (Ø�tð(à�sð(ð �tð(ð �uð	(ð
 �tð(ð �uð(ð �tð(ð �sð(ð ˜ð(ð ˜ð(ð ˜ð(ð ˜ð(ð ˜ð(ð ˜ð(ð ˜ð(ð  ˜ð!(ð (ð" ˜ð#(ð$ ˜ð%(ð& ˜ð'(ð( ˜ð)(ð* ˜ð+(ð, ˜ð-(ð. ˜ð/(ð0 ˜ð1(ð2 ˜ð3(ð4 ˜ð5(ð6 ˜ð7(ð8 ˜ð9(ð: ˜ð;(ð< ˜ð=(ð> ˜ð?(ð@ ˜ðA(ðB ˜ðC(ð (ðD ØØØØØðO(ð (ð (Ð ðZ(˜˜qð (Ø˜að(à˜Qð(ð ˜að(ð ˜qð	(ð ˜qð(ð ˜að(ð ˜Qð(ð ˜bð(ð ˜rð(ð ˜rð(ð ˜bð(ð ˜Rð(ð ˜bð(ð  ˜rð!(ð" ˜rð#(ð$ ˜bð%(ð (ð& ˜Rð'(ð( ˜bð)(ð* ˜rð+(ð. ˜rð/(ð0 ˜bð1(ð2 ˜Rð3(ð4 ˜bð5(ð6 ˜rð7(ð: ˜rð;(ð< ˜bð=(ð> ˜Rð?(ð@ ˜bðA(ðB ˜rðC(ðF ˜rðG(ðH ˜bðI(ðJ ˜RðK(ðL ˜bðM(ð (ðN ˜rðO(ð (Ð ðZ!�q˜$ð !Ø˜4ð!ð ˜4ð!ð ˜4ð	!ð
 ˜4ð!ð ˜4ð!ð ˜Dð!ð ˜Dð!ð ˜Dð!ð ˜Dð!ð ˜Dð!ð ˜Dð!ð ˜Dð!ð" ˜Dð#!ð$ ˜Dð%!ð& ˜Dð'!ð* ˜Dð+!ð, !Ø Ø à Ø Ø Ø à Ø ðA!ð !ð !Ð ðH5*ð 5*ð 5*ðp]ð ]ð ]ð<^ð ^ð ^ð87(ð 7(ð 7(ðt&Rð &Rð &RðR*ð *ð *ð *ðZQð Qð Qð Qð(Qð Qð Qð Qð(ð ð ð ð$	ð 	ð 	ð 	ð 	�lÔ3ñ 	ô 	ð 	ðð ð ð ð ñ ô ð ð&	ð 	ð 	ð 	ð 	ˆ8Ôñ 	ô 	ð 	ð
 #Ð#€
ð ˆzÒÐð €N€N€NØ€GÔ�TÑÔÐÐÐð	 Ðrv   