
    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 d dlmZ d dlmZ  ej                  d      Z
 G d	 d
      Z G d dej                        Zedk(  rd dlZ ej                  e       yy)    )annotationsN)clef)	converter)environment)note)intervalzanalysis.segmentByRestsc                  4    e Zd ZdZe	 dd       Zed        Zy)	SegmenterzP
    Given a work or part, returns a list of melodic segments or intervals.
    c                   g }g }|j                         j                  g d      }t        t        |            D ]  }||   }t	        |t
        j                        r3|j                  |       |t        |      dz
  k(  r|j                  |       t	        |t
        j                  t        j                  f      s|j                  |       g } |r!|ddd   D ]  }|r|j                  |        |S )aj  
        Segments a part by its rests (and clefs) and returns a list of lists where
        each sublist is one segment of contiguous notes. NB Uses .recurse() internally.

        >>> example = converter.parse("tinyNotation: C4 r D E r r F r G r A B r c")
        >>> segments = analysis.segmentByRests.Segmenter.getSegmentsList(example)
        >>> segments
        [[<music21.note.Note C>],
         [<music21.note.Note D>, <music21.note.Note E>],
         [<music21.note.Note F>],
         [<music21.note.Note G>],
         [<music21.note.Note A>, <music21.note.Note B>],
         [<music21.note.Note C>]]
        NoteRestClef   N)recursegetElementsByClassrangelen
isinstancer   r   appendr   r   r   remove)	cls
workOrPartremoveEmptyListssegmentsthisSegment	partNotesinsegments	            L/DATA/.local/lib/python3.12/site-packages/music21/analysis/segmentByRests.pygetSegmentsListzSegmenter.getSegmentsList   s    & &&(;;<TU	s9~&A!A!TYY'""1%I**OOK0!dii34,  ' #DbD>OOG, *     c                   g }|j                         j                  g d      }t        t        |      dz
        D ]  }||   }t	        |t
        j                  t        j                  f      r3||dz      }t	        |t
        j                  t        j                  f      rft        j                  ||      }|j                  |        |S )a  
        Given a work or part, returns a list of intervals between contiguous notes.
        NB Uses .recurse() internally so
        if called on a work then returns a list of lists with one list per part.

        >>> example = converter.parse("tinyNotation: 4/4 E4 r F G A r g c r c")
        >>> intList = analysis.segmentByRests.Segmenter.getIntervalList(example)
        >>> [x.name for x in intList]
        ['M2', 'M2', 'P5']
        r   r   )r   r   r   r   r   r   r   r   r   r   Intervalr   )r   r   intervalListelementListr   n1n2intervalObjs           r"   getIntervalListzSegmenter.getIntervalListE   s      ((*==>VWs;'!+,AQB"tyy$))45QU#B"tyy$))45"++B3K, - r$   N)T)__name__
__module____qualname____doc__classmethodr#   r,    r$   r"   r
   r
      s5      *.& &P  r$   r
   c                      e Zd Zd Zd Zy)Testc                    t        j                  d      }t        j                  |      }| j	                  |d   t
               | j                  |d   d   j                  d       y )N"tinyNotation: E4 r F G A r g c r cr   r   F)r   parser
   r#   assertIsInstancelistassertEqualname)selfexr   s      r"   testGetSegmentsListzTest.testGetSegmentsLista   sS    __AB,,R0hqk40!Q,,c2r$   c                    t        j                  d      }t        j                  |      }| j	                  |d   j
                  d       | j                  |t               y )Nr6   r   M2)r   r8   r
   r,   r;   r<   r9   r:   )r=   r>   r'   s      r"   testGetIntervalListzTest.testGetIntervalListh   sK    __AB 004a--t4lD1r$   N)r-   r.   r/   r?   rB   r2   r$   r"   r4   r4   _   s    32r$   r4   __main__)
__future__r   unittestmusic21r   r   r   r   r   EnvironmentenvironLocalr
   TestCaser4   r-   mainTestr2   r$   r"   <module>rK      sp    #      &{&&'@AD DN28 2$ zGT r$   