
    3jm                        d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
  G d dej                        Zedk(  rd dlZ ej                  e       yy)	    )annotationsN)common)scale)Terminus	DirectionIntervalNetworkc                  Z    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)Testc                j    d}|D ]  }|t        |      dz   z  } |r|dt        |      dz
   }|dz  }|S )N[, r      ])strlen)selflistInoutps       O/DATA/.local/lib/python3.12/site-packages/music21/scale/test_intervalNetwork.pypitchOutzTest.pitchOut   sH    A3q6D= C aC1%Cs

    c                n    d}|| j                  |d         z  }|dz  }|t        |d         z  }|dz  }|S )N(r   r      ))r   r   )r   
pitchTupler   s      r   realizePitchOutzTest.realizePitchOut    sH    t}}Z]++ts:a=!!s

r   c                   g d}t        |      }|j                  dd      }| j                  | j                  |      d       |j                  dddd      }| j                  | j                  |      d       | j                  |j	                  d	dd
      d       | j                  |j	                  ddd      d       | j                  |j	                  ddd      d       g d}t        |      }|j                  dd      }| j                  | j                  |      d       |j                  dddd      }| j                  | j                  |      d       | j                  |j	                  ddd      d       g d}t        |      }|j                  ddd      \  }}| j                  | j                  |      d       |j                  ddg d      \  }}| j                  | j                  |      d       | j                  | j                  |      d       |j                  g d      }| j                  t        |      d       |j                  g d      }| j                  t        |      d       y )NM2r!   m2r!   r!   r!   r"   c#   z#[A3, B3, C#4, D4, E4, F#4, G#4, A4]   c8c9[C#8, D8, E8, F#8, G8, A8, B8]bc2r   d2   )P5r-   r-   c4z[C4, G4, D5, A5]c11z=[C4, G4, D5, A5, E6, B6, F#7, C#8, G#8, D#9, A#9, E#10, B#10]ze#10ze-fz[F])b-zd-r0   z[B-, F]z[D-])gar)   df#zx[(5, <music21.pitch.Pitch G>), (5, <music21.pitch.Pitch D>), (4, <music21.pitch.Pitch A>), (4, <music21.pitch.Pitch C>)])r2   r3   r)   r#   r4   r5   zx[(6, <music21.pitch.Pitch D>), (5, <music21.pitch.Pitch A>), (5, <music21.pitch.Pitch G>), (4, <music21.pitch.Pitch E>)])r   realizePitchassertEqualr   getRelativeNodeDegreematchfindr   )r   edgeListnetr9   matchedunused_noMatchnoMatchresultss           r   testScaleModelzTest.testScaleModel(   sJ   =h'   q)u-/TU   q$5u-/OP 	2234@!D 	224DA1E224DA1E &h'  q)u-/AB  q$6u-X	Z
 	224FCQG >h'
 #&))D!S"9w/7 99T1.?@w/;w/8 ((56WY	Z
 ((;<WY	Zr   c                   g d}t        |      }|j                  dd      }| j                  | j                  |      d       |j                  dd      }| j                  | j                  |      d       |j                  dddd	      }| j                  | j                  |      d
       |j	                  ddddg      \  }}| j                  | j                  |      d       |j                  g d      }| j                  t        |      d       |j                  ddg      }| j                  t        |      d       g d}t        |      }|j                  dd      }| j                  | j                  |      d       |j                  dd      }| j                  | j                  |      d       |j                  g d      }| j                  t        |      d       y )N)M3m3P4g#r   z[G#4, B#4, D#5, G#5]r$   z[C#4, E#4, G#4, C#5]r   r*   c5z'[E2, G#2, B2, E3, G#3, B3, E4, G#4, B4]e2b6z[E2, B6])cer2   zy[(3, <music21.pitch.Pitch C>), (1, <music21.pitch.Pitch A>), (1, <music21.pitch.Pitch G#>), (1, <music21.pitch.Pitch G>)]rK   zz[(2, <music21.pitch.Pitch E>), (1, <music21.pitch.Pitch A>), (1, <music21.pitch.Pitch G#>), (1, <music21.pitch.Pitch D->)])rC   rD   rC   rD   m7r.   z[C4, E4, G4, B4, D5, C6]   z[B-2, D3, F3, A3, C4, B-4])rK   rF   r)   d#zy[(3, <music21.pitch.Pitch E>), (2, <music21.pitch.Pitch C>), (1, <music21.pitch.Pitch B>), (1, <music21.pitch.Pitch G#>)])r   r6   r7   r   r9   r:   r   )r   r;   r<   r9   r=   r>   r@   s          r   testHarmonyModelzTest.testHarmonyModelk   s   
 &h'   q)u-/EF   q)u-/EF   q$5u-/XY #&))D!dD\"Bw/< ((?+WZ	[
 ((C;'W[	\ 2h'  q)u-/IJ   q)u-/KL ((12WZ	[r   c                d   g d}t        |      }g d}t        |      }|j                  dd      }| j                  | j                  |      d       |j	                  |j                  dd            }| j                  t        |      d       | j                  |j                  ddd      d	       y )
Nr    )rD   rD   rC   r!   b4r   z[B4, D5, F5, A5, B5]r#   zx[(5, <music21.pitch.Pitch D>), (4, <music21.pitch.Pitch B>), (4, <music21.pitch.Pitch A>), (4, <music21.pitch.Pitch E>)]r4   r%   )r   r6   r7   r   r:   r   r8   )r   r;   netScale
netHarmonyr9   r@   s         r   testScaleAndHarmonyzTest.testScaleAndHarmony   s    ="8, ,$X.
''a0u-/EF --
 7 7a @AWY	Z 	77QEqIr   c           
     	   g d}t               }|j                  |       | j                  t        t	        |j
                  j                                     g d       | j                  t        |j                  j                         D cg c]  }t        |       c}      g d       | j                  t        |j                  d         d       | j                  t        |j                  t        j                           d       | j                  t        |j
                  d         d       | j                  t        |j
                  d         d	       | j                  t        |j
                  d
         d       | j                  t        |j
                  d
   j                  t        j                              d       | j                  t        |j
                  d
   j                  t        j                              d       | j                  t        |j
                  d
   j                  t        j                               d       | j                  |j#                  |j                  t        j                     t        j                        |j
                  d   g|j                  d   gf       | j                  |j#                  |j                  t        j                     t        j                        |j
                  d
   g|j                  d   gf       | j                  | j%                  |j'                  dd            d       | j                  | j%                  |j'                  ddd            d       | j                  | j%                  |j'                  ddd            d       | j                  | j%                  |j'                  dddd            d       | j                  | j%                  |j'                  dddd            d       | j                  | j%                  |j'                  dd            d       | j                  | j%                  |j'                  d dd!d"            d#       | j                  | j)                  |j+                  dd            d$       | j                  | j)                  |j+                  d%d            d&       y c c}w )'Nr    r   r   r   r$   r,   rM      012345zTerminus.HIGHzTerminus.LOWr   z)<music21.scale.intervalNetwork.Node id=0>z4<music21.scale.intervalNetwork.Node id=Terminus.LOW>z[<music21.scale.intervalNetwork.Edge Direction.BI M2 [(Terminus.LOW, 0), (0, Terminus.LOW)]>r$   zE<music21.scale.intervalNetwork.Edge Direction.BI M2 [(2, 3), (3, 2)]>rW   z]<music21.scale.intervalNetwork.Edge Direction.BI m2 [(5, Terminus.HIGH), (Terminus.HIGH, 5)]>z[(5, Terminus.HIGH)]z[(Terminus.HIGH, 5)]z([(5, Terminus.HIGH), (Terminus.HIGH, 5)]rM   r.   r   z [C4, D4, E4, F4, G4, A4, B4, C5]c6maxPitchz<[C4, D4, E4, F4, G4, A4, B4, C5, D5, E5, F5, G5, A5, B5, C6]c3minPitchz<[C3, D3, E3, F3, G3, A3, B3, C4, D4, E4, F4, G4, A4, B4, C5])rd   ra   zX[C3, D3, E3, F3, G3, A3, B3, C4, D4, E4, F4, G4, A4, B4, C5, D5, E5, F5, G5, A5, B5, C6]f4z[[C3, D3, E3, F3, G3, A3, B-3, C4, D4, E4, F4, G4, A4, B-4, C5, D5, E5, F5, G5, A5, B-5, C6]zC#r%   z"[D3, E3, F#3, G3, A3, B3, C#4, D4]zC#4r&   r'   r(   zS([C4, D4, E4, F4, G4, A4, B4, C5], [Terminus.LOW, 0, 1, 2, 3, 4, 5, Terminus.HIGH])c#4zU([D3, E3, F#3, G3, A3, B3, C#4, D4], [Terminus.LOW, 0, 1, 2, 3, 4, 5, Terminus.HIGH]))r   fillBiDirectedEdgesr7   sortedlistedgeskeysnodesr   reprr   LOWgetConnectionsr   	ASCENDING
DESCENDINGBIgetNextr   r6   r   realize)r   r;   r<   xs       r   
testBasicAzTest.testBasicA   s"   =)SYY^^%5 67.	0 	1A B1AAQ1A BCX	Z 	ciil+-XYcii56O	Q 	18	
 	1S	U 	1:	
 	1,,Y-@-@AB"	
 	1,,Y-A-ABC"	
 	1,,Y\\:;6	
 	KK		(,,/1D1DEiil^ciil^,	

 	KK		(,,/1E1EFiil^ciil^,	

 	s'7'7a'@A;	= 	s'7'7a$'7'OPW	Y 	s'7'7a$'7'OPW	Y 	s'7'7a$Y]'7'^_M	N 	s'7'7a$Y]'7'^_O	P 	s'7'7a'@A=	? 	s'7'7q$'MN9	; 	--ckk$.BCN	O 	--ckk%.CDN	OY !Cs   
S'c           
        g d}g d}t               }|j                  ||       | j                  t        |j	                  |j
                  t        j                     t        j                              d       | j                  t        |j	                  |j
                  t        j                     t        j                              d       | j                  t        |j	                  |j
                  t        j                     t        j                              d       | j                  t        |j	                  |j
                  t        j                     t        j                              d       | j                  | j                  |j                  dddd            d	       | j                  | j                  |j                  dddd            d
       | j                  | j                  |j                  dddd            d       | j                  t!        |j#                  d            d       | j                  t!        |j#                  d            d       y )N)r!   r"   r!   r!   r!   r!   r"   )r!   r"   r!   r!   r"   r!   r!   z([<music21.scale.intervalNetwork.Edge Direction.ASCENDING M2 [(Terminus.LOW, 0)]>], [<music21.scale.intervalNetwork.Node id=0>])z([<music21.scale.intervalNetwork.Edge Direction.DESCENDING M2 [(Terminus.HIGH, 11)]>], [<music21.scale.intervalNetwork.Node id=11>])a4r   a3a5z([A3, B3, C4, D4, E4, F4, G4, A4, B4, C5, D5, E5, F#5, G#5, A5], [Terminus.LOW, 6, 7, 8, 9, 10, 11, Terminus.LOW, 0, 1, 2, 3, 4, 5, Terminus.HIGH])z [A4, B4, C5, D5, E5, F5, G5, A5]z"[A4, B4, C5, D5, E5, F#5, G#5, A5]r$   zV[<music21.scale.intervalNetwork.Node id=1>, <music21.scale.intervalNetwork.Node id=7>]r%   zW[<music21.scale.intervalNetwork.Node id=5>, <music21.scale.intervalNetwork.Node id=11>])r   fillDirectedEdgesr7   rm   rs   rl   r   rn   r   rp   rq   HIGHr   rt   r   r6   r   nodeNameToNodes)r   ascendingEdgeListdescendingEdgeListr<   s       r   testDirectedAzTest.testDirectedA  s     GG/1CD 	SYYx||4i6I6IJKT	U
 	SYYx||4i6J6JKLW	X 	SYYx}}5y7J7JKLT	U
 	SYYx||4i6J6JKLW	X 	--ckk$4.NOM	N 	s'7'7at'LM;	= 	s'7'7at'LM=	? 	##A&';	< 	##A&'<	=r   c           
     B   t        j                  d      }| j                  t        |j                  j
                  j                  j                         D cg c]  }t        |       c}      g d       | j                  t        |j                  j
                  j                  j                               g d       t        j                  dddddt        j                  ddf}d	t        j                  dt        j                  gfd
ddt        j                  t        j                  gfd
f}t               }|j!                  ||       d}t"        j$                  dk  rd}| j'                  t)        j*                  t        |j                        |      t        |j                               | j                  |j,                  d       | j                  |j.                  d       | j                  | j1                  |j3                  dd            d       y c c}w )Nr2   rX   rV   r   )iddegreer   r   r$   r"   )intervalconnectionsrC   a5  
            OrderedDict({0: <music21.scale.intervalNetwork.Edge Direction.BI m2
                                [(Terminus.LOW, 0), (0, Terminus.LOW)]>,
                         1: <music21.scale.intervalNetwork.Edge Direction.BI M3
                                [(0, Terminus.HIGH), (Terminus.HIGH, 0)]>}))r$      aI  
                OrderedDict([(0, <music21.scale.intervalNetwork.Edge Direction.BI m2
                                    [(Terminus.LOW, 0), (0, Terminus.LOW)]>),
                             (1, <music21.scale.intervalNetwork.Edge Direction.BI M3
                                    [(0, Terminus.HIGH), (Terminus.HIGH, 0)]>)])r.   z[C4, D-4, F4])r   
MajorScaler7   rh   abstract_netrl   rk   r   rj   r   rn   r|   r   rr   r   fillArbitrarysysversion_info
assertTruer   whitespaceEqual	degreeMaxdegreeMaxUniquer   r6   )r   sc1ru   rl   rj   r<   r9   s          r   testScaleArbitraryzTest.testScaleArbitraryO  s   s#1B1B1H1H1M1M1O P1OAQ1O PQX	Z 1 1 7 7 < < >?.	0 !2Q' 3
 #||Q	5" #(--6"	 %'O
 g%TE 	..s399~uECII	( 	*,,a0s'7'7a'@A?SQ !Qs   Hc                   g d}t               }|j                  |       |j                  ddd      \  }}| j                  | j	                  |      d       | j                  t        |      d       | j                  | j                  |j                  dt        j                  d            d       | j                  t        |j                  ddd	
            d       | j                  t        j                  | j                  |j                  dddd	
            d             | j                  | j                  |j                  dddd	
            d       | j                  | j                  |j                  dd            d       | j                  | j                  |j                  dd            d       | j                  | j                  |j                  ddd            d       y )Nr    rb   r   r*   z[C2, D2, E2, F2, G2, A2, B2]z [Terminus.LOW, 0, 1, 2, 3, 4, 5]rc   z@([C2, D2, E2, F2, G2, A2, B2], [Terminus.LOW, 0, 1, 2, 3, 4, 5])T)includeFirstz,([<music21.pitch.Pitch C3>], [Terminus.LOW])g3g0aJ  ([G0, A0, B0, C1, D1, E1, F#1,
                     G1, A1, B1, C2, D2, E2, F#2,
                     G2, A2, B2, C3, D3, E3, F#3, G3],
                    [Terminus.LOW, 0, 1, 2, 3, 4, 5,
                     Terminus.LOW, 0, 1, 2, 3, 4, 5,
                     Terminus.LOW, 0, 1, 2, 3, 4, 5,
                     Terminus.LOW])d6rM   d4z([D4, E4, F#4, G4, A4, B4, C5, D5, E5, F#5, G5, A5, B5, C6, D6], [3, 4, 5, Terminus.LOW, 0, 1, 2, 3, 4, 5, Terminus.LOW, 0, 1, 2, 3])zS([C3, D3, E3, F3, G3, A3, B3, C4], [Terminus.LOW, 0, 1, 2, 3, 4, 5, Terminus.HIGH])zg#2r$   z=([G#2, A2, B2, C#3, D#3, E3], [1, 2, 3, 4, 5, Terminus.HIGH])e4r`   z~([G#2, A2, B2, C#3, D#3, E3, F#3, G#3, A3, B3, C#4, D#4, E4], [1, 2, 3, 4, 5, Terminus.HIGH, 0, 1, 2, 3, 4, 5, Terminus.HIGH]))r   rg   realizeDescendingr7   r   r   r   r   r|   r   r   r   realizeAscending)r   r;   r<   pitchesrl   s        r   testRealizeDescendingzTest.testRealizeDescending{  s   =)..tQ=w/7	9U;	 	  !6!6tX]]UY!6!Z[N	
 	S2242NOG	I 	""$$S%:%:4DW[%:%\]'		
 	--!!$4d!CEU	
 	--c.B.B4.KLN	O 	--c.B.B5!.LMX	Z 	--c.B.B5!VZ.B.[\^	_r   c           	        t               }|j                          | j                  | j                  |j	                  d            d       | j                  | j                  |j	                  ddt
        j                              d       | j                  | j                  |j	                  dt        j                  t
        j                              d       | j                  |j                  dt        j                  d      g g f       | j                  | j                  |j                  dt        j                  d	            d
       |j                  dt        j                  d	d	      }| j                  | j                  |      d       |j                  dt        j                  dd      }| j                  | j                  |      d
       y )Ng4zU([G4, A4, B-4, C5, D5, E5, F#5, G5], [Terminus.LOW, 0, 1, 2, 3, 4, 6, Terminus.HIGH])r   	directionzT([G4, A4, B-4, C5, D5, E-5, F5, G5], [Terminus.LOW, 0, 1, 2, 3, 5, 7, Terminus.LOW])zU([G3, A3, B-3, C4, D4, E-4, F4, G4], [Terminus.LOW, 0, 1, 2, 3, 5, 7, Terminus.HIGH])F)fillMinMaxIfNoneTzB([G4, A4, B-4, C5, D5, E-5, F5], [Terminus.LOW, 0, 1, 2, 3, 5, 7]))r   r   g5)r   fillMelodicMinorr7   r   rt   r   rq   r   r|   r   rn   )r   r<   descReals      r   
testBasicBzTest.testBasicB  s   --ckk$.?@N	O 	  T1	@T@T!UV@	A 	  T8==IL`L`!abA	
 	!!$u!MH	

 	  !6!6tX\\\`!6!abP	R
 (()16::> ) @ 	--h7M	N ((x||T4H--h7]	_r   c           
     0   t               }|j                          | j                  t        |j	                  ddd            d       | j                  t        |j	                  ddd            d       | j                  t        |j	                  ddd            d       | j                  t        |j	                  dddt
        j                              d       | j                  t        |j	                  dddt
        j                              d	       y )
Nr.   r   C4rM   G4rW   A4r   A-4)r   r   r7   r   getPitchFromNodeDegreer   rp   rq   r   r<   s     r   testGetPitchFromNodeStepzTest.testGetPitchFromNodeStep  s    S77aCDdKS77aCDdK 	S77aCDdK**4AATAT*UV	
 	**4AAUAU*VW	
r   c                d
   t               }|j                          | j                  t        |j	                  dddt
        j                              d       | j                  t        |j	                  dddt
        j                              d       | j                  t        |j	                  dddt
        j                              d	       | j                  t        |j	                  ddd
t
        j                              d       | j                  t        |j	                  dddt
        j                              d       | j                  t        |j	                  dddt
        j                              d       | j                  t        |j	                  ddd
t
        j                  d            d       | j                  t        |j	                  dddt
        j                  d            d	       | j                  t        |j	                  dddt
        j                  t
        j                              d       | j                  t        |j	                  dddt
        j                  t
        j                              d       | j                  t        |j	                  dddt
        j                  t
        j                              d       | j                  t        |j	                  dddt
        j                  t
        j                              d       | j                  t        |j	                  dddt
        j                  t
        j                              d       | j                  t        |j	                  dddt
        j                              d       | j                  |j                  ddd      t        j                  df       | j                  |j                  ddd      d       | j                  |j                  ddd       d!t        j                  f       | j                  |j                  ddd"      d#       | j                  |j                  ddd t
        j                  $      d%t        j                  f       | j                  |j                  ddd"t
        j                  $      d%t        j                  f       | j                  t        |j	                  dddt
        j                  t
        j                              d       y )&Nr.   r   r   r   r   rx   B4rQ   C5rG   B-4zb-4r   za-4r   r   )r   stepSizerf   )r   getNeighborzE-4D4za-b3zB-3zc-4r   r#   )pitchReferencenodeNamepitchTargetr   rN   )r   r   r)   rW   r1   )r,   rW   )r   r   r   r   r%   )r   r   r7   r   	nextPitchr   rp   rq   getNeighborNodeIdsr   r|   rn   r   s     r   testNextPitchzTest.testNextPitch  s    	S]]4DIDWDW]XY	S]]4DIDWDW]XY	S]]4DIDWDW]XY	 	S]]4DIDXDX]YZ	 S]]4EYEYEY]Z[	 S]]4E5>5I5I + K L	
 	S]]4D5>5I5I45 + 7 8 	  	S]]4D5>5H5H45 + 7 8 	 	!U'11 ) 3 3   		
 	S]]4E5>5H5H7@7K7K + M N 	 	S]]4D5>5H5H7@7J7J + L M 	 	S]]4D5>5H5H7@7K7K + M N 	 	S]]4D5>5I5I7@7J7J + L M 	  	S]]4E5>5H5H + J K	 	""$PT"U]]A	

 	""$PT"U	

 	""$PS"T	

 	""#  # " 	
 	""##..	 # 0
 	 	""# #..	 # 0
 	 	#..%00  2 3 	r   c                   t               }|j                          |j                  dddd      \  }}| j                  |d   j                  d       | j                  |d   j                  d       |j                  dddd      \  }}| j                  |d   j                  d       | j                  |d   j                  d       y )	Nr   r   F)rd   ra   reverser   r   T)r   r   r   r7   nameWithOctave)r   r<   descending_melodic_minor_!descending_melodic_minor_reverseds        r   'test_realize_descending_reversed_cachedz,Test.test_realize_descending_reversed_cachedp  s    &)&;&;4$ '< '?# !1!4CCUK1"5DDdK/2/D/D4$ 0E 0>,)1:1=LLdS:2>MMuUr   N)__name__
__module____qualname__r   r   rA   rO   rT   rv   r   r   r   r   r   r   r    r   r   r
   r
      sV    AZF7[rJ*WOr:=z*TX2_h/_b
*yvVr   r
   __main__)
__future__r   r   unittestmusic21r   r   music21.scale.intervalNetworkr   r   r   TestCaser
   r   mainTestr   r   r   <module>r      sU    # 
    N Ng	V8 g	VV zGT r   