
    3j                        d dl mZ d dlZd dlmZ d dlmZ d dlmZ  ej                  e
      Z G d de      Z G d d	ej                        Zed
k(  rd dlZ ej                   e       yy)    )annotationsN)environmentdefaultDeepcopy)SlottedObjectMixinc                      e Zd ZdZdZddZddZd Zd Zd Z	e
d	        Zej                  d
        Ze
d        Zej                  d        Ze
d        Zej                  d        Zy)StreamStatusa  
    An object that stores the current notation state for the client stream.

    Separates out tasks such as whether notation has been made, etc.

    >>> s = stream.Stream()
    >>> ss = s.streamStatus
    >>> ss
    <music21.stream.streamStatus.StreamStatus object at 0x...>
    >>> s.streamStatus.client is s
    True

    Copying of StreamStatus and surrounding Streams

    >>> import copy
    >>> ss2 = copy.deepcopy(ss)
    >>> ss2.client is None
    True

    >>> s2 = copy.deepcopy(s)
    >>> s2.streamStatus
    <music21.stream.streamStatus.StreamStatus object at 0x...>
    >>> s2.streamStatus is ss
    False
    >>> s2.streamStatus.client is s2
    True
    _accidentals_beams_concertPitch_dirty_enharmonics	_measures
_ornaments_rests_ties_tupletsclientNc                    d | _         d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _	        || _
        y Nr
   )selfr   s     H/DATA/.local/lib/python3.12/site-packages/music21/stream/streamStatus.py__init__zStreamStatus.__init__G   sR     ! 
    c                     t        | |dh      S )zs
        Manage deepcopying by creating a new reference to the same object.
        leaving out the client
        r   )ignoreAttributesr   )r   memos     r   __deepcopy__zStreamStatus.__deepcopy__V   s    
 tTXJGGr   c                    | j                   j                  D ]'  }|j                  |j                  j                  ' y y)a^  
        If Accidentals.displayStatus is None for all contained pitches, it as
        assumed that accidentals have not been set for display and/or
        makeAccidentals has not been run. If any Accidental has displayStatus
        other than None, this method returns True, regardless of if
        makeAccidentals has actually been run.
        TF)r   pitches
accidentaldisplayStatus)r   ps     r   haveAccidentalsBeenMadez$StreamStatus.haveAccidentalsBeenMade_   s:     $$A||'<<--9 % r   c                    | j                   j                  dd      D ]'  }|j                  |j                  j                  s' y y)a  
        If any Note in this Stream has .beams defined, it as assumed that Beams
        have not been set and/or makeBeams has not been run. If any Beams
        exist, this method returns True, regardless of if makeBeams has
        actually been run.
        )NotRestFclassFilterrestoreActiveSitesT)r   recursebeams	beamsList)r   ns     r   haveBeamsBeenMadezStreamStatus.haveBeamsBeenMadem   sB     $$RW$XAww"qww'8'8 Y r   c                    d}| j                   j                  dd      D ]@  }|j                  j                  sd}|j                  j                  d   j                  @ y |ryy)a  
        If any GeneralNote in this Stream is a tuplet, then check to
        see if any of them have a first Tuplet with type besides None
        return True. Otherwise, return False if there is a tuplet. Return None if
        no Tuplets.

        >>> s = stream.Stream()
        >>> s.streamStatus.haveTupletBracketsBeenMade() is None
        True
        >>> s.append(note.Note())
        >>> s.streamStatus.haveTupletBracketsBeenMade() is None
        True
        >>> nTuplet = note.Note(quarterLength=1/3)
        >>> s.append(nTuplet)
        >>> s.streamStatus.haveTupletBracketsBeenMade()
        False
        >>> nTuplet.duration.tuplets[0].type = 'start'
        >>> s.streamStatus.haveTupletBracketsBeenMade()
        True

        FGeneralNoter(   Tr   N)r   r+   durationtupletstype)r   foundTupletr.   s      r   haveTupletBracketsBeenMadez'StreamStatus.haveTupletBracketsBeenMadey   sd    , $$SX$YAzz!!"::%%a(--9	 Z
 r   c                \    | j                   | j                         | _         | j                   S r   )r   r%   r   s    r   accidentalszStreamStatus.accidentals   s+    $ $ < < >D   r   c                8    |t        |      | _        y d | _        y r   )boolr   r   exprs     r   r9   zStreamStatus.accidentals   s     $T
D $Dr   c                \    | j                   | j                         | _         | j                   S r   )r   r/   r8   s    r   r,   zStreamStatus.beams   s&    ;;002DK{{r   c                8    |t        |      | _        y d | _        y r   )r;   r   r<   s     r   r,   zStreamStatus.beams   s    t*DKDKr   c                    | j                   (| j                         | _         | j                   d| _         | j                   S )NT)r   r6   r8   s    r   r3   zStreamStatus.tuplets   s9    ==  ;;=DM }}$ $}}r   c                8    |t        |      | _        y d | _        y r   )r;   r   r<   s     r   r3   zStreamStatus.tuplets   s     JDM DMr   r   )__name__
__module____qualname____doc__	__slots__r   r   r%   r/   r6   propertyr9   setterr,   r3    r   r   r	   r	      s    <I H
F ! !
 % %  
 \\    ^^! !r   r	   c                      e Zd ZdZd Zy)Testz;
    Note: most Stream tests are found in stream.tests
    c                0   dd l }ddlm} ddlm} |j	                         }|j                  dd      }|j                  |       |j                  dd      }|j                  dd      }|j                  ||g       |j                  d	d      }|j                  d	d      }	|j                  ||	g       |j                  j                  d
       |j                  j                  d       | j                  |j                  j                                |j                  |      }
| j                  |
j                  j                                d|
j                  _        |j                  |
      }| j                  |j                  j                         y )Nr   )stream)noteC4quarter)r4   D4eighthE4startstopF)copymusic21rM   rN   MeasureNoteappendr,   
assertTruestreamStatusr/   deepcopyassertFalse)r   rV   rM   rN   mcd1d2e3e4mmmmms               r   "testHaveBeamsBeenMadeAfterDeepcopyz'Test.testHaveBeamsBeenMadeAfterDeepcopy   s0   " NNIIdI+	YYt(Y+YYt(Y+	"bYYt(Y+YYt(Y+	"b
 
88:;]]199;< %mmB))//0r   N)rB   rC   rD   rE   rg   rI   r   r   rK   rK      s    1r   rK   __main__)
__future__r   unittestrW   r   music21.common.miscr   music21.common.objectsr   Environment__file__environLocalr	   TestCaserK   rB   mainTestrI   r   r   <module>rr      sm    #   / 5&{&&x0m!% m!f18 1@ zGT r   