§
    ƒØj…8  ã                  ó  — 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	 dd	lm
Z
  ej        d
¦  «        Zg d¢Zdddddddddddœ
ZdddddddddœZd „ Zd!d"d#d$d%d&d'd(d)d*d+d+d,d-d.œZ G d/„ d0ej        ¦  «        Z G d1„ d2ej        ¦  «        Z G d3„ d4e	j        ¦  «        Z G d5„ d6e¦  «        Z G d7„ d8e¦  «        Z G d9„ d:ej        ¦  «        Z G d;„ d<ej        ¦  «        ZeegZed=k    rddlZ ej        e¦  «         dS dS )>z°
Classes and functions for creating and manipulating dynamic symbols. Rather than
subclasses, the :class:`~music21.dynamics.Dynamic` object is often specialized by parameters.
é    )ÚannotationsN)Úbase)Úcommon)Úenvironment)Úexceptions21)Úspanner)ÚstyleÚdynamics)ÚppppppÚpppppÚppppÚpppÚppÚpÚmpÚmfÚfÚfpÚsfÚffÚfffÚffffÚfffffÚffffffÚpianississimoÚ
pianissimoÚpianoÚ
mezzopianoÚ
mezzoforteÚforteÚ
fortepianoÚ	sforzandoÚ
fortissimoÚfortississimo)
r   r   r   r   r   r   r   r   r   r   zextremely softú	very softÚsoftzmoderately softzmoderately loudÚloudz	very loudzextremely loud)r   r   r   r   r   r   r   r   c                óš   — | �| dk    rdS | dk     rdS | dk     rdS | dk     rd	S | d
k     rdS | dk     rdS | dk     rdS | dk     rdS | dk     rdS dS )aX  
    Given a decimal from 0 to 1, return a string representing a dynamic
    with 0 being the softest (0.01 = 'ppp') and 1 being the loudest (0.9+ = 'fff')
    0 returns "n" (niente), while ppp and fff are the loudest dynamics used.

    >>> dynamics.dynamicStrFromDecimal(0.25)
    'pp'
    >>> dynamics.dynamicStrFromDecimal(1)
    'fff'
    Nr   Úng)\�Âõ(¼?r   g{®GázÄ?r   g¤p=
×£Ð?r   g
×£p=
×?r   ç      à?r   gÍÌÌÌÌÌä?r   gš™™™™™é?r   çÍÌÌÌÌÌì?r   r   © )r)   s    ú…/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/dynamics.pyÚdynamicStrFromDecimalr.   5   s‹   € ð 	€y�A˜’F�FØˆsØ	
ˆTŠˆØˆvØ	
ˆTŠˆØˆuØ	
ˆTŠˆØˆtØ	
ˆTŠˆØˆsØ	
ˆSŠˆØˆtØ	
ˆTŠˆØˆtØ	
ˆSŠˆØˆsØ	
ˆSŠˆØˆtàˆuó    r*   g        gš™™™™™¹?g333333Ã?ç      Ð?gffffffÖ?gÍÌÌÌÌÌÜ?gš™™™™™á?gffffffæ?g      è?g333333ë?r+   gffffffî?)Nr)   r   r   r   r   r   r   r   r   r   r   r   r   c                  ó   — e Zd ZdS )ÚDynamicExceptionN)Ú__name__Ú
__module__Ú__qualname__r,   r/   r-   r2   r2   j   s   € € € € € Ø€Dr/   r2   c                  ó¬   ‡ — e Zd ZU dZdZej        ZddgZddddœZ	d	e
d
<   dˆ fd„	Zd„ Zd„ Zd„ Z eeed¬¦  «        Zd„ Zd„ Z eeed¬¦  «        Zˆ xZS )ÚDynamica³  
    Object representation of Dynamics.

    >>> pp1 = dynamics.Dynamic('pp')
    >>> pp1.value
    'pp'
    >>> pp1.longName
    'pianissimo'
    >>> pp1.englishName
    'very soft'

    Dynamics can also be specified on a 0 to 1 scale with 1 being the
    loudest (see dynamicStrFromDecimal() above)

    >>> ppp = dynamics.Dynamic(0.15)  # on 0 to 1 scale
    >>> ppp.value
    'ppp'
    >>> print(f'{ppp.volumeScalar:.2f}')
    0.15

    Note that we got lucky last time because the dynamic 0.15 exactly corresponds
    to what we've considered the default for 'ppp'.  Here we assign 0.98 which
    is close to the 0.9 that is the default for 'fff' -- but the 0.98 will
    be retained in the .volumeScalar

    >>> loud = dynamics.Dynamic(0.98)  # on 0 to 1 scale
    >>> loud.value
    'fff'
    >>> print(f'{loud.volumeScalar:.2f}')
    0.98

    Transferring the .value ('fff') to a new Dynamic object will set the volumeScalar
    back to 0.9

    >>> loud2 = dynamics.Dynamic(loud.value)
    >>> loud2.value
    'fff'
    >>> print(f'{loud2.volumeScalar:.2f}')
    0.90

    Custom dynamics are possible:

    >>> myDyn = dynamics.Dynamic('rfzsfmp')
    >>> myDyn.value
    'rfzsfmp'
    >>> print(myDyn.volumeScalar)
    0.5
    >>> myDyn.volumeScalar = 0.87
    >>> myDyn.volumeScalar
    0.87

    Dynamics can be placed anywhere in a stream.

    >>> s = stream.Stream()
    >>> s.insert(0, note.Note('E-4', type='half'))
    >>> s.insert(2, note.Note('F#5', type='half'))
    >>> s.insert(0, dynamics.Dynamic('pp'))
    >>> s.insert(1, dynamics.Dynamic('mf'))
    >>> s.insert(3, dynamics.Dynamic('fff'))
    >>> #_DOCS_SHOW s.show()

    .. image:: images/dynamics_simple.*
        :width: 344

    é
   ÚlongNameÚenglishNamezŸ
            the name of this dynamic in Italian.


            >>> d = dynamics.Dynamic('pp')
            >>> d.longName
            'pianissimo'
            z¡
            the name of this dynamic in English.


            >>> d = dynamics.Dynamic('pp')
            >>> d.englishName
            'very soft'
            a}  
            Staff placement: 'above', 'below', or None.

            A setting of None implies that the placement will be determined
            by notation software and no particular placement is demanded.

            This is not placed in the `.style` property, since for some dynamics,
            the placement above or below an object has semantic
            meaning and is not purely presentational.  For instance, a dynamic
            placed between two staves in a piano part implies that it applies
            to both hands, while one placed below the lower staff would apply
            only to the left hand.
            )r9   r:   Ú	placementzdict[str, str]Ú	_DOC_ATTRNc                ó   •—  t          ¦   «         j        di |¤Ž d | _        d | _        d | _        d | _        t          |t          ¦  «        s|| _        t          |¦  «        | _	        n|| _	        d| j
        _        d| j
        _        d | _        d S )NiÜÿÿÿi°ÿÿÿr,   )ÚsuperÚ__init__Ú_volumeScalarr9   r:   Ú_valueÚ
isinstanceÚstrr.   Úvaluer	   Ú	absoluteXÚ	absoluteYr;   )ÚselfrD   ÚkeywordsÚ	__class__s      €r-   r?   zDynamic.__init__Ô   s“   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ð
 "ˆÔØˆŒØˆÔØˆŒå˜%¥Ñ%Ô%ð 	à!&ˆDÔÝ.¨uÑ5Ô5ˆDŒJˆJàˆDŒJð  #ˆŒ
ÔØ"ˆŒ
ÔàˆŒˆˆr/   c                ó*   — t          | j        ¦  «        S ©N)rC   rD   ©rG   s    r-   Ú_reprInternalzDynamic._reprInternalí   s   € Ý�4”:‰ŒÐr/   c                ó   — | j         S rK   )rA   rL   s    r-   Ú	_getValuezDynamic._getValueð   s
   € ØŒ{Ðr/   c                óÊ   — || _         | j         t          v rt          | j                  | _        nd | _        | j         t          v rt          | j                  | _        d S d | _        d S rK   )rA   Ú	longNamesr9   ÚenglishNamesr:   ©rG   rD   s     r-   Ú	_setValuezDynamic._setValueó   s]   € ØˆŒØŒ;�)Ð#Ð#Ý% d¤kÔ2ˆDŒMˆMà ˆDŒMàŒ;�,Ð&Ð&Ý+¨D¬KÔ8ˆDÔÐÐà#ˆDÔÐÐr/   a½  
        Get or set the value of this dynamic, which sets the long and
        English names of this Dynamic. The value is a string specification.

        >>> p = dynamics.Dynamic('p')
        >>> p.value
        'p'
        >>> p.englishName
        'soft'
        >>> p.longName
        'piano'

        >>> p.value = 'f'
        >>> p.value
        'f'
        >>> p.englishName
        'loud'
        >>> p.longName
        'forte'
        )Údocc                óú   — | j         �| j         S | j        t          v rt          | j                 S | j        }d|v r
|dd …         }|d         dk    r
|d d…         }|t          v rt          |         S t          d          S )NÚsé   éÿÿÿÿÚz)r@   rA   ÚdynamicStrToScalar)rG   ÚthisDynamics     r-   Ú_getVolumeScalarzDynamic._getVolumeScalar  s�   € ØÔÐ)ØÔ%Ð%àŒ[Õ.Ð.Ð.Ý% d¤kÔ2Ð2àœ+ˆKà�kÐ!Ð!Ø)¨!¨"¨"œo�à˜2Œ #Ò%Ð%Ø)¨#¨2¨#Ô.�ØÕ0Ð0Ð0Ý)¨+Ô6Ð6å)¨$Ô/Ð/r/   c                ó€   — t          j        |¦  «        rd|cxk    rdk    rn n	|| _        d S t          d|› �¦  «        ‚)Nr   rX   z cannot set as volume scalar to: )r   ÚisNumr@   r2   rS   s     r-   Ú_setVolumeScalarzDynamic._setVolumeScalar(  sR   € åŒ<˜ÑÔð 	O 1¨ ? ?¢? ?°¢? ? ? ? ?Ø!&ˆDÔÐÐå"Ð#MÀeÐ#MÐ#MÑNÔNÐNr/   aû  
        Get or set the volume scalar for this dynamic. If not explicitly set, a
        default volume scalar will be provided. Any number between 0 and 1 can be
        used to set the volume scalar, overriding the expected behavior.

        As mezzo is at 0.5, the unit interval range is doubled for
        generating final output. The default output is 0.5.


        >>> d = dynamics.Dynamic('mf')
        >>> d.volumeScalar
        0.55...

        >>> d.volumeScalar = 0.1
        >>> d.volumeScalar
        0.1
        >>> d.value
        'mf'


        int(volumeScalar \* 127) gives the MusicXML <sound dynamics="x"/> tag

        >>> xmlOut = musicxml.m21ToXml.GeneralObjectExporter().parse(d).decode('utf-8')
        >>> print(xmlOut)
        <?xml...
        <direction>
            <direction-type>
              <dynamics default-x="-36" default-y="-80">
                <mf />
              </dynamics>
            </direction-type>
            <sound dynamics="12" />
        </direction>...
        rK   )r3   r4   r5   Ú__doc__ÚclassSortOrderr	   Ú	TextStyleÚ_styleClassÚ
_DOC_ORDERr<   Ú__annotations__r?   rM   rO   rT   ÚpropertyrD   r]   r`   ÚvolumeScalarÚ__classcell__©rI   s   @r-   r7   r7   o   s  ø€ € € € € € ð@ð @ðB €NØ”/€Kà˜mÐ,€Jðððð#!ð !€Ið ð ð ñ ð>ð ð ð ð ð ð2ð ð ðð ð ð
$ð 
$ð 
$ð ˆH�Y 	ððñ ô €Eð,0ð 0ð 0ð&Oð Oð Oð �8Ð,Ð.>ð !Eð !ñ !ô !€L€L€L€L€Lr/   r7   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚDynamicWedgez9
    Common base-class for Crescendo and Diminuendo.
    c                ór   •—  t          ¦   «         j        |i |¤Ž d | _        d| _        d| _        d| _        d S )NÚbelowé   F)r>   r?   Útyper;   ÚspreadÚniente©rG   ÚspannedElementsrH   rI   s      €r-   r?   zDynamicWedge.__init__Y  sA   ø€ Ø�‰ŒÔ˜/Ð6¨XÐ6Ð6Ð6ð
 ˆŒ	Ø ˆŒØˆŒØˆŒˆˆr/   ©r3   r4   r5   ra   r?   ri   rj   s   @r-   rl   rl   T  sB   ø€ € € € € ðð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r/   rl   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )Ú	Crescendoz«
    A spanner crescendo wedge.

    >>> d = dynamics.Crescendo()
    >>> d.spread
    15
    >>> d.spread = 20
    >>> d.spread
    20
    >>> d.type
    'crescendo'
    c                óH   •—  t          ¦   «         j        |i |¤Ž d| _        d S )NÚ	crescendo©r>   r?   rp   rs   s      €r-   r?   zCrescendo.__init__s  s*   ø€ Ø�‰ŒÔ˜/Ð6¨XÐ6Ð6Ð6ØˆŒ	ˆ	ˆ	r/   ru   rj   s   @r-   rw   rw   e  sB   ø€ € € € € ðð ð ð  ð  ð  ð  ð  ð  ð  ð  r/   rw   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )Ú
Diminuendozv
    A spanner diminuendo wedge.

    >>> d = dynamics.Diminuendo()
    >>> d.spread = 20
    >>> d.spread
    20
    c                óH   •—  t          ¦   «         j        |i |¤Ž d| _        d S )NÚ
diminuendorz   rs   s      €r-   r?   zDiminuendo.__init__‚  s*   ø€ Ø�‰ŒÔ˜/Ð6¨XÐ6Ð6Ð6Ø ˆŒ	ˆ	ˆ	r/   ru   rj   s   @r-   r|   r|   x  sB   ø€ € € € € ðð ð!ð !ð !ð !ð !ð !ð !ð !ð !r/   r|   c                  ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestExternalTc                ó^   — t          d¦  «        }| j        r|                     ¦   «          d S d S )Nr   )r7   Úshow)rG   Úas     r-   Ú
testSinglezTestExternal.testSingleŒ  s2   € Ý�F‰OŒOˆØŒ9ð 	Ø�FŠF‰HŒHˆHˆHˆHð	ð 	r/   c                óà   — ddl m} |                     ¦   «         }d}t          D ],}t	          |¦  «        }|                     ||¦  «         |dz  }Œ-| j        r|                     ¦   «          dS dS )z:
        present each dynamic in a single measure
        r   ©Ústreamé   N)Úmusic21r‡   ÚStreamÚ
shortNamesr7   Úinsertr‚   )rG   r‡   rƒ   ÚoÚdynStrÚbs         r-   Ú	testBasiczTestExternal.testBasic‘  sƒ   € ð 	#Ð"Ð"Ð"Ð"Ð"Ø�MŠM‰OŒOˆØˆÝ ð 	ð 	ˆFÝ˜‘”ˆAØ�HŠH�Q˜‰NŒNˆNØ�‰FˆAˆAØŒ9ð 	Ø�FŠF‰HŒHˆHˆHˆHð	ð 	r/   N)r3   r4   r5   r‚   r„   r�   r,   r/   r-   r€   r€   ‰  s7   € € € € € Ø€Dðð ð ð
ð ð ð ð r/   r€   c                  ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestc                óB   — ddl m}  || t          ¦   «         ¦  «         d S )Nr   )ÚtestCopyAll)Úmusic21.test.commonTestr”   Úglobals)rG   r”   s     r-   ÚtestCopyAndDeepcopyzTest.testCopyAndDeepcopy£  s0   € Ø7Ð7Ð7Ð7Ð7Ð7Øˆ�D�'™)œ)Ñ$Ô$Ð$Ð$Ð$r/   c                óô   — t          ¦   «         }|j        �J ‚t          d¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         d S )Nr   r   r%   )r7   r9   ÚassertEqualrD   r:   )rG   ÚnoDynr   s      r-   r�   zTest.testBasic§  sr   € Ý‘	”	ˆØŒ~Ð%Ð%Ð%å�T‰]Œ]ˆØ×Ò˜œ 4Ñ(Ô(Ð(Ø×Ò˜œ lÑ3Ô3Ð3Ø×Ò˜œ¨Ñ5Ô5Ð5Ð5Ð5r/   c                ó°  — ddl m} ddl m} |                     d¦  «        }|j        d                              ¦   «                              |j        ¦  «        }|                      t          |¦  «        d¦  «         |j        d                              ¦   «                              |j
        ¦  «        }|                      t          |¦  «        d¦  «         d S )Nr   )Úcorpus)r
   zopus41no1/movement2é#   é   )r‰   rœ   r
   ÚparseÚpartsÚflattenÚgetElementsByClassr7   r™   Úlenrl   )rG   rœ   r
   rƒ   r�   s        r-   ÚtestCorpusDynamicsWedgezTest.testCorpusDynamicsWedge°  sÆ   € Ø"Ð"Ð"Ð"Ð"Ð"Ø$Ð$Ð$Ð$Ð$Ð$à�LŠLÐ.Ñ/Ô/ˆØŒG�AŒJ×ÒÑ Ô ×3Ò3°HÔ4DÑEÔEˆØ×Ò�˜Q™œ Ñ$Ô$Ð$àŒG�AŒJ×ÒÑ Ô ×3Ò3°HÔ4IÑJÔJˆØ×Ò�˜Q™œ Ñ#Ô#Ð#Ð#Ð#r/   c                óü   — ddl m} t          d¦  «        }|                     ¦   «                              |¦  «                             d¦  «        }d}|                      |                     |¦  «        d|¦  «         d S )Nr   )Úm21ToXmlr   zutf-8z<p />rY   )Úmusic21.musicxmlr¦   r7   ÚGeneralObjectExporterrŸ   ÚdecodeÚassertNotEqualÚfind)rG   r¦   ÚdÚxmlOutÚmatchs        r-   ÚtestMusicxmlOutputzTest.testMusicxmlOutput»  s{   € à-Ð-Ð-Ð-Ð-Ð-Ý�C‰LŒLˆØ×/Ò/Ñ1Ô1×7Ò7¸Ñ:Ô:×AÒAÀ'ÑJÔJˆØˆØ×Ò˜FŸKšK¨Ñ.Ô.°°FÑ;Ô;Ð;Ð;Ð;r/   c                ó6  — ddl m} ddl m} |                     ¦   «         }g d¢}t	          d¦  «        D ]d}t          ||t          |¦  «        z           ¦  «        }|                     |¦  «         |                     |                     d¦  «        ¦  «         Œed S )Nr   r†   ©Únote)r   r   r   r   r8   Úc1)	r‰   r‡   r²   rŠ   Úranger7   r£   ÚappendÚNote)rG   r‡   r²   rW   Ú
selectionsÚir¬   s          r-   ÚtestDynamicsPositionAzTest.testDynamicsPositionAÃ  s¨   € Ø"Ð"Ð"Ð"Ð"Ð"Ø Ð Ð Ð Ð Ð Ø�MŠM‰OŒOˆØ-Ð-Ð-ˆ
å�r‘”ð 	&ð 	&ˆAÝ˜
 1¥s¨:¡¤Ñ#6Ô7Ñ8Ô8ˆAØ�HŠH�Q‰KŒKˆKØ�HŠH�T—Y’Y˜t‘_”_Ñ%Ô%Ð%Ð%ð	&ð 	&r/   c                ó˜  — dd l }ddlm} ddlm} ddlm} |                     ¦   «         }t          d¦  «        D ]‚}|                     |dz   ¬¦  «        }|                     | 	                    d¬	¦  «        ¦  «         |                     | 
                    d
¬¦  «        ¦  «         |                     |¦  «         Œƒ|                     |j        ¦  «        }|D ]p}d„ t          d¦  «        D ¦   «         }	|                     |	¦  «         |	d d…         }	|	D ]3}
t          d¦  «        }d|j        _        |                     |
|¦  «         Œ4Œqd S )Nr   r†   r±   )Úlayouté   rX   )ÚnumberT)ÚisNewÚwhole)rp   c                ó   — g | ]}|d z  ‘ŒS )r0   r,   )Ú.0Úxs     r-   ú
<listcomp>z.Test.testDynamicsPositionB.<locals>.<listcomp>Ü  s   € Ð3Ð3Ð3 A�q˜4‘xÐ3Ð3Ð3r/   é   rˆ   r   é   )Úrandomr‰   r‡   r²   r»   rŠ   r´   ÚMeasurerµ   ÚSystemLayoutÚRestr¢   Úshuffler7   r	   rF   rŒ   )rG   rÆ   r‡   r²   r»   rW   r¸   ÚmÚstream_iteratorÚoffsetsr�   r¬   s               r-   ÚtestDynamicsPositionBzTest.testDynamicsPositionBÏ  sp  € ØˆˆˆØ"Ð"Ð"Ð"Ð"Ð"Ø Ð Ð Ð Ð Ð Ø"Ð"Ð"Ð"Ð"Ð"Ø�MŠM‰OŒOˆÝ�q‘”ð 	ð 	ˆAØ—’ a¨!¡e�Ñ,Ô,ˆAØ�HŠH�V×(Ò(¨tÐ(Ñ4Ô4Ñ5Ô5Ð5Ø�HŠH�T—Y’Y G�YÑ,Ô,Ñ-Ô-Ð-Ø�HŠH�Q‰KŒKˆKˆKØ×.Ò.¨v¬~Ñ>Ô>ˆØ ð 	ð 	ˆAØ3Ð3­¨r©¬Ð3Ñ3Ô3ˆGØ�NŠN˜7Ñ#Ô#Ð#Ø˜b˜q˜b”kˆGØð ð �Ý˜D‘M”M�Ø$&�”Ô!Ø—’˜˜A‘”��ðð		ð 	r/   N)	r3   r4   r5   r—   r�   r¤   r¯   r¹   rÎ   r,   r/   r-   r’   r’   ¡  sn   € € € € € ð%ð %ð %ð6ð 6ð 6ð	$ð 	$ð 	$ð<ð <ð <ð	&ð 	&ð 	&ðð ð ð ð r/   r’   Ú__main__) ra   Ú
__future__r   Úunittestr‰   r   r   r   r   r   r	   ÚEnvironmentÚenvironLocalr‹   rQ   rR   r.   r[   ÚMusic21Exceptionr2   ÚMusic21Objectr7   ÚSpannerrl   rw   r|   ÚTestCaser€   r’   re   r3   ÚmainTestr,   r/   r-   ú<module>rÙ      sß  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à&ˆ{Ô& zÑ2Ô2€ðQð Qð Q€
à#Ø ØØ Ø ØØ ØØ Ø$ð	&ð 	&€	ð (Ø"ØØ(Ø(ØØ"Ø(ð*ð *€ðð ð ðF Ø	ØØØ
Ø	Ø
Ø
Ø	Ø
Ø
Ø
ØØðð Ð ð&	ð 	ð 	ð 	ð 	�|Ô4ñ 	ô 	ð 	ð
að að að að aˆdÔ ñ aô að aðJð ð ð ð �7”?ñ ô ð ð" ð  ð  ð  ð  �ñ  ô  ð  ð&!ð !ð !ð !ð !�ñ !ô !ð !ð"ð ð ð ð �8Ô$ñ ô ð ð0Að Að Að Að Aˆ8Ôñ Aô Að AðN Ð,Ð-€
àˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr/   