
    3je                        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 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mZ  G d dej$                        Zedk(  rd dlZ ej*                  e       yy)    )annotationsN)common)	converter)corpus)key)note)pitch)scale)stream)m21ToXml)Pitch
Accidentalc                      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d Zd Zd Zd Zd Zd Zd Zd Zd Zy)Testc                    t        d      }t        j                  |      }| j                  ||       | j                  |j                  |j                         y )NzC#3)r   copydeepcopyassertIsNot
accidental)selfp1p2s      D/DATA/.local/lib/python3.12/site-packages/music21/test/test_pitch.pytestCopyManuallyzTest.testCopyManually   sA    5\]]2R 6    c                d    t        j                  d      }| j                  t        |      d       y )NB#3z<music21.pitch.Pitch B#3>)r	   r   assertEqualreprr   ps     r   testReprzTest.testRepr$   s%    KKa"=>r   c                R    t        d      }| j                  |j                  d       y )Nr      )r   r   octave)r   bs     r   
testOctavezTest.testOctave(   s    %L1%r   c                   | j                  t        d      5  t        d      }d d d        | j                  t              5  t        d      }d d d        t        d      }| j	                  |j
                  d       | j                  t        d      5  d|_        d d d        y # 1 sw Y   xY w# 1 sw Y   cxY w# 1 sw Y   y xY w)Nz6Cannot have octave given before pitch name in '8D-4'\.z8D-423   z:Argument to name, 32, must be a string, not <class 'int'>.    )assertRaisesRegex
ValueErrorr   assertRaisesr   midinamer    s     r   testNameSettingzTest.testNameSetting,   s    ##J$]_fA_ z*dA +"I$##H
 AF	
 
_ _ +*
 
s#   B" B.B:"B+.B7:Cc                |   t        j                  d      }|j                  d   j                  t        j
                        }|d   j                  d   }| j                  |j                  j                  d       | j                  |j                  j                  d       | j                  |j                  j                         |j                  d   j                  d      }|j                  d   }| j                  |j                  j                  d       | j                  |j                  j                         y	)
zG
        Test that we are getting the properly set accidentals
        z
bwv438.xml   r      flatnormal   sharpN)r   parsepartsgetElementsByClassr   Measurepitchesr   r   r0   displayTypeassertFalsedisplayStatusmeasure
assertTrue)r   stenorMeasurespAlteredaltoM6s        r   testAccidentalImportzTest.testAccidentalImport<   s     LL&
55fnnE #++A.,,116:,,88(C,,::;##A&>>!$,,117;++99:r   c                N   t        d      t        d      t        d      g}t        d      }t        d      |_        d|j                  _        | j	                  |j
                  d       | j                  |j                  j                         |j                  |d       | j                  |j                  j                         t        j                  |      }| j                  |j                  j                         | j	                  |j                  j
                  d       y)	3
        Test updating accidental display.
        zA#3zC#CcnaturalT)	pitchPastoverrideStatusN)r   r   r   r@   r   r0   rB   updateAccidentalDisplayr?   r   r   )r   pastar&   s       r   !testUpdateAccidentalDisplaySimplez&Test.testUpdateAccidentalDisplaySimpleM   s     eeDk5:6#J!),%)"%223	!!D!F334MM!334**I6r   c           	         d } fd}t        d      t        d      t        d      t        d      t        d      g}g d} ||g         |||       t        d      t        d      t        d      t        d	      t        d      g}g d} ||g         |||       t        d
      t        d      t        d	      t        d      t        d      t        d      g}g d} ||g         |||       t        d
      t        d
      t        d      t        d      t        d      t        d      t        d      g}g d} ||g         |||       t        d
      t        d      t        d      g}g d} ||g         |||       t        d
      t        d      t        d      g}d|d   j                  _        g d} ||g         |||       t        d      t        d      t        d	      g}t        d      |d   _        d|d   j                  _        g d} ||g         |||       t        d
      t        d      t        d      g}g d} ||g         |||       t        d
      t        d      t        d
      g}g d} ||g         |||       t        d      t        d      t        d      g}g d} ||g         |||       y)rI   c                X    | D ]%  }|j                  |       |j                  |       ' y )N)rM   rO   append)_pListrP   r!   s      r   procz4Test.testUpdateAccidentalDisplaySeries.<locals>.procd   s(    ))D)9A r   c                >   t        t        | |            D ]  \  }\  }}|j                  d }d }n,|j                  j                  }|j                  j                  }|\  }}	j                  ||d| d| d|        	j                  ||| d| d| d|         y Nzname error for z: z instead of desired z
 display: z	, target 	enumeratezipr   r0   r@   r   
_past_resultir!   _resultItempNamepDisplayStatus
targetNametargetDisplayStatusr   s
            r   comparez7Test.testUpdateAccidentalDisplaySeries.<locals>.comparei       '0UG1D'E##A{<<' E%)NLL--E%&\\%?%?N2=/
/  
#21#Rw>RS]R^!_a  "'cA3j(8	BUAVW (Fr   a#3a3)r8   TrL   Trk   rl   rk   za#2a6za#1a5za-2g3za#5zg-3)r5   TNNrl   rk   rp   rl   za-5a2)rp   r5   Frp   rk   rk   rl   rl   )rp   rk   rk   alwaysr3   rL   )rq   rq   rl   )rp   rq   rp   g#3zd-2)rq   rk   rp   N)r   r   r>   r   )r   rX   rg   pListresults   `    r   !testUpdateAccidentalDisplaySeriesz&Test.testUpdateAccidentalDisplaySeries`   s   	
	* uuT{E%LteEl,6UBv uuT{E%LteEl,6UBv uuT{E$KuuU|U4[:FUBv uuU|U5\uuU|U4[%+GZUBv uuU|U5\:CUBv uuU|U5\:*2a'CUBv teDk5;7(3a*2a'@UBv uuT{E%L9?UBv uuT{E%L9?UBv teElE%L9@UBvr   c                n    d } fd}t        d      t        d      t        d      t        d      t        d      t        d      t        d      g}g d}t        j                  d      } ||g |j                          |||       t        d	      t        d
      t        d      t        d      t        d      t        d      t        d      g}g d}t        j                  d      } ||g |j                          |||       t        d	      t        d      t        d      t        d      t        d      t        d      g}g d}t        j                  d      } ||g |j                          |||       t        d	      t        d      t        d      t        d      t        d      t        d      g}g d}t        j                  d      } ||g |j                          |||       t        d      t        d      t        d      t        d      t        d      t        d      g}g d}t        j                  d      } ||g |j                          |||       t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      g	}g d}t        j                  d      } ||g |j                          |||       t        d      t        d	      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      g}g d}t        j                  d      } ||g |j                          |||       t        d      t        d	      t        d      t        d       t        d      t        d      t        d      t        d	      t        d      g	}g d!}t        j                  d      } ||g |j                          |||       y")#zI
        Test updating accidental display against a KeySignature
        c                Z    | D ]&  }|j                  ||       |j                  |       ( y )N)rM   alteredPitchesrU   )rW   rP   r{   r!   s       r   rX   z@Test.testUpdateAccidentalDisplaySeriesKeySignature.<locals>.proc   s*    ))D)XA r   c                >   t        t        | |            D ]  \  }\  }}|j                  d }d }n,|j                  j                  }|j                  j                  }|\  }}	j                  ||d| d| d|        	j                  ||| d| d| d|         y rZ   r[   r^   s
            r   rg   zCTest.testUpdateAccidentalDisplaySeriesKeySignature.<locals>.compare   rh   r   zf#3zf#2f3ro   )r8   Fr~   rl   rk   r~   rq   r~   r4   rj   b2c#3ru   a4)rq   rq   r~   r~   r~   r~   rq   r$   c#4zg#4)rq   r~   r~   rl   r~   rk   zf#4)r~   rl   rk   rq   rk   r~   d3e3f4)	rq   rq   r~   rq   rl   rk   r~   rk   r~   r3   b3zb-3a-3ze-3)rl   rl   rl   rp   rp   rp   rs   rs   rs   rs   rs   rs   b4)	rl   rl   rl   rl   rp   rp   rl   rl   rl   N)r   r   KeySignaturer{   )r   rX   rg   rv   rw   kss   `     r   -testUpdateAccidentalDisplaySeriesKeySignaturez2Test.testUpdateAccidentalDisplaySeriesKeySignature   s   	
	* uuU|U4[uuU|U4[%,HUa UB))*v teDk5<uuU|U5\5;HVa UB))*v teElE%LteElE%L:Ha UB))*v teElE%LteElE%L:Ha UB))*v uuT{E%LteElE%L:D a UB))*v teDk5<teDk5<uuU|U5\;G a UB))*v teDk5;uuU|U5\uuU|U5\uuU|U5\;
 b!UB))*v teDk5;teElE%LteDk5;8K b!UB))*vr   c                    d }d } fd}t        d      t        d      t        d      t        d      g}g d} ||g         |||       t        d      t        d      t        d      t        d      g} ||g         |||       t        d      }t        d      t        d	      t        d
      g}|j                  |d        j                  |j                  d       y)z3
        test if octave display is working
        c                \    | D ]'  }|j                  |dd       |j                  |       ) y )NTFrM   cautionaryPitchClasscautionaryNotImmediateRepeatrU   rW   r_   r!   s      r   proc1z6Test.testUpdateAccidentalDisplayOctaves.<locals>.proc1<  s3    ))EPTGL * NQ r   c                \    | D ]'  }|j                  |dd       |j                  |       ) y )NFr   rU   r   s      r   proc2z6Test.testUpdateAccidentalDisplayOctaves.<locals>.proc2B  s3    ))EPUGL * NQ r   c                >   t        t        | |            D ]  \  }\  }}|j                  d }d }n,|j                  j                  }|j                  j                  }|\  }}	j                  ||d| d| d|        	j                  ||| d| d| d|         y rZ   r[   r^   s
            r   rg   z8Test.testUpdateAccidentalDisplayOctaves.<locals>.compareH  rh   r   r   r   )rk   rk   r~   r~   r   ri   zc#rK   F)rM   r   N)r   rO   r   r   )r   r   r   rg   rv   rw   r   rP   s   `       r   "testUpdateAccidentalDisplayOctavesz'Test.testUpdateAccidentalDisplayOctaves8  s    	 	 	( uuU|U5\u$eRvuuU|U5\ueRv4[eeDk5:6
""T"N-r   c                   t        j                  d      j                         }|j                  dt	        j
                  d             |j                  dd       |t        j                     }| j                  |d   j                  j                  j                  d       | j                  |d   j                  j                  j                  d       | j                  |d   j                  j                  j                  d       | j                  |d   j                  j                  j                  d       | j                  |d   j                  j                  j                  d	       | j                  |d   j                  j                  j                  d       | j                  |d
   j                  j                  j                  d	       | j                  |d
   j                  j                  j                  d       | j                  |d   j                  j                  j                  d       | j                  |d   j                  j                  j                  d       | j                  |d   j                  j                  j                  d       | j                  |d   j                  j                  j                  d       | j                  |d   j                  j                         | j                  |d   j                  j                  j                  d       | j                  |d   j                  j                  j                  d       y)z
        a nasty test provided by Jose Cabal-Ugaz about octave leaps,
        cautionaryNotImmediateRepeat=False
        and key signature conflicts.
        z/tinynotation: 4/4 fn1 fn1 e-8 e'-8 fn4 en4 e'n4r   r4   TF)inPlacer   rL   r3   r5   r$         r7   N)r   r9   flatteninsertr   r   makeNotationr   Noter   r	   r   r0   r@   assertIsNotNone)r   bmnotess      r   testAccidentalsCautionaryzTest.testAccidentalsCautionarym  sf    __NOWWY
		!S%%a()
5I499q2277Cq22@@$Gq2277Cq22@@$Gq2277@q22@@$Gq2277@q22@@$Gq2277Cq22@@$Gq2277Cq22@@$GU1X^^667q2277Cq22@@$Gr   c                <   t        j                  d      }d|j                  j                  _        t        j                  d      }|j                  j                  d|j                         | j                  |j                  j                  j                  d       y )NCnTrJ   )rN   r{   F)
r   r   r	   r   r@   r   KeyrO   r{   assertIs)r   nks      r   testOverrideDisplayStatuszTest.testOverrideDisplayStatus  si    IIdO+/(GGCL	''tAL\L\']agg((66>r   c                (   t        j                  d      }|j                         j                  j	                         }|j                  d       | j                  |j                  j                  j                  d       d |j                  j                  _	        |d   j                         j                  dt        j                  d             |j                  d       | j                  |j                  j                  j                  d       y )NztinyNotation: 2/4 f4 fn4Tr   Fr<   r   C-)r   r9   recurser   lastmakeAccidentalsr   r	   r   r@   firstr   r   r   r   r!   	last_notes      r   testImplicitToExplicitNaturalz"Test.testImplicitToExplicitNatural  s    OO67IIK%%**,		$'ioo00>>F37	""0	)##Aswwt}5	$'ioo00>>Fr   c                   t        j                  d      }|j                         j                  j	                         }t        d      |j                  _        d|j                  j                  _        |j                  d       | j                  |j                  j                  j                  d       |t        j                     j                         j                  dt!        j"                  d             |j                  dd	       | j                  |j                  j                  j                  d       d
|t         j"                     j                         _        |j                  dd	       | j                  |j                  j                  j                  d       t        j                  d      }|j                         j                  j	                         }t        d      |j                  _        d|j                  j                  _        |j                  d       | j                  |j                  j                  j                  d       |j                  j                  j'                  d       |j                  dd	       | j                  |j                  j                  j                  d       y)zF
        Beginning of test cases for if-absolutely-necessary.
        ztinyNotation: 2/4 f#2 f2rL   zif-absolutely-necessaryTr   Fr   ir   rN   ztinyNotation: 2/4 F#4 f4r8   N)r   r9   r   r   r   r   r	   r   r>   r   r   r@   r   r<   r   r   r   r   sharpssetr   s      r   testIfAbsolutelyNecessaryzTest.testIfAbsolutelyNecessary  s    OO67IIK%%**,	%/	%:	"1J	"".	$'ioo00>>F	&..!((C,<,<R,@A	$t<ioo00>>E-/#

!!#*	$t<ioo00>>FOO67IIK%%**,	%/	%:	"1J	"".	$'ioo00>>F 	""&&w/	$t<ioo00>>Er   c                   t        j                  d      }|j                  d       |t        j                     j                         }| j                  |j                  j                  j                  d       d |j                  j                  _	        |d   j                         j                  dt        j                  d             |j                  d       | j                  |j                  j                  j                  d       y )NztinyNotation: 2/4 f4 dn4Tr   Fr<   r   r   )r   r9   r   r   r   r   r   r	   r   r@   r   r   r   r   r   s      r    testNaturalOutsideAlteredPitchesz%Test.testNaturalOutsideAlteredPitches  s    OO67	$'diiL%%'	ioo00>>F 48	""0	)##Aswwt}5	$'ioo00>>Er   c                   t        j                  d      }|j                  d      j                  dt	        j
                  d             d|j                         j                  j                         j                  j                  _        |j                  dd       | j                  |j                  d      j                  j                         j                  j                  j                  d       | j                  |j                  d      j                  j                         j                  j                  j                  d       y )NztinyNotation: f#4 e f#r4   r   GFTr   )r   r9   rA   r   r   r   r   r   r   r	   r   r@   r   r   r   r    s     r   3testInterveningNoteBetweenIdenticalChromaticPitchesz8Test.testInterveningNoteBetweenIdenticalChromaticPitches  s    OO45			!Aswws|,BG		 &&11?	$t<aiil((..066AAOOQVWaiil((--/55@@NNPUVr   c                H   g d}|D ]1  \  }}}t        |      }t        |      }| j                  ||k(  |       3 t        d      }t        d      }| j                  ||       d|_        d|_        | j                  ||       d|_        d|_        | j                  ||       y)rI   )	)rQ   r&   F)rQ   rQ   T)a#rQ   F)r   zb-F)r   za-F)za##r   F)a#4r   T)r   za-4F)ri   r   Fr   r   r$   N)r   r   r%   assertNotEqual)r   dataxymatchr   r   s          r   testPitchEqualityzTest.testPitchEquality  s    

  KAq%qBqBR2Xu-  
 4[4[R 		B#		R r   c                    t        d      }|j                  d      }| j                  |j                  d       | j                  |j                  d       y )ND2zM-23rJ   )r   	transposer   r0   r%   )r   dPitchlowCs      r   testLowNoteszTest.testLowNotes  sC    t'C(b)r   c                   t        d      }| j                  t        |      d       t        j                         j                  |      j                  d      }d}|j                  dd      }|j                  dd      }| j                  |j                  |      d       t        j                         }dD ]T  }t        |      }| j                  t        |      |       t        j                         }||_        |j                  |       V | j                  t!        |      d	       |D cg c]  }|j                  j"                   }}| j                  |g d
       t        j                         }g d}	t%        j&                  d      }
t)        dd      D ]l  }t        j                  |
j+                  ||
j-                         z              }d|_        t1        |	|         |j                  _        |j                  |       n |j4                  D cg c]  }t        |j                         }}| j                  |g d       |D cg c]  }|j                  j"                   }}| j                  |g d       y c c}w c c}w c c}w )NzD#~zutf-8z2<step>D</step><alter>1.5</alter><octave>4</octave>  
r   )zA~zA#~zA`zA-`r   )g     `Q@     Q@g      Q@     P@)
N      ?g      ?g      g      z
half-sharpzone-and-a-half-sharpz	half-flatzone-and-a-half-flat~c4r4   
   r   )	zC~4zD#~4zE-`4zF`4zG~4zA#~4zB`4zC-`4zD~4)	g     @N@g     O@     @O@g      P@r   r   r   g     @M@r   )r   r   strr   GeneralObjectExporterr9   decodereplacer   findr   Streamr   r   r	   rV   lenpsr
   
MajorScalerangepitchFromDegreegetDegreeMaxUniquequarterLengthr   r   r   )r   r   xmlOutr   rC   pStrr!   r   e	alterListscr   s               r   testQuarterToneAzTest.testQuarterToneA  s	   5\R%(//177;BB7KDR(b)FKK.3MMO.DdASVT*		AAGHHQK / 	Q#%&'QQ' 89MMO	 d#q"A		",,Q1F1F1H-HIJA!AO!+IaL!9AGGHHQK	  ()ww/w!QWWw/\	^ &''QQ' VW' ( 0 (s   ,I?JJ	c                   t        j                  d      }d|_        | j                  t	        |      d       | j                  |j
                  d       d|_        | j                  t	        |      d       | j                  |j
                  d       | j                  |j                  d       |j                  d	      }| j                  t	        |      d
       | j                  |j
                  d       y )Nr      zA4(+25c)g     PQ@z-10zA4(-10c)g9Q@	      zA5(-10c)g9T@)r	   r   	microtoner   r   r   
pitchClassr   r    s     r   testMicrotoneAzTest.testMicrotoneA  s    KKQ,u%Q,u%q)KKOQ,u%r   c                *	   | j                  t        t        j                  d      j	                  d            d       t        j                  d      }d|_        | j                  t        |      d       | j                  t        |j	                  d            d       | j                  t        t        j                  d      j	                  d            d       | j                  t        t        j                  d      j	                  d            d	       | j                  t        t        j                  d      j	                  d
            d       | j                  t        t        j                  d      j	                  d            d       | j                  t        t        j                  d      j	                  d            d       | j                  t        t        j                  d      j	                  d            d       | j                  t        j                  d      j                  d      d       | j                  t        t        j                  d      j	                  d            d       | j                  t        t        j                  d      j	                  d            d       | j                  t        t        j                  d      j	                  d            d       | j                  t        j                  d      j                  d      d       t        j                  d      }d|_        | j                  t        |j	                  d            d       t        j                  d      }t        j                  d      }d|_        | j                  |j                  |      d       d|_        | j                  |j                  |      d       t        j                  d      }| j                  t        |j	                  d            d       t        j                  d       }| j                  t        |j	                  d            d!       | j                  t        |j                  d"            d#       y )$Nr   r4   C4   zC4(+20c)r3   C5r$   zG5(+2c)r   C6r   zE6(-14c)r7   zG6(+2c)   z	A~6(+19c)g4c3z3rdH(-2c)/C3c2C3z2ndH/C3izC4(-10c)iz2ndH(+20c)/C3(-20c)z2ndH(-20c)/C3(+20c)c1   z	G#~4(-9c)a1zF~5(-9c)M6A1)r   r   r	   r   getHarmonicr   harmonicStringr   )r   r!   fr   r   s        r   testMicrotoneBzTest.testMicrotoneB&  s6   U[[.::1=>EKKQ,Q]]1-.
;U[[.::1=>EU[[.::1=>	JU[[.::1=>EU[[.::1=>
KU[[.::1=>	JU[[.::1=>LT*99$?PU[[.::1=>EU[[.::1=>EU[[.::1=>ET*99$?KKKQ]]1-.
;KKKK))!,.CD))!,.CD[[R^^B/0+>[[R^^B/0*=R\\$/0$7r   c                   g }t        j                  d      }d|_        t        d      D ]:  }|j	                  t        |             |j                  j                  dz
  |_        < | j                  t        |      d       y )Nr   r      r4   zt['C4(+5c)', 'C4(+4c)', 'C4(+3c)', 'C4(+2c)', 'C4(+1c)', 'C4', 'C4(-1c)', 'C4(-2c)', 'C4(-3c)', 'C4(-4c)', 'C4(-5c)'])r	   r   r   r   rV   r   centsr   )r   r   r!   ra   s       r   testMicrotoneCzTest.testMicrotoneCT  sm    KKrALLQ ++++a/AK  	UZ	[r   c                .   g d}| j                  t        |      d       g }|D ]7  }t        j                         }||_        |j                  t        |             9 | j                  t        j                  t        |      d      t        |             y )N)i  gUUUUU|@g}@i  g
@gUUUUU@i&  g@gUUUUUU@i]  gz@gUUUUU@i  g2@gUUUUUŅ@i  g@gUUUUU}@i  g@gUUUUU5@i9  gZ@gUUUUU@   aj  
                ['A4', 'A~4(+21c)', 'B`4(-11c)', 'B4(+4c)', 'B~4(+17c)', 'C~5(-22c)',
                 'C#5(-14c)', 'C#~5(-7c)', 'D5(-2c)', 'D~5(+1c)', 'E-5(+3c)', 'E`5(+3c)',
                 'E5(+2c)', 'E~5(-1c)', 'F5(-4c)', 'F~5(-9c)', 'F#5(-16c)', 'F#~5(-23c)',
                 'F#~5(+19c)', 'G5(+10c)', 'G~5(-1c)', 'G#5(-12c)', 'G#~5(-24c)', 'G#~5(+14c)'])
r   r   r	   r   	frequencyrV   r   rB   r   whitespaceEqual)r   r  rv   fqr!   s        r   testMicrotoneDzTest.testMicrotoneD_  s    9 	Q$BAAKLLQ   	""E
c J
	
r   N)__name__
__module____qualname__r   r"   r'   r1   rG   rR   rx   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   r      s~    7?& ;"7&fPn`3.jH6?	GF>
FW!2*'XR&"*8\	[
r   r   __main__)
__future__r   r   unittestmusic21r   r   r   r   r   r	   r
   r   music21.musicxmlr   music21.pitchr   r   TestCaser   r  mainTestr  r   r   <module>r     se    #           % +[	
8 [	
| zGT r   