
    rh:D                    .   S SK Jr  S SKrS SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S S	KJ
r
  \R                  " S
5      r " S S\R                  5      r   SS jr " S S\R                   5      r\S:X  a  S SKr\R&                  " \5        gg)    )annotationsN)chord)environment)exceptions21)note)pitch)scale)streamzalpha.analysis.searchc                      \ rS rSrSrg)SearchModuleException    N)__name__
__module____qualname____firstlineno____static_attributes__r       W/home/james-whalen/.local/lib/python3.13/site-packages/music21/alpha/analysis/search.pyr   r      s    r   r   c           	     P   [        U[        R                  5      (       d  [        S5      eSnSnSn	Sn
SnSn/ n/ n[	        5       nSnSnSn/ n[
        R                  " 5       nU  H  n[        U[        R                  5      (       a  M$  [        U[        R                  5      (       a	  U(       a  ML  [        U[        R                  [        R                  45      (       d  M}  UR                  U R                  U5      U5        M     [!        U5       GH  u  nnU[#        U5      S-
  :  a	  UUS-      nOSn[%        US5      (       Ga  UR                  n
Ub  [%        US5      (       a  UR                  n	OSn	SnUc  [        R&                  R(                  nOUnUR+                  U
UUS9nUc  SnGO.Uc  SnOU(       a  X{-
  S:X  a  SnOUR-                  X[        R&                  R.                  UUS	9(       a=  US[        R&                  R.                  4;   a  Sn[        R&                  R.                  nOpUR-                  X[        R&                  R0                  UUS	9(       a=  US[        R&                  R0                  4;   a  Sn[        R&                  R0                  nOSnSnU(       a3  UR3                  U5        UR5                  U
5        UR5                  U5        UnU
n[#        U5      U:  a  UR-                  U	U
USUS	9(       a  OSnU(       a  [
        R                  " 5       nU H$  nUR                  U R                  U5      U5        M&     UUS
.nUR5                  U5        SnUSL ah  USL ac  UR-                  X[        R&                  R0                  UUS	9(       d/  UR-                  X[        R&                  R.                  UUS	9(       a  SnOSnU(       a  SnSn[	        5       n/ n/ nSnU(       d  GM  Sn[	        5       nUR3                  U5        U
/nU/nSnGM     U$ )aM  
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   findConsecutiveScalerK      s   4 k5#6#677#$JKKJEEAAMKL%KL EI --/Ka%%a## a%++tyy122v33A6:  {+	 C$q((
+EE1gA WUG%<%< G$$11,33AH[>J 4 LA
 y# %"G $
!(;"G!((5??3L3L2:=P ) R (D%//2K2K+LL #G$)OO$=$=M!((5??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 ''%//2L2L19<O ( Q '--e8Q8Q7?BU . W ,0(#'L J M%KKL L  
 !M%KOOA#K3L#( w ,z r   c                  &    \ rS rSrS rS rS rSrg)Test   c                2    SSK Jn  U" U [        5       5        g )Nr   )testCopyAll)music21.test.commonTestrP   globals)selfrP   s     r   testCopyAndDeepcopyTest.testCopyAndDeepcopy   s    7D')$r   c                (   [         R                  " S5      n[        R                  " 5       nS H*  n[        R
                  " U5      nUR                  U5        M,     [        X!SS9nU R                  [        U5      S5        U R                  [        US   S   5      S5        [        R                  " 5       nS H*  n[        R
                  " U5      nUR                  U5        M,     [        X!SS	S
9nU R                  [        U5      S5        U R                  [        US   S   5      S5        [        R                  " 5       nS H*  n[        R
                  " U5      nUR                  U5        M,     [        X!SS	S
9nU R                  [        U5      S5        U R                  [        US   S   5      S5        U R                  [        US   S   5      S5        [        R                  " 5       nS H*  n[        R
                  " U5      nUR                  U5        M,     [        X!SSS
9nU R                  [        U5      S5        U R                  [        US   S   5      S5        U R                  [        US   S   5      S5        [        R                  " 5       nS H*  n[        R
                  " U5      nUR                  U5        M,     [        X!SS	S
9nU R                  [        U5      S5        [        X!SS	S
9nU R                  [        U5      S5        U R                  [        US   S   5      S5        U R                  [        US   S   5      S5        U R                  [        US   S   5      S5        [        R                  " 5       n/ SQn/ SQnUR                  5         Xg-   U-   U-   U-    H*  n[        R
                  " U5      nUR                  U5        M,     [        X!SS	S
9nU R                  [        U5      S5        [        X!SSS
9nU R                  [        U5      S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        [        R                  " 5       n/ SQn/ SQnUR                  5         UU-   SS/-   U-   S/-   U-   SS/-   U-    H*  n[        R
                  " U5      nUR                  U5        M,     [        X!SS	S
9nU R                  [        U5      S5        [        X!SSS
9nU R                  [        U5      S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        U R                  [        US   S   5      S5        U R                  US   S   S   R                  R                  S5        g )Na4)rW   b4zc#4d4e4f#4g#4rW      )r2   r   r   r
      nameWithOctaver2   r      )
rW   rX   c#5d5e5rW   rX   rb   rc   rd         )
rW   b8zc#3d3rZ   rW   b9zc#2rY   e12name)rW   rX   rb   d-3rW   rX   rb   rl   rW   rX   rb   rl      )rb   rh   rZ   r[   r\   zC#5zG#4g2ze#7za-2ab)r	   
MajorScaler
   r   r   r"   r/   rK   assertEqualr&   reverser   r_   )rS   scpartpnnrH   stubstubReverseds           r   testFindConsecutiveScaleATest.testFindConsecutiveScaleA  sF   d# }}EB		"AKKN F
 $Da@TA&T!WX./3}}EB		"AKKN F
 $Da8HJTA&T!WX./3}}PB		"AKKN Q $Da8HJTA&T!WX./3T!WX./3 }}QB		"AKKN R
 $DaU[\TA&T!WX./3T!WX./3 }}`B		"AKKN a
 $Da8HJTA&#Da8HJTA&T!WX./3T!WX./3T!WX./3 }}08&-<|KB		"AKKN L
 $Da8HJTA& $DaU[\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" $Da8HJTA& $DaU[\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           	        SSK Jn  [        R                  " S5      n[        R                  " S5      n[        R                  " S5      nUR	                  S5      R                  SS5      nX$U4 H}  nUR                   Hj  n[        UR                  5       US	S
S9n[        U5       H>  u  pU
 H3  nUR                  UR                  5       R                   U	S-    35        M5     M@     Ml     M     g )Nr   )corpusg4rW   rY   zmozart/k80/movement1r      rf   rk   r`   )music21r}   r	   rq   parsemeasurespartsrK   flattenr%   addLyricgetTonicrk   )rS   r}   scGMajorscAMajorscDMajorsrt   ru   rH   ggrouprw   s               r   xtestFindConsecutiveScaleBTest.xtestFindConsecutiveScaleB  s    "##D)##D)##D)LL/099!R@x0B+DLLNBPQ@FH )$HA"

bkkm&8&8%9!a%#AB # !0	   1r   r   N)r   r   r   r   rT   rz   r   r   r   r   r   rM   rM      s    %DKLCr   rM   __main__)rf   r   rk   TF)
__future__r   unittestr   r   r   r   r   r   r	   r
   EnvironmentenvironLocalMusic21Exceptionr   rK   TestCaserM   r   mainTestr   r   r   <module>r      s    #         &&'>?	L99 	 ?@9?;@[~ZC8 ZCP zT r   