
    rhn                        S SK Jr  S SKrS SKrS SKJr  S SKJr  S SKJrJ	r	J
r
   " S S\R                  5      r\S:X  a  S SKr\R                  " \5        gg)	    )annotationsN)common)scale)Terminus	DirectionIntervalNetworkc                  h    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rSrg)Test   c                x    SnU H  nU[        U5      S-   -  nM     U(       a  US[        U5      S-
   nUS-  nU$ )N[, r      ])strlen)selflistInoutps       \/home/james-whalen/.local/lib/python3.13/site-packages/music21/scale/test_intervalNetwork.pypitchOutTest.pitchOut   sH    A3q6D= C aC1%Cs

    c                l    SnX R                  US   5      -  nUS-  nU[        US   5      -  nUS-  nU$ )N(r   r      ))r   r   )r   
pitchTupler   s      r   realizePitchOutTest.realizePitchOut    sF    }}Z]++ts:a=!!s

r   c                   / SQn[        U5      nUR                  SS5      nU R                  U R                  U5      S5        UR                  SSSS5      nU R                  U R                  U5      S5        U R                  UR	                  S	SS
5      S5        U R                  UR	                  SSS5      S5        U R                  UR	                  SSS5      S5        / SQn[        U5      nUR                  SS5      nU R                  U R                  U5      S5        UR                  SSSS5      nU R                  U R                  U5      S5        U R                  UR	                  SSS5      S5        / SQn[        U5      nUR                  SSS5      u  pEU R                  U R                  U5      S5        UR                  SS/ SQ5      u  pFU R                  U R                  U5      S5        U R                  U R                  U5      S5        UR                  / SQ5      nU R                  [        U5      S5        UR                  / SQ5      nU R                  [        U5      S5        g )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   )P5r0   r0   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-r3   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>)])r5   r6   r,   r&   r7   r8   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netr<   matchedunused_noMatchnoMatchresultss           r   testScaleModelTest.testScaleModel(   sF   =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                   / SQn[        U5      nUR                  SS5      nU R                  U R                  U5      S5        UR                  SS5      nU R                  U R                  U5      S5        UR                  SSSS	5      nU R                  U R                  U5      S
5        UR	                  SSSS/5      u  pEU R                  U R                  U5      S5        UR                  / SQ5      nU R                  [        U5      S5        UR                  SS/5      nU R                  [        U5      S5        / SQn[        U5      nUR                  SS5      nU R                  U R                  U5      S5        UR                  SS5      nU R                  U R                  U5      S5        UR                  / SQ5      nU R                  [        U5      S5        g )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er5   zy[(3, <music21.pitch.Pitch C>), (1, <music21.pitch.Pitch A>), (1, <music21.pitch.Pitch G#>), (1, <music21.pitch.Pitch G>)]rO   zz[(2, <music21.pitch.Pitch E>), (1, <music21.pitch.Pitch A>), (1, <music21.pitch.Pitch G#>), (1, <music21.pitch.Pitch D->)])rG   rH   rG   rH   m7r1   z[C4, E4, G4, B4, D5, C6]   z[B-2, D3, F3, A3, C4, B-4])rO   rJ   r,   d#zy[(3, <music21.pitch.Pitch E>), (2, <music21.pitch.Pitch C>), (1, <music21.pitch.Pitch B>), (1, <music21.pitch.Pitch G#>)])r   r9   r:   r   r<   r=   r   )r   r>   r?   r<   r@   rA   rC   s          r   testHarmonyModel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   / SQn[        U5      n/ SQn[        U5      nUR                  SS5      nU R                  U R                  U5      S5        UR	                  UR                  SS5      5      nU R                  [        U5      S5        U R                  UR                  SSS5      S	5        g )
Nr#   )rH   rH   rG   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>)]r7   r(   )r   r9   r:   r   r=   r   r;   )r   r>   netScale
netHarmonyr<   rC   s         r   testScaleAndHarmonyTest.testScaleAndHarmony   s    ="8, ,$X.
''a0u-/EF --
 7 7a @AWY	Z 	77QEqIr   c                "    / SQn[        U5      ng )Nr#   )r   )r   r>   unused_netScales      r   testGraphedOutputTest.testGraphedOutput   s    =)(3r   c                	   / SQn[        5       nUR                  U5        U R                  [        [	        UR
                  R                  5       5      5      / SQ5        U R                  [        UR                  R                  5        Vs/ s H  n[        U5      PM     sn5      / SQ5        U R                  [        UR                  S   5      S5        U R                  [        UR                  [        R                     5      S5        U R                  [        UR
                  S   5      S5        U R                  [        UR
                  S   5      S	5        U R                  [        UR
                  S
   5      S5        U R                  [        UR
                  S
   R                  [        R                  5      5      S5        U R                  [        UR
                  S
   R                  [        R                  5      5      S5        U R                  [        UR
                  S
   R                  [        R                   5      5      S5        U R                  UR#                  UR                  [        R                     [        R                  5      UR
                  S   /UR                  S   /45        U R                  UR#                  UR                  [        R                     [        R                  5      UR
                  S
   /UR                  S   /45        U R                  U R%                  UR'                  SS5      5      S5        U R                  U R%                  UR'                  SSSS95      S5        U R                  U R%                  UR'                  SSSS95      S5        U R                  U R%                  UR'                  SSSSS95      S5        U R                  U R%                  UR'                  SSSSS95      S5        U R                  U R%                  UR'                  SS5      5      S5        U R                  U R%                  UR'                  S SS!S"5      5      S#5        U R                  U R)                  UR+                  SS5      5      S$5        U R                  U R)                  UR+                  S%S5      5      S&5        g s  snf )'Nr#   r   r   r   r'   r/   rQ      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)]>ra   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)]rQ   r1   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])rn   rk   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   fillBiDirectedEdgesr:   sortedlistedgeskeysnodesr   reprr   LOWgetConnectionsr   	ASCENDING
DESCENDINGBIgetNextr   r9   r    realize)r   r>   r?   xs       r   
testBasicA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           
        / SQn/ SQn[        5       nUR                  X5        U R                  [        UR	                  UR
                  [        R                     [        R                  5      5      S5        U R                  [        UR	                  UR
                  [        R                     [        R                  5      5      S5        U R                  [        UR	                  UR
                  [        R                     [        R                  5      5      S5        U R                  [        UR	                  UR
                  [        R                     [        R                  5      5      S5        U R                  U R                  UR                  SSSS5      5      S	5        U R                  U R                  UR                  SSSS5      5      S
5        U R                  U R                  UR                  SSSS5      5      S5        U R                  [!        UR#                  S5      5      S5        U R                  [!        UR#                  S5      5      S5        g )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   fillDirectedEdgesr:   rw   r}   rv   r   rx   r   rz   r{   HIGHr    r~   r   r9   r   nodeNameToNodes)r   ascendingEdgeListdescendingEdgeListr?   s       r   testDirectedATest.testDirectedA  s    GG/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           
     L   [         R                  " S5      nU R                  [        UR                  R
                  R                  R                  5        Vs/ s H  n[        U5      PM     sn5      / SQ5        U R                  [        UR                  R
                  R                  R                  5       5      / SQ5        [        R                  SS.SSS.[        R                  SS.4nS	[        R                  S[        R                  /4S
.SS[        R                  [        R                  /4S
.4n[        5       nUR!                  X45        Sn["        R$                  S:  a  SnU R'                  [(        R*                  " [        UR                  5      U5      [        UR                  5      5        U R                  UR,                  S5        U R                  UR.                  S5        U R                  U R1                  UR3                  SS5      5      S5        g s  snf )Nr5   rb   r`   r   )iddegreer   r   r'   r%   )intervalconnectionsrG   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)]>)])r1   z[C4, D-4, F4])r   
MajorScaler:   rr   abstract_netrv   ru   r   rt   r   rx   r   r   r|   r   fillArbitrarysysversion_info
assertTruer   whitespaceEqual	degreeMaxdegreeMaxUniquer   r9   )r   sc1r   rv   rt   r?   r<   s          r   testScaleArbitraryTest.testScaleArbitraryU  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                   / SQn[        5       nUR                  U5        UR                  SSS5      u  p4U R                  U R	                  U5      S5        U R                  [        U5      S5        U R                  U R                  UR                  S[        R                  SS95      S5        U R                  [        UR                  SSS	S
95      S5        U R                  [        R                  " U R                  UR                  SSSS	S
95      S5      5        U R                  U R                  UR                  SSSS	S
95      S5        U R                  U R                  UR                  SS5      5      S5        U R                  U R                  UR                  SS5      5      S5        U R                  U R                  UR                  SSSS95      S5        g )Nr#   rl   r   r-   z[C2, D2, E2, F2, G2, A2, B2]z [Terminus.LOW, 0, 1, 2, 3, 4, 5]rm   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])d6rQ   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])e4rj   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   rq   realizeDescendingr:   r   r   r    r   r   r   r   r   realizeAscending)r   r>   r?   pitchesrv   s        r   testRealizeDescending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           
        [        5       nUR                  5         U R                  U R                  UR	                  S5      5      S5        U R                  U R                  UR	                  SS[
        R                  S95      S5        U R                  U R                  UR	                  S[        R                  [
        R                  S95      S5        U R                  UR                  S[        R                  SS9/ / 45        U R                  U R                  UR                  S[        R                  S	S95      S
5        UR                  S[        R                  S	S	S9nU R                  U R                  U5      S5        UR                  S[        R                  SS5      nU R                  U R                  U5      S
5        g )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   fillMelodicMinorr:   r    r~   r   r{   r   r   r   rx   )r   r?   descReals      r   
testBasicB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                $   [        5       nUR                  5         U R                  [        UR	                  SSS5      5      S5        U R                  [        UR	                  SSS5      5      S5        U R                  [        UR	                  SSS5      5      S5        U R                  [        UR	                  SSS[
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  S95      S	5        g )
Nr1   r   C4rQ   G4ra   A4r   A-4)r   r   r:   r   getPitchFromNodeDegreer   rz   r{   r   r?   s     r   testGetPitchFromNodeStep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                	   [        5       nUR                  5         U R                  [        UR	                  SSS[
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  S95      S	5        U R                  [        UR	                  SSS
[
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  S95      S5        U R                  [        UR	                  SSS
[
        R                  SS95      S5        U R                  [        UR	                  SSS[
        R                  SS95      S	5        U R                  [        UR	                  SSS[
        R                  [
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  [
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  [
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  [
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  [
        R                  S95      S5        U R                  [        UR	                  SSS[
        R                  S95      S5        U R                  UR                  SSSS9[        R                  S45        U R                  UR                  SSSS9S5        U R                  UR                  SSS S9S![        R                  45        U R                  UR                  SSS"S9S#5        U R                  UR                  SSS [
        R                  S$9S%[        R                  45        U R                  UR                  SSS"[
        R                  S$9S%[        R                  45        U R                  [        UR	                  SSS[
        R                  [
        R                  S95      S5        g )&Nr1   r   r   r   r   r   B4rV   C5rK   B-4zb-4r   za-4r   r   )r   stepSizerp   )r   getNeighborzE-4D4za-b3zB-3zc-4r   r&   )pitchReferencenodeNamepitchTargetr   rR   )r   r   r,   ra   r4   )r/   ra   )r   r   r   r   r(   )r   r   r:   r   	nextPitchr   rz   r{   getNeighborNodeIdsr   r   rx   r   s     r   testNextPitch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                   [        5       nUR                  5         UR                  SSSSS9u  p#U R                  US   R                  S5        U R                  US   R                  S5        UR                  SSSSS9u  pCU R                  US   R                  S5        U R                  US   R                  S5        g )	Nr   r   F)rn   rk   reverser   r   T)r   r   r   r:   nameWithOctave)r   r?   descending_melodic_minor_!descending_melodic_minor_reverseds        r   'test_realize_descending_reversed_cached,Test.test_realize_descending_reversed_cachedv  s    &)&;&;4$ '< '?# 1!4CCUK1"5DDdK/2/D/D4$ 0E 0>,):1=LLdS:2>MMuUr    N)__name__
__module____qualname____firstlineno__r   r    rD   rS   rY   r]   r   r   r   r   r   r   r   r   __static_attributes__r   r   r   r
   r
      s[    AZF7[rJ*4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      sS    # 
    N Nm	V8 m	Vb zT r   