
    3jٯ                       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Zd dl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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 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' d dl(m)Z) d!dZ* G d dejV                        Z, G d dejV                        Z-e.d k(  rd dlZ ej^                  e,       yy)"    )annotationsN)ElementTree
fromstring)articulations)chord)common)	converter)corpus)defaults)duration)dynamics)expressions)harmony)
instrument)layout)meter)note)repeat)spanner)stream)style)tempo)helpers)testPrimitive)GeneralObjectExporterScoreExporterMusicXMLWarningMusicXMLExportException)MeasureParserc                0    t        j                  dd|       S )zc
    Collapse all whitespace (say, in some XML) to a single space,
    for ease of comparison.
    z\s+ )resub)txts    K/DATA/.local/lib/python3.12/site-packages/music21/musicxml/test_m21ToXml.pystripInnerSpacesr&   )   s    
 66&#s##    c                      e Zd Zd Zd(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(y'))Testc                ^    t               }|j                  |      }|j                  d      }|S )Nutf-8)r   parsedecode)selfobjgexbytesOutbytesOutUnicodes        r%   getXmlzTest.getXml3   s+    #%99S>"//'2r'   c                    |rt               }|j                  |      }t        |      }||_        |j	                         }t        j                  |       |S )z8
        Return a <score-partwise> ElementTree.
        )r   fromGeneralObjectr   makeNotationr,   r   indent)r.   r/   r6   r0   SXmxScores         r%   getETz
Test.getET9   sL     ')C'',C3&((*wr'   c                   t        j                         }t        j                         }d|_        |j	                  t        j                  d             |j	                  |       d}|dz  }| j                  t              5 }|j                          d d d        | j                  t        j                        |       y # 1 sw Y   /xY w)NzOffstage Trumpetg      `?quarterLengthz)In part (Offstage Trumpet), measure (1): z9Cannot convert "2048th" duration to MusicXML (too short).)r   ScorePartpartNameinsertr   NoteassertRaisesr   writeassertEqualstr	exception)r.   spmsgerrors        r%   testExceptionMessagezTest.testExceptionMessageG   s    LLNKKM'
	(45	9JJ675GGI 8U__-s3 87s   CC
c                   t        j                  d      }t        |j                         j                        }|d   }|d   }t        j                  ||g      }|j                  d|       |d   }|d   }|d   }t        j                  |||g      }	|j                  d|	       |d   }
|d	   }t        j                  |
|g      }|j                  d|       | j                  | j                  |      j                  d
      d       y )Nz*tinynotation: 4/4 c4 d e f g a b c' b a g2r                          z<slur )r	   r,   listrecursenotesr   SlurrA   rE   r3   count)r.   rI   	listNotescdsl1fgasl2c2g2sl3s                r%   testSpannersWritezTest.testSpannersWriteT   s    OOHI**+	aLaLllAq6"	caLaLaLllAq!9%	cq\r]llB8$	cQ--h7;r'   c                   t        j                         }t        j                         }|j                  d|       t        j                         }|j                  d|       t        j
                         }|j                  d|       t        j                  dd      }t        j                         }t        j                         }|j                  d|       |j                  d|       |j                  d|       t        j                  ||      }t        j                  ||      }	|j                  ||	f       | j                  |      }
| j                  t!        d      t!        |
             y )Nr   CrQ   r<      as  <measure implicit="no" number="0">
                       <attributes>
                           <divisions>10080</divisions>
                       </attributes>
                       <note>
                           <pitch>
                               <step>C</step>
                               <octave>4</octave>
                           </pitch>
                           <duration>40320</duration>
                           <type>whole</type>
                       </note>
                       <backup>
                           <duration>40320</duration>
                       </backup>
                       <direction placement="below">
                           <direction-type>
                               <wedge number="1" spread="0" type="crescendo" />
                           </direction-type>
                       </direction>
                       <forward>
                           <duration>20160</duration>
                       </forward>
                       <direction placement="below">
                           <direction-type>
                               <wedge number="2" spread="15" type="diminuendo" />
                           </direction-type>
                       </direction>
                       <direction placement="below">
                           <direction-type>
                               <wedge number="1" spread="15" type="stop" />
                           </direction-type>
                       </direction>
                       <forward>
                           <duration>20160</duration>
                       </forward>
                       <direction placement="below">
                           <direction-type>
                               <wedge number="2" spread="0" type="stop" />
                           </direction-type>
                       </direction>
                   </measure>)r   r>   r?   rA   MeasureVoicer   rB   r   SpannerAnchorr   	Crescendo
Diminuendoappendr3   assertInr&   )r.   scorepartmeasurevoicensa1sa2crescdimxmlOuts              r%   testSpannerAnchorszTest.testSpannerAnchorsh   s   {{}Q.."Awq% IIc+##%##%QQQ""1c*!!#s+eS\"U#)!*"V V$Y-	
r'   c                b   t        j                         dz  dz  }t        j                  |dz        }| j	                  t        |j                        d       | j                  |j                  d   t        j                         | j	                  t        |j                  d   j                        d       | j	                  t        |j                  d   j                        d       | j                  |j                  d   j                  d   t        j                         |j                  d       | j	                  t        |j                  d   j                        d       | j                  |      }|j                  d      d   }| j!                  t#        d	      t#        |             y
)z
        Test that spanners are gathered on the PartStaffs that need them.

        Multi-staff instruments are separated on import into distinct PartStaff
        objects, where usually all the spanners will remain on the first object.
        musicxmllilypondTestSuitez43e-Multistaff-ClefDynamics.xmlrN   r   TinPlacez
</backup>
a   <direction placement="below">
                        <direction-type>
                            <wedge number="1" spread="0" type="crescendo" />
                        </direction-type>
                        <staff>2</staff>
                    </direction>N)r   getSourceFilePathr	   r,   rE   lenspannersassertIsInstancer   
StaffGrouppartsr   rl   r6   r3   splitro   r&   )r.   xmlDirrH   ry   xmlAfterFirstBackups        r%   testSpannersWritePartStaffsz Test.testSpannersWritePartStaffs   sT    ))+j8;NNOOF%FFG 	QZZ!,ajjmV->->? 	QWWQZ00115QWWQZ00115aggaj11!4h6H6HI 	
t$QWWQZ00115 Q$ll=9!<$% 01		
r'   c                x   t        j                         }t        j                  |g      }t        j                  |g      }| j                  |      }| j                  d|       t        j                         }t        j                  |g      }|j                  d|       | j                  |      }| j                  d|       | j                  d|       d|_	        | j                  |      }| j                  d|       | j                  d|       d|_	        | j                  |      }| j                  d|       y )	Nz<voice>1</voice>r   z<voice>2</voice>   z<voice>234</voice>z<voice>235</voice>helloz<voice>hello</voice>)
r   rB   r   rj   ri   r3   assertNotInrA   ro   id)r.   rt   v1mry   n2v2s          r%   testLowVoiceNumberszTest.testLowVoiceNumbers   s    IIK\\1#NNB4 Q+V4YY[\\2$	BQ(&1(&1Q*F3*F3Q,f5r'   c                   t        j                         }t        j                  |g      }t        j                  |g      }t        j                         }t        j                  |g      }t        j                  |g      }t        j
                  ||g      }t        j                         }t        j                  |g      }	t        j                  |	g      }
t        j                         }t        j                  |g      }t        j                  |g      }t        j
                  |
|g      }t        j                         }t        j                  |g      }t        j                  |g      }t        j                         }t        j                  |g      }t        j                  |g      }t        j
                  ||g      }t        j                  |||g      }t        j                  |||g      }|j                  d|       | j                  |d      }|j                  d      }|D ]J  }|j                  d      }|j                  d      }| j                  |j                  |j                         L y )Nr   Fr6   zpart/measure/noters   staff)r   rB   r   rj   ri   	PartStaffr>   r   r   rA   r:   findallfindrE   text)r.   n1_1v1_1m1_1n1_2v1_2m1_2ps1n2_1v2_1m2_1n2_2v2_2m2_2ps2n3_1v3_1m3_1n3_2v3_2m3_2ps3rH   
staffGrouptreemxNotesmxNoters   r   s                                r%   (testVoiceNumberOffsetsThreeStaffsInGroupz-Test.testVoiceNumberOffsetsThreeStaffsInGroup   s   yy{||TF#~~tf%yy{||TF#~~tf%d|,yy{||TF#~~tf%yy{||TF#~~tf%d|,yy{||TF#~~tf%yy{||TF#~~tf%d|,LL#sC)&&S#7
	Jzz!%z0,,23FKK(EKK(EUZZ4	 r'   c                P   t        j                         dz  dz  }|dz  }t        j                  |      }|t        j
                     j                         }| j                  |      }| j                  d|       | j                  d|       | j                  d|       | j                  |      }|j                  d      }|d   }| j                  |j                  d	      d
       | j                  t        |      d       | j                  |d   j                  d       | j                  |d   j                  d       |d   }	| j                  t        |	      d       |	D 
cg c]  }
|
j                   }}
| j                  |g d       | j                  |	j                  d      j                   d       | j                  |	j                  d      d   j                   d       | j                  |	j                  d      d   j                   d       | j                  |	j                  d      d   j                   d       | j                  |	j                  d      d   j                   d       |d   }| j                  t        |      d       |D 
cg c]  }
|
j                   }}
| j                  |g d       | j#                  |j                  d      j                          | j                  |j                  d      d   j                   d       | j                  |j                  d      d   j                   d       | j                  |j                  d      d   j                   d       | j                  |j                  d      d   j                   d       y c c}
w c c}
w )Nr|   r}   z!61l-Lyrics-Elisions-Syllables.xmlz<lyric name="1" number="1">z<syllabic>begin</syllabic>z<text>a</text>zpart/measure/note/lyricr   number1rh   syllabicrN   r   rR   )r   r   elisionr   r   r   r!   middlebr[   r\   ende)r   r   r	   r,   r   NotRestfirstr3   ro   r:   r   rE   getr   tagr   r   assertIsNone)r.   r   fprH   n1ry   r   mxLyricsly0ly1childtagsly2s                r%   testCompositeLyricszTest.testCompositeLyrics  s   ))+j8;NN99OOBt||_""$R3V<2F;&/zz!}<< 9:qk*C0S1%QZ0QV, qkS1%'*+se		s+RS),1137Z0388(CV,Q/44c:Z0388(CV,Q/44c:qkS1%'*+se		s+RS#((9-223Z0388(CV,Q/44c:Z0388%@V,Q/44c:! , ,s   "NN#c                   t        j                  dddd      }| j                  |      }|j                  d      }| j	                  t        |      d       |d   }|j                  d      }|j                  d	      }| j	                  |j                  d       | j	                  |j                  d
      j                  d       | j	                  |j                  d      j                  d       | j	                  |j                  d      j                  d       | j	                  |j                  d      j                  d       t               }|j                  |      }| j	                  |j                  d      |j                  d             | j	                  |j                  d      |j                  d             | j	                  |j                         |j                                y)z
        This test checks for the issue in 1756 where a chord symbol imported
        with both inversion and bass would not have them both set.

        There were multiple bugs fixed, so important to check.
        FzA-rN   minor)rootbass	inversionkindpart/measure/harmonyr   r   z	root-stepr   r   r   zbass/bass-stepAzbass/bass-alterz-1F)r   N)r   ChordSymbolr:   r   rE   r   r   r   r   xmlToChordSymbolr   r   r   )	r.   explicitFm6et
harmonyEls	harmonyElr   rootStepmpcss	            r%   #testExportChordSymbolWithInversionsz(Test.testExportChordSymbolWithInversions5  s    ))sQXYZZ$ZZ 67
Z!,qM	~~f%99[),/44g>4993?(89>>D(9:??F _  +))u)5rwwEw7JK))u)5rwwEw7JK..0",,.Ar'   c                p   t        j                  d      }d|_        | j                  |      }|j	                  d      }| j                  |j                  d      d       t        j                  d      }| j                  |      }|j	                  d      }| j                  |j                  d             y )Nrg   belowr   	placementG)r   r   r   r:   r   rE   r   r   )r.   r   r   r   cs2et2
harmonyEl2s          r%   testExportChordSymbolPlacementz#Test.testExportChordSymbolPlacementQ  s      %ZZ^GG23	{3W=!!#&jjoXX45
*..56r'   c                   t        j                         }t        j                         }t        j                         }|j	                  t        j                  d             |j                  t        j                  d      d       |j	                  |       t        j                         }|j	                  t        j                                |j                  t        j                  d      d       |j	                  t        j                  d             |j                  t        j                  d      d       |j	                  |       |j	                  |       | j                  d| j                  |      j                  d             | j                  d| j                  |      j                  d             | j                  d| j                  |      j                  d             t        j                         }t        j                         }t        j                         }|j	                  t        j                                |j                  t        j                  d      d       |j	                  t        j                  d             |j                  t        j                  d      d       |j	                  |       t        j                         }|j	                  t        j                  d	             |j                  t        j                  d      d       |j	                  t        j                  d             |j                  t        j                  d      d       |j	                  |       |j	                  |       | j                  d| j                  |      j                  d             | j                  d| j                  |      j                  d
             y )Nrg   rQ   rh   rP   z<harmonyrN   z<kind text="N.C.">none</kind>z<root-step text="">zNo Chordz!<kind text="No Chord">none</kind>)r   r>   r?   ri   rn   r   r   repeatAppendr   rB   NoChordrE   r3   rY   )r.   rH   rI   r   s       r%   testExportNCzTest.testExportNC]  s   LLNKKMNN	$$S)*	tyy~q)	NN	"#	tyy~q)	$$S)*	tyy~q)		DKKN00<=DKKN001PQRDKKN001FGHLLNKKMNN	"#	tyy~q)	$$S)*	tyy~q)	NN	,-	tyy~q)	$$S)*	tyy~q)		DKKN001PQRDKKN001TUVr'   c                   t        j                  d      }t        j                  |g      }t	        |      }|j                          |D cg c]  }|j                  dk(  s| }}| j                  ||j                  d d        y c c}w )Nztinynotation: 4/4 c1 d1r   rN   )	r	   r,   r   r>   r   setPartsAndRefStreamoffsetassertSequenceEqualelements)r.   rI   scsxr   measuresAtOffsetZeros         r%   testSetPartsAndRefStreamMeasurez$Test.testSetPartsAndRefStreamMeasure  sv    OO56\\1#2
!+,>1aA1>  !5qzz"1~F  ?s   B Bc                "   t        j                         }|j                  t        j                  d             |j                  t        j                                |j                  t        j                                t        |      }| j                  t              5 }t        |j                         j                  d            }ddd       | j                  t        |      j                  d      d   t!        j"                               | j                  dt!        |j"                               | j%                  t        |      t!        |j"                               | j'                  j)                  d      g        y# 1 sw Y   xY w)zF
        Badly nested streams should warn but output no gaps.
        1/4r+   Nz 0xr   z/ is not well-formed; see isWellFormedNotation()
.//forward)r   r>   rn   r   TimeSignaturer   rB   r   assertWarnsr   et_fromstringr,   r-   ro   reprr   rF   warningr   r   r   )r.   rH   r0   cmr   s        r%   testFromScoreNoPartszTest.testFromScoreNoParts  s    LLN	$$U+,		#A&o." !3!3G!<=D /d1gmmE*1-s2::?GRZZY 	a#bjj/2 	  l!;R@ /.s   )FFc                    t        j                         }|j                  t        j                                t        |      }|j                         }| j                  |j                  d             y )N
.//measure)	r   r>   rn   r   rB   r   r,   assertIsNotNoner   )r.   rH   
scExporterr   s       r%   testFromScoreNoMeasureszTest.testFromScoreNoMeasures  sN    LLN	"1%
!TYY|45r'   c                   t        j                  t        j                         t	        j
                  d      g      }t        j                  |      }d|_        t        j                  t        j                  t        j                         t	        j
                         g            }t        j                  ||g      }| j                  |j                  d       t        |      }t        |j                         j                  d            }| j                  t        |j!                  d            d       | j                  |j#                  d      j$                  d       d|_        t        |      }t        |j                         j                  d            }| j                  t        |j!                  d            d       | j                  |j#                  d      j$                  d       y	)
z@
        A score with mixed sounding and written parts.
        rg   Tunknownr+   z.//transposerN   z.//stepDN)r   ri   r   Clarinetr   rB   r?   atSoundingPitchBassoonr>   rE   r   r   r,   r-   r   r   r   r   )r.   r   p1p2rH   r0   r   s          r%   testFromSoundingPitchzTest.testFromSoundingPitch  s\    NNJ//1499S>BC[[^![[););)=tyy{(KLMLL"b"**I6#A&SYY[//89T\\.9:A>9-22C8 #A&SYY[//89T\\.9:A>9-22C8r'   c           
     r   t        j                  t        j                  t        j                         t        j                  d      g      t        j                  t        j                         t        j                  d      g      t        j                  t        j                         t        j                  d      g      g      }t        j                  t        j                  t        j                         t        j                  d      g      t        j                  t        j                         t        j                  d      g      t        j                  t        j                         t        j                  d      g      g      }t        j                  ||g      }t        |      }|j                         }| j                  t        |j                  d            d       | j                  t        |j                  d            d       | j                  |j                  d      j                  d      |j                  d      j                  d             | j!                  |j                  d      j                  d      |j                  d      d   j                  d             y	)
a  
        This is a score for two woodwind players both doubling on
        flute and oboe. They both switch to flute and then back to oboe.
        There are six m21 instruments to represent this, but the
        <score-instrument> tags need just four, since no
        musicXML <part> needs two oboes in it, etc., unless
        there is a patch change/MIDI instrument change.
        wholetype.//score-instrumentrQ   .//measure/note/instrumentrS   r   rT   N)r   r?   ri   r   Oboer   rB   Fluter>   r   r,   rE   r   r   r   r   assertNotEqual)r.   r	  r
  rH   scExr   s         r%   testMultipleInstrumentszTest.testMultipleInstruments  s    [[NNJOO-tyyg/FGHNNJ,,.		w0GHINNJOO-tyyg/FGH
 
 [[NNJOO-tyyg/FGHNNJ,,.		w0GHINNJOO-tyyg/FGH
 
 LL"b"Qzz|T\\*?@A1ET\\*FGH!L#89==dC#?@DDTJ	LDII&;<@@F LL)EFrJNNtT	Vr'   c           
     D   t        j                  t        j                  t        j                         t        j                  d      g      t        j                  t        j                         t        j                  d      g      t        j                  t        j                         t        j                  d      g      g      }t        j                  t        j                  t        j                         t        j                  d      g      t        j                  t        j                  d      g      t        j                  t        j                  d      g      g      }t        j                  ||g      }t        j                  |||g      }t        |      }|j                         }| j                  |j!                  d      D ch c]  }|j"                   c}h d       | j                  t%        |j!                  d            d       y c c}w )Nr  r  z.//instrument-name>   Electric OrganElectric PianoPianorj   r  rS   )r   r   ri   r   ElectricPianor   rB   ElectricOrganr  Vocalistr   r   r>   r   r,   rE   r   r   r   )r.   r   r   sgrH   r  r   els           r%   testMultipleInstrumentsPianoz!Test.testMultipleInstrumentsPiano  s   NNJ446		w8OPQNNJ446		w8OPQNNJ,,.		w0GHI 
 
 NNJ//1499'3JKLNNDII7345NNDII7345 
 
 Sz*LL#sB(Qzz|#||,@ABARWWABB	

 	T\\*FGH!L Cs   Hc                   t        j                  dd      }|j                  t        j                  d             t        j
                  |      }t        |      }|j                         }|j                  d      D ]@  }| j                  d|j                  v        | j                  |j                  d      d       B y)	zo Check that id of measure are exported
            as attributes of the <measure> eelement in MusicXML
        testrN   )r   r   r  r  r   r   N)r   ri   rn   r   rB   r>   r   r,   r   
assertTrueattribrE   r   )r.   rr   rH   r  r   measure_xmls         r%   testExportIdOfMeasurezTest.testExportIdOfMeasure  s     ..F15tyyg./LL!Qzz|<<5KOODK$6$667[__T2F; 6r'   c                   t        j                         }d|_        t        j                  d      }|j                  d      j                  |       t        j                  |      }t        |      }|j	                         }|j                  d      d   }|j                  d      d   }| j                  |j                  d      |j                  d             y )N*   ztinyNotation: c1rN   r  r   z.//midi-instrumentr   )r   
InstrumentmidiProgramr	   r,   rr   rA   r   r>   r   r   rE   r   )r.   irH   r   r  r   mxScoreInstrumentmxMidiInstruments           r%   testMidiInstrumentNoNamezTest.testMidiInstrumentNoName  s    !!#OO./			!A\\!_"2&
! LL)>?B<<(<=a@*..t46F6J6J46PQr'   c                    t        j                  t        j                        }| j	                  |      }|j                  d      }| j                  |D cg c]  }|j                   c}g d       y c c}w )Nz.//ornaments/accidental-mark)naturalsharpzthree-quarters-flat)r	   r,   r   notations32ar:   r   rE   r   )r.   rH   xaccidentalMarksaccMarks        r%   testOrnamentAccidentalszTest.testOrnamentAccidentals  s\    OOM667JJqM))$BC)89gW\\97	
9s   A3c                   t        j                  t        j                        }| j	                  |      }|j                  d      }| j                  |D cg c]  }|j                  d       c}g d       |j                         }|j                  d       | j	                  |      }|j                  d      }| j                  |D cg c]  }|j                  d       c}g d       d|j                  d   j                  t        j                        j                         _        | j	                  |      }|j                  d      }| j                  |D cg c]  }|j                  d       c}g d       y c c}w c c}w c c}w )N	.//endingr   )1,2r9  3r:  Tr~   r   ) r;  r:  r:  )r	   r,   r   multiDigitEndingr:   r   rE   r   templater6   r   getElementsByClassr   RepeatBracketr   r   )r.   rH   r3  endingsr   r=  s         r%   testMultiDigitEndingsWritezTest.testMultiDigitEndingsWrite  s=    OOM::;JJqM))K(7;7a!%%/7;=UV ::<d+JJx ))K(7;7a!%%/7;=UV OP
%%g&;&;<BBDKJJqM))K(7;7a!%%/7;=OP < < <s   E?
FF	c           	     H   t        j                  t        j                        }| j	                  |      }|j                  d      }| j                  |D cg c]  }|j                  d       c}g d       d d gdd gd d gd dgdd gd d gd dgd d gd}|j                  d      }| j                  t        |      d       |D ]M  }|j                  d      }| j                  |	      5  t        ||   d
   d u      }	t        ||   d   d u      }
d}d}|j                  d      }t        |      D ]  \  }}|j                  d      dk(  rAd}d }|j                  d      }||j                  d      }| j                  |||   d
          [|j                  d      dk(  spd}d }|j                  d      }||j                  d      }| j                  |||   d           |	r| j                  |       |
r| j                  |       d d d        P y c c}w # 1 sw Y   axY w)Nr8  r   )r   r   2rC  startstop)r   rC  r:  45678r      )measureNumberr   rN   Fz
.//barlinelocationleftTendingr  right)r	   r,   r   multiMeasureEndingr:   r   rE   r   r   subTestbool	enumerater   r#  )r.   rH   r3  r@  r   expectedEndingsmeasuresrr   
measNumberexpectLeftBarlineexpectRightBarlinegotLeftBarlinegotRightBarlinebarlinesr+  barlineleftEndingType
leftEndingrightEndingTyperightEndings                       r%   testMultiMeasureEndingsWritez!Test.testMultiMeasureEndingsWrite-  s,   $ OOM<<=JJqM))K(7;7a!%%/7;=QR 44

 99\*X*G X.JJ7$()DQ)Gt)S$T!%)/**Ea*HPT*T%U"!&"'"??<8"+H"5JAw{{:.&8)-)-%,\\(%;
%1-7^^F-CN((9TUV9WX Z0G;*.*.&-ll8&<&2.9oof.EO((/*:UVW:XY #6  %OON3%OOO45 87   <" 87s   H'B6HA(HH!	c                   t        j                  d      }t        j                         }d|_        t        j
                         }t        j                  d      }d|_        |j                  d      j                  |||g       | j                  |      }|j                  d      D ]"  }| j                  |j                  d             $ |j                  d	      }| j                  |j!                  d
      d       y)zL
        Transfer element offset after calling getTextExpression().
        ztinynotation: 4/4 c1FLangsam)r   aboverN   z.//directionr   zpart/measure/directionr   N)r	   r,   r   Coda	useSymbolFiner   MetronomeMarkr   rr   
storeAtEndr:   r   r   r   rE   r   )r.   rH   r[   r^   mmr   	directionmxDirections           r%   testTextExpressionOffsetzTest.testTextExpressionOffseto  s    
 OO23KKMKKM  i0			!Ar
+zz!}n5IinnX67 6 ii 895w?r'   c                   t        j                  d      }|t        j                     j	                         }d|_        | j                  |j                  d       | j                  |      }| j                  t        |j                  d            d       |j                  d      }| j                  |j                  d      d       | j                  |j                  d             y )	Nztinynotation: 9/8 r1g      @auto.//restrN   rr   yesz.//note/type)r	   r,   r   Restr   r=   rE   fullMeasurer:   r   r   r   r   r   )r.   rH   rr   rests        r%   testFullMeasureRestzTest.testFullMeasureRest  s    OO23diiL /zz!} 	T\\)45q9yy#),e4$))N34r'   c                   t        j                         }t        j                         }|j                  j	                  |       t        j
                         }|j                  j	                  |       | j                  |j                  d       t        |      }t        |j                         j                  d            }| j                  |j                  d             | j                  |j                  d             y )Nr   r+   z	.//stringz.//other-technical)r   rB   r   StringIndicationrn   HammerOnrE   r   r   r   r,   r-   r   r   )r.   rt   r`   hr0   r   s         r%   testArticulationSpecialCasesz!Test.testArticulationSpecialCases  s    IIK**,	q!""$ 	
q! 	1%#A&SYY[//89$))K01$))$89:r'   c                   t        j                  t        j                  d      g      }d|t         j                     j                         _        d|t         j                     j                         _        t               j                  |      }| j                  |      }| j                  t        |j                  d            d       d|t         j                     j                         _        t               j                  |      }| j                  |      }| j                  t        |j                  d            d       y )NztinyNotation: 4/4 c4       @g      ?rq  r   rN   )r   r>   r	   r,   ri   r   paddingLeftpaddingRightr   r5   r:   rE   r   r   )r.   rH   r   s      r%   testMeasurePaddingzTest.testMeasurePadding  s    LL)//*@ABC03&..!-14&..!.!#55a8zz!}T\\)45q903&..!-!#55a8zz!}T\\)45q9r'   c                @   t        j                  d      j                  d   }t        j                  d      |j                  d      _        |j                         j                  t        j                        j                         }|j                  dt        j                  d             |j                  d       |j                         }| j                  |      }| j                  |j                  d	             | j!                  |j                  d
             y)af  
        Instrument tags were causing forward motion in some cases.
        From Chapter 14, Key Signatures

        This is a transposed score.  Instruments were being extended in duration
        in the toSoundingPitch and not having their durations restored afterwards
        leading to Instrument objects being split if the duration was complex
        zbach/bwv57.8z#Altoz6/8   r   z2/4Tr~   z.//noter   N)r
   r,   r   r   r   rr   timeSignatureflattengetElementsNotOfClassr   rA   makeMeasuresr6   r:   r#  r   assertFalse)r.   altonewAltonewAltoFixedr   s        r%   #test_instrumentDoesNotCreateForwardz(Test.test_instrumentDoesNotCreateForward  s     ||N+11':(-(;(;E(BQ%,,.66u7J7JKRRTq%--e45T*++-zz,'Y/0l34r'   c                   t        j                         }|j                  t        j                                |j                  t        j                                |j                  t        j                                |j                  t        j                                t        j                         }t        j                         }t        j                         }|j                  d|       |j                  d|       |j                  ||       |j                  |       t        j                         }|j                  |       t        j                         }|j                  |       | j                  |      }d}d}	|j                         D ]=  }
|
j                  dk(  s|
}|j                         D ]  }
|
j                  dk(  s|
}	 n  n | j!                  |       | j!                  |	       t#        |	j$                        }d}|j'                  d      D ]  }
|
j)                  d      }|t#        |j$                        }t+        j,                  t/        j0                  ||            }|
j                  d	k(  rt+        j,                  ||z
        }}t+        j,                  ||z         } | j3                  |d
       y)z
        Write to MusicXML from a Measure containing SpannerAnchors was not positioning
        the current time offset correctly before starting the next written measure.
        Now the next measure is positioned at the correct offset.
        g      ?g      ?Nrr   	divisionsrO   *r   backupg      @)r   ri   rn   r   rB   r   rl   r   rk   rA   addSpannedElementsr?   r>   r:   iterr   r   intr   r   r   r   opFrac	fractionsFractionrE   )r.   m1rw   startAnchor	endAnchorrI   rH   r   measEldivisionsElr  divisionsIntcurrOffsetQLdurdurIntdurQLs                   r%   5test_writeFromSpannerAnchorsGetsMeasureEndOffsetRightz:Test.test_writeFromSpannerAnchorsGetsMeasureEndOffsetRight  s    ^^
		$))+
		$))+
		$))+
		$))+""$++-))+	
		#{#
		#y!  i8
		%KKM	LLN	zz!} ))+Bvv" ++-Bvv,&( (   	V$[);++,..%B''*%CSXXi&8&8&NO66X%#)==1E#FL#)==1E#FL & 	s+r'   c                N   t        j                         }|j                  t        j                  d             |j                  t        j                                |j                  dt        j                  dd             t        j                  |g      }t        j                  |g      }| j                  |d      }| j                  |j                  d             | j                  t!        |j                  d      d	   j"                        t$        j&                         y
)z
        A metronome mark at an offset exceeding the bar duration was causing
        <forward> tags, i.e. hidden rests. Prefer <offset> instead.
        r   rh   slow(   Fr   r   z.//direction/offsetr   N)r   ri   rn   r   r   r   rs  rA   r   ri  r?   r>   r:   r  r   rE   r  r   r   divisionsPerQuarter)r.   r   rI   rH   r   s        r%   -testOutOfBoundsExpressionDoesNotCreateForwardz2Test.testOutOfBoundsExpressionDoesNotCreateForward  s    
 NN	$$U+,		E''34KKLL!zz!%z0l3423A6;;<((	*r'   c           
        ddddddddddddddddd	dddf}t        j                  t        j                        }| j	                  |      }|j                  d
      }t        |j                  d            D ]S  \  }}| j                  |      5  ||   D ]*  }| j                  |j                  |d      ||   |          , 	 d d d        U t        |      }dddddddddddddddddddd	dddf}	t        j                  t        j                        }| j	                  |      }|j                  d
      }t        |j                  d            D ]V  \  }}| j                  ||z         5  |	|   D ]*  }| j                  |j                  |d      |	|   |          , 	 d d d        X y # 1 sw Y   DxY w# 1 sw Y   pxY w)NrD  rr  r   )r  liner   change)r  r  discontinueresumerE  rq   z.//pedal)pedal_indexr;  )r  signr   )r	   r,   r   
pedalLinesr:   r   rT  r   rR  rE   r   r   pedalSymLines)
r.   expectedResults1rH   r3  mxPartr+  mxPedalkstartIdxexpectedResults2s
             r%   
testPedalszTest.testPedals  s      !
 &
 !
 !
 -
8 OOM445JJqM#FNN:$>?JAw!,)!,A$$W[[B%79I!9LQ9OP - -, @
 '(   !
 !
 &
 !
 !
 5
B OOM778JJqM#FNN:$>?JAw(Q,7)!,A$$W[[B%79I!9LQ9OP - 87 @U -,V 87s   3F673G6G 	G	c                   d}t        j                  t        j                        }| j	                  |      }|j                  d      }|j                  d      }t        |j                  d            D ]}  \  }}| j                  |      5  d }d }	|j                  d      }
|
"|
j                  d      }|
j                  d      }	||   j                  d      rZ| j                  |       |j                  d	      }d
D ])  }||   j                  |      s| j                  ||       + 	 d d d        ||   j                  d      r| j                  |	       |	j                  d      }||   dk(  r| j                  |       	 d d d        dD ])  }||   j                  |      s| j                  ||       + 	 d d d        T| j                  |	       | j                  |       d d d         y # 1 sw Y   xY w)N)
arpeggiater  r  arpeggiate upr  r  r  r  r  arpeggiate downr  r  r  r  r  znon-arpeggiate bottomr;  znon-arpeggiate topr  r  r  rq   rr   r   
note_index	notationsnon-arpeggiater  r  )topbottomrl  )updown)r	   r,   r   arpeggio32dr:   r   rT  r   rR  
startswithr   r   endswithrE   r   )r.   expectedResultsrH   r3  r  	mxMeasurer+  r   nonArparpr  
nonArpTypewhichEndarpDirectionrl  s                  r%   testArpeggioszTest.testArpeggios^  s   
. OOM556JJqMKK	*	"9#4#4V#<=IAv+"KK4	(&^^,<=F#..6C"1%001AB((0!'F!3J$5*1-66x@ ,,ZB %6  ,+ #1%00>((-#&77;#7L&q)\9)),7 ' ,+( &4	*1-66yA ,,\9E &4 / ,+0 !!#&!!&)3 ,+ >++s,   B	G5G54AG5G5(G5"G55G?	c                   d}t        j                  t        j                        }| j	                  |      }|j                  d      }|j                  d      }t        |j                  d            D ]p  \  }}| j                  |      5  d }d }	|j                  d      }
|
|
j                  d      }||j                  d      }	| j                  |	||          d d d        r y # 1 sw Y   }xY w)	N)NNNr   r   r   NNNr   r   r   rq   rr   r   r  r  r  r   )r	   r,   r   multiStaffArpeggiosr:   r   rT  r   rR  r   rE   )r.   expectedNumberrH   r3  r  r  r  r   r  arpNumr  s              r%   testArpeggioMarkSpannerszTest.testArpeggioMarkSpanners  s    
( OOM==>JJqMKK	*	"+I,=,=f,E"FJ4"KK4	(#..6C? WWX.F  
)CD 54 #G44s   AC''C0	c                   t        j                  g d      }t        j                  d      }t	        j
                  ||gd      }t        j                         }|j                  |       t        j                  |g      }t        j                         }|j                  |       t        j                  |g      }t        j                  ||g      }t        j                  ||||g      }	| j                  |	      }
|
j                  d      }|j                  d      }t        |j!                  d            D ]  \  }}| j#                  |      5  d }d	}|j                  d
      }|H|j                  d      }|dv r|| j%                  d|d       |dv r1|/| j%                  d|d       n|dv r| j%                  d|d       |#|j'                  d      }| j)                  |d       d d d         y # 1 sw Y   xY w)N)C3E3G3D4znon-arpeggio)arpeggioTyperq   rr   r   r  rT   r  r  )rN   rh   znote_index=z should not have non-arpeggiate)r   rP   z should have non-arpeggiatez should have notationsr   r   )r   Chordr   rB   r   ArpeggioMarkSpannerr   ri   rn   r   r   r   r>   r:   r   rT  r   rR  failr   rE   )r.   c1r   amr  r	  m2r
  slrH   r3  r  r  r  r   r  r  r  s                     r%   %testArpeggioMarkSpannersNonArpeggiatez*Test.testArpeggioMarkSpannersNonArpeggiate  s   [[+,YYt_,,b"XNS^^
		"rd#^^
		"rd#Bx(LL"b"b)*JJqMKK	*	"+I,=,=f,E"FJ4"KK4	(#..)9:C!V+		[ZM1P"QR!V+		[ZM1L"MN6)II-CDE? WWX.F$$VS1 54 #G44s   BG::H	c                    dd fd}t        j                  d      }t        j                  d      }t        j                         }|j	                  d|       |j	                  d|        ||dd       t        j                  d	
      }|j	                  d|        ||dd       |j                  |       |j                  |        ||dd       t        j                  d
      }|j	                  d|        ||dd       |j                  |       |j	                  d|        ||dd       d|_	        d|_
        d|_         ||dd       y )NFc                   t        j                  |       } t        j                  |        t	        j
                  | g      }t	        j                  |g      }j                  |d      }j                  t        |j                  d            |       j                  t        |j                  d            |       y )NFr   r   z	.//offset)copydeepcopyr   realizeChordSymbolDurationsr   r?   r>   r:   assertIsrS  r   )rk  
forwardTag	offsetTagrI   rH   r   r.   s         r%   realizeDurationsAndAssertTagszWTest.testExportChordSymbolsWithRealizedDurations.<locals>.realizeDurationsAndAssertTags  s    r"B//3RD!AaS!A::ae:4DMM$t||L9:JGMM$t||K899Er'   C7F7r   rh   T)r  r  halfr  r  )FF)rk  zstream.Measure)r   r   r   ri   rA   r   rs  removerB   writeAsChordr   r=   )r.   r  cs1r   r   r1r   s   `      r%   +testExportChordSymbolsWithRealizedDurationsz0Test.testExportChordSymbolsWithRealizedDurations  s!   	F !!$'!!$'NN	C	C%aDEJ YYF#	B%aEUK 	
	%aDEJ YYG$	B%aETJ 	
	C%aEUK  	%aEUKr'   c                   t        j                         }t        j                  d      }t	        j
                  ddd      }|j                  j                  |       d|j                  _        t        j                  dd      |_
        |j                  |d       |j                  |dg       |j                  |d	       |j                  d
t        j                  d             |j!                  dddd       | j#                  |t        j$                     j'                         j                  d       t)               }| j+                  |j-                  |            }| j/                  t1        |j3                  d            d       y)zV
        Express hidden rests with inexpressible durations as <forward> tags.
        eighthr  r  rQ   F   i  r~  rS   r   z4/4T)r   fillGaps	hideReststimeRangeFromBarDurationg{Gzd?r   rN   N)r   ri   r   rB   r   TupletappendTupletlinkedr  r  r=   r   repeatInsertrA   r   r   	makeRests
assertLessrs  r   r   r:   r5   rE   r   r   )r.   r   	septuplet
tuplet_objr0   r   s         r%   3test_inexpressible_hidden_rests_become_forward_tagsz8Test.test_inexpressible_hidden_rests_become_forward_tags  s)    NN II8,	__Q84
''
3$)	!"+"4"4S#">		y!$	y3%(	y!$	E''./	D44Z^_$))**,::FC#%zz#//23 	T\\,78!<r'   c                   ddl m}  |dd      }d|j                  _         |dd      }d|j                  _        t	        j
                         }|j                  d|       |j                  d|       | j                  |j                         t               j                  |      j                  d	      }| j                  d
|       | j                  d|       d|_        d|_        t               j                  |      j                  d	      }| j                  d|       | j                  d
|       | j                  d|       | j                  d|       | j                  d|       d|j                  _        d|j                  _        t               j                  |      j                  d	      }| j                  d|       | j                  d
|       y )Nr   )RomanNumeralIrg   r  VrO   r~  r+   z	<forward>z<chordFz<numeralz<offsetz<rest)music21.romanr  r   r  r   ri   rA   r#  r  r   r,   r-   r   ro   r=   )r.   r  rn1rn2r   ry   s         r%   test_roman_musicxml_two_kindsz"Test.test_roman_musicxml_two_kinds*  s}   . 3$"3$"NN	c	c 	(()&(..q188Af-h'  &(..q188Aj&)k6*6*F+&)%("%("&(..q188Agv&f-r'   c                n   t        j                  d      }|j                         j                  j	                         }t        j                         |j
                  _        d|j
                  j                  _        t               j                  |      j                  d      }| j                  d|       y )NztinyNotation: 2/4 c2redr+   z<stem color="#FF0000">up</stem>)r	   r,   rV   rW   r   r   Style	stemStylecolorr   r-   ro   )r.   one_note_tune	half_notery   s       r%   !test_stem_style_without_directionz&Test.test_stem_style_without_directionL  s    !(>?!))+11779	$)KKM	!*/	!!'&(..}=DDWM7@r'   N)T))__name__
__module____qualname__r3   r:   rL   re   rz   r   r   r   r   r   r   r   r   r   r  r  r  r   r&  r.  r6  rA  rb  rn  rw  r|  r  r  r  r  r  r  r  r  r  r   r  r   r'   r%   r)   r)   1   s    4<(B
J$
L6*$5L%;NB8
7$WLGA*69*V:M.<R
Q0@5D@*5;(:5&4,l*$NQ`7*r"EH#2L-L^=4 .DAr'   r)   c                      e Zd ZdZd Zy)TestExternalTc                   t        j                  d      }t        |      }|j                         }t        j                  |       t        j                         }|j                  |j                                t        |      }|j                  |dd       |j                         }|j                          |j                  d      }|j                  d      }| j                  rt        |       t        j                  |d      5 }|j!                         }	d d d        t#        t%        j&                  |j)                         	j)                                     }
t+        |
      D ]V  \  }}|j-                  d      s#|j-                  d      s|j-                  d	      s:d
|v r?| j                  sLt        |       X dd l}|j1                  |       y # 1 sw Y   xY w)Ncpebachr+   F)encodingxml_declarationr|   )r  -?+zid=r   )r
   r,   r   r   r7   ioBytesIOrD   	xmlHeaderr   getvaluecloser-   showprintopenreadrU   difflibndiff
splitlinesrT  r  osr  )r.   r   r8   r9   sior   vr   r^   r   differr+  r  r*  s                 r%   
testSimplezTestExternal.testSimpleX  sU    LL# 1((*wjjl		",,.!!
w>LLN		HHW WWZ 99"IWWR'*aB +gmmALLNBMMODE (GAts#ts';ts?SD=99$K ) 	
		" +*s   GGN)r  r  r  r#  r.  r  r'   r%   r  r  U  s    D,r'   r  __main__)r$   rF   )0
__future__r   r  r'  r  r  r"   unittestxml.etree.ElementTreer   r   r   music21r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   music21.musicxmlr   r   music21.musicxml.m21ToXmlr   r   r   r   music21.musicxml.xmlToM21r   r&   TestCaser)   r  r  mainTestr  r'   r%   <module>r9     s    "    	 	  "                   $ *  4$aA8 aAH!/8$$ /d zGT r'   