
    3j5                        d dl mZ d dlZd dlZd dl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mZmZmZmZ d dlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&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m0Z0  ejb                  d      Z2 G d dejf                        Z4e5dk(  rd dlZ ejl                  e4       yy)    )a2b_hexN)chord)	converter)common)corpus)environment)
instrument)interval)key)meter)ChannelVoiceMessages	DeltaTime
MetaEvents	MidiTrack	MidiEventMidiFile)TimedNoteEventTranslateWarningchannelInstrumentDataconductorStreamgetMetaEventsmidiAsciiStringToBinaryStringmidiEventToInstrumentmidiEventsToNotemidiFileToStreamnoteToMidiEventspacketStorageFromSubstreamListprepareStreamForMidistreamHierarchyToMidiTracksstreamToMidiFile"updatePacketStorageWithChannelInfo)testPrimitive)note)
percussion)scale)stream)tempo)tie)volumez
midi.testsc                   |   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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?d+Z,d, Z-d- Z.d. Z/d/ Z0d0 Z1d1 Z2d2 Z3d3 Z4d4 Z5d5 Z6d6 Z7d7 Z8d8 Z9d9 Z:d: Z;d; Z<d< Z=d= Z>d> Z?y*)@Testc                     t               }t        d      }d|_        |j                  j	                  |       d|_        d}||j                         z   }| j                  |dt        d      z          y)zH
        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       ?/DATA/.local/lib/python3.12/site-packages/music21/midi/tests.pytestWriteMThdStrzTest.testWriteMThdStr:   sf     Zl	
		!$
"//"33
Ww7N/O%OPr/   c                    t        j                         dz  dz  }|dz  }t        j                  |g       t	               }|j                  |       |j                          |j                          | j                  t        |j                        d       | j                  |j                  d       | j                  |j                  d        t        j                         }|j                  |       |j!                          |j                          |dz  }t        j                  |g       t	               }|j                  |       |j                          |j                          | j                  t        |j                        d       | j                  |j                  d       | j                  |j                  d        t        j                         }|j                  |       |j!                          |j                          |d	z  }t        j                  |g       t	               }|j                  |       |j                          |j                          | j                  t        |j                        d
       | j                  |j                  d       | j                  |j                  d        t        j                         }|j                  |       |j!                          |j                          |dz  }t        j                  |g       t	               }|j                  |       |j                          |j                          | j                  t        |j                        d       | j                  |j                  d       | j                  |j                  d        t        j                         }|j                  |       |j!                          |j                          y )Nmidir"   
test01.mid   r.   z
test02.mid      z
test03.mid   z
test04.mid   i  )r   getSourceFilePathenvironLocal
printDebugr   openreadcloser6   lenr2   r4   ticksPerSecondioBytesIOopenFileLikewrite)r7   dirLibfpr8   fileLikeOpens        r;   testBasicImportz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|
%



r/   c                    t        j                         dz  dz  }|dz  }t        j                  |g       t	               }|j                  |       |j                          |j                          |j                  d   }| j                  |j                  d       | j                  t        |j                        d       d}|t        |j                        dz
  k  rk| j                  |j                  |   t               | j                  |j                  |dz      t               |dz  }|t        |j                        dz
  k  rjy y )	Nr>   r"   r?   r-      t   r   r@   )r   rE   rF   rG   r   rH   rI   rJ   r2   r6   lengthrK   eventsassertIsInstancer   r   )r7   rQ   rR   r8   track2is         r;   testInternalDataModelzTest.testInternalDataModel   s
   ))+f4Fl"%Z

	

1 	, 	V]]+S1#fmm$q((!!&--"2I>!!&--A"6	B FA #fmm$q((r/   c                 &   t        d      }g dg dg dg dg}d}d}|D ]  \  }}}t        |      }||z
  |_        |j                  j	                  |       t        |      }	t        j                  |	_        d|	_	        ||	_
        ||	_        |j                  j	                  |	       t        |      }||_        |j                  j	                  |       t        |      }	t        j                  |	_        d|	_	        ||	_
        d|	_        |j                  j	                  |	       ||z   }||z  } t        |      }|j                  j	                  |       t        |      }	t        j                  |	_        d|	_	        d|	_        |j                  j	                  |	       t               }
d|
_        |
j"                  j	                  |       t%        j&                         }|
j)                  |       |
j+                          |
j-                          y )	Nr-   rB   <   Z   )rB   2   F   )rB   3   x   )rB   >   P   r   r/   rB   )r   r   timerY   r3   r   r   NOTE_ONtypechannelpitchvelocityr   END_OF_TRACKdatar   r4   r2   rM   rN   rO   rP   rJ   )r7   mtro   timeNowtLastdpvdtmer8   rS   s               r;   testBasicExportzTest.testBasicExport   s   q\  GAq!2BoBGIIR 2B*22BGBJBHBKIIR  2BBGIIR 2B*22BGBJBHBKIIR aKEqLG7 < r]
		r]))

		
 Z!%
		zz|
%



r/   c                     t        d      }t        |      }|j                  d       |j                  d       |j                  d       y )Nr-   r      i8)r   r   setPitchBend)r7   rp   rw   s      r;   testSetPitchBendzTest.testSetPitchBend   s8    q\r]


r/   c                 \   t        d      }g d}||D cg c]  }|  c}z  }g dgdz  }d}d}t        |      D ]x  \  }}|\  }	}
}t        |      }||z
  |_        |j                  j                  |       t        |t        j                  d      }|j                  ||          |j                  j                  |       t        |      }||z
  |_        |j                  j                  |       t        |t        j                  d      }|
|_        ||_        |j                  j                  |       t        |      }|	|_        |j                  j                  |       t        |t        j                  d      }|
|_        d|_        |j                  j                  |       ||	z   }||	z  }{ t        |      }|j                  j                  |       t        |      }t        j                  |_        d|_        d|_        |j                  j                  |       |j%                  d       t'               }d	|_        |j*                  j                  |       t-        j.                         }|j1                  |       |j3                          |j5                          y c c}w )
Nr-   )
r      r   rb   r   d   r      r   rz   r_      r   )rj   rk   r/      rB   )r   	enumerater   rh   rY   r3   r   r   
PITCH_BENDr{   ri   rl   rm   r   rn   rj   rk   ro   
setChannelr   r4   r2   rM   rN   rO   rP   rJ   )r7   rp   pbValuesxro   rq   rr   r\   ers   rt   ru   rv   rw   r8   rS   s                   r;   testWritePitchBendAzTest.testWritePitchBendA   s9   q\ :*AaR** "$dODAqGAq!2BoBGIIR 2$8$C$CQOBOOHQK(IIR 2BoBGIIR 2$8$@$@!LBBHBKIIR  2BBGIIR 2$8$@$@!LBBHBKIIR aKEqLGG $L r]
		r]))

		 	aZ!%
		zz|
%



A +s   
J)c                    t        j                         dz  dz  }|dz  }t        j                  |      }| j	                  t        |j                        d       | j	                  t        |j                  d   j                         j                        d       | j	                  t        |j                  d   j                         j                        d       y )	Nr>   r"   z
test09.midr@   r   i  r-   iX  )	r   rE   r   parser6   rK   partsrecursenotesr7   rQ   rR   ss       r;   testImportWithRunningStatusz Test.testImportWithRunningStatusG  s    ))+f4Fl" OOBQWWq)QWWQZ//1778#>QWWQZ//1778#>r/   c                    t               }|j                  d       t               }t        j                  |_        d|_        d|_        d|_        |j                  j                  t        |j                        dz
  |j                  d          |j                  j                  t        |j                        dz
  |       t               }|g|_        |j                         }t               }|j                  |       |j                  d   j                  D cg c]!  }|j
                  t        j                  k(  r|# c}d   }| j!                  |j                  d       | j!                  |j                  d       y c c}w )Ns   MTrk       @ CZ C  / r-   r`   ra   r@   r   )r   rI   r   r   POLYPHONIC_KEY_PRESSURErj   rk   
parameter1
parameter2rY   insertrK   r   r2   writestrreadstrr6   )r7   rp   pressurewritingFilebyteStrreadingFiler   pressureEventReads           r;   testReadPolyphonicKeyPressurez"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   &E>c                     t               }|j                  d       | j                  t        |j                        d       | j                  |j                  d   j
                  t        j                         y )Ns    DUMMY  
Myut  X   r   )r   processDataToEventsr6   rK   rY   rj   r   UNKNOWN)r7   rp   s     r;   testReadUnknownMetaMessagezTest.testReadUnknownMetaMessagen  sZ    [
  B 	CRYY+1**J,>,>?r/   c                     g }|j                  d       g }|j                  |       t        |      }| j                  |dt        d      z   dz   t        d      z          y )Nz
0 90 1f 15)tracksEventsListr0   000000060001000103c0s   MTrk0000000400901f0f)r3   r   r6   r   )r7   asciiMidiEventList	midiTrackr:   s       r;   !testMidiAsciiStringToBinaryStringz&Test.testMidiAsciiStringToBinaryStringw  sn    !!,/ 	+, 3IN
 7+A#BB"#%,-?%@A	Br/   c                 :   t        j                  d      }d|_        t        |      }| j	                  t        |      d       | j                  |d   t               | j                  |d   t               | j                  |d   t               | j                  |d   t               t        t        |d   j                  |d   j                  |d               }| j	                  |j                  j                  d       | j	                  |j                  d       y )NA4g       @rC   r   r-   r@   r   )r#   NotequarterLengthr   r6   rK   rZ   r   r   r   r   rh   rl   nameWithOctave)r7   n1	eventListn2s       r;   testNotez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/r/   c                    t        j                         }t        j                  dd      }t	        j
                  d      |_        t        j                  dd      }t	        j
                  d      |_        t        j                  dd      }t        j                  dd      }|j                  ||||g       t        |      d   }|j                  D cg c];  }|j                  t        j                  t        j                  fv s0|j                  = }}| j                  |t        j                  t        j                  gdz         |j                  d	       t        |      d   }|j                  D cg c];  }|j                  t        j                  t        j                  fv s0|j                  = }	}| j                  |	t        j                  t        j                  gdz         y c c}w c c}w )
NC4      ?r   startstopr-   r   T)inPlace)r&   Streamr#   r   r(   Tier3   r   rY   rj   r   ri   NOTE_OFFassertListEqualmakeMeasures)
r7   r   nr   n3n4r9   eventmt1noteOnOffEventTypesmt2noteOnOffEventTypess
             r;   testStripTieszTest.testStripTies  s   MMOIId#. YYt3/YYt3/YYt3/	!RR!)!,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/91G4+G4c                    t        j                         }d|_        t        j                         }t        d      D ]&  }|j                  t        j                  |             ( |j                  dt        j                  d             |j                  dt        j                  d             |j                  dt        j                  d             t        |      d   }| j                  t        |j                        d	       t!        |j                        }d
}| j#                  t%        j&                  ||      |       y )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   ranger3   copydeepcopyr   r   TimeSignaturer   r6   rK   rY   repr
assertTruer   whitespaceEqual)r7   r   r   r\   rp   conductorEventsmatchs          r;   testTimeSignaturezTest.testTimeSignature  s    IIKMMOrAHHT]]1%&  	
E''./	E''./	E''./(+A.RYY, ryy/	E 	..FXr/   c                    t        j                         }d|_        t        j                         }t        d      D ]&  }|j                  t        j                  |             ( |j                  dt        j                  d             |j                  dt        j                  d             |j                  dt        j                  d             |j                  dt        j                  d	             |j                  dt        j                  d
             |j                  dt        j                  d             t        |      d   }| j                  t!        |j"                        d       y )Nr   r   r   r   r   r   r   r   rC   r      )r#   r   r   r&   r   r   r3   r   r   r   r   r   r   KeySignaturer   r6   rK   rY   )r7   r   r   r\   	conductors        r;   testKeySignaturezTest.testKeySignature  s   IIKMMOrAHHT]]1%&  	
E''./	E''./	E''./	C$$Q'(	C$$R()	C$$Q'(/215	Y--.3r/   c                    t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  g}g }t        j                         }t        |      D ]y  \  }}t        j                         } |       }|j                  |       |j                  d|       |j                  t        j                  d             |j                  d|       { t!        |      \  }}	| j#                  |j%                         t'        d |D                     | j)                  t'        |j+                               h d       | j-                  |	g d       t/        t1        dd            }
t!        ||
      \  }}	| j#                  |j%                         t'        d	 |D                     | j)                  t'        |j+                               h d
       | j-                  |	dg       t        |      D ]  \  }}d|z
  |_         t!        |      \  }}	| j#                  |j%                         t'        d |D                     | j)                  t'        |j+                               h d       | j-                  |	g d       d|d   _        d}|dz  }|dz  }| j5                  t6        |      5  t!        |      \  }}	d d d        | j#                  |j%                         t'        d |D                     | j)                  t'        |j+                               h d       | j-                  |	g d       y # 1 sw Y   yxY w)Nr   C#c              3   4   K   | ]  }|j                     y wNmidiProgram.0insts     r;   	<genexpr>z-Test.testChannelAllocation.<locals>.<genexpr>       8\V[d9I9IV[   >   r-   r@   r   rC   rA   r   )
r      r   	                  r   r      )acceptableChannelListc              3   4   K   | ]  }|j                     y wr   r   r   s     r;   r   z-Test.testChannelAllocation.<locals>.<genexpr>  r   r   >   r   r   r   r   r   r   r   r   c              3   4   K   | ]  }|j                     y wr   r   r   s     r;   r   z-Test.testChannelAllocation.<locals>.<genexpr>   r   r   >   r   r   r   r   r   r   )	r-   r@   r   rC   rA   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   4   K   | ]  }|j                     y wr   r   r   s     r;   r   z-Test.testChannelAllocation.<locals>.<genexpr>+  r   r   >   r-   r   r   r   r   r   )	r@   r   rC   rA   r   r   r   r   r   )r	   HarpsichordViolaElectricGuitarFlute
VibraphoneBassDrumHiHatCymbalr&   Scorer   Partr3   r   r#   r   r   r6   keyssetassertSetEqualvaluesr   listr   midiChannelassertWarnsRegexr   )r7   iListiObjsr   r\   	instClassrt   r   channelByInstrumentchannelsDynamicacliObjwants                r;   testChannelAllocationzTest.testChannelAllocation  s   ''!!**!!&&$$'' LLN%e,LAy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^a/b,_,113S8\V[8\5\]C 3 : : <=?WX_rd3 !'GAt!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&&M/c           
         d t         j                  t         j                  t         j                  t         j                  d g}g }g }t        |      D ]  \  }}t        j                         }|* |       }|j                  |       |j                  d|       |dk7  r$|j                  t        j                  d             |j                  |        t        |d      }| j                  |t               | j                  t!        |j#                               g d       |d   }	| j                  |	t               | j%                  t'        |	j#                               ddh       | j)                  |	d   |d          | j                  |	d   t                | j+                  |	d          | j                  |	d   d   t               |d   j,                  d|d   j,                  d	|d	   j,                  d
|d
   j,                  dd di}
t/        ||
       | j%                  t'        |	j#                               h d       | j                  |	d   d       | j                  |	d   d   d   d       y )Nr   r   F)addStartDelay)r   r-   r@   r   rC   rA   r-   
rawPacketsinitInstrumentr@   r   rC   rA   >   r  initChannelr  r  )r	   r   r   r   r   r   r&   r   r3   r   r#   r   r   rZ   dictr6   r  r   r  r  assertIsr   r   r!   )r7   r  r  substreamListr\   r	  rt   r   packetStorageharpsPacketchannelInfos              r;   testPacketStoragezTest.testPacketStorage/  s0   ''!!**!! %e,LAy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Ir/   c                    t        j                  d      }|j                  d   }t        |      d   }d}d | _        t        |j                  d d       }| j                  t        j                  ||      |       d}|j                  d   }t        |      d   }t        |j                  d d       }| j                  t        j                  ||      |       |j                  d   }t        |      }| j                  t        |      d	       d
}t        |d   j                  d d       }| j                  t        j                  ||      |       y )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>]rA   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   r@   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strrY   r   r   r   r6   rK   )	r7   r   sopranomtsr   foundaltomtamtLists	            r;   testAnacrusisTimingzTest.testAnacrusisTiming_  s2   LL) ''*%)'2156 CJJrN#..ue<eDX www)$/2CJJrN#..ue<eD ''*%,W5Va(X F1I$$Sb)*..ue<eDr/   c                    t        j                         }|j                  t        j                                |j                  t        j                  dd      d       t        j                         }|j                  t        j                                |j                  t        j                  dd      d       t        j                         }|j                  t        j                                |j                  t        j                  dd      d       t        j                         }|j                  d	|       |j                  d	|       |j                  d	|       t        |       y )
Ng6      ?r   rC   c1r@   e4r-   r   )r&   r   r3   r	   DulcimerrepeatAppendr#   r   TubaTubularBellsr   r   r   )r7   p1p2p3r   s        r;   testMidiProgramChangeAzTest.testMidiProgramChangeA  s    [[]
		*%%'(
		$c:A>[[]
		*//#$
		$a8!<[[]
		*))+,
		$a8!<LLN	B	B	B#A&r/   c                 (   t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  g}t        j                         }|j!                  dd      }t#        j$                  |       t'        j(                         }t+        d      D ]e  }t-        j.                  ||t1        |      z           }d|_         ||t1        |      z            }|j5                  |       |j5                  |       g t7        |       y )Nc2c5   r   )r	   r   
Clavichord	AccordionCelesta
Contrabassr   Harpr   UkuleleBanjoPiccoloAltoSaxophoneTrumpetr%   
MinorScale
getPitchesrandomshuffler&   r   r   r#   r   rK   r   r3   r   )r7   r  scpitchesr   r\   r   r   s           r;   testMidiProgramChangeBzTest.testMidiProgramChangeB  s   ''&&
(<(<##Z%:%:J<L<L*";";Z=O=O!!:#5#5z7O7O##%  --d+wMMOrA		'!c'l"234A!AO(5SZ(*DHHTNHHQK  	$A&r/   c                     t        j                  d      }|j                         }t        |      }| j	                  t        |      d       d}t        |d   j                  dd        }| j                  t        j                  ||      |       y )Nbwv66.6r@   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   r6   rK   r  rY   r   r   r   )r7   r   sFlatr%  r   resultss         r;   testOverlappedEventsAzTest.testOverlappedEventsA  sy    LL#		,U3Va(E$ fQi&&st,-..w>Hr/   c                 >   t        j                         }|j                  dd      }t        j                  |       d}d}d}t        j                         }|D ]8  }t        j                  |      }||z
  |_	        |j                  ||       ||z   }: t        |       y )Nr5  r6  r   r   r   )r%   
MajorScalerC  rD  rE  r&   r   r#   r   r   r   r   )	r7   rF  rG  durstepor   rt   r   s	            r;   testOverlappedEventsBzTest.testOverlappedEventsB  s     --d+wMMOA		!A!AgAOHHQNDA	  	$A&r/   c                    t        j                         }|j                  t        j                  d             |j                  t        j                  d             |j                  dt        j                  d             t        j                  d      }d|j                  _
        |j                  d|       t        j                  g dd	      }d
|j                  d   _
        |j                  |       |j                  }|j                  |t        j                  d             |j                  |t        j                  d             t!        |       y )Nr   r   r   cgr~   )rs   fahalfrj   ir-   r   b)r&   r   r   r   r   r   r   r#   r   rl   	microtoner   ChordrG  r3   highestTimer   )r7   r   r   rV  poss        r;   testOverlappedEventsCzTest.testOverlappedEventsC  s    MMO	!!!$%	$$U+,	DIIcN#IIcN	AKKf5!$		!	mm	diin%	diin%#A&r/   c                    t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                   t         j"                  t         j$                  t         j&                  t         j(                  t         j*                  t         j,                  g}t/        j0                         }|j3                  dd      }t5        j6                         }t9        |      D ]M  \  }}t;        j<                  |      }d|_         ||          }|jA                  |       |jA                  |       O tC        |       y )Nr5  r6  r)  )"r	   r   r8  r9  r:  r;  r   r<  r   r=  r>  r?  r@  rA  Clarinetr   ViolinSopranoOboer.  SitarOcarinaPianor%   rP  rC  r&   r   r   r#   r   r   r3   r   )	r7   r  rF  rG  r   r\   rt   r   r   s	            r;   testExternalMidiProgramChangeBz#Test.testExternalMidiProgramChangeB  s>   '')>)>
@T@T##Z%:%:J<L<L*";";Z=O=O!!:#5#5z7O7O##Z%8%8*:J:J""J$6$6
*"2"2J4F4F!!#  --d+ MMOg&DAq		!A!AO58:DHHTNHHQK ' 	$A&r/   c                    t        j                         }|j                  t        j                  dd             |j                  t        j                  dd             |j                  t        j                  dd             |j                  t        j                  dd             |j                  t        j                  dd             |j                  dt        j                  d	d
             t        |       y )Nc4wholer[  c~4c#4c#~4d4r   g3r   r   )r&   r   r3   r#   r   r   r   )r7   r   s     r;   testMicrotonalOutputAzTest.testMicrotonalOutputA+  s    MMO	4g./	5w/0	5w/0	601	4g./ 	
DIId"56#A&r/   c                 N   t        j                         }|j                  t        j                  dd             |j                  t        j                  dd             |j                  t        j                  dd             |j                  t        j                  dd             |j                  t        j                  dd             t        j                         }|j                  dt        j                  d	d
             t        j                         }|j                  d|       |j                  d|       t        |      }| j                  |d   j                         dg       | j                  |d   j                         ddg       t        j                         }|j                  d|       |j                  d|       t        |      }| j                  |d   j                         dg       | j                  |d   j                         ddg       y )Nrl  rm  r[  rn  ro  rp  rq  r   g2r   r   r-   r@   )
r&   r   r3   r#   r   r   r   r   r6   getChannels)r7   r0  r1  r   r!  s        r;   testMicrotonalOutputBz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6r/   c                 J   t         j                  t         j                  t         j                  t         j                  g}g d}t        j                         }t        |      D ]  \  }}t        j                         }|j                  d |              ||   \  }}}	t        |      D ](  }
|j                  t        j                  |	|             * |j                  d|        t        |      }| j                  |d   j!                         g        | j                  |d   j!                         dg       | j                  |d   j!                         dg       | j                  |d   j!                         dg       | j                  |d   j!                         dg       y )N))r   r-   C6)rC   r@   G3)r@   rC   E4)r         ?C5r   r   r-   r@   r   rC   )r	   r   r   r   r   r&   r   r   r   r   r   r3   r#   r   r   r6   rv  )r7   r  paramsr   r\   r   rt   numberql	pitchNamejr!  s               r;   testInstrumentAssignmentszTest.testInstrumentAssignmentsX  sV   ''!!**!!##
 LLN 'GAtAHHQ$*1I!FB	6]9B?@ #HHQN ( *!,Q++-r2Q++-s3Q++-s3Q++-s3Q++-s3r/   c                 p   t         j                  t         j                  t         j                  t         j                  g}dddgfddddgfdddd	gfd
ddgfg}t        j                         }t        |      D ]  \  }}t        j                         }|j                  d |              ||   \  }}}	t        |      D ]7  }
|j                  t        j                  |	|
t        |	      z     |             9 |j                  d|        t        |      }| j!                  |d   j#                         dg       | j!                  |d   j%                         d
g       | j!                  |d   j#                         ddg       | j!                  |d   j%                         dg       | j!                  |d   j#                         dd
g       | j!                  |d   j%                         dg       | j!                  |d   j#                         dd
g       | j!                  |d   j%                         dg       y )Nr   r-   ry  rC   r@   rz  zG~3r{  E5r   r|  r}  r   r   rA   )   r      I   )r	   r   r   r   r   r&   r   r   r   r   r   r3   r#   r   rK   r   r6   rv  getProgramChanges)r7   r  r~  r   r\   r   rt   r  r  pitchNameListr  r!  s               r;   testMicrotonalOutputDzTest.testMicrotonalOutputDx  s   ''!!**!! a$.a$'a$&dTF#%
 LLN 'GAtAHHQ(.q	%FB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:r/   c                 p   t        j                  d      }|j                  d   }t        j                  |      }t        j                  d      }|j                  |dd       t        j                         }|j                  d|       |j                  d|       t        |      }| j                  |d   j                         dg       | j                  |d   j                         dg       | j                  |d   j                         ddg       | j                  |d   j                         dg       y )	NrJ  r   r   Tr   r^  r   classFilterListr-   r@   r   r   r   r   r   r
   Interval	transposer&   r   r   r   r6   rv  r  )r7   r   r0  r1  	halfSharppostr!  s          r;   testMicrotonalOutputEz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9r/   c                    t        j                  d      }|j                  d   }t        j                  |      }t        j                  |      }t        j                  d      }t        j                  d      }|j                  |dd       |j                  |dd       t        j                         }|j                  d|       |j                  d|       |j                  d|       t        |      }| j                  |d   j                         dg       | j                  |d   j                         dg       | j                  |d	   j                         dd	g       | j                  |d	   j                         dg       | j                  |d
   j                         dd
g       | j                  |d
   j                         dg       y )NrJ  r         )@g     (Tr  r  r-   r@   r   r  	r7   r   r0  r1  r2  t1t2r  r!  s	            r;   testMicrotonalOutputFz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9r/   c                 j   t        j                  d      }|j                  d   }|j                  |j	                  t
        j                        j                                t        j                  |      }t        j                  |      }t        j                  d      }t        j                  d      }|j                  |dt        j                  t        j                   f       |j                  |dt        j                  t        j                   f       t#        j$                         }|j'                  dt        j(                                |j'                  d|       |j'                  dt        j*                                |j'                  d|       |j'                  dt        j,                                |j'                  d|       t/        |      }| j1                  |d	   j3                         d	g       | j1                  |d	   j5                         d
g       | j1                  |d   j3                         ddg       | j1                  |d   j5                         dg       | j1                  |d   j3                         ddg       | j1                  |d   j5                         dg       y )NrJ  r   r  g      Tr  g      ?g      ?r-   r   r@   rC   8   r   rA   r  )r   r   r   removegetElementsByClassr	   
Instrumentfirstr   r   r
   r  r  r#   r   r   r^  r&   r   r   r,  rA  r   r   r6   rv  r  r  s	            r;   testMicrotonalOutputGz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:r/   c                    t        j                         dz  dz  }|dz  }t        j                  |      }|j	                         j                  t        j                        }| j                  t        |      d       | j                  |d   j                  d       | j                  |d   j                  d       | j                  |d	   j                  d
       | j                  |d   j                  d       |dz  }t        j                  |      }|j	                         j                  t        j                        }| j                  t        |      d       | j                  |d   j                  d       |dz  }t        j                  |      }|j	                         j                  t        j                        }| j                  t        |      d       | j                  |d   j                  d       y )Nr>   r"   
test10.midrC   r   g      ^@r-   g     [@r@   g     V@r   g      N@z
test06.midz
test07.midg     f@)r   rE   r   r   rK  r  r'   MetronomeMarkr6   rK   r  )r7   rQ   rR   r   mmStreams        r;   testMidiTempoImportAz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3r/   c                    t        j                         dz  dz  }|dz  }t        j                  |      }| j	                  t        |j                        d       | j	                  |j                  d   t        j                     D cg c]  }|j                   c}g d       | j	                  |j                  d   t        j                     D cg c]  }|j                   c}g d       | j	                  |j                  d	   t        j                     D cg c]  }|j                   c}g d       y c c}w c c}w c c}w )
Nr>   r"   z
test11.midr   r   )FFFFr-   )TTTTr@   )
r   rE   r   r   r6   rK   r   r'   r  numberImplicit)r7   rQ   rR   r   mms        r;   testMidiTempoImportBzTest.testMidiTempoImportB  s   ))+f4Fl"OOBQWWq))*E4G4G)HI)H2R)HI(	
 	)*E4G4G)HI)H2R)HI$	
 	)*E4G4G)HI)H2R)HI$	
 J J Js   D9D>Ec                 X   t        j                         dz  dz  dz  }t        j                  |      }|j                  D ]i  }|j                  t        j                        j                         }|j                  }| j                  |j                  d       | j                  ||       k y )Nr>   r"   
test17.midr   )r   rE   r   r   r   r  r&   Measurer  timeSignaturer6   ratioStringassertIn)r7   rR   r   rt   mtss         r;   testMidiImportMeterzTest.testMidiImportMeter  s    %%'&0?B\QOOBA$$V^^4::<ABR^^U3MM"a 	 r/   c                 H   t        j                         dz  dz  dz  }t               }|j                  |       |j	                          |j                          t               }|j                  d   j                  d d |_        |j                  j                  d|       t        |      }|j                  D ]i  }|j                  t        j                        j                         }|j                   }| j#                  |j$                  d       | j'                  ||       k y )Nr>   r"   r  r   rC   z4/4)r   rE   r   rH   rI   rJ   r   r2   rY   r   r   r   r  r&   r  r  r  r6   r  r  )r7   rR   r8   	new_trackr   rt   r  r  s           r;   testMidiImportImplicitMeterz Test.testMidiImportImplicitMeter(  s    %%'&0?B\Q Z

	

 K	99Q<..r2	
		I&R A$$V^^4::<ABR^^U3MM"a 	 r/   c                    t        j                         }|j                  t        j                  d      d       |j                  dt        j                  d             |j                  dt        j                  d             |j                  dt        j                  d             t        j                         }|j                  t        j                  d	      d       |j                  dt        j                  d
             t        j                         }|j                  d|d|g       t        |      }| j                  t        |      d       t        |d   j                        }| j                  |j!                  d      d       | j                  |j!                  d      d       t        |d   j                        }| j                  |j#                  d      d       | j                  |j#                  d      d       y)z@
        Export conductor data to MIDI conductor track.
        rl  r   r   r   ra   r  r   r7  g4z6/4r   	SET_TEMPOr@   TIME_SIGNATUREr-   r  N)r&   r   r-  r#   r   r   r   r   r'   r  r   r   r6   rK   r   rY   countfind)r7   r0  r1  r   r!  condTrkReprmusicTrkReprs          r;   testMidiExportConductorAz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Ar/   c                    t        j                  d      }|j                  dt        j                  d             |j                  dt        j                  d             |j                  dt        j                  d             |j                  d	t        j                  d
             |j                  dt        j                  d             t        |      }t        |d   j                        }| j                  |j                  d      d       t        |d   j                        }| j                  |j                  d      d       y )NrJ  r      r  rC   r7  r   re   r   ra   r   ih  r  rA   r-   )
r   r   r   r'   r  r   r   rY   r6   r  )r7   r   r!  r  r  s        r;   testMidiExportConductorBz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!<r/   c                 "   d}d}d}t        j                         }t        d      D ]  }t        j                  |t        j
                  dz  z  |z        dz   dz  }||z
  |z  |z   }|j                  t        j                  |             |j                  t        j                  d	              t        |      }| j                  t        |      d       t        |d
   j                        }	| j                  |	j!                  d      d       y )Nr`   iX  rb   r   r@   r-   r   r  rr  r   r  )r&   r   r   mathsinpir3   r'   r  r#   r   r   r6   rK   r   rY   r  )
r7   minTempomaxTempoperiodr   r\   scalarr   r!  mtsReprs
             r;   testMidiExportConductorCzTest.testMidiExportConductorCm  s    MMOsAhhqDGGaK069:Q>#EFX%/8;AHHU((23HHTYYt_%	 
 *!,S1%s1v}}%{3S9r/   c                    t        j                         }|j                  t        j                                t        |      }| j                  t        |      d       t        |d   j                        }| j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d       y)z:
        120 bpm and 4/4 are supplied by default.
        r@   r   r  r-   r  r   N)r&   r   r   r#   r   r   r6   rK   r   rY   r  )r7   r   r!  r  s       r;   testMidiExportConductorDzTest.testMidiExportConductorD|  s     MMO	)!,S1%3q6==)**;7;**+;<a@**<8!<r/   c                    t        j                         }t        j                  d      }t        j                  d      }|j	                  dt        j                  d             |j	                  dt        j                  d             |j	                  dt        j                  d             |j	                  d|       |j	                  d|       t        |      }|j                  t
        j                        }|j                  t        j                        }| j                  t        |      d	       | j                  |d   j                  d       | j                  t        |      d	       y
)zI
        The conductor only gets the first element at an offset.
        ztinynotation: c1ztinynotation: d2 d2r   ,   r     r@   r   r-   N)r&   r   r   r   r   r'   r  r   r   r   r  r6   rK   r  )r7   r   r0  r1  r   temposkeySignaturess          r;   testMidiExportConductorEz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/r/   c                    t        j                         dz  dz  }t        j                  |dz        }| j	                  t        |d         d       t        |      }|j                  d   }|j                  D cg c]!  }|j                  t        j                  u s |# }}| j	                  t        |      d       yc c}w )z(
        Multiple meter changes
        musicxmllilypondTestSuitez11a-TimeSignatures.xmlr   r   r   N)r   rE   r   r   r6   rK   r    r2   rY   rj   r   r  )r7   
source_dirr   r8   r   r   meter_eventss          r;   testMidiExportConductorFzTest.testMidiExportConductorF  s     --/*<?RR
OOJ)AABQ/0"5a IIaL	 ''P'!166Z5N5N+NA' 	 P\*B/Ps   9!B=B=c                    t        j                         }t        d      D ]M  }t        j                  d      }|dz  |j
                  _        d|j
                  _        |j                  |       O t        |      }t        |d   j                        }| j                  |j                  d      d       | j                  |j                  d      d       y )Nr   c3Fr-   zvelocity=114zvelocity=13)r&   r   r   r#   r   r)   velocityScalarvelocityIsRelativer3   r   r   rY   r6   r  )r7   r   r\   r   r!  r  s         r;   testMidiExportVelocityAzTest.testMidiExportVelocityA  s    MMOrA		$A&'"fAHH#*/AHH'HHQK  *!,s1v}}%~6:}5q9r/   Nc                    t        j                         }g d}t        d      D cg c]
  }|dz  dz    }}|t        t	        |            z   }dgdz  dgdz  z   dgdz  z   dgdz  z   dgd	z  z   }t        |      D ]  \  }}t        j                         d
kD  rt        j                         }nt        j                  g d      }	g }
t        |	      D ]M  \  }}t        j                         }||||   z   t        |      z     |_        d|_        |
j!                  |       O |	j#                  |
       |	}||j$                  _        |j!                  |        t        j(                  |       t        j(                  |       t        j                         }t        |      D ]q  \  }}t        j*                  t        j,                  g d            }||j$                  _        ||t        |      z     |j                  _        |j!                  |       s t        j.                         }|j1                  d|       |j1                  d|       t3        |      }| j5                  dt7        |d   j8                               t7        |d   j8                        t7        |d   j8                        z   }| j;                  |j=                  d      d       | j;                  |j=                  d      d       y c c}w )N)r   r   r   r   g      $@g?r)  r-   r   r@   rC   g333333?)r  zd-4g5F)f#2r  ze-2r   r  zvelocity=51zvelocity=102)r&   r   r   r  reversedr   rD  r#   Restr   r^  r)   VolumerK   r  r  r3   
setVolumesdurationr   rE  r   choicer   r   r   r  r   rY   assertGreaterr  )r7   s1shiftr   ampsqlListr  r  rV  chvChordr\   unused_cSubru   s2r   r   r!  r  s                      r;   testMidiExportVelocityBzTest.testMidiExportVelocityB  s_   "MMO).q2AS32d8D>**aS1W$sQw.#:aS1WD v&EAr}}$IIK[[!45.0&/mNA{A'+Qq\SY,F'GA$+0A(MM!$	 '4
 f%')AJJ$IIaL '  	vt'-}}v&EAr		&--(=>?A')AJJ$&*1s4y=&9AHH#IIaL	 ' LLN	B	B)!,k4A#67s1v}}%SV]](;;7==7;7==8!<S 3s   K4c                 l   t        j                         dz  dz  }|dz  }t        j                  |      }| j	                  t        |j                  d   j                         j                        d       | j	                  t        |j                  d   j                         j                        d       | j	                  t        |j                  d   j                         j                        d       | j	                  t        |j                  d   j                         j                        d       y )Nr>   r"   z
test12.midr   r   r-   r@   )	r   rE   r   r   r6   rK   r   rK  r   r   s       r;   testImportTruncationProblemAz!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!<r/   c                    t        j                         dz  dz  }|dz  }t        j                  |      }| j	                  t        |j                         j                        d       |dz  }t        j                  |      }| j	                  t        |t        j                           d       | j	                  t        |j                  j                         j                  d      j                        d       y )Nr>   r"   z
test13.midr   z
test14.midr   r@   )r   rE   r   r   r6   rK   rK  r   r   r^  r   r  measurevoicesr   s       r;   testImportChordVoiceAzTest.testImportChordVoiceA  s     ))+f4Fl"OOBQYY[../3 l"OOBQu{{^,a0QWW]]_44Q7>>?Cr/   c                     t        j                         dz  dz  }|dz  }t        j                  |      }| j	                  t        |t        j                           d       y )Nr>   r"   z
test05.midrA   )r   rE   r   r   r6   rK   r   r^  r   s       r;   testImportChordsAzTest.testImportChordsA  sQ    ))+f4Fl" OOBQu{{^,a0r/   c                      d  _          fd}t        j                  d      }|j                  d   j	                  dd      }t        |      }g d} |||       y )Nc                    g }t        d      D ]  }t        dt        | j                  |   j                        d      D ]y  }| j                  |   j                  |   }| j                  |   j                  |dz      }|j	                  |j
                  |j                  j                  |j                  f       {  j                  ||       y )Nr@   r   r-   )
r   rK   r2   rY   r3   rh   rj   namerl   r6   )mf_innermatch_innertriplesr\   r  rs   r   r7   s          r;   procComparez0Test.testMidiEventsImported.<locals>.procCompare  s    G1Xq#hooa&8&?&?"@!DA *11!4A *11!a%8ANNAFFAFFKK#AB E 
 Wk2r/   zbach/bwv66.6r   r   r   )")r   r  N)r   KEY_SIGNATUREN)r   r  N`'  rn   N)r   SEQUENCE_TRACK_NAMEN)r   r   N)r   PROGRAM_CHANGENr   ri   E   r  r   r
  )r   ri   G   )r  r   r  )r   ri   r  )r  r   r  r	  r  r   ri   D   )r  r   r  r   ri   B   r  r   r  r  )N  r   r  r  r  r   r  r  r  r  r  r  )  r   r  )r   ri   A   )r  r   r  r  r  r  )r  r   r   r   measuresr    )r7   r  r   partr8   r   s   `     r;   testMidiEventsImportedzTest.testMidiEventsImported  sY    	3 LL(wwqz""1a( d#!0D 	Br/   c                 P   t        j                  t        j                        }t	        |      }t        |      }|j                  j                         j                  d      j                  t        j                        j                         }| j                  |t        j                         | j                  |j                  d       t!        j"                         dz  dz  }|dz  }t        j                  |      }| j                  |j                  d   j$                  d       y )Nr-   r   r>   r"   z
test15.midrY  )r   r   r"   transposing01r    r   r   r  r  r  r	   r  rZ   rf  r6   r   r   rE   partName)r7   r   r8   outfirst_instrumentrQ   rR   r  s           r;   testMidiInstrumentToStreamzTest.testMidiInstrumentToStreamK  s    OOM778a r"99??,44Q7JJ!!##(57 	.
@)77; ))+f4Fl"__R !--s3r/   c                    t        j                         dz  dz  }|dz  }t        j                  |      }| j	                  t        |j                  j                         j                  d      j                        d       |j                  j                         j                         j                  d      }| j                  |D cg c]  }|j                  j                   c}ddg       yc c}w )	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-   r@   r   r   N)r   rE   r   r   r6   rK   r   r  r  r  rK  getElementsByOffsetassertSequenceEqualr  r   )r7   rQ   rR   r   elsr   s         r;   testImportZeroDurationNotezTest.testImportZeroDurationNoteZ  s     ))+f4Fl"OOBQWW]]_44Q7>>?Cggmmo%%';;C@  C!HCq!**":":C!H1a&Q!Hs   C/c                    t        j                  t        j                        }t	        |j                         j                        }t        |      }t	        |j                         j                        }| j                  ||       y r   )	r   r   r"   repeatBracketsArK   rK  r   r   r  )r7   r   num_notes_beforepreparednum_notes_afters        r;   testRepeatsExpandedzTest.testRepeatsExpandedg  sa    OOM99:qyy{001'*h..0667?,<=r/   c                    t               }t        dd      |_        t        |      }| j	                  |t
        j                         t        dd      |_        t        |      }| j	                  |t
        j                         y)z
        MuseScore currently writes null bytes at the end of instrument names.
        https://musescore.org/en/node/310158
        zPiccolo utf-8r   N)r   bytesro   r   rZ   r	   r?  r   )r7   r   r\   s      r;    testNullTerminatedInstrumentNamez%Test.testNullTerminatedInstrumentNamen  si    
 ='2
!%(a!3!34 7G,
!%(a!1!12r/   c                    d}|D ]s  }| j                  |      5  t               }t        |d      |_        t        j
                  |_        t        |      }| j                  |j                         d d d        u t               }d|_        d|_
        t        j                  |_        t        |      }| j                  |t        j                         y # 1 sw Y   xY w)N)z    zInstrument 20r  zInst 2r	   )r  r+  r   r   )subTestr   r,  ro   r   INSTRUMENT_NAMErj   r   assertIsNoneinstrumentNamerk   r   r  rZ   r	   UnpitchedPercussion)r7   
lousyNamesr  r   r\   s        r;   testLousyInstrumentDatazTest.testLousyInstrumentData}  s    T
D4(!"41
'77
)%0!!!"2"23 )(  
)88
!%(a!?!?@ )(s   ACC	c                 f   t        j                         }t        j                         }d|_        t        j                         }|j                  t	        j
                  d             |j                  |       |j                  d|       t        |      }| j                  |j                  d       y )Nr   r   r   )	r&   r   priorityr3   r#   r   r   r   r6   )r7   r   rt   r  r   s        r;   testConductorStreamzTest.testConductorStream  sv    MMOMMO
MMO	4!		A#A&	++R0r/   c                 @   t        j                         dz  dz  dz  }t        j                  |      }| j	                  t        |j                  d   j                  d      j                  j                         j                  t        j                              d       y )Nr>   r"   r  r-   r   )r   rE   r   r   r6   rK   r   r  r  lastr  r#   r  )r7   rR   inns      r;   testRestsMadeInVoicezTest.testRestsMadeInVoice  sx    %%'&0?B\Qoob!		!$$Q'..335HHSTVW	Yr/   c           
         t        j                         dz  dz  dz  }t        j                  |      }|j                  j                         }|j                  d      }|j                  d      }| j                  t        |j                        d       | j                  t        |j                        d       | j                  |j                  j                  d       | j                  |j                  |      d       |j                  D ]p  }| j                  |      5  | j                  t        d	 |j!                  t"        j$                        D              |j                  j                         d d d        r y # 1 sw Y   }xY w)
Nr>   r"   r  r-   r@   r   g      @)r  c              3   H   K   | ]  }|j                   j                    y wr   )barDurationr   )r   r  s     r;   r   z/Test.testRestsMadeInMeasures.<locals>.<genexpr>  s#       >(33 >(s    ")r   rE   r   r   r   r;  r  r6   rK   notesAndRestsr   r  r   elementOffsetr/  sumr  r&   r  )r7   rR   r<  pianoLHm1m2r  s          r;   testRestsMadeInMeasuresz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                     t        j                         }|j                  t        j                                t        |       y r   )r&   r   r   r	   r  r    )r7   rt   s     r;   testEmptyExportzTest.testEmptyExport  s,    KKM	&&() 	r/   c                 z   t               }d|_        d|_        t        j                  |_        t               }d|_        d|_        t        j                  |_        d}t        ||f||fg      }|d   d   }t        |t        j                        sJ |d   d   }t        |t        j                        sJ | j                  |j                  d       | j                  |j                  d       t        ||fg      }|d   d   }t        |t        j                        sJ | j                  |j                  d       y)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   Sopranor@   5   N)r   ro   rk   r   r  rj   r   r  r   
isinstancer	   r  r6   r   )r7   event1event2DUMMY_DELTA_TIMEmeta_event_pairsme0me1s          r;   *testImportInstrumentsWithoutProgramChangesz/Test.testImportInstrumentsWithoutProgramChanges  s0    *99 ! 44(+;V*DGWY_F`)ab q!!$#z44555q!!$#z44555!,!, )+;V*D)EFq!!$#z44555"-r/   c           	         t        j                  t        j                         t	        j
                         t        j                  t	        j
                         t	        j
                         g      g      }t        |      }|d   }| j                  |j                  D ch c]  }|j                   c}dh       |j                  D cg c]   }|j                  t        j                  u r|" }}| j                  t!        |      d       | j                  |D ch c]  }|j"                   c}dh       |j%                  d       |j'                  dt        j(                                t        |      }|d   }| j                  |j                  D ch c]  }|j                   c}dh       |j                  D cg c]!  }|j                  t        j                  u s |# }}| j                  t!        |      d       | j                  |D ch c]  }|j"                   c}dh       t        j*                         |j,                  j/                         _        t        |      }|d   }| j                  |j                  D ch c]  }|j                   c}dh       |j                  D cg c]!  }|j                  t        j                  u s |# }}| j                  t!        |      d       | j                  |D cg c]  }|j"                   c}g d       y c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nr-   r   r   #   r   r`   )C   r`   r`   )r&   r  r	   r   r#   	Unpitchedr$   PercussionChordr   r   rY   rk   rj   r   ri   r6   rK   rl   popr   r  Agogor   r  storedInstrument)r7   r  r2   bass_drum_trackevnote_ons
drum_trackmixed_tracks           r;   testExportUnpitchedz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*2bgg9M9U9U.UB* 	 WX*X6Xr"((X6= ,6+;+;+=(,Q/Qik.@.@A.@.@AB4H$++X+2rww:N:V:V/VB+ 	 XX*X6Xr"((X6E? F

 7 AW 7 BX 7sB   L 	%L%L*L/>!L4 L4L9L>0!MMMc                 F   g d}g d}dd|fdd|fdd|fdd	|fg}|D ]  \  }}}t        j                         d
z  dz  |z  }t        j                  ||      }t	        |j                         j                  |      D ]!  \  }	}
| j                  |	j                  |
       #  y )N)"   明u   山u   涌u   水   郁rd     葱 re  u   钟u   灵u   毓u   秀u   海u   天rf  u   东   济rg  u   多u   士u   四u   方u   所rf  u   崇u   早rf  u   育rf  u   文rc  rf  u   种)"   빛u   날   세u   라u   영u   웅u   열rf  u   사u   만ri  u   불u   망u   하u   실rf     이u   옛u   적rj     나u   지u   금rj  rf  rk  u   항u   상u   앙u   모u   합u   니rf  u   다z
test18.midr+  z
test19.midgbkz
test20.midz
test21.mideuc-krr>   r"   )encoding)	r   rE   r   r   ziprK  r   r6   lyric)r7   lyricFactZhlyricFactKo	testCasesfilenamern  	lyricFactrR   r   r   lyricStrs              r;   testMidiImportLyricszTest.testMidiImportLyrics  s    FL
 7K05+.7K08[1	
	 .7)Hh	))+f4FQBX6A!$QYY[%6%6	!BH  (3 "C .7r/   c                    d}d}d}d|fd|fd|fd|fd|fd|fd|fg}|D ]\  \  }}| j                  ||      5  t        j                         }t        j                         }t        j                         }	t	        j
                  d      }
||
_        t	        j
                  d	      }||_        |j                  |
       |	j                  |       |j                  |       |j                  |	       t        j                  |d
|      }| j                  |t               t        j                  |d
|      }|j                         j                  D ]  }| j                  |j                  |         	 d d d        _ y # 1 sw Y   kxY w)Ncatrc  rh  r+  rl  rm  )rn  rp  rl  r  r>   )fmtrn  )r/  r&   r   r   r#   r   rp  r3   r   toDatarZ   r,  	parseDatarK  r   r6   )r7   lyricEnlyricZhlyricKors  rn  rp  r   r0  r1  r   r   r\  r  r   s                  r;   testMidiExportLyricszTest.testMidiExportLyrics%  sX    gGwgGgw
	  )OHexu=LLN[[][[]YYt_ YYt_ 		"		"$$QFXF%%a/''vI**A$$QWWe4 +) >=  )==s   D:FF	c                    ddl m} t        j                         }|j	                  t        j                  dd      d       t        |      }|j                  d   j                  d   }| j                  |j                  |j                         t        |d	
      }|j                  d   j                  d   }| j                  |j                  d       y )Nr   defaultsr   r   r   r@   r  r   FaddEndDelay)music21r  r&   r   r-  r#   r   r    r2   rY   r6   rh   ticksAtStart)r7   r  r   	mfDefaultendDtDefault	mfNoDelayendDtNoDelays          r;   testAddEndDelayzTest.testAddEndDelayK  s    $MMO	tyyS91= %Q'	 ''+2226**H,A,AB %QE:	 ''+2226**A.r/   c                     ddl m} ddlm} | j	                   |       d   j
                  |j                         | j	                   |d      d   j
                  d       y )Nr   r  )getEndEventsFr  )r  r  music21.midi.translater  r6   rh   r  )r7   r  r  s      r;   testGetEndEventsAddEndDelayz Test.testGetEndEventsAddEndDelayZ  sK    $7*//1F1FG%8;@@!Dr/   )returnN)@__name__
__module____qualname__r<   rT   r]   rx   r|   r   r   r   r   r   r   r   r   r   r  r  r&  r3  rH  rN  rT  ra  rj  rs  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r)  r-  r5  r9  r=  rG  rI  rS  ra  rw  r  r  r   r/   r;   r+   r+   6   sV   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4,$5L/Er/   r+   __main__)7binasciir   r   rM   r  rD  unittestr  r   r   r   r   r   r	   r
   r   r   music21.midi.baser   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   music21.musicxmlr"   r#   r$   r%   r&   r'   r(   r)   EnvironmentrF   TestCaser+   r  mainTestr  r/   r;   <module>r     s      	                 " +       &{&&|4hE8 hEX1 zGT r/   