
    3j                    .   d Z ddlmZ ddlZddlZddlmZ ddlmZ  ej                  d      Z
 G d dej                        Z G d	 d
ej                  j                        Z G d dej                         ZdZedk(  rddlZ ej(                  e       yy)z9
Tools for performing voice-leading analysis with trees.
    )annotationsN)environment)exceptions21ztree.analysisc                      e Zd Zy)HorizontalityExceptionN__name__
__module____qualname__     B/DATA/.local/lib/python3.12/site-packages/music21/tree/analysis.pyr   r          r   r   c                  ^    e Zd ZdZdZddZd Zd Zd Ze	d        Z
e	d	        Ze	d
        Zy)Horizontalityz
    A horizontality of consecutive PitchedTimespan objects.

    It must be initiated with a list or tuple of Timespan objects.
    	timespansNc                    t        |t        j                  j                        st	        d|      |st	        d      t        d |D              st	        d      t        |      | _        y )Nz"timespans must be a sequence, not z9there must be at least one timespan in the timespans listc              3  P   K   | ]  }t        |d       xr t        |d         yw)offsetendTimeN)hasattr.0xs     r   	<genexpr>z)Horizontality.__init__.<locals>.<genexpr>4   s'     U9a71h'AGAy,AA9s   $&z5only Timespan objects can be added to a horizontality)
isinstancecollectionsabcSequencer   alltupler   )selfr   s     r   __init__zHorizontality.__init__.   sd    )[__%=%=>(+Mi])[\\(KM MU9UU()`aay)r   c                     | j                   |   S Nr   )r#   items     r   __getitem__zHorizontality.__getitem__:   s    ~~d##r   c                ,    t        | j                        S r&   )lenr   )r#   s    r   __len__zHorizontality.__len__=   s    4>>""r   c                    g }| D ];  }dj                  d |j                  D              }d| d}|j                  |       = dj                  |      }dt        |       j                   d| dS )	Nz, c              3  4   K   | ]  }|j                     y wr&   )nameWithOctave)r   ys     r   r   z)Horizontality.__repr__.<locals>.<genexpr>C   s     %J	1a&6&6	s   (z,) <z: >)joinpitchesappendtyper	   )r#   pitchStringsr   joinedPitchesoutpitchStrs         r   __repr__zHorizontality.__repr__@   su    A II%J		%JJMm_B'C$  88L)4:&&'r(155r   c                   t        |       dk  ryt        d | D              sy| d   j                  d   | d   j                  d   | d   j                  d   f}|d   |d   cxk  r|d   k  ry |d   |d   cxkD  r|d   kD  ry yy)z
        Is true if the Horizontality contains a passing tone; currently defined as three tones in
        one direction.

        (TODO: better check)
           Fc              3  F   K   | ]  }t        |j                          y wr&   r*   r5   r   s     r   r   z/Horizontality.hasPassingTone.<locals>.<genexpr>U        2TS^T   !r         T)r*   r!   r5   r#   r5   s     r   hasPassingTonezHorizontality.hasPassingToneK   s     t9q=2T22GOOAGOOAGOOA

 1:
/WQZ/ 0QZ'!*1wqz1 2r   c                    t        |       dk  ryt        d | D              sy| d   j                  d   | d   j                  d   | d   j                  d   f}|d   |d   k(  r,t        |d   j                  |d   j                  z
        dk  ryy)zH
        Is true if the Horizontality contains a neighbor tone.
        r>   Fc              3  F   K   | ]  }t        |j                          y wr&   r@   r   s     r   r   z0Horizontality.hasNeighborTone.<locals>.<genexpr>i   rA   rB   r   rC   rD   T)r*   r!   r5   abspsrE   s     r   hasNeighborTonezHorizontality.hasNeighborToneb   s    
 t9q=2T22 GOOAGOOAGOOA

 1:#71:==71:==01A5r   c                    t               }| D ]&  }|j                  t        |j                               ( t	        |      dk(  ryy)ze
        Is true if the Horizontality contains no motion (including enharmonic restatements)
        rC   TF)setaddr"   r5   r*   )r#   	pitchSetsr   s      r   hasNoMotionzHorizontality.hasNoMotionv   s<    
 E	AMM%		*+ y>Qr   r&   )r	   r
   r   __doc__	__slots__r$   r(   r+   r<   propertyrF   rK   rP   r   r   r   r   r      s^    I*$#6  ,  & 	 	r   r   c                      e Zd Zy)TestNr   r   r   r   rU   rU      r   r   rU   r   __main__)rQ   
__future__r   collections.abcr   unittestmusic21r   r   EnvironmentenvironLocalTreeExceptionr   r   r    r   TestCaserU   
_DOC_ORDERr	   mainTestr   r   r   <module>ra      s    #     &{&&7	\77 	aKOO,, aN	8 	 
 zGT r   