
    rh                        S SK Jr  S SKrS SKJr  S SKJr  S SKJr  \R                  " \
5      r " S S\5      r " S S	\R                  5      r\S
:X  a  S SKr\R                   " \5        gg)    )annotationsN)environmentdefaultDeepcopy)SlottedObjectMixinc                      \ rS rSrSrSrSS jrSS jrS rS r	S	 r
\S
 5       r\R                  S 5       r\S 5       r\R                  S 5       r\S 5       r\R                  S 5       rSrg)StreamStatus   aL  
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                    S U l         S U l        S U l        S U l        S U l        S U l        S U l        S U l        S U l        S U l	        Xl
        g Nr   )selfr   s     U/home/james-whalen/.local/lib/python3.13/site-packages/music21/stream/streamStatus.py__init__StreamStatus.__init__H   sP     ! 
    c                    [        XS1S9$ )z[
Manage deepcopying by creating a new reference to the same object.
leaving out the client
r   )ignoreAttributesr   )r   memos     r   __deepcopy__StreamStatus.__deepcopy__W   s    
 tXJGGr   c                    U R                   R                   H+  nUR                  c  M  UR                  R                  c  M+    g   g)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   haveAccidentalsBeenMade$StreamStatus.haveAccidentalsBeenMade`   s:     $$A||'<<--9 % r   c                    U R                   R                  SSS9 H/  nUR                  c  M  UR                  R                  (       d  M/    g   g)z
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   haveBeamsBeenMadeStreamStatus.haveBeamsBeenMaden   sE     $$RW$XAww"qww'8'8'8 Y r   c                    SnU R                   R                  SSS9 HH  nUR                  R                  (       d  M   SnUR                  R                  S   R                  c  MH    g   U(       a  gg)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   foundTupletr2   s      r   haveTupletBracketsBeenMade'StreamStatus.haveTupletBracketsBeenMadez   sg    , $$SX$YAzz!!!"::%%a(--9	 Z
 r   c                ^    U R                   c  U R                  5       U l         U R                   $ r   )r   r(   r   s    r   accidentalsStreamStatus.accidentals   s+    $ $ < < >D   r   c                :    Ub  [        U5      U l        g S U l        g r   )boolr   r   exprs     r   r?   r@      s     $T
D $Dr   c                ^    U R                   c  U R                  5       U l         U R                   $ r   )r   r3   r>   s    r   r0   StreamStatus.beams   s&    ;;002DK{{r   c                :    Ub  [        U5      U l        g S U l        g r   )rB   r   rC   s     r   r0   rF      s    t*DKDKr   c                    U R                   c)  U R                  5       U l         U R                   c  SU l         U R                   $ )NT)r   r;   r>   s    r   r8   StreamStatus.tuplets   s9    ==  ;;=DM }}$ $}}r   c                :    Ub  [        U5      U l        g S U l        g r   )rB   r   rC   s     r   r8   rI      s     JDM DMr   r   )__name__
__module____qualname____firstlineno____doc__	__slots__r   r!   r(   r3   r;   propertyr?   setterr0   r8   __static_attributes__ r   r   r	   r	      s    <I H
F ! !
 % %  
 \\    ^^! !r   r	   c                      \ rS rSrSrS rSrg)Test   z3
Note: most Stream tests are found in stream.tests
c                   SS K nSSKJn  SSKJn  UR	                  5       nUR                  SSS9nUR                  U5        UR                  SSS9nUR                  SSS9nUR                  Xg/5        UR                  S	SS9nUR                  S	SS9n	UR                  X/5        UR                  R                  S
5        UR                  R                  S5        U R                  UR                  R                  5       5        UR                  U5      n
U R                  U
R                  R                  5       5        SU
R                  l        UR                  U
5      nU R                  UR                  R                  5        g )Nr   )stream)noteC4quarter)r9   D4eighthE4startstopF)copymusic21rY   rZ   MeasureNoteappendr0   
assertTruestreamStatusr3   deepcopyassertFalse)r   rb   rY   rZ   mcd1d2e3e4mmmmms               r   "testHaveBeamsBeenMadeAfterDeepcopy'Test.testHaveBeamsBeenMadeAfterDeepcopy   s,   " NNIIdI+	YYt(Y+YYt(Y+	"YYt(Y+YYt(Y+	"
 
88:;]]199;< %mmB))//0r   rT   N)rK   rL   rM   rN   rO   rs   rS   rT   r   r   rV   rV      s    1r   rV   __main__)
__future__r   unittestrc   r   music21.common.miscr   music21.common.objectsr   Environment__file__environLocalr	   TestCaserV   rK   mainTestrT   r   r   <module>r      si    #   / 5&&x0m!% m!f18 1@ zT r   