
    rh(                        S SK Jr  S SKrS SKrS SKrS SK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  S S
KJr  S SKJr  S SKJrJrJrJrJrJr  S SKJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&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.  S SKJ/r/  S SKJ0r0  \Rb                  " S5      r2 " S S\Rf                  5      r4\5S:X  a  S SKr\Rl                  " \45        gg)    )a2b_hexN)chord)	converter)common)corpus)environment)
instrument)interval)key)meter)ChannelVoiceMessages	DeltaTime
MetaEvents	MidiTrack	MidiEventMidiFile)TimedNoteEventTranslateWarningchannelInstrumentDataconductorStreamgetMetaEventsmidiAsciiStringToBinaryStringmidiEventsToInstrumentmidiEventsToNotemidiFileToStreamnoteToMidiEventspacketStorageFromSubstreamListprepareStreamForMidistreamHierarchyToMidiTracksstreamToMidiFile"updatePacketStorageWithChannelInfo)testPrimitive)note)
percussion)scale)stream)tempo)tie)volumez
midi.testsc                   z   \ 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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#S" r$S# r%S$ r&S% r'S& r(S' r)S( r*S) r+S* r,S?S, jr-S- r.S. r/S/ r0S0 r1S1 r2S2 r3S3 r4S4 r5S5 r6S6 r7S7 r8S8 r9S9 r:S: r;S; r<S< r=S= r>S>r?g+)@Test6   c                     [        5       n[        S5      nSUl        UR                  R	                  U5        SUl        SnX1R                  5       -   nU R                  US[        S5      -   5        g)z8
Convert bytes of Ascii midi data to binary midi bytes.
r               MThds   000000060001000103c0N)	r   r   formattracksappendticksPerQuarterNotewriteMThdStrassertEqualr   )selfmftrk
midiBinStrs       L/home/james-whalen/.local/lib/python3.13/site-packages/music21/midi/tests.pytestWriteMThdStrTest.testWriteMThdStr:   sd     Zl	
		!$
//"33
Ww7N/O%OPr0   c                    [         R                  " 5       S-  S-  nUS-  n[        R                  U/5        [	        5       nUR                  U5        UR                  5         UR                  5         U R                  [        UR                  5      S5        U R                  UR                  S5        U R                  UR                  S 5        [        R                  " 5       nUR                  U5        UR!                  5         UR                  5         US-  n[        R                  U/5        [	        5       nUR                  U5        UR                  5         UR                  5         U R                  [        UR                  5      S5        U R                  UR                  S5        U R                  UR                  S 5        [        R                  " 5       nUR                  U5        UR!                  5         UR                  5         US	-  n[        R                  U/5        [	        5       nUR                  U5        UR                  5         UR                  5         U R                  [        UR                  5      S
5        U R                  UR                  S5        U R                  UR                  S 5        [        R                  " 5       nUR                  U5        UR!                  5         UR                  5         US-  n[        R                  U/5        [	        5       nUR                  U5        UR                  5         UR                  5         U R                  [        UR                  5      S5        U R                  UR                  S5        U R                  UR                  S 5        [        R                  " 5       nUR                  U5        UR!                  5         UR                  5         g )Nmidir"   
test01.mid   r/   z
test02.mid      z
test03.mid   z
test04.mid   i  )r   getSourceFilePathenvironLocal
printDebugr   openreadcloser7   lenr3   r5   ticksPerSecondioBytesIOopenFileLikewrite)r8   dirLibfpr9   fileLikeOpens        r<   testBasicImportTest.testBasicImportI   s   ))+f4Fl"%Z

	

RYY+//5**D1 zz|
%



 l"%Z

	

RYY+//6**D1 zz|
%



 l"%Z

	

RYY+//6**D1 zz|
%



 l"%Z

	

RYY,//5**D1 zz|
%



r0   c                    [         R                  " 5       S-  S-  nUS-  n[        R                  U/5        [	        5       nUR                  U5        UR                  5         UR                  5         UR                  S   nU R                  UR                  S5        U R                  [        UR                  5      S5        SnU[        UR                  5      S-
  :  am  U R                  UR                  U   [        5        U R                  UR                  US-      [        5        US-  nU[        UR                  5      S-
  :  a  Ml  g g )	Nr@   r"   rA   r.      t   r   rB   )r   rG   rH   rI   r   rJ   rK   rL   r3   r7   lengthrM   eventsassertIsInstancer   r   )r8   rS   rT   r9   track2is         r<   testInternalDataModelTest.testInternalDataModel   s
   ))+f4Fl"%Z

	

1 	, 	V]]+S1#fmm$q((!!&--"2I>!!&--A"6	B FA #fmm$q((r0   c                    [        S5      n/ SQ/ SQ/ SQ/ SQ/nSnSnU GH  u  pVn[        U5      nX4-
  Ul        UR                  R	                  U5        [        U5      n	[        R                  U	l        SU	l	        Xil
        Xyl        UR                  R	                  U	5        [        U5      nXXl        UR                  R	                  U5        [        U5      n	[        R                  U	l        SU	l	        Xil
        SU	l        UR                  R	                  U	5        X5-   nX5-  nGM
     [        U5      nUR                  R	                  U5        [        U5      n	[        R                  U	l        SU	l	        SU	l        UR                  R	                  U	5        [        5       n
SU
l        U
R"                  R	                  U5        [$        R&                  " 5       nU
R)                  U5        U
R+                  5         U
R-                  5         g )	Nr.   rD   <   Z   )rD   2   F   )rD   3   x   )rD   >   P   r   r0   rD   )r   r   timer\   r4   r   r   NOTE_ONtypechannelpitchvelocityr   END_OF_TRACKdatar   r5   r3   rO   rP   rQ   rR   rL   )r8   mtrs   timeNowtLastdpvdtmer9   rU   s               r<   testBasicExportTest.testBasicExport   s   q\  GA!2BoBGIIR 2B*22BGBJHKIIR  2BGIIR 2B*22BGBJHBKIIR KELG7 < r]
		r]))

		
 Z!%
		zz|
%



r0   c                     [        S5      n[        U5      nUR                  S5        UR                  S5        UR                  S5        g )Nr.   r      i8)r   r   setPitchBend)r8   rt   r{   s      r<   testSetPitchBendTest.testSetPitchBend   s8    q\r]


r0   c                 <   [        S5      n/ SQnX" Vs/ s H  o3* PM     sn-  n/ SQ/S-  nSnSn[        U5       GHe  u  pxUu  pn[        U5      nXV-
  Ul        UR                  R                  U5        [        U[        R                  SS9nUR                  X'   5        UR                  R                  U5        [        U5      nXV-
  Ul        UR                  R                  U5        [        U[        R                  SS9nXl        Xl        UR                  R                  U5        [        U5      nXl        UR                  R                  U5        [        U[        R                  SS9nXl        SUl        UR                  R                  U5        XY-   nXY-  nGMh     [        U5      nUR                  R                  U5        [        U5      n[        R                  Ul        SUl        SUl        UR                  R                  U5        UR%                  S5        ['        5       nS	Ul        UR*                  R                  U5        [,        R.                  " 5       nUR1                  U5        UR3                  5         UR5                  5         g s  snf )
Nr.   )
r      r   rf   r   d   r      r   r   rc      r   )rn   ro   r0      rD   )r   	enumerater   rl   r\   r4   r   r   
PITCH_BENDr   rm   rp   rq   r   rr   rn   ro   rs   
setChannelr   r5   r3   rO   rP   rQ   rR   rL   )r8   rt   pbValuesxrs   ru   rv   r_   erw   rx   ry   rz   r{   r9   rU   s                   r<   testWritePitchBendATest.testWritePitchBendA   s!   q\ :*AR** "$dODAGA!2BoBGIIR 2$8$C$CQOBOOHK(IIR 2BoBGIIR 2$8$@$@!LBHKIIR  2BGIIR 2$8$@$@!LBHBKIIR KELGG $L r]
		r]))

		 	aZ!%
		zz|
%



A +s   Jc                    [         R                  " 5       S-  S-  nUS-  n[        R                  " U5      nU R	                  [        UR                  5      S5        U R	                  [        UR                  S   R                  5       R                  5      S5        U R	                  [        UR                  S   R                  5       R                  5      S5        g )	Nr@   r"   z
test09.midrB   r   i  r.   iX  )	r   rG   r   parser7   rM   partsrecursenotesr8   rS   rT   ss       r<   testImportWithRunningStatus Test.testImportWithRunningStatusG  s    ))+f4Fl" OOBQWWq)QWWQZ//1778#>QWWQZ//1778#>r0   c                    [        5       nUR                  S5        [        5       n[        R                  Ul        SUl        SUl        SUl        UR                  R                  [        UR                  5      S-
  UR                  S   5        UR                  R                  [        UR                  5      S-
  U5        [        5       nU/Ul        UR                  5       n[        5       nUR                  U5        UR                  S   R                   Vs/ s H%  nUR
                  [        R                  :X  d  M#  UPM'     snS   nU R!                  UR                  S5        U R!                  UR                  S5        g s  snf )Ns   MTrk       @ CZ C  / r.   rd   re   rB   r   )r   rK   r   r   POLYPHONIC_KEY_PRESSURErn   ro   
parameter1
parameter2r\   insertrM   r   r3   writestrreadstrr7   )r8   rt   pressurewritingFilebyteStrreadingFiler   pressureEventReads           r<   testReadPolyphonicKeyPressure"Test.testReadPolyphonicKeyPressureU  sI   [
 K 	L ;,DD  
		RYY!+RYYr];
		RYY!+X6j T&&(jG$(3(:(:1(=(D(D X(D1 !*>*V*V V (D XXY[*55r:*55r:Xs   "F?Fc                     [        5       nUR                  S5        U R                  [        UR                  5      S5        U R                  UR                  S   R
                  [        R                  5        g )Ns    DUMMY  
Myut  X   r   )r   processDataToEventsr7   rM   r\   rn   r   UNKNOWN)r8   rt   s     r<   testReadUnknownMetaMessageTest.testReadUnknownMetaMessagen  sZ    [
  B 	CRYY+1**J,>,>?r0   c                     / nUR                  S5        / nUR                  U5        [        US9nU R                  US[        S5      -   S-   [        S5      -   5        g )Nz
0 90 1f 15)tracksEventsListr1   000000060001000103c0s   MTrk0000000400901f0f)r4   r   r7   r   )r8   asciiMidiEventList	midiTrackr;   s       r<   !testMidiAsciiStringToBinaryString&Test.testMidiAsciiStringToBinaryStringw  sn    !!,/ 	+, 3IN
 7+A#BB"#%,-?%@A	Br0   c                 <   [         R                  " S5      nSUl        [        U5      nU R	                  [        U5      S5        U R                  US   [        5        U R                  US   [        5        U R                  US   [        5        U R                  US   [        5        [        [        US   R                  US   R                  US   5      5      nU R	                  UR                  R                  S5        U R	                  UR                  S5        g )NA4g       @rE   r   r.   rB   r   )r#   NotequarterLengthr   r7   rM   r]   r   r   r   r   rl   rp   nameWithOctave)r8   n1	eventListn2s       r<   testNoteTest.testNote  s    YYt_$R(	Y+ilI6ilI6ilI6ilI6 nYq\->->	!@Q@QS\]^S_`a00$7))3/r0   c                    [         R                  " 5       n[        R                  " SSS9n[        R
                  " S5      Ul        [        R                  " SSS9n[        R
                  " S5      Ul        [        R                  " SSS9n[        R                  " SSS9nUR                  X#XE/5        [        U5      S   nUR                   Vs/ s H>  owR                  [        R                  [        R                  4;   d  M2  UR                  PM@     nnU R                  U[        R                  [        R                  /S-  5        UR                  SS	9  [        U5      S   nUR                   Vs/ s H>  owR                  [        R                  [        R                  4;   d  M2  UR                  PM@     n	nU R                  U	[        R                  [        R                  /S-  5        g s  snf s  snf )
NC4g      ?r   startstopr.   r   T)inPlace)r&   Streamr#   r   r(   Tier4   r   r\   rn   r   rm   NOTE_OFFassertListEqualmakeMeasures)
r8   r   nr   n3n4r:   eventmt1noteOnOffEventTypesmt2noteOnOffEventTypess
             r<   testStripTiesTest.testStripTies  s   MMOIId#. YYt3/YYt3/YYt3/	!!)!,Q/:=** "J*

 ((*>*G*GWI II*%*** "J
 	32::2;;=?@A	B
 	
t$)!,Q/:=** "J*

 ((*>*G*GWI II*%*** "J 	32::2;;=?@A	B"J"Js   1G/G/41G4)G4c                    [         R                  " 5       nSUl        [        R                  " 5       n[        S5       H(  nUR                  [        R                  " U5      5        M*     UR                  S[        R                  " S5      5        UR                  S[        R                  " S5      5        UR                  S[        R                  " S5      5        [        U5      S   nU R                  [        UR                  5      S	5        [!        UR                  5      nS
nU R#                  [$        R&                  " XV5      U5        g )N      ?r   r   3/4r   5/4   2/4
   a{  [<music21.midi.DeltaTime (empty) track=0>,
        <music21.midi.MidiEvent SET_TEMPO, track=0, data=b'\x07\xa1 '>,
        <music21.midi.DeltaTime (empty) track=0>,
        <music21.midi.MidiEvent TIME_SIGNATURE, track=0, data=b'\x03\x02\x18\x08'>,
        <music21.midi.DeltaTime t=30240, track=0>,
        <music21.midi.MidiEvent TIME_SIGNATURE, track=0, data=b'\x05\x02\x18\x08'>,
        <music21.midi.DeltaTime t=50400, track=0>,
        <music21.midi.MidiEvent TIME_SIGNATURE, track=0, data=b'\x02\x02\x18\x08'>,
        <music21.midi.DeltaTime t=10080, track=0>,
        <music21.midi.MidiEvent END_OF_TRACK, track=0, data=b''>])r#   r   r   r&   r   ranger4   copydeepcopyr   r   TimeSignaturer   r7   rM   r\   repr
assertTruer   whitespaceEqual)r8   r   r   r_   rt   conductorEventsmatchs          r<   testTimeSignatureTest.testTimeSignature  s    IIKMMOrAHHT]]1%&  	
E''./	E''./	E''./(+A.RYY, ryy/	E 	..FXr0   c                    [         R                  " 5       nSUl        [        R                  " 5       n[        S5       H(  nUR                  [        R                  " U5      5        M*     UR                  S[        R                  " S5      5        UR                  S[        R                  " S5      5        UR                  S[        R                  " S5      5        UR                  S[        R                  " S	5      5        UR                  S[        R                  " S
5      5        UR                  S[        R                  " S5      5        [        U5      S   nU R                  [!        UR"                  5      S5        g )Nr   r   r   r   r   r   r   r   rE   r      )r#   r   r   r&   r   r   r4   r   r   r   r   r   r   KeySignaturer   r7   rM   r\   )r8   r   r   r_   	conductors        r<   testKeySignatureTest.testKeySignature  s   IIKMMOrAHHT]]1%&  	
E''./	E''./	E''./	C$$Q'(	C$$R()	C$$Q'(/215	Y--.3r0   c                    [         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  [         R                  /n/ n[        R                  " 5       n[        U5       H{  u  pE[        R                  " 5       nU" 5       nUR                  U5        UR                  SU5        UR                  [        R                  " S5      5        UR                  SU5        M}     [!        U5      u  pU R#                  UR%                  5       ['        S U 5       5      5        U R)                  ['        UR+                  5       5      1 Sk5        U R-                  U	/ SQ5        [/        [1        SS5      5      n
[!        X:S9u  pU R#                  UR%                  5       ['        S	 U 5       5      5        U R)                  ['        UR+                  5       5      1 S
k5        U R-                  U	S/5        [        U5       H  u  pKSU-
  Ul        M     [!        U5      u  pU R#                  UR%                  5       ['        S U 5       5      5        U R)                  ['        UR+                  5       5      1 Sk5        U R-                  U	/ SQ5        SUS   l        SnUS-  nUS-  nU R5                  [6        U5         [!        U5      u  pS S S 5        U R#                  UR%                  5       ['        S U 5       5      5        U R)                  ['        UR+                  5       5      1 Sk5        U R-                  U	/ SQ5        g ! , (       d  f       N~= f)Nr   C#c              3   8   #    U  H  oR                   v   M     g 7fNmidiProgram.0insts     r<   	<genexpr>-Test.testChannelAllocation.<locals>.<genexpr>       8\V[d9I9IV[   >   r.   rB   r   rE   rC   r   )
r      r   	                  r   r      )acceptableChannelListc              3   8   #    U  H  oR                   v   M     g 7fr   r   r   s     r<   r   r     r   r   >   r   r   r   r   r   r   r   r   c              3   8   #    U  H  oR                   v   M     g 7fr   r   r   s     r<   r   r      r   r   >   r   r   r   r   r   r   )	r.   rB   r   rE   rC   r   r   r   r   r   z5Harpsichord specified 1-indexed MIDI channel 101 but zPacceptable channels were \[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16\]. zDefaulting to channel 1.c              3   8   #    U  H  oR                   v   M     g 7fr   r   r   s     r<   r   r   +  r   r   >   r.   r   r   r   r   r   )	rB   r   rE   rC   r   r   r   r   r   )r	   HarpsichordViolaElectricGuitarFlute
VibraphoneBassDrumHiHatCymbalr&   Scorer   Partr4   r   r#   r   r   r7   keyssetassertSetEqualvaluesr   listr   midiChannelassertWarnsRegexr   )r8   iListiObjsr   r_   	instClassrx   r   channelByInstrumentchannelsDynamicacliObjwants                r<   testChannelAllocationTest.testChannelAllocation  s   ''!!**!!&&$$'' LLN%e,LAA;DLLHHQHHTYYt_%HHQN - 0EQ/G, 	,113S8\V[8\5\]C 3 : : <=?RS_.RS 5R=!/DQ/b,,113S8\V[8\5\]C 3 : : <=?WX_rd3 !'GA!AvD ( 0EQ/G,,113S8\V[8\5\]C 3 : : <=?WX_.IJ  #aFcc**""#3T:3H3K0 ;,113S8\V[8\5\]C 3 : : <=?VW_.JK	 ;:s   M##
M1c           
         S [         R                  [         R                  [         R                  [         R                  S /n/ n/ n[        U5       H  u  pE[        R                  " 5       nUb*  U" 5       nUR                  U5        UR                  SU5        US:w  a%  UR                  [        R                  " S5      5        UR                  U5        M     [        USS9nU R                  U[        5        U R                  [!        UR#                  5       5      / SQ5        US   n	U R                  U	[        5        U R%                  ['        U	R#                  5       5      SS15        U R)                  U	S   US   5        U R                  U	S   [         5        U R+                  U	S   5        U R                  U	S   S   [        5        US   R,                  SUS   R,                  S	US	   R,                  S
US
   R,                  SS S0n
[/        X5        U R%                  ['        U	R#                  5       5      1 Sk5        U R                  U	S   S5        U R                  U	S   S   S   S5        g )Nr   r   F)addStartDelay)r   r.   rB   r   rE   rC   r.   
rawPacketsinitInstrumentrB   r   rE   rC   >   r"  initChannelr#  r$  )r	   r  r  r  r	  r   r&   r  r4   r   r#   r   r   r]   dictr7   r  r  r  r  assertIsr   r   r!   )r8   r  r  substreamListr_   r  rx   r   packetStorageharpsPacketchannelInfos              r<   testPacketStorageTest.testPacketStorage/  s,   ''!!**!! %e,LAA$ {T"D!Av4)  # - 7}TYZmT2m00235GH#A&k40C 0 0 23)+;<	>k"23U1X>k,7>L12k,7:DA !H  !!H  !!H  !!H  !!
 	+=FC 0 0 23K	M]3Q7\226}EqIr0   c                    [         R                  " S5      nUR                  S   n[        U5      S   nSnS U l        [        UR                  S S 5      nU R                  [        R                  " XT5      U5        SnUR                  S   n[        U5      S   n[        UR                  S S 5      nU R                  [        R                  " XT5      U5        UR                  S   n[        U5      nU R                  [        U5      S	5        S
n[        US   R                  S S 5      nU R                  [        R                  " XT5      U5        g )Nzbach/bwv103.6z#sopranor.   aI  
        [<music21.midi.DeltaTime (empty) track=1>,
         <music21.midi.MidiEvent SEQUENCE_TRACK_NAME, track=1, data=b'Soprano'>,
         <music21.midi.DeltaTime (empty) track=1>,
         <music21.midi.MidiEvent PITCH_BEND, track=1, channel=1, parameter1=0, parameter2=64>,
         <music21.midi.DeltaTime (empty) track=1>]rC   a  
        [<music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent SEQUENCE_TRACK_NAME, track=1, data=b'Alto'>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent PITCH_BEND, track=1, channel=1, parameter1=0, parameter2=64>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent PROGRAM_CHANGE, track=1, channel=1, data=0>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent NOTE_ON, track=1, channel=1, pitch=62, velocity=90>]z#altor   rB   a  [<music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent SEQUENCE_TRACK_NAME, track=1, data=b'Soprano'>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent PITCH_BEND, track=1, channel=1, parameter1=0, parameter2=64>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent PROGRAM_CHANGE, track=1, channel=1, data=0>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent LYRIC, track=1, data=b'1. Was\nzu\n2. Ich\nwas'>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent NOTE_ON, track=1, channel=1, pitch=66, velocity=90>,
        <music21.midi.DeltaTime t=5040, track=1>,
        <music21.midi.MidiEvent NOTE_OFF, track=1, channel=1, pitch=66, velocity=0>]r   )r   r   r   r   maxDiffstrr\   r   r   r   r7   rM   )	r8   r   sopranomtsr   foundaltomtamtLists	            r<   testAnacrusisTimingTest.testAnacrusisTiming_  s,   LL) ''*%)'2156 CJJrN#..u<eDX www)$/2CJJrN#..u<eD ''*%,W5Va(X F1I$$Sb)*..u<eDr0   c                    [         R                  " 5       nUR                  [        R                  " 5       5        UR                  [        R                  " SSS9S5        [         R                  " 5       nUR                  [        R                  " 5       5        UR                  [        R                  " SSS9S5        [         R                  " 5       nUR                  [        R                  " 5       5        UR                  [        R                  " SSS9S5        [         R                  " 5       nUR                  S	U5        UR                  S	U5        UR                  S	U5        [        U5        g )
Ng6      ?r   rE   c1rB   e4r.   r   )r&   r  r4   r	   DulcimerrepeatAppendr#   r   TubaTubularBellsr  r   r   )r8   p1p2p3r   s        r<   testMidiProgramChangeATest.testMidiProgramChangeA  s    [[]
		*%%'(
		$c:A>[[]
		*//#$
		$a8!<[[]
		*))+,
		$a8!<LLN	B	B	B#A&r0   c                 0   [         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  /n[        R                  " 5       nUR!                  SS5      n["        R$                  " U5        [&        R(                  " 5       n[+        S5       He  n[,        R.                  " X5[1        U5      -     5      nSUl        X[1        U5      -     " 5       nUR5                  U5        UR5                  U5        Mg     [7        U5        g )Nc2c5   r   )r	   r  
Clavichord	AccordionCelesta
Contrabassr  Harpr  UkuleleBanjoPiccoloAltoSaxophoneTrumpetr%   
MinorScale
getPitchesrandomshuffler&   r   r   r#   r   rM   r   r4   r   )r8   r  scpitchesr   r_   r   r   s           r<   testMidiProgramChangeBTest.testMidiProgramChangeB  s   ''&&
(<(<##Z%:%:J<L<L*";";Z=O=O!!:#5#5z7O7O##%  --d+wMMOrA		'c'l"234A!AOSZ(*DHHTNHHQK  	$A&r0   c                 "   [         R                  " S5      nUR                  5       n[        U5      nU R	                  [        U5      S5        Sn[        US   R                  SS  5      nU R                  [        R                  " XT5      U5        g )Nbwv66.6rB   at  [<music21.midi.MidiEvent NOTE_ON, track=1, channel=1, pitch=66, velocity=90>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent NOTE_ON, track=1, channel=1, pitch=61, velocity=90>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent NOTE_ON, track=1, channel=1, pitch=58, velocity=90>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent NOTE_ON, track=1, channel=1, pitch=54, velocity=90>,
        <music21.midi.DeltaTime t=10080, track=1>,
        <music21.midi.MidiEvent NOTE_OFF, track=1, channel=1, pitch=66, velocity=0>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent NOTE_OFF, track=1, channel=1, pitch=61, velocity=0>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent NOTE_OFF, track=1, channel=1, pitch=58, velocity=0>,
        <music21.midi.DeltaTime (empty) track=1>,
        <music21.midi.MidiEvent NOTE_OFF, track=1, channel=1, pitch=54, velocity=0>,
        <music21.midi.DeltaTime t=10080, track=1>,
        <music21.midi.MidiEvent END_OF_TRACK, track=1, data=b''>]r.   i)r   r   flattenr   r7   rM   r0  r\   r   r   r   )r8   r   sFlatr6  r   resultss         r<   testOverlappedEventsATest.testOverlappedEventsA  sw    LL#		,U3Va(E$ fQi&&st,-..w>Hr0   c                 D   [         R                  " 5       nUR                  SS5      n[        R                  " U5        SnSnSn[
        R                  " 5       nU H7  n[        R                  " U5      nX5-
  Ul	        UR                  XX5        XT-   nM9     [        U5        g )NrH  rI  r   r   r   )r%   
MajorScalerV  rW  rX  r&   r   r#   r   r   r   r   )	r8   rY  rZ  durstepor   rx   r   s	            r<   testOverlappedEventsBTest.testOverlappedEventsB  s     --d+wMMOA		!A!gAOHHQNA	  	$A&r0   c                    [         R                  " 5       nUR                  [        R                  " S5      5        UR                  [
        R                  " S5      5        UR                  S[        R                  " S5      5        [        R                  " S5      nSUR                  l
        UR                  SU5        [        R                  " / SQSS	9nS
UR                  S   l
        UR                  U5        UR                  nUR                  U[        R                  " S5      5        UR                  U[        R                  " S5      5        [!        U5        g )Nr   r   r   cgr   )rw   fahalfrn   ir.   r   b)r&   r   r   r   r   r   r   r#   r   rp   	microtoner   ChordrZ  r4   highestTimer   )r8   r   r   rl  poss        r<   testOverlappedEventsCTest.testOverlappedEventsC  s    MMO	!!!$%	$$U+,	DIIcN#IIcN	AKKf5!$		!	mm	diin%	diin%#A&r0   c                    [         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                   [         R"                  [         R$                  [         R&                  [         R(                  [         R*                  [         R,                  /n[.        R0                  " 5       nUR3                  SS5      n[4        R6                  " 5       n[9        U5       HM  u  pV[:        R<                  " U5      nSUl        X   " 5       nURA                  U5        URA                  U5        MO     [C        U5        g )NrH  rI  r;  )"r	   r  rK  rL  rM  rN  r  rO  r  rP  rQ  rR  rS  rT  Clarinetr	  ViolinSopranoOboer@  SitarOcarinaPianor%   re  rV  r&   r   r   r#   r   r   r4   r   )	r8   r  rY  rZ  r   r_   rx   r   r   s	            r<   testExternalMidiProgramChangeB#Test.testExternalMidiProgramChangeB  s8   '')>)>
@T@T##Z%:%:J<L<L*";";Z=O=O!!:#5#5z7O7O##Z%8%8*:J:J""J$6$6
*"2"2J4F4F!!#  --d+ MMOg&DA		!A!AO8:DHHTNHHQK ' 	$A&r0   c                    [         R                  " 5       nUR                  [        R                  " SSS95        UR                  [        R                  " SSS95        UR                  [        R                  " SSS95        UR                  [        R                  " SSS95        UR                  [        R                  " SSS95        UR                  S[        R                  " S	S
S95        [        U5        g )Nc4wholerq  c~4c#4c#~4d4r   g3r   r   )r&   r   r4   r#   r   r   r   )r8   r   s     r<   testMicrotonalOutputATest.testMicrotonalOutputA+  s    MMO	4g./	5w/0	5w/0	601	4g./ 	
DIId"56#A&r0   c                 >   [         R                  " 5       nUR                  [        R                  " SSS95        UR                  [        R                  " SSS95        UR                  [        R                  " SSS95        UR                  [        R                  " SSS95        UR                  [        R                  " SSS95        [         R                  " 5       nUR                  S[        R                  " S	S
S95        [         R                  " 5       nUR                  SU5        UR                  SU5        [        U5      nU R                  US   R                  5       S/5        U R                  US   R                  5       SS/5        [         R                  " 5       nUR                  SU5        UR                  SU5        [        U5      nU R                  US   R                  5       S/5        U R                  US   R                  5       SS/5        g )Nr  r  rq  r  r  r  r  r   g2r   r   r.   rB   )
r&   r  r4   r#   r   r   r  r   r7   getChannels)r8   rB  rC  r   r2  s        r<   testMicrotonalOutputBTest.testMicrotonalOutputB8  s   [[]
		$))Dw/0
		$))E01
		$))E01
		$))F12
		$))Dw/0 [[]
		!TYYt267 LLN	B	B)!,Q++-s3Q++-1v6
 LLN	B	B)!,Q++-s3Q++-1v6r0   c           	      J   [         R                  [         R                  [         R                  [         R                  /n/ SQn[
        R                  " 5       n[        U5       H  u  pE[
        R                  " 5       nUR                  SU" 5       5        X$   u  pxn	[        U5       H&  n
UR                  [        R                  " XS95        M(     UR                  SU5        M     [        U5      nU R                  US   R!                  5       / 5        U R                  US   R!                  5       S/5        U R                  US   R!                  5       S/5        U R                  US   R!                  5       S/5        U R                  US   R!                  5       S/5        g )N))r   r.   C6)rE   rB   G3)rB   rE   E4)r         ?C5r   r   r.   rB   r   rE   )r	   r  r  r  r	  r&   r  r   r  r   r   r4   r#   r   r   r7   r  )r8   r  paramsr   r_   r   rx   numberql	pitchNamejr2  s               r<   testInstrumentAssignmentsTest.testInstrumentAssignmentsX  sN   ''!!**!!##
 LLN 'GAAHHQ$*I!F	6]9?@ #HHQN ( *!,Q++-r2Q++-s3Q++-s3Q++-s3Q++-s3r0   c                 p   [         R                  [         R                  [         R                  [         R                  /nSSS/4SSSS/4SSSS	/4S
SS/4/n[
        R                  " 5       n[        U5       H  u  pE[
        R                  " 5       nUR                  SU" 5       5        X$   u  pxn	[        U5       H5  n
UR                  [        R                  " X[        U	5      -     US95        M7     UR                  SU5        M     [        U5      nU R!                  US   R#                  5       S/5        U R!                  US   R%                  5       S
/5        U R!                  US   R#                  5       SS/5        U R!                  US   R%                  5       S/5        U R!                  US   R#                  5       SS
/5        U R!                  US   R%                  5       S/5        U R!                  US   R#                  5       SS
/5        U R!                  US   R%                  5       S/5        g )Nr   r.   r  rE   rB   r  zG~3r  E5r   r  r  r   r   rC   )   r      I   )r	   r  r  r  r	  r&   r  r   r  r   r   r4   r#   r   rM   r   r7   r  getProgramChanges)r8   r  r  r   r_   r   rx   r  r  pitchNameListr  r2  s               r<   testMicrotonalOutputDTest.testMicrotonalOutputDx  s   ''!!**!! a$.a$'a$&dTF#%
 LLN 'GAAHHQ(.	%F6]=S5G1G#HXZ[\ #HHQN ( *!,Q++-s3Q113aS9Q++-1v6Q113bT:Q++-1v6Q113bT: 	Q++-1v6Q113bT:r0   c                 r   [         R                  " S5      nUR                  S   n[        R                  " U5      n[
        R                  " S5      nUR                  USSS9  [        R                  " 5       nUR                  SU5        UR                  SU5        [        U5      nU R                  US   R                  5       S/5        U R                  US   R                  5       S/5        U R                  US   R                  5       SS/5        U R                  US   R                  5       S/5        g )	Nr^  r   r   Tr   rt  r   classFilterListr.   rB   r   r   r   r   r   r
   Interval	transposer&   r  r   r   r7   r  r  )r8   r   rB  rC  	halfSharppostr2  s          r<   testMicrotonalOutputETest.testMicrotonalOutputE  s    LL#WWQZ]]2%%c*	
Y>OP||~ArAr *$/Q++-s3Q113aS9Q++-1v6Q113aS9r0   c                    [         R                  " S5      nUR                  S   n[        R                  " U5      n[        R                  " U5      n[
        R                  " S5      n[
        R                  " S5      nUR                  USSS9  UR                  USSS9  [        R                  " 5       nUR                  SU5        UR                  SU5        UR                  SU5        [        U5      nU R                  US   R                  5       S/5        U R                  US   R                  5       S/5        U R                  US	   R                  5       SS	/5        U R                  US	   R                  5       S/5        U R                  US
   R                  5       SS
/5        U R                  US
   R                  5       S/5        g )Nr^  r         )@g     (Tr  r  r.   rB   r   r  	r8   r   rB  rC  rD  t1t2r  r2  s	            r<   testMicrotonalOutputFTest.testMicrotonalOutputF  s~   LL#WWQZ]]2]]2t$v&
R7HI
R7HI||~ArArAr *$/Q++-s3Q113aS9Q++-1v6Q113aS9Q++-1v6Q113aS9r0   c                 p   [         R                  " S5      nUR                  S   nUR                  UR	                  [
        R                  5      R                  5       5        [        R                  " U5      n[        R                  " U5      n[        R                  " S5      n[        R                  " S5      nUR                  US[        R                  [        R                   4S9  UR                  US[        R                  [        R                   4S9  ["        R$                  " 5       nUR'                  S[
        R(                  " 5       5        UR'                  SU5        UR'                  S[
        R*                  " 5       5        UR'                  SU5        UR'                  S[
        R,                  " 5       5        UR'                  SU5        [/        U5      nU R1                  US	   R3                  5       S	/5        U R1                  US	   R5                  5       S
/5        U R1                  US   R3                  5       SS/5        U R1                  US   R5                  5       S/5        U R1                  US   R3                  5       SS/5        U R1                  US   R5                  5       S/5        g )Nr^  r   r  g      Tr  g      ?g      ?r.   r   rB   rE   8   r   rC   r  )r   r   r   removegetElementsByClassr	   
Instrumentfirstr   r   r
   r  r  r#   r   r   rt  r&   r  r   r>  rT  r  r   r7   r  r  r  s	            r<   testMicrotonalOutputGTest.testMicrotonalOutputG  s   LL#WWQZ
		"''
(=(=>DDFG]]2]]2t$u%
R		5;;7OP
R		5;;7OP||~
		!Z((*+Ar
		!Z'')*E2
		!Z..01D" *$/Q++-s3Q113bT:Q++-1v6Q113bT: 	Q++-1v6Q113bT:r0   c                     [         R                  " 5       S-  S-  nUS-  n[        R                  " U5      nUR	                  5       R                  [        R                  5      nU R                  [        U5      S5        U R                  US   R                  S5        U R                  US   R                  S5        U R                  US	   R                  S
5        U R                  US   R                  S5        US-  n[        R                  " U5      nUR	                  5       R                  [        R                  5      nU R                  [        U5      S5        U R                  US   R                  S5        US-  n[        R                  " U5      nUR	                  5       R                  [        R                  5      nU R                  [        U5      S5        U R                  US   R                  S5        g )Nr@   r"   
test10.midrE   r   g      ^@r.   g     [@rB   g     V@r   g      N@z
test06.midz
test07.midg     f@)r   rG   r   r   r_  r  r'   MetronomeMarkr7   rM   r  )r8   rS   rT   r   mmStreams        r<   testMidiTempoImportATest.testMidiTempoImportA  s   ))+f4Fl"OOB99;11%2E2EFX*!++U3!++U3!++T2!++T2l"OOB99;11%2E2EFX*!++U3l"OOB99;11%2E2EFX*!++U3r0   c                    [         R                  " 5       S-  S-  nUS-  n[        R                  " U5      nU R	                  [        UR                  5      S5        U R	                  UR                  S   [        R                      Vs/ s H  oDR                  PM     sn/ SQ5        U R	                  UR                  S   [        R                      Vs/ s H  oDR                  PM     sn/ SQ5        U R	                  UR                  S	   [        R                      Vs/ s H  oDR                  PM     sn/ SQ5        g s  snf s  snf s  snf )
Nr@   r"   z
test11.midr   r   )FFFFr.   )TTTTrB   )
r   rG   r   r   r7   rM   r   r'   r  numberImplicit)r8   rS   rT   r   mms        r<   testMidiTempoImportBTest.testMidiTempoImportB  s   ))+f4Fl"OOBQWWq))*E4G4G)HI)H2)HI(	
 	)*E4G4G)HI)H2)HI$	
 	)*E4G4G)HI)H2)HI$	
 J J Js   	EE!Ec                 ^   [         R                  " 5       S-  S-  S-  n[        R                  " U5      nUR                   Hi  nUR                  [        R                  5      R                  5       nUR                  nU R                  UR                  S5        U R                  XT5        Mk     g )Nr@   r"   
test17.midr   )r   rG   r   r   r   r  r&   Measurer  timeSignaturer7   ratioStringassertIn)r8   rT   r   rx   mtss         r<   testMidiImportMeterTest.testMidiImportMeter  s    %%'&0?B\QOOBA$$V^^4::<ABR^^U3MM" 	 r0   c                 L   [         R                  " 5       S-  S-  S-  n[        5       nUR                  U5        UR	                  5         UR                  5         [        5       nUR                  S   R                  S S Ul        UR                  R                  SU5        [        U5      nUR                   Hi  nUR                  [        R                  5      R                  5       nUR                   nU R#                  UR$                  S5        U R'                  Xv5        Mk     g )Nr@   r"   r  r   rE   z4/4)r   rG   r   rJ   rK   rL   r   r3   r\   r   r   r   r  r&   r  r  r  r7   r  r  )r8   rT   r9   	new_trackr   rx   r  r  s           r<   testMidiImportImplicitMeter Test.testMidiImportImplicitMeter(  s    %%'&0?B\Q Z

	

 K	99Q<..r2	
		I&R A$$V^^4::<ABR^^U3MM" 	 r0   c                     [         R                  " 5       nUR                  [        R                  " S5      S5        UR                  S[        R                  " S5      5        UR                  S[        R                  " SS95        UR                  S[        R                  " SS95        [         R                  " 5       nUR                  [        R                  " S	5      S5        UR                  S[        R                  " S
5      5        [         R                  " 5       nUR                  SUSU/5        [        U5      nU R                  [        U5      S5        [        US   R                  5      nU R                  UR!                  S5      S5        U R                  UR!                  S5      S5        [        US   R                  5      nU R                  UR#                  S5      S5        U R                  UR#                  S5      S5        g)z0
Export conductor data to MIDI conductor track.
r  r   r   r   re   r  r   rJ  g4z6/4r   	SET_TEMPOrB   TIME_SIGNATUREr.   r%  N)r&   r  r?  r#   r   r   r   r   r'   r  r  r   r7   rM   r   r\   countfind)r8   rB  rC  r   r2  condTrkReprmusicTrkReprs          r<   testMidiExportConductorATest.testMidiExportConductorA>  s{    [[]
		$,
		!U((/0
		!U((34
		!U((34[[]
		$,
		!U((/0LLN	!RB )!,S1% 3q6==)**;7;**+;<a@CFMM***;7<**+;<bAr0   c                    [         R                  " S5      nUR                  S[        R                  " SS95        UR                  S[        R                  " SS95        UR                  S[        R                  " SS95        UR                  S	[        R                  " S
S95        UR                  S[        R                  " SS95        [        U5      n[        US   R                  5      nU R                  UR                  S5      S5        [        US   R                  5      nU R                  UR                  S5      S5        g )Nr^  r      r  rE   rJ  r   ri   r   re   r   ih  r  rC   r.   )
r   r   r   r'   r  r   r   r\   r7   r  )r8   r   r2  r  r  s        r<   testMidiExportConductorBTest.testMidiExportConductorB^  s    LL#	E''s34	E''r23	E''s34	E''r23	U((45 *!,3q6==)**;7;CFMM*++K8!<r0   c                 &   SnSnSn[         R                  " 5       n[        S5       H  n[        R                  " U[        R
                  S-  -  U-  5      S-   S-  nX!-
  U-  U-   nUR                  [        R                  " US95        UR                  [        R                  " S	5      5        M     [        U5      nU R                  [        U5      S5        [        US
   R                  5      n	U R                  U	R!                  S5      S5        g )Nrd   iX  rf   r   rB   r.   r   r  r  r   r  )r&   r   r   mathsinpir4   r'   r  r#   r   r   r7   rM   r   r\   r  )
r8   minTempomaxTempoperiodr   r_   scalarr   r2  mtsReprs
             r<   testMidiExportConductorCTest.testMidiExportConductorCm  s    MMOsAhhqDGGaK069:Q>#EF%/8;AHHU((23HHTYYt_%	 
 *!,S1%s1v}}%{3S9r0   c                    [         R                  " 5       nUR                  [        R                  " 5       5        [        U5      nU R                  [        U5      S5        [        US   R                  5      nU R                  UR                  S5      S5        U R                  UR                  S5      S5        U R                  UR                  S5      S5        g)z*
120 bpm and 4/4 are supplied by default.
rB   r   r  r.   r  r   N)r&   r   r   r#   r   r   r7   rM   r   r\   r  )r8   r   r2  r  s       r<   testMidiExportConductorDTest.testMidiExportConductorD|  s     MMO	)!,S1%3q6==)**;7;**+;<a@**<8!<r0   c                    [         R                  " 5       n[        R                  " S5      n[        R                  " S5      nUR	                  S[
        R                  " SS95        UR	                  S[
        R                  " SS95        UR	                  S[        R                  " S5      5        UR	                  SU5        UR	                  SU5        [        U5      nUR                  [
        R                  5      nUR                  [        R                  5      nU R                  [        U5      S	5        U R                  US   R                  S5        U R                  [        U5      S	5        g
)z9
The conductor only gets the first element at an offset.
ztinynotation: c1ztinynotation: d2 d2r   ,   r     rB   r   r.   N)r&   r   r   r   r   r'   r  r   r   r   r  r7   rM   r  )r8   r   rB  rC  r   temposkeySignaturess          r<   testMidiExportConductorETest.testMidiExportConductorE  s    MMO__/0__23
		!U((34
		!U((45
		!S%%b)*	B	B#A&	--e.A.AB!44S5E5EFVa())2.]+Q/r0   c                    [         R                  " 5       S-  S-  n[        R                  " US-  5      nU R	                  [        US   5      S5        [        U5      nUR                  S   nUR                   Vs/ s H#  oUR                  [        R                  L d  M!  UPM%     nnU R	                  [        U5      S5        gs  snf )z
Multiple meter changes
musicxmllilypondTestSuitez11a-TimeSignatures.xmlr   r   r   N)r   rG   r   r   r7   rM   r    r3   r\   rn   r   r  )r8   
source_dirr   r9   r   r   meter_eventss          r<   testMidiExportConductorFTest.testMidiExportConductorF  s     --/*<?RR
OOJ)AABQ/0"5a IIaL	 ''P'!66Z5N5N+NA' 	 P\*B/Ps   ; CCc                    [         R                  " 5       n[        S5       HO  n[        R                  " S5      nUS-  UR
                  l        SUR
                  l        UR                  U5        MQ     [        U5      n[        US   R                  5      nU R                  UR                  S5      S5        U R                  UR                  S5      S5        g )Nr   c3Fr.   zvelocity=114zvelocity=13)r&   r   r   r#   r   r)   velocityScalarvelocityIsRelativer4   r   r   r\   r7   r  )r8   r   r_   r   r2  r  s         r<   testMidiExportVelocityATest.testMidiExportVelocityA  s    MMOrA		$A&'"fAHH#*/AHH'HHQK  *!,s1v}}%~6:}5q9r0   Nc                 
   [         R                  " 5       n/ SQn[        S5       Vs/ s H
  o3S-  S-   PM     nnU[        [	        U5      5      -   nS/S-  S/S-  -   S/S-  -   S/S-  -   S/S	-  -   n[        U5       H  u  pg[        R                  " 5       S
:  a  [        R                  " 5       nO[        R                  " / SQ5      n	/ n
[        U	5       HL  u  p[        R                  " 5       nXFX+   -   [        U5      -     Ul        SUl        U
R!                  U5        MN     U	R#                  U
5        U	nXxR$                  l        UR!                  U5        M     [        R(                  " U5        [        R(                  " U5        [         R                  " 5       n[        U5       Hq  u  pg[        R*                  " [        R,                  " / SQ5      5      nXR$                  l        XF[        U5      -     UR                  l        UR!                  U5        Ms     [         R.                  " 5       nUR1                  SU5        UR1                  SU5        [3        U5      nU R5                  S[7        US   R8                  5      5        [7        US   R8                  5      [7        US   R8                  5      -   nU R;                  UR=                  S5      S5        U R;                  UR=                  S5      S5        g s  snf )N)r   r   r   r   g      $@g?r;  r.   r   rB   rE   g333333?)r  zd-4g5F)f#2r  ze-2r   r  zvelocity=51zvelocity=102)r&   r   r   r  reversedr   rW  r#   Restr   rt  r)   VolumerM   r  r	  r4   
setVolumesdurationr   rX  r   choicer  r   r   r  r   r\   assertGreaterr  )r8   s1shiftr   ampsqlListr  r  rl  chvChordr_   unused_cSubry   s2r   r   r2  r  s                      r<   testMidiExportVelocityBTest.testMidiExportVelocityB  sM   "MMO).q2AS32d8D>**aS1W$sQw.#:aS1WD v&EA}}$IIK[[!45.0&/mNAA'+\SY,F'GA$+0A(MM!$	 '4
 f%')JJ$IIaL '  	vt'-}}v&EA		&--(=>?A')JJ$&*s4y=&9AHH#IIaL	 ' LLN	B	B)!,k4A#67s1v}}%SV]](;;7==7;7==8!<S 3s   L c                 p   [         R                  " 5       S-  S-  nUS-  n[        R                  " U5      nU R	                  [        UR                  S   R                  5       R                  5      S5        U R	                  [        UR                  S   R                  5       R                  5      S5        U R	                  [        UR                  S   R                  5       R                  5      S5        U R	                  [        UR                  S   R                  5       R                  5      S5        g )Nr@   r"   z
test12.midr   r   r.   rB   )	r   rG   r   r   r7   rM   r   r_  r   r   s       r<   testImportTruncationProblemA!Test.testImportTruncationProblemA  s    ))+f4Fl"OOBQWWQZ//1778!<QWWQZ//1778!<QWWQZ//1778!<QWWQZ//1778!<r0   c                    [         R                  " 5       S-  S-  nUS-  n[        R                  " U5      nU R	                  [        UR                  5       R                  5      S5        US-  n[        R                  " U5      nU R	                  [        U[        R                     5      S5        U R	                  [        UR                  R                  5       R                  S5      R                  5      S5        g )Nr@   r"   z
test13.midr   z
test14.midr   rB   )r   rG   r   r   r7   rM   r_  r   r   rt  r   r  measurevoicesr   s       r<   testImportChordVoiceATest.testImportChordVoiceA  s     ))+f4Fl"OOBQYY[../3 l"OOBQu{{^,a0QWW]]_44Q7>>?Cr0   c                     [         R                  " 5       S-  S-  nUS-  n[        R                  " U5      nU R	                  [        U[        R                     5      S5        g )Nr@   r"   z
test05.midrC   )r   rG   r   r   r7   rM   r   rt  r   s       r<   testImportChordsATest.testImportChordsA	  sQ    ))+f4Fl" OOBQu{{^,a0r0   c                    ^  S T l         U 4S jn[        R                  " S5      nUR                  S   R	                  SS5      n[        U5      n/ SQnU" XE5        g )Nc                   > / n[        S5       H  n[        S[        U R                  U   R                  5      S5       Hz  nU R                  U   R                  U   nU R                  U   R                  US-      nUR	                  UR
                  UR                  R                  UR                  45        M|     M     TR                  X!5        g )NrB   r   r.   )
r   rM   r3   r\   r4   rl   rn   namerp   r7   )mf_innermatch_innertriplesr_   r  rw   r   r8   s          r<   procCompare0Test.testMidiEventsImported.<locals>.procCompare  s    G1Xq#hooa&8&?&?"@!DA *11!4A *11!a%8ANNAFFAFFKK#AB E 
 W2r0   zbach/bwv66.6r   r   r   )")r   KEY_SIGNATUREN)r   r  N)r   r  N`'  rr   N)r   SEQUENCE_TRACK_NAMEN)r   r   N)r   PROGRAM_CHANGENr   rm   E   r5  r   r9  )r   rm   G   )r5  r   r;  )r   rm   r  )r5  r   r  r8  r:  r   rm   D   )r5  r   r=  r   rm   B   r5  r   r?  r<  )N  r   r=  r>  rA  r   r?  r>  r@  r>  rB  r>  )  r   r?  )r   rm   A   )rC  r   rD  r>  r@  r4  )r/  r   r   r   measuresr    )r8   r1  r   partr9   r   s   `     r<   testMidiEventsImportedTest.testMidiEventsImported  sW    	3 LL(wwqz""1a( d#!0D 	Br0   c                 V   [         R                  " [        R                  5      n[	        U5      n[        U5      nUR                  R                  5       R                  S5      R                  [        R                  5      R                  5       nU R                  U[        R                  5        U R                  UR                  S5        [         R"                  " 5       S-  S-  nUS-  n[         R                  " U5      nU R                  UR                  S   R$                  S5        g )Nr.   r   r@   r"   z
test15.midro  )r   r   r"   transposing01r    r   r   r  r$  r  r	   r  r]   r}  r7   r   r   rG   partName)r8   r   r9   outfirst_instrumentrS   rT   r  s           r<   testMidiInstrumentToStreamTest.testMidiInstrumentToStreamH  s    OOM778a r"99??,44Q7JJ!!##(57 	.
@)77; ))+f4Fl"__R !--s3r0   c                    [         R                  " 5       S-  S-  nUS-  n[        R                  " U5      nU R	                  [        UR                  R                  5       R                  S5      R                  5      S5        UR                  R                  5       R                  5       R                  S5      nU R                  U Vs/ s H  oUR                  R                  PM     snSS/5        gs  snf )	z
Musescore places zero duration notes in multiple voice scenarios
to represent double stemmed notes. Avoid false positives for extra voices.
https://github.com/cuthbertLab/music21/issues/600
r@   r"   z
test16.midr.   rB   r   r   N)r   rG   r   r   r7   rM   r   r  r$  r%  r_  getElementsByOffsetassertSequenceEqualr  r   )r8   rS   rT   r   elsr   s         r<   testImportZeroDurationNoteTest.testImportZeroDurationNoteW  s     ))+f4Fl"OOBQWW]]_44Q7>>?Cggmmo%%';;C@  C!HCq**":":C!H1a&Q!Hs   	C3c                    [         R                  " [        R                  5      n[	        UR                  5       R                  5      n[        U5      n[	        UR                  5       R                  5      nU R                  XB5        g r   )	r   r   r"   repeatBracketsArM   r_  r   r   r  )r8   r   num_notes_beforepreparednum_notes_afters        r<   testRepeatsExpandedTest.testRepeatsExpandedd  s^    OOM99:qyy{001'*h..0667?=r0   c                    [        5       n[        SS5      Ul        [        U5      nU R	                  U[
        R                  5        [        SS5      Ul        [        U5      nU R	                  U[
        R                  5        g)zl
MuseScore currently writes null bytes at the end of instrument names.
https://musescore.org/en/node/310158
zPiccolo utf-8r	  N)r   bytesrs   r   r]   r	   rR  r	  )r8   r   r_   s      r<    testNullTerminatedInstrumentName%Test.testNullTerminatedInstrumentNamek  si    
 ='2
"5)a!3!34 7G,
"5)a!1!12r0   c                    SnU Hq  nU R                  US9   [        5       n[        US5      Ul        [        R
                  Ul        [        U5      nU R                  UR                  5        S S S 5        Ms     [        5       nSUl        SUl
        [        R                  Ul        [        U5      nU R                  U[        R                  5        g ! , (       d  f       M  = f)N)z    zInstrument 20r  zInst 2r	   )r-  r^  r   r   )subTestr   r_  rs   r   INSTRUMENT_NAMErn   r   assertIsNoneinstrumentNamero   r   r7  r]   r	   UnpitchedPercussion)r8   
lousyNamesr-  r   r_   s        r<   testLousyInstrumentDataTest.testLousyInstrumentDataz  s    T
D4(!"41
'77
*51!!!"2"23 )(  
)88
"5)a!?!?@ )(s   AC
C"	c                 n   [         R                  " 5       n[         R                  " 5       nSUl        [         R                  " 5       nUR                  [        R
                  " S5      5        UR                  U5        UR                  SU5        [        U5      nU R                  UR                  S5        g )Nr   r   r   )	r&   r   priorityr4   r#   r   r   r   r7   )r8   r   rx   r  r   s        r<   testConductorStreamTest.testConductorStream  sv    MMOMMO
MMO	4!		A#A&	++R0r0   c                 D   [         R                  " 5       S-  S-  S-  n[        R                  " U5      nU R	                  [        UR                  S   R                  S5      R                  R                  5       R                  [        R                  5      5      S5        g )Nr@   r"   r  r.   r   )r   rG   r   r   r7   rM   r   r$  r%  lastr  r#   r  )r8   rT   inns      r<   testRestsMadeInVoiceTest.testRestsMadeInVoice  sx    %%'&0?B\Qoob!		!$$Q'..335HHSTVW	Yr0   c           
      &   [         R                  " 5       S-  S-  S-  n[        R                  " U5      nUR                  R                  5       nUR                  S5      nUR                  S5      nU R                  [        UR                  5      S5        U R                  [        UR                  5      S5        U R                  UR                  R                  S5        U R                  UR                  U5      S5        UR                   Hn  nU R                  US9   U R                  [        S	 UR!                  ["        R$                  5       5       5      UR                  R                  5        S S S 5        Mp     g ! , (       d  f       M  = f)
Nr@   r"   r  r.   rB   r   g      @)rF  c              3   L   #    U  H  oR                   R                  v   M     g 7fr   )barDurationr   )r   r  s     r<   r   /Test.testRestsMadeInMeasures.<locals>.<genexpr>  s        >(33 >(s   "$)r   rG   r   r   r   rq  r$  r7   rM   notesAndRestsr   r  r   elementOffsetrc  sumr  r&   r  )r8   rT   rr  pianoLHm1m2rF  s          r<   testRestsMadeInMeasuresTest.testRestsMadeInMeasures  s/   %%'&0?B\Qoob!)).."__Q__QR--.2RXX*22C8..r2C8IID4(   T=T=T>(   MM//	 )( ((s    AF
F	c                     [         R                  " 5       nUR                  [        R                  " 5       5        [        U5        g r   )r&   r  r   r	   r  r    )r8   rx   s     r<   testEmptyExportTest.testEmptyExport  s,    KKM	&&() 	r0   c                    [        5       nSUl        SUl        [        R                  Ul        [        5       nSUl        SUl        [        R                  Ul        Sn[        X14X24/5      nUS   S   n[        U[        R                  5      (       d   eUS   S   n[        U[        R                  5      (       d   eU R                  UR                  S5        U R                  UR                  S5        [        X24/5      nUS   S   n[        U[        R                  5      (       d   eU R                  UR                  S5        g)a-  
Instrument instances are created from both program changes and
track or sequence names. Since we have a MIDI file, we should not
rely on default MIDI programs defined in the instrument module; we
should just keep track of the active program number.
https://github.com/cuthbertLab/music21/issues/1085
r   r.   s   SopranorB   5   N)r   rs   ro   r   r7  rn   r   r6  r   
isinstancer	   r  r7   r   )r8   event1event2DUMMY_DELTA_TIMEmeta_event_pairsme0me1s          r<   *testImportInstrumentsWithoutProgramChanges/Test.testImportInstrumentsWithoutProgramChanges  s2    *99 ! 44(+;*DGWF`)ab q!!$#z445555q!!$#z445555!,!, )+;*D)EFq!!$#z445555"-r0   c           	         [         R                  " [        R                  " 5       [        R
                  " 5       [        R                  " [        R
                  " 5       [        R
                  " 5       /5      /5      n[        U5      nUS   nU R                  UR                   Vs1 s H  oDR                  iM     snS15        UR                   Vs/ s H$  nUR                  [        R                  L d  M"  UPM&     nnU R                  [!        U5      S5        U R                  U Vs1 s H  oDR"                  iM     snS15        UR%                  S5        UR'                  S[        R(                  " 5       5        [        U5      nUS   nU R                  UR                   Vs1 s H  oDR                  iM     snS15        UR                   Vs/ s H#  oDR                  [        R                  L d  M!  UPM%     nnU R                  [!        U5      S5        U R                  U Vs1 s H  oDR"                  iM     snS15        [        R*                  " 5       UR,                  R/                  5       l        [        U5      nUS   nU R                  UR                   Vs1 s H  oDR                  iM     snS15        UR                   Vs/ s H#  oDR                  [        R                  L d  M!  UPM%     nnU R                  [!        U5      S5        U R                  U Vs/ s H  oDR"                  PM     sn/ SQ5        g s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )Nr.   r   r   #   r   rd   )C   rd   rd   )r&   r  r	   r  r#   	Unpitchedr$   PercussionChordr   r   r\   ro   rn   r   rm   r7   rM   rp   popr   r  Agogor   r  storedInstrument)r8   r  r3   bass_drum_trackevnote_ons
drum_trackmixed_tracks           r<   testExportUnpitchedTest.testExportUnpitched  s   NN!NN&&(8$..:J'KL
 
 -Q/ )o.D.DE.D.DEtL(//
/2ww.666 / 	 
 	X*X6Xr((X6= 	
a	J))+,,Q/AY
j.?.?@.?.?@2$G#**W*2gg9M9U9U.UB* 	 WX*X6Xr((X6= ,6+;+;+=(,Q/Qik.@.@A.@.@AB4H$++X+2ww:N:V:V/VB+ 	 XX*X6Xr((X6E? F

 7 AW 7 BX 7sH   %M!M6M(M%M M5M'M M  M%0M%"M*c                 F   / SQn/ SQnSSU4SSU4SSU4SS	U4/nU H  u  pEn[         R                  " 5       S
-  S-  U-  n[        R                  " XuS9n[	        UR                  5       R                  U5       H!  u  pU R                  U	R                  U
5        M#     M     g )N)"   明u   山u   涌u   水   郁r     葱 r  u   钟u   灵u   毓u   秀u   海u   天r  u   东   济r  u   多u   士u   四u   方u   所r  u   崇u   早r  u   育r  u   文r  r  u   种)"   빛u   날   세u   라u   영u   웅u   열r  u   사u   만r  u   불u   망u   하u   실r     이u   옛u   적r     나u   지u   금r  r  r  u   항u   상u   앙u   모u   합u   니r  u   다z
test18.midr^  z
test19.midgbkz
test20.midz
test21.mideuc-krr@   r"   )encoding)	r   rG   r   r   zipr_  r   r7   lyric)r8   lyricFactZhlyricFactKo	testCasesfilenamer  	lyricFactrT   r   r   ls              r<   testMidiImportLyricsTest.testMidiImportLyrics  s    FL
 7K05+.7K08[1	
	 .7)H	))+f4FQB6Aaiik//;  !, < .7r0   c                 "   SnSnSnSU4SU4SU4SU4SU4SU4SU4/nU GHX  u  pVU R                  XVS9   [        R                  " 5       n[        R                  " 5       n[        R                  " 5       n	[        R
                  " S5      n
Xjl        [        R
                  " S	5      nXkl        UR                  U
5        U	R                  U5        UR                  U5        UR                  U	5        [        R                  " US
US9nU R                  U[        5        [        R                  " US
US9nUR                  5       R                   H  nU R                  UR                  U5        M!     S S S 5        GM[     g ! , (       d  f       GMn  = f)Ncatr  r  r^  r  r  )r  r  r  r  r@   )fmtr  )rc  r&   r  r  r#   r   r  r4   r   toDatar]   r_  	parseDatar_  r   r7   )r8   lyricEnlyricZhlyricKor  r  r  r   rB  rC  r   r   rr  r  r   s                  r<   testMidiExportLyricsTest.testMidiExportLyrics"  sP    gGwgGgw
	  )OHx=LLN[[][[]YYt_ YYt_ 		"		"$$QFXF%%a/''vI**A$$QWWe4 +) >=  )==s   D;E>>
F	)r/  )returnN)@__name__
__module____qualname____firstlineno__r=   rV   r`   r|   r   r   r   r   r   r   r   r   r   r   r  r,  r7  rE  r[  rb  ri  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r!  r&  r)  rG  rN  rT  r[  r`  ri  rn  rs  r  r  r  r  r  r  __static_attributes__ r0   r<   r+   r+   6   sJ   QI`>;zIV?;2@B60 B> YD4(6Lp.J`8Et','4I8','*'6'7@4@&;T:(:6;D40
(!!,B@=:=0(0:,=^	=D"14l4R>3A(	1Y($.L(FT-,$5r0   r+   __main__)7binasciir   r   rO   r  rW  unittestmusic21r   r   r   r   r   r	   r
   r   r   music21.midi.baser   r   r   r   r   r   music21.midi.translater   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   music21.musicxmlr"   r#   r$   r%   r&   r'   r(   r)   EnvironmentrH   TestCaser+   r  mainTestr  r0   r<   <module>r     s      	                 " +       &&|4P58 P5h0 zT r0   