
    3j"D                    *   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	 d d	lm
Z
  ej                  d
      Z G d dej                        Z	 	 	 ddZ G d dej                         Zedk(  rd dlZ ej&                  e       yy)    )annotationsN)chord)environment)exceptions21)note)pitch)scale)streamzalpha.analysis.searchc                      e Zd Zy)SearchModuleExceptionN)__name__
__module____qualname__     J/DATA/.local/lib/python3.12/site-packages/music21/alpha/analysis/search.pyr   r      s    r   r   c                   t        |t        j                        st        d      d}d}d}	d}
d}d}g }g }t	               }d}d}d}g }t        j                         }| D ]  }t        |t        j                        rt        |t        j                        r|r;t        |t        j                  t        j                  f      sf|j                  | j                  |      |        t!        |      D ]  \  }}|t#        |      dz
  k  r	||dz      }nd}t%        |d      r|j                  }
|t%        |d      r|j                  }	nd}	d}|t        j&                  j(                  }n|}|j+                  |
||      }|d}n|d}n|r||z
  dk(  rd}n|j-                  |
|t        j&                  j.                  ||	      r;|dt        j&                  j.                  fv rd}t        j&                  j.                  }nm|j-                  |
|t        j&                  j0                  ||	      r;|dt        j&                  j0                  fv rd}t        j&                  j0                  }nd}d}|r3|j3                  |       |j5                  |
       |j5                  |       |}|
}t#        |      |k\  r|j-                  |	|
|d|	      rnd}|rt        j                         }|D ]#  }|j                  | j                  |      |       % ||d
}|j5                  |       d}|du re|du ra|j-                  |	|
t        j&                  j0                  ||	      s.|j-                  |	|
t        j&                  j.                  ||	      rd}nd}|rd}d}t	               }g }g }d}|sd}t	               }|j3                  |       |
g}|g}d} |S )a  
    Given a pitch source and a concrete scale, return references to all
    elements found that represent consecutive scale segments in one direction.

    The `targetScale` is a concrete scale instance.

    The `degreesRequired` specifies how many consecutive scale degrees
    are required for grouping. Note that if more are found, they will
    continue to be gathered until a break is found.

    The `stepSize` determines what scale step size is examined

    The `comparisonAttribute` is the Pitch class attribute used
    for all pitch comparisons; this can be used to force enharmonic
    comparison ('name'), pitch space comparison ('nameWithOctave') or
    permit pitch class matching ('pitchClass').

    If `repeatsAllowed` is True, repeated Pitches will be counted as
    part of the consecutive segment.

    If `restsAllowed` is True, rests will not interrupt a consecutive segment.
    z$scale must be a concrete scale classNF   r   )comparisonAttribute	directionTr   )stepSizer   )r
   r   )
isinstancer	   ConcreteScaler   setr
   Streamr   Chordr   Restr   PitchNoteinsertelementOffset	enumeratelenhasattr	DirectionBIgetScaleDegreeFromPitchisNext	ASCENDING
DESCENDINGaddappend)sourcetargetScaledegreesRequiredr   r   repeatsAllowedrestsAllowed
degreeLastpLastpNextpddirectionLastcollPitchescollElementscollDegreesclearCollectclearCollectKeepLastmatch	collMatchsourceCleaneeCounteNextcollectdirDegreeGetpostinnerEl
dictionarys                                r   findConsecutiveScalerH      s   4 k5#6#67#$JKKJEEAAMKL%KL EI --/Ka%a# a%++tyy12v33A6:  {+	 C$q((
+EE1gA WUG%< G$$11,33AH[>J 4 LA
 y# %"G $
Q!(;"G!((E5??3L3L2:=P ) R (D%//2K2K+LL #G$)OO$=$=M!((E5??3M3M2:=P ) R (D%//2L2L+MM #G$)OO$>$>M
 $G ,0(
 OOA&&&q) ''* JE {. !!%"#"/+,6I	 " K
  ==?D (F0097C ( %)}EJZ(E u$)=)F ''q%//2L2L19<O ( Q '--eQ8Q8Q7?BU . W ,0(#'L J M%KKL L  
 !M%KOOA#K3L#( w ,z r   c                      e Zd Zd Zd Zd Zy)Testc                2    ddl m}  || t                      y )Nr   )testCopyAll)music21.test.commonTestrL   globals)selfrL   s     r   testCopyAndDeepcopyzTest.testCopyAndDeepcopy   s    7D')$r   c                @   t        j                  d      }t        j                         }dD ](  }t	        j
                  |      }|j                  |       * t        ||d      }| j                  t        |      d       | j                  t        |d   d         d       t        j                         }dD ](  }t	        j
                  |      }|j                  |       * t        ||dd	
      }| j                  t        |      d       | j                  t        |d   d         d       t        j                         }dD ](  }t	        j
                  |      }|j                  |       * t        ||dd	
      }| j                  t        |      d       | j                  t        |d   d         d       | j                  t        |d   d         d       t        j                         }dD ](  }t	        j
                  |      }|j                  |       * t        ||dd
      }| j                  t        |      d       | j                  t        |d   d         d       | j                  t        |d   d         d       t        j                         }dD ](  }t	        j
                  |      }|j                  |       * t        ||dd	
      }| j                  t        |      d       t        ||dd	
      }| j                  t        |      d       | j                  t        |d   d         d       | j                  t        |d   d         d       | j                  t        |d   d         d       t        j                         }g d}g d}|j                          ||z   |z   |z   |z   D ](  }t	        j
                  |      }|j                  |       * t        ||dd	
      }| j                  t        |      d       t        ||dd
      }| j                  t        |      d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       t        j                         }g d}g d}|j                          ||z   ddgz   |z   dgz   |z   ddgz   |z   D ](  }t	        j
                  |      }|j                  |       * t        ||dd	
      }| j                  t        |      d       t        ||dd
      }| j                  t        |      d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       | j                  t        |d   d         d       | j                  |d   d   d   j                  j                  d       y )Na4)rR   b4zc#4d4e4f#4g#4rR      )r/   r   r   r
      nameWithOctaver/   r      )
rR   rS   c#5d5e5rR   rS   r]   r^   r_         )
rR   b8zc#3d3rU   rR   b9zc#2rT   e12name)rR   rS   r]   d-3rR   rS   r]   rg   rR   rS   r]   rg      )r]   rc   rU   rV   rW   zC#5zG#4g2ze#7za-2ab)r	   
MajorScaler
   r   r   r   r,   rH   assertEqualr#   reverser   rZ   )rO   scpartpnnrE   stubstubReverseds           r   testFindConsecutiveScaleAzTest.testFindConsecutiveScaleA  s\   d# }}EB		"AKKN F
 $D"a@TA&T!WX./3}}EB		"AKKN F
 $D"a8HJTA&T!WX./3}}PB		"AKKN Q $D"a8HJTA&T!WX./3T!WX./3 }}QB		"AKKN R
 $D"aU[\TA&T!WX./3T!WX./3 }}`B		"AKKN a
 $D"a8HJTA&#D"a8HJTA&T!WX./3T!WX./3T!WX./3 }}08,&-<|KB		"AKKN L
 $D"a8HJTA& $D"aU[\TA&T!WX./3a*1-33BBEJT!WX./3a*1-33BBEJT!WX./3a*1-33BBEJT!WX./3a*1-33BBEJT!WX./3a*1-33BBEJ }}08!"E]#  W	
 "" 3Z  ""B 		"AKKN" $D"a8HJTA& $D"aU[\TA&T!WX./3a*1-33BBEJT!WX./3a*1-33BBEJT!WX./3a*1-33BBEJT!WX./3a*1-33BBEJT!WX./3a*1-33BBEJr   c           	        ddl m} t        j                  d      }t        j                  d      }t        j                  d      }|j	                  d      j                  dd      }|||fD ]z  }|j                  D ]i  }t        |j                         |d	d
      }t        |      D ]<  \  }	}
|
D ]2  }|j                  |j                         j                   |	dz           4 > k | y )Nr   )corpusg4rR   rT   zmozart/k80/movement1r      ra   rf   r[   )music21rw   r	   rl   parsemeasurespartsrH   flattenr"   addLyricgetTonicrf   )rO   rw   scGMajorscAMajorscDMajorsro   rp   rE   ggrouprr   s               r   xtestFindConsecutiveScaleBzTest.xtestFindConsecutiveScaleB  s    "##D)##D)##D)LL/099!R@Xx0B+DLLNBPQ@FH )$HAu"

bkkm&8&8%9!a%#AB # !0	   1r   N)r   r   r   rP   ru   r   r   r   r   rJ   rJ      s    %DKLCr   rJ   __main__)ra   r   rf   TF)
__future__r   unittestrz   r   r   r   r   r   r	   r
   EnvironmentenvironLocalMusic21Exceptionr   rH   TestCaserJ   r   mainTestr   r   r   <module>r      s    #         &{&&'>?	L99 	 ?@9?;@[~ZC8 ZCP zGT r   