
    3jؑ                   z   d Z ddlm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 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  G d dej@                        Z!e"dk(  rddlZ ejF                  e!       yy)z$
Tests for :mod:`music21.mei.base`.
    )annotationsN)ElementTree)defaultdict)Fraction)mock)articulations)bar)clefduration)
instrument)interval)key)metadata)meter)note)pitch)spanner)stream)tie)base)_XMLID)MEI_NSc            	      ,(   e Zd Zd Zd Zd Zd Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d	       ej                  d
       ej                  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 ej                  d       d!        Z ej                  d"      d#        Zd$ Zd% Z d& Z! ej                  d'       ej                  d(       ej                  d)      d*                      Z" ej                  d'       ej                  d(       ej                  d)      d+                      Z#d, Z$d- Z%d. Z&d/ Z'd0 Z(d1 Z)d2 Z*d3 Z+d4 Z, ej                  d5      d6        Z-d7 Z.d8 Z/d9 Z0d: Z1 ej                  d;      d<        Z2 ej                  d;      d=        Z3 ej                  d;      d>        Z4 ej                  d;      d?        Z5 ej                  d;      d@        Z6 ej                  d;      dA        Z7 ej                  d;      dB        Z8 ej                  dC      dD        Z9 ej                  dC      dE        Z: ej                  dC      dF        Z;dG Z<dH Z=dI Z>dJ Z?dK Z@dL ZAdM ZBdN ZCdO ZDdP ZEdQ ZFdR ZGdS ZHdT ZIdU ZJdV ZKdW ZLdX ZM ej                  d5      dY        ZN ej                  d5      dZ        ZO ej                  d[       ej                  d\       ej                  d]       ej                  d^      d_                             ZPd` ZQda ZR ej                  d[       ej                  d\       ej                  d]       ej                  d^       ej                  db      dc                                    ZSdd ZT ej                  d[       ej                  d\       ej                  d]       ej                  d^       ej                  d        ej                  de       ej                  df      dg                                                  ZUdh ZV ej                  d[       ej                  d\       ej                  d]       ej                  d^       ej                  di       ej                  dj      dk                                           ZWdl ZX ej                  d[       ej                  d\       ej                  d]       ej                  d^       ej                  dm      dn                                    ZYdo ZZ ej                  d[       ej                  d\       ej                  d]       ej                  d^       ej                  dp      dq                                    Z[dr Z\ ej                  ds       ej                  d^       ej                  di      dt                      Z]du Z^dv Z_dw Z` ej                  dx      dy        Za ej                  dx      dz        Zb ej                  d{      d|        Zc ej                  d{      d}        Zdeed~        Zf ej                  d       ej                  d\       ej                  d^       ej                  d      d                             Zgd Zh ej                  d       ej                  d\       ej                  d^       ej                  d      d                             Zid Zj ej                  d       ej                  d\       ej                  d^       ej                  d       ej                  d        ej                  de       ej                  df      d                                                  Zkd Zl ej                  d       ej                  d\       ej                  d^       ej                  d       ej                  di      d                                    Zmd Zn ej                  d       ej                  d\       ej                  d^       ej                  d       ej                  dm      d                                    Zod Zp ej                  d       ej                  d       ej                  d      d                      Zq ej                  d       ej                  d       ej                  d      d                      Zr ej                  d       ej                  d       ej                  d      d                      Zsd Ztd Zud Zv ej                  d       ej                  d       ej                  d      d                      Zw ej                  d       ej                  d       ej                  d      d                      Zx ej                  d       ej                  d       ej                  d      d                      Zy ej                  d       ej                  d       ej                  d      d                      Zzd Z{d Z|d Z} ej                  d      d        Z~d Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d      d                                    Zd Zd Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d       ej                  d      d                                           Zd Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d       ej                  d       ej                  d      d                                                  Zd Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d       ej                  d       ej                  d      d                                                  Zd Z ej                  d      d        Zd Zd Z ej                  d       ej                  d      d               Zd Z ej                  d       ej                  d       ej                  d      d                      Zd Zd Zd Z ej                  d5      d        Zd Zd Zd Z ej                  d      d        Zd Zd ZdÄ ZdĄ Zdń ZdƄ ZdǄ ZdȄ ZdɄ Z ej                  d5      dʄ        Z ej                  d      d˄        Z ej                  d       ej                  d5      d̄               Zd̈́ Zd΄ Z ej                  d5      dτ        ZdЄ Z ej                  d5      dф        Zd҄ Zdӄ ZdԄ Z ej                  dի      dք        Z ej                  dի      dׄ        Z ej                  dի      d؄        Z ej                  dի      dل        Zdڄ Z ej                  d\       ej                  di       ej                  d۫      d܄                      Z ej                  d\       ej                  di       ej                  d۫      d݄                      Z ej                  d\       ej                  di       ej                  d۫      dބ                      Zd߄ Zd Zd Zd Z ej                  d      d        Z ej                  d      d        Z ej                  d      d        Z ej                  d      d        Zd Zd Zd Zd Zd Zd Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d      d                                    Zd Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d      d                                    Zd Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d      d                                    Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d5      d                                    Zd Z ej                  d      d        Z ej                  d       ej                  d       ej                  d       ej                  d      d                             Zɐd  Z ej                  d       ej                  d       ej                  d       ej                  d      d                             Zːd Z ej                  d       ej                  d       ej                  d       ej                  d      d                             Z͐d Z ej                  d       ej                  d       ej                  d       ej                  d      d                             Zϐd	 Z ej                  d5       ej                  d       ej                  d       ej                  d       ej                  d      d
                                    Z ej                  d5      d        ZҐd ZӐd ZԐd Z	 d Z֐d Zאy(  Testc                    t        j                         }| j                  |j                         | j	                  |j
                  t               | j	                  |j                  t        j                         y)zU
        __init__(): no argument gives an "empty" MeiToM21Converter instance
        N)
r   MeiToM21ConverterassertIsNotNonedocumentRootassertIsInstancem21Attrr   
slurBundler   SpannerBundle)selfactuals     B/DATA/.local/lib/python3.12/site-packages/music21/mei/test_base.py	testInit1zTest.testInit1=   sV     '')V001fnnk:f//1F1FG    c                V   d}t        j                  |      }| j                  |j                         | j	                  t
         d|j                  j                         | j                  |j                  t               | j                  |j                  t        j                         y)zC
        __init__(): a valid MEI file is prepared properly
        z<?xml version="1.0" encoding="UTF-8"?>
                       <mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="2013">
                       <music><score></score></music></mei>meiN)r   r   r   r   assertEqualr   tagr    r!   r   r"   r   r#   )r$   	inputFiler%   s      r&   	testInit2zTest.testInit2F   s    ?	 ''	2 	V001F83)<)<)@)@Afnnk:f//1F1FGr(   c                ,   d}| j                  t        j                  t        j                  |       	 t        j                  |       y# t        j                  $ r7}| j	                  t        j
                  |j                  d          Y d}~yd}~ww xY w)zL
        __init__(): an invalid XML file causes an MeiValidityError
        zthis is not an XML filer   N)assertRaisesr   MeiValidityErrorr   r+   _INVALID_XML_DOCargsr$   r-   theErrors      r&   	testInit3zTest.testInit3V   su     .	$//1G1GS	F""9-$$ 	FT22HMM!4DEE	Fs   A	 	B-BBc                J   d}| j                  t        j                  t        j                  |       	 t        j                  |       y# t        j                  $ rF}| j	                  t        j
                  j                  d      |j                  d          Y d}~yd}~ww xY w)zG
        __init__(): a MusicXML file causes an MeiElementError
        a(  <?xml version="1.0" encoding="UTF-8"?>
                       <!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.1 Partwise//EN"
                                                       "http://www.musicxml.org/dtds/partwise.dtd">
                       <score-partwise></score-partwise>zscore-partwiser   N)r0   r   MeiElementErrorr   r+   _WRONG_ROOT_ELEMENTformatr3   r4   s      r&   	testInit4zTest.testInit4a   s    <	 	$..0F0F	R	b""9-## 	bT55<<=MNPXP]P]^_P`aa	bs   A	 	B"<BB"zmusic21.mei.base._ppSlurszmusic21.mei.base._ppTieszmusic21.mei.base._ppBeamszmusic21.mei.base._ppTupletszmusic21.mei.base._ppConcludez!music21.mei.base.scoreFromElementzmusic21.mei.base.makeMetadatac                   t        j                         }t        j                  t        j
                        |_        d|j                  j                  _        t        j                  t        j                        }	|	|_        dt         dt         d}
|j                         }| j                  |	|       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  j                  j                  |
       |j                  d|j                         |j                  |j                         y)z8
        MeiToM21Converter.run(): that it works
        spec_set   .//music//scoreN)r   r   r   	MagicMockETreeElementr   findreturn_valuer   Streamr   runassertIsassert_called_once_withr"   )r$   mockMetamockScoreFEmockConclude
mockTuplet	mockBeamsmockTies	mockSlurstestConvexpScoreexpDocRootQueryr%   s               r&   testRun1zTest.testRun1o   s    ))+ $ F23""/>>6==9#+ xwvhe<h'**84))(3((2))(3,,X6""::?K++Ax/B/BC(()>)>?r(   c                @   d}t        j                  d      }t        j                  |      }| j	                  |j
                  |j
                         | j	                  |j                  |j                         | j	                  |j                  |j                         y)zB
        safePitch(): when ``name`` is a valid pitch name
        D#6Nr   Pitchr   	safePitchr+   name
accidentaloctaver$   r\   expectedr%   s       r&   testSafePitch1zTest.testSafePitch1   sq     ;;u%%4,,f.?.?@&--8r(   c                >   d}t        j                         }t        j                  |      }| j	                  |j
                  |j
                         | j	                  |j                  |j                         | j	                  |j                  |j                         y)zF
        safePitch(): when ``name`` is not a valid pitch name
         NrY   r_   s       r&   testSafePitch2zTest.testSafePitch2   sn     ;;=%4,,f.?.?@&--8r(   c                B   t        j                  d      }t        j                  ddd      }| j	                  |j
                  |j
                         | j	                  |j                  |j                         | j	                  |j                  |j                         y)z_
        safePitch(): when ``name`` is not given, but there are various ``**keywords``
        rX   D#6r\   r]   r^   NrY   r$   r`   r%   s      r&   testSafePitch3zTest.testSafePitch3   sp     ;;u%SSE4,,f.?.?@&--8r(   c                B   t        j                  d      }t        j                  ddd      }| j	                  |j
                  |j
                         | j	                  |j                  |j                         | j	                  |j                  |j                         y)z8
        safePitch(): when 2nd argument is None
        D6rf   Nrh   ri   rY   rj   s      r&   testSafePitch4zTest.testSafePitch4   sp     ;;t$ST#F4,,f.?.?@&--8r(   c                \   t        j                  t        j                        g}t        j                  d      |d   _        t        j                  t        j                        }t        j                  |      |_        dg}t        j                  |      }| j                  ||       y)z?
        allPartsPresent(): one <staffDef>, no repeats
        r=   1rG   r   N)	r   rC   rD   rE   getfindallr   allPartsPresentassertSequenceEqual)r$   	staffDefselemr`   r%   s        r&   testAllPartsPresent1zTest.testAllPartsPresent1   sw     ^^U]];<	>>s;	!~~u}}5~~9=5%%d+  62r(   c                   t        d      D cg c]&  }t        j                  t        j                        ( }}t        d      D ],  }t        j                  t        |dz               ||   _        . t        j                  t        j                        }t        j                  |      |_        t        d      }t        j                  |      }| j                  ||       yc c}w )z5
        allPartsPresent(): four <staffDef>s
           r=      rq   1234Nranger   rC   rD   rE   strrr   rs   listr   rt   ru   r$   _rv   irw   r`   r%   s          r&   testAllPartsPresent2zTest.testAllPartsPresent2   s     FK1XNXT^^U]];X	NqA#~~3q1u:FIaL ~~u}}5~~9=<%%d+  62 Os   +C'c                   t        d      D cg c]&  }t        j                  t        j                        ( }}t        d      D ]/  }t        j                  t        |dz  dz               ||   _        1 t        j                  t        j                        }t        j                  |      |_        t        d      }t        j                  |      }| j                  ||       yc c}w )zM
        allPartsPresent(): four unique <staffDef>s, several repeats
           r=   rz   r{   rq   r|   Nr}   r   s          r&   testAllPartsPresent3zTest.testAllPartsPresent3   s     FK2YOYT^^U]];Y	OrA#~~3A{;KLIaL ~~u}}5~~9=<%%d+  62 Ps   +C*c                p   t        j                  t        j                        }| j	                  t
        j                  t
        j                  |       	 t        j                  |       y# t
        j                  $ r7}| j                  t
        j                  |j                  d          Y d}~yd}~ww xY w)z:
        allPartsPresent(): error: no <staffDef>s
        r=   r   N)r   rC   rD   rE   r0   r   r1   rt   r+   _SEEMINGLY_NO_PARTSr3   )r$   rw   mvErrs      r&   testAllPartsPresent4zTest.testAllPartsPresent4   s     ~~u}}5$//1E1EtL	F  &$$ 	FT55uzz!}EE	Fs   A+ +B5>-B00B5c                    t        j                  dddd      }d}t        j                  |      }| j	                  ||j
                         y)zG
        _timeSigFromAttrs(): that it works (integration test)
        {mei}staffDef38meter.count
meter.unitattrib3/8N)rD   rE   r   _timeSigFromAttrsr+   ratioString)r$   rw   expectedRatioStringr%   s       r&   testTimeSigFromAttrszTest.testTimeSigFromAttrs   sG     }}_SX[5\]#''-,f.@.@Ar(   c                    t        j                  ddddd      }d}t        j                  |      }| j	                  |t
        j                         | j                  ||j                         y)	zd
        _keySigFromAttrs(): using @key.pname, @key.accid, and @key.mode (integration test)
        r   Bfminor)	key.pnamez	key.accidkey.moder   zb-N)	rD   rE   r   _keySigFromAttrsr    r   Keyr+   tonicPitchNameWithCase)r$   rw   expectedTPNWCr%   s       r&   testKeySigFromAttrs1zTest.testKeySigFromAttrs1   sb     }}_3UXBI6K L&&t,fcgg.(E(EFr(   c                   t        j                  dddd      }d}d}t        j                  |      }| j	                  |t
        j                         | j                  ||j                         | j                  ||j                         y)zV
        _keySigFromAttrs(): using @key.sig, and @key.mode (integration test)
        r   6sr   )key.sigr   r      N)
rD   rE   r   r   r    r   KeySignaturer+   sharpsmode)r$   rw   expectedSharpsexpectedModer%   s        r&   testKeySigFromAttrs2zTest.testKeySigFromAttrs2  sr     }}_SZ5[\&&t,fc&6&677v{{3r(   c                    t        j                  dddd      }d}t        j                  |      }| j	                  |t
        j                         | j                  ||j                         y)zX
        _transpositionFromAttrs(): descending transposition (integration test)
        r   -3-2
trans.semi
trans.diatr   m-3N	rD   rE   r   _transpositionFromAttrsr    r   Intervalr+   directedNamer$   rw   expectedNamer%   s       r&   testTranspositionFromAttrs1z Test.testTranspositionFromAttrs1  [     }}_DX\5]^--d3fh&7&78v':':;r(   c                    t        j                  dddd      }d}t        j                  |      }| j	                  |t
        j                         | j                  ||j                         y)zW
        _transpositionFromAttrs(): ascending transposition (integration test)
        r   74r   r   P5Nr   r   s       r&   testTranspositionFromAttrs2z Test.testTranspositionFromAttrs2  s[     }}_CWZ5[\--d3fh&7&78v':':;r(   c                    t        j                  dddd      }d}t        j                  |      }| j	                  |t
        j                         | j                  ||j                         y)zX
        _transpositionFromAttrs(): large ascending interval (integration test)
        r   1911r   r   P12Nr   r   s       r&   testTranspositionFromAttrs3z Test.testTranspositionFromAttrs3!  r   r(   c                    t        j                  dddd      }d}t        j                  |      }| j	                  |t
        j                         | j                  ||j                         y)zU
        _transpositionFromAttrs(): alternate octave spec (integration test)
        r   120r   r   P8Nr   r   s       r&   testTranspositionFromAttrs4z Test.testTranspositionFromAttrs4+  s[     }}_DX[5\]--d3fh&7&78v':':;r(   c                    t        j                  dddd      }d}t        j                  |      }| j	                  |t
        j                         | j                  ||j                         y)zc
        _transpositionFromAttrs(): alternate large descending interval (integration test)
        r   z-19z-4r   r   zP-12Nr   r   s       r&   testTranspositionFromAttrs5z Test.testTranspositionFromAttrs55  s[     }}_EY]5^_--d3fh&7&78v':':;r(   c                    t        j                  dddd      }d}t        j                  |      }| j	                  |t
        j                         | j                  ||j                         y)zf
        _transpositionFromAttrs(): alternate ascending sixteenth interval (integration test)
        r   26rp   r   r   M16Nr   r   s       r&   testTranspositionFromAttrs6z Test.testTranspositionFromAttrs6?  s[     }}_DX[5\]--d3fh&7&78v':':;r(   c                Z    d}d}t        j                  |      }| j                  ||       y)z@
        removeOctothorpe(): when there's an octothorpe
        z%#14ccdc11-8090-49f4-b094-5935f534131az$14ccdc11-8090-49f4-b094-5935f534131aNr   removeOctothorper+   r$   xmlidr`   r%   s       r&   testRemoveOctothorpe1zTest.testRemoveOctothorpe1I  s.     89&&u-6*r(   c                Z    d}d}t        j                  |      }| j                  ||       y)zD
        removeOctothorpe(): when there's not an octothorpe
        z$b05c3007-bc49-4bc2-a970-bb5700cb634dNr   r   s       r&   testRemoveOctothorpe2zTest.testRemoveOctothorpe2R  s.     79&&u-6*r(   zmusic21.mei.base._makeArticListc                    t        j                  dddi      }d|_        t        j                  |      }| j                  d|       |j                  d       y)z@
        articFromElement(): very straight-forward test
        articyesr   r?   N)rD   rE   rG   r   articFromElementr+   rK   )r$   mockMakeListrw   r%   s       r&   testArticFromElementzTest.testArticFromElement[  sO    
 }}Wgu-=>$%!&&t,F#,,U3r(   z$music21.mei.base._accidentalFromAttrc                    t        j                  dddi      }d|_        t        j                  |      }| j                  d|       |j                  d       y)z@
        accidFromElement(): very straight-forward test
        accidr   r   r?   N)rD   rE   rG   r   accidFromElementr+   rK   )r$   	mockAccidrw   r%   s       r&   testAccidFromElementzTest.testAccidFromElementf  sO    
 }}Wgu-=>!"	&&t,F#))%0r(   c                    t        j                         }d|_        d|t        j                         t        j                         dg}d}t        j                  |      }| j                  ||       y)z*
        getVoiceId(): usual case
        *   N  )r   VoiceidrH   Partr   
getVoiceIdr+   )r$   theVoice	fromTheser`   r%   s        r&   testGetVoiceId1zTest.testGetVoiceId1q  sU     <<>8V]]_fkkmSI	+6*r(   c                    dt        j                         t        j                         dg}| j                  t        t
        j                  |       y)zD
        getVoiceId(): no Voice objects causes RuntimeError
        Nr   )r   rH   r   r0   RuntimeErrorr   r   )r$   r   s     r&   testGetVoiceId2zTest.testGetVoiceId2|  s4     6==?FKKM3?	,Cr(   c                   t        j                         }d|_        t        j                         }d|_        d|t        j                         t        j                         |dg}| j                  t        t        j                  |       y)zG
        getVoiceId(): three Voice objects causes RuntimeError
        r      Nr   )	r   r   r   rH   r   r0   r   r   r   )r$   
firstVoice
otherVoicer   s       r&   testGetVoiceId3zTest.testGetVoiceId3  s]     \\^

\\^

:v}}zSVW	,Cr(   zmusic21.mei.base.metaSetTitlez music21.mei.base.metaSetComposerzmusic21.mei.base.metaSetDatec                   t        j                  t        j                        }d|j                  _        t        j                  |      }| j                  |t        j                         |j                  j                  dt         d       | j                  d|j                         | j                  d|j                         | j                  d|j                         y)zA
        makeMetadata() when there is no <work> element.
        r=   Nr@   workr   )r   rC   rD   rE   rF   rG   r   makeMetadatar    r   MetadatarK   r   r+   
call_count)r$   mockDatemockComposer	mockTitler   r%   s         r&   testMakeMeta1zTest.testMakeMeta1  s     ~~u}}=)-&""<0fh&7&7811Cxt2DEH//0L334I001r(   c                   t        j                  t        j                        }t        j                  t        j                        }||j                  _        d |_        d |_        d |_        t        j                  |      }| j                  |t        j                         |j                  j                  dt         d       |j                  ||       |j                  ||       |j                  ||       y)z@
        makeMetadata() when there is a <work> element.
        r=   c                    |S N unusedys     r&   <lambda>z$Test.testMakeMeta2.<locals>.<lambda>  s    r(   c                    |S r  r  r  s     r&   r  z$Test.testMakeMeta2.<locals>.<lambda>  s    Qr(   c                    |S r  r  r  s     r&   r  z$Test.testMakeMeta2.<locals>.<lambda>  s    !r(   r@   r   N)r   rC   rD   rE   rF   rG   side_effectr   r   r    r   r   rK   r   )r$   r   r   r   r   mockWorkr%   s          r&   testMakeMeta2zTest.testMakeMeta2  s     ~~u}}=>>5==9)1&2#6  3	""<0fh&7&7811Cxt2DE((6:,,Xv>))(F;r(   c                X   d}t        j                  |      }d}d}t        j                         }t	        j
                  ||      }| j                  ||       | j                  t        |d             | j                  ||j                         | j                  ||j                         y)zG
        metaSetTitle() with a title and tempo but no subtitle
        z<work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <title>Symphony No. 7</title>
            </titleStmt>
            <tempo>Adagio</tempo>
        </work>zSymphony No. 7AdagiosubtitleN)rD   
fromstringr   r   r   metaSetTitlerJ   assertFalsehasattrr+   titlemovementName)r$   r   expTitleexpMovementNamemetar%   s         r&   testMetaTitle1zTest.testMetaTitle1  s     %#"  """4.dF#z236<<0&*=*=>r(   c                R   d}t        j                  |      }d}t        j                         }t	        j
                  ||      }| j                  ||       | j                  t        |d             | j                  ||j                         | j                  |j                         y)zE
        metaSetTitle() with a title, subtitle, but no tempo
        z<work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <title>Symphony No. 7</title>
                <title type="subtitle">in one movement</title>
            </titleStmt>
        </work>z Symphony No. 7 (in one movement)r  N)rD   r  r   r   r   r  rJ   r  r  r+   r  assertIsNoner  )r$   r   r  r  r%   s        r&   testMetaTitle2zTest.testMetaTitle2  s     %5  """4.dF#z236<<0&--.r(   c                    d}t        j                  |      }t        j                         }t	        j
                  ||      }| j                  ||       | j                  |j                         y)z5
        metaSetComposer() with no composers
        4<work xmlns="http://www.music-encoding.org/ns/mei"/>N)	rD   r  r   r   r   metaSetComposerrJ   r  composer)r$   r   r  r%   s       r&   testMetaComposer1zTest.testMetaComposer1  sZ     J%  "%%dD1dF#&//*r(   c                    d}t        j                  |      }d}t        j                         }t	        j
                  ||      }| j                  ||       | j                  ||j                         y)zC
        metaSetComposer() with one composer in <respStmt>
        z<work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <respStmt>
                    <persName role="composer">Jean Sibelius</persName>
                </respStmt>
            </titleStmt>
        </work>Jean SibeliusN	rD   r  r   r   r   r   rJ   r+   r!  r$   r   expComposerr  r%   s        r&   testMetaComposer2zTest.testMetaComposer2  sb     %%  "%%dD1dF#foo6r(   c                    d}t        j                  |      }d}t        j                         }t	        j
                  ||      }| j                  ||       | j                  ||j                         y)zC
        metaSetComposer() with one composer in <composer>
        z<work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <composer>Jean Sibelius</composer>
            </titleStmt>
        </work>r$  Nr%  r&  s        r&   testMetaComposer3zTest.testMetaComposer3  sb    
 %%  "%%dD1dF#foo6r(   c                    d}t        j                  |      }d}d}t        j                         }t	        j
                  ||      }| j                  ||       |j                  ||fvr| j                  d       yy)zN
        metaSetComposer() with two composers, one specified each way
        a&  <work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <respStmt>
                    <persName role="composer">Jean Sibelius</persName>
                </respStmt>
                <composer>Sibelius, Jean</composer>
            </titleStmt>
        </work>)r$  Sibelius, Jean)r,  r$  z+composer names do not match in either orderN)	rD   r  r   r   r   r   rJ   	composersfail)r$   r   expComposers1expComposers2r  r%   s         r&   testMetaComposer4zTest.testMetaComposer4  sy     %;;  "%%dD1dF#M=#AAIICD Br(   c                    d}t        j                  |      }d}t        j                         }t	        j
                  ||      }| j                  ||       | j                  ||j                         y)z-
        metaSetDate() with no dates
        r  N	rD   r  r   r   r   metaSetDaterJ   r+   dateCreatedr$   r   expDater  r%   s        r&   testMetaDate1zTest.testMetaDate1.  sc     J%  "!!$-dF#&"4"45r(   c                    d}t        j                  |      }d}t        j                         }t	        j
                  ||      }| j                  ||       | j                  ||j                         y)z-
        metaSetDate() with @isodate
        z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date isodate="1924-03-02"/>
                </creation>
            </history>
        </work>
1924/03/02Nr3  r6  s        r&   testMetaDate2zTest.testMetaDate2<  d     %  "!!$-dF#&"4"45r(   c                    d}t        j                  |      }d}t        j                         }t	        j
                  ||      }| j                  ||       | j                  ||j                         y)z)
        metaSetDate() with text
        z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date>1924-03-02</date>
                </creation>
            </history>
        </work>r:  Nr3  r6  s        r&   testMetaDate3zTest.testMetaDate3P  r<  r(   zmusic21.mei.base.environLocalc                Z   d}t        j                  |      }d}t        j                  j	                  d      }t        j                         }t        j                  ||      }| j                  ||       | j                  ||j                         |j                  j                  |       y)z4
        metaSetDate() with text that fails
        z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date>2 March 1924</date>
                </creation>
            </history>
        </work>Nz2 March 1924)rD   r  r   _MISSED_DATEr:   r   r   r4  rJ   r+   r5  warnrK   )r$   mockEnvironr   r7  expWarnr  r%   s          r&   testMetaDate4zTest.testMetaDate4d  s    
 %##**>:  "!!$-dF#&"4"45009r(   c                    d}t        j                  |      }d}t        j                         }t	        j
                  ||      }| j                  ||       | j                  ||j                         y)z=
        metaSetDate() with @notbefore and @notafter
        z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date notbefore="1915" notafter="1924"/>
                </creation>
            </history>
        </work>1915/--/-- to 1924/--/--Nr3  r6  s        r&   testMetaDate5zTest.testMetaDate5{  d     %,  "!!$-dF#&"4"45r(   c                    d}t        j                  |      }d}t        j                         }t	        j
                  ||      }| j                  ||       | j                  ||j                         y)z<
        metaSetDate() with @startdate and @enddate
        z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date startdate="1915" enddate="1924"/>
                </creation>
            </history>
        </work>rF  Nr3  r6  s        r&   testMetaDate6zTest.testMetaDate6  rH  r(   c                n    d}d}dddd}d}t        j                  |||      }| j                  ||       y)z^
        _attrTranslator(): the usual case works properly when "attr" is in "mapping"
        twonumbersr{         onerL  threeN)r   _attrTranslatorr+   )r$   attrr\   mappingr`   r%   s         r&   testAttrTranslator1zTest.testAttrTranslator1  sC     A2%%dD':6*r(   c                ,   d}d}dddd}d}| j                  t        j                  t        j                  |||       	 t        j                  |||       y	# t        j                  $ r)}| j	                  ||j
                  d          Y d	}~y	d	}~ww xY w)
zY
        _attrTranslator(): exception is raised properly when "attr" isn't found
        fourrM  r{   rN  rO  rP  z.Unexpected value for "numbers" attribute: fourr   N)r0   r   MeiValueErrorrS  r+   r3   )r$   rT  r\   rU  r`   r   s         r&   testAttrTranslator2zTest.testAttrTranslator2  s     A2C$,,d.B.BD$PWX	6  tW5!! 	6Xuzz!}55	6s   A B*BBz music21.mei.base._attrTranslatorc                t    d}t        j                  |       |j                  |dt         j                         y)zS
        _accidentalFromAttr(): ensure proper arguments to _attrTranslator
        sr   N)r   _accidentalFromAttrrK   _ACCID_ATTR_DICTr$   	mockTransrT  s      r&   testAccidentalzTest.testAccidental  s/    
   &))$9N9NOr(   c                t    d}t        j                  |       |j                  |dt         j                         y)zQ
        _accidGesFromAttr(): ensure proper arguments to _attrTranslator
        r\  	accid.gesN)r   _accidGesFromAttrrK   _ACCID_GES_ATTR_DICTr_  s      r&   testAccidGeszTest.testAccidGes  s/    
 t$))$T=V=VWr(   c                t    d}t        j                  |       |j                  |dt         j                         y)zS
        _qlDurationFromAttr(): ensure proper arguments to _attrTranslator
        r\  durN)r   _qlDurationFromAttrrK   _DUR_ATTR_DICTr_  s      r&   testDurationzTest.testDuration  s/    
   &))$t7J7JKr(   c                    d}t        j                  dd      |_        d}t        j                  |      }|j                  |dt        j                         | j                  ||       y)zU
        _articulationFromAttr(): ensure proper arguments to _attrTranslator
        marcasdfr?   )r\   rG   )r?   r   N)r   rC   rG   r   _articulationFromAttrrK   _ARTIC_ATTR_DICTr+   )r$   r`  rT  r`   r%   s        r&   testArticulation1zTest.testArticulation1  sY    
 !%V!!L	++D1))$9N9NO6*r(   c                   d}t         j                  t         j                  f}t        j                  |      }| j                  d|j                         t        t        |            D ]  }||   }||   }| j                  ||         y)zJ
        _articulationFromAttr(): proper handling of "marc-stacc"
        z
marc-staccr   N)
r   StrongAccentStaccator   ro  r+   r   r~   lenr    r$   r`  rT  r`   r%   r   
actualHereexpectedHeres           r&   testArticulation2zTest.testArticulation2  sz    
 !..0F0FG++D1I001s8}%AJ#A;L!!*l; &r(   c                   d}t         j                  t         j                  f}t        j                  |      }| j                  d|j                         t        t        |            D ]  }||   }||   }| j                  ||         y)zI
        _articulationFromAttr(): proper handling of "ten-stacc"
        z	ten-staccr   N)
r   Tenutort  r   ro  r+   r   r~   ru  r    rv  s           r&   testArticulation3zTest.testArticulation3  sz    
 !((-*@*@A++D1I001s8}%AJ#A;L!!*l; &r(   c                   d}d}t        j                  |      |_        | j                  t         j                  t         j                  |       |j                  |dt         j                         	 t        j                  |       y# t         j                  $ r)}| j                  ||j                  d          Y d}~yd}~ww xY w)zG
        _articulationFromAttr(): proper handling of not-found
        garbagezerror messager   r   N)	r   rY  r  r0   ro  rK   rp  r+   r3   )r$   r`  rT  r`   r   s        r&   testArticulation4zTest.testArticulation4  s    
 " $ 2 28 <	$,,d.H.H$O))$9N9NO	6&&t,!! 	6Xuzz!}55	6s   0B CB==Cz&music21.mei.base._articulationFromAttrc                l    d}dg|_         dg}t        j                  |      }| j                  ||       y)zN
        _makeArticList(): properly handles single-articulation lists
        accaccentN)rG   r   _makeArticListr+   )r$   	mockArticrT  r`   r%   s        r&   testArticList1zTest.testArticList1  s:    
 "*	:$$T*6*r(   c                    d}dgdgdggfd|_         g d}t        j                  |      }| j                  ||       y)zM
        _makeArticList(): properly handles multi-articulation lists
        zacc stacc marcr  staccatomarcatoc                &    j                  d      S Nr   popr  mockReturnss    r&   r  z%Test.testArticList2.<locals>.<lambda>#  s    {q/Ar(   )r  r  r  Nr  r   r  r+   r$   r  rT  r`   r%   r  s        @r&   testArticList2zTest.testArticList2  sI    
   zJ<)= A	4$$T*6*r(   c                    d}dgddgdggfd|_         g d}t        j                  |      }| j                  ||       y)zO
        _makeArticList(): properly handles the compound articulations
        zacc marc-stacc marcr  r  r  c                 &    j                  d      S r  r  r  s    r&   r  z%Test.testArticList3.<locals>.<lambda>/  s    0Br(   )r  r  r  r  Nr  r  s        @r&   testArticList3zTest.testArticList3(  sL    
 % zIz#:YKH B	?$$T*6*r(   c                `    d}d}d}t        j                  ||      }| j                  ||       y)zK
        _getOctaveShift(): properly handles positive displacement
        15aboverN  Nr   _getOctaveShiftr+   r$   disdisPlacer`   r%   s        r&   testOctaveShift1zTest.testOctaveShift14  s5     %%c846*r(   c                `    d}d}d}t        j                  ||      }| j                  ||       y)zK
        _getOctaveShift(): properly handles negative displacement
        22belowNr  r  s        r&   testOctaveShift2zTest.testOctaveShift2>  s5     %%c846*r(   c                `    d}d}d}t        j                  ||      }| j                  ||       y)zW
        _getOctaveShift(): properly handles positive displacement with "None"
        r   Nr{   r  r  s        r&   testOctaveShift3zTest.testOctaveShift3H  s5     %%c846*r(   c                `    d}d}d}t        j                  ||      }| j                  ||       y)zF
        _getOctaveShift(): properly positive two "None" args
        Nr   r  r  s        r&   testOctaveShift4zTest.testOctaveShift4R  s5     %%c846*r(   c                2   d}t        j                  dd      t        j                  d      f}t        j                  |      }| j	                  t        |d         t        |d                | j	                  t        |d         t        |d                y)	z-
        _barlineFromAttr(): rptboth
        rptbothendrN  timesstartr   r{   N)r	   Repeatr   _barlineFromAttrr+   typer$   rightr`   r%   s       r&   testBarlineFromAttr1zTest.testBarlineFromAttr1\  sy     JJuA.

70CD&&u-hqk*DO<hqk*DO<r(   c                @   d}t        j                  dd      }t        j                  |      }| j	                  t        |      t        |             | j	                  |j                  |j                         | j	                  |j                  |j                         y)z,
        _barlineFromAttr(): rptend
        rptendr  rN  r  Nr	   r  r   r  r+   r  	directionr  r  s       r&   testBarlineFromAttr2zTest.testBarlineFromAttr2f  su     ::e1-&&u-hf6++X-?-?@8r(   c                <   d}t        j                  d      }t        j                  |      }| j	                  t        |      t        |             | j	                  |j                  |j                         | j	                  |j                  |j                         y)z.
        _barlineFromAttr(): rptstart
        rptstartr  Nr  r  s       r&   testBarlineFromAttr3zTest.testBarlineFromAttr3q  ss     ::g&&&u-hf6++X-?-?@8r(   c                    d}t        j                  d      }t        j                  |      }| j	                  t        |      t        |             | j	                  |j
                  |j
                         y)z5
        _barlineFromAttr(): end (--> final)
        r  finalN)r	   Barliner   r  r+   r  r  s       r&   testBarlineFromAttr4zTest.testBarlineFromAttr4|  sW     ;;w'&&u-hf66r(   c                    d}t        j                  d      }t        j                  |      }| j	                  t        |      t        |             | j	                  |j
                  |j
                         y)z%
        _tieFromAttr(): "i"
        rc   r  Nr   Tier   _tieFromAttrr+   r  r  s       r&   testTieFromAttr1zTest.testTieFromAttr1  sW     777#""5)hf66r(   c                    d}t        j                  d      }t        j                  |      }| j	                  t        |      t        |             | j	                  |j
                  |j
                         y)z&
        _tieFromAttr(): "ti"
        rc   continueNr  r  s       r&   testTieFromAttr2zTest.testTieFromAttr2  W     77:&""5)hf66r(   c                    d}t        j                  d      }t        j                  |      }| j	                  t        |      t        |             | j	                  |j
                  |j
                         y)z%
        _tieFromAttr(): "m"
        rc   r  Nr  r  s       r&   testTieFromAttr3zTest.testTieFromAttr3  r  r(   c                    d}t        j                  d      }t        j                  |      }| j	                  t        |      t        |             | j	                  |j
                  |j
                         y)z%
        _tieFromAttr(): "t"
        rc   stopNr  r  s       r&   testTieFromAttr4zTest.testTieFromAttr4  sV     776?""5)hf66r(   c                    t        j                  dddd      }d|_        t        j                  |      }| j                  |t        j                         | j                  d|j                         | j                  d|j                         y	)
zG
        sylFromElement() where @con is given and @wordpos="i"
        sylr   r\  wordposconr   ChribeginzChri N
rD   rE   textr   sylFromElementr    r   Lyricr+   syllabicr$   rw   r%   s      r&   testSyl1zTest.testSyl1  sl     }}Us3+GH	$$T*fdjj1&//2&++.r(   c                    t        j                  dddd      }d|_        t        j                  |      }| j                  |t        j                         | j                  d|j                         | j                  d|j                         y	)
zG
        sylFromElement() where @con is given and @wordpos="m"
        r  mtr  r   stomiddlez~sto~Nr  r  s      r&   testSyl2zTest.testSyl2  sl     }}Us3+GH	$$T*fdjj16??3&++.r(   c                    t        j                  dddd      }d|_        t        j                  |      }| j                  |t        j                         | j                  d|j                         | j                  d|j                         y	)
zK
        sylFromElement() where @con is not given and @wordpos="t"
        r  r  dr  r   pherr  z-pherNr  r  s      r&   testSyl3zTest.testSyl3  sl     }}Us3+GH	$$T*fdjj10&++.r(   c                   t        j                  d      }d|_        t        j                  |      }| j                  |t        j                         | j                  d|j                         | j                  d|j                         y)zB
        sylFromElement() where @wordpos is not specified
        r  shoesingleNr  r  s      r&   testSyl4zTest.testSyl4  se     }}U#	$$T*fdjj16??3-r(   c                   t        j                  dddi      }t        j                  t         d      }d|_        |j	                  |       t        j                  |d      }| j                  d	t        |             | j                  |d
   t        j                         | j                  d|d
   j                         | j                  d|d
   j                         | j                  d|d
   j                         y)z@
        verseFromElement() with one <syl> and @n given
        versen42r   r  Hin-r?   backupNr{   r   r  Hinr   N)rD   rE   r   r  appendr   verseFromElementr+   ru  r    r   r  r  number)r$   rw   r  r%   s       r&   
testVerse1zTest.testVerse1  s     }}Wc4[9mmvhcN+C&&tQ7CK(fQi4&)"4"45q	/VAY--.r(   c                   t        j                  d      }t        j                  t         d      }d|_        |j	                  |       t        j                  t         d      }d|_        |j	                  |       t        j                  t         d      }d|_        |j	                  |       t        j                  |d      }| j                  dt        |             |D ]>  }| j                  |t        j                         | j                  d|j                         @ | j                  d	|d
   j                         | j                  d|d
   j                         | j                  d|d   j                         | j                  d|d   j                         | j                  d|d   j                         | j                  d|d   j                         y)zF
        verseFromElement() with three <syl> and @n not given
        r  r  r  z-de-z-mithr?   r  rO  r  r   r  r  r{   der  rN  mithN)rD   rE   r   r  r  r   r  r+   ru  r    r   r  r  r  )r$   rw   r  r%   eachSyls        r&   
testVerse2zTest.testVerse2  sw    }}W%mmvhcN+CmmvhcN+CmmvhcN+C&&tQ7CK(G!!'4::6Q/  	&)"4"45q	/6!9#5#56vay~~.q	 2 230r(   c                n   t        j                  dddi      }t        j                  t         d      }d|_        |j	                  |       t        j                  |      }| j                  dt        |             | j                  |d   t        j                         | j                  d	|d   j                         | j                  d
|d   j                         | j                  d|d   j                         |j                  j                  t
        j                   j#                  d             y)zB
        verseFromElement() with one <syl> and invalid @n
        r  r  mistaker   r  r  r{   r   r  r  NrD   rE   r   r  r  r   r  r+   ru  r    r   r  r  r  rA  rK   _BAD_VERSE_NUMBERr:   r$   rB  rw   r  r%   s        r&   
testVerse3zTest.testVerse3  s    
 }}Wc9-=>mmvhcN+C&&t,CK(fQi4&)"4"45q	/F1I,,-001G1G1N1Ny1YZr(   c                f   t        j                  d      }t        j                  t         d      }d|_        |j	                  |       t        j                  |      }| j                  dt        |             | j                  |d   t        j                         | j                  d|d   j                         | j                  d|d   j                         | j                  d|d   j                         |j                  j                  t
        j                   j#                  d             y	)
z=
        verseFromElement() with one <syl> and no @n
        r  r  r  r{   r   r  r  NoneNr  r  s        r&   
testVerse4zTest.testVerse4%  s    
 }}W%mmvhcN+C&&t,CK(fQi4&)"4"45q	/F1I,,-001G1G1N1Nv1VWr(   zmusic21.note.Notez)music21.mei.base._processEmbeddedElementszmusic21.mei.base.safePitchzmusic21.mei.base.makeDurationc           	        t        j                  ddddddd      }d	|_        d
|_        t        j                         }||_        g |_        |}t        j                  |d      }| j                  |||       |j                  ddd       |j                  dd       |j                  |j                         | j                  d|j                  j                         | j                  d|j                  j                  j                         | j                  d|j                  j                         | j                  |j                  |j                         y)z
        noteFromElement(): all the basic attributes (i.e., @pname, @accid, @oct, @dur, @dots)

        (mostly-unit test; mock out Note, _processEmbeddedElements(),
         safePitch(), and makeDuration())
        r   rf   r\  2r   rp   pnamer   octrh  dotsr   makeDuration() returnsafePitch() returnNrg         ?r{   r   )rD   rE   rG   r   rC   r   noteFromElementr+   rK   r   r   r   extendr   r   )	r$   mockMakeDurationmockSafePitchmockProcEmbElmockNoterw   mockNewNoter`   r%   s	            r&   	testUnit1zTest.testUnit1?  s%    }}VcCPS\_58-: ;(?%%9"nn& +%'"%%dD1;7--c3<00a8(()C)CDKNN556K55<<GGHKOO667)668L8LMr(   c           	     $   t        j                  ddddddd      }t        j                  |      }| j	                  d	|j
                         | j	                  d
|j                         | j	                  d|j                  j                         y)z
        noteFromElement(): all the elements that go in Note.__init__()...
                           'pname', 'accid', 'oct', 'dur', 'dots'
        (corresponds to testUnit1() with no mocks)
        r   rf   r\  r  r   rp   r  r   D#2      ?r{   N	rD   rE   r   r  r+   nameWithOctavequarterLengthr   r  r  s      r&   testIntegration1azTest.testIntegration1a^  s|     }}VcCPS\_58-: ;%%d+ 5 56f223FOO001r(   c                "   t        j                  dddddd      }t        j                  |      }| j	                  d|j
                         | j	                  d	|j                         | j	                  d
|j                  j                         y)z
        noteFromElement(): all the elements that go in Note.__init__()...
                           'pname', 'accid', 'oct', 'dur', 'dots'
        (this has different arguments than testIntegration1a())
        r   rf   r  r  r   )r  r   r  rh  r   D2r  r   Nr  r  s      r&   testIntegration1bzTest.testIntegration1bk  su     }}VcCPS\_,`a%%d+v445f223FOO001r(   z!music21.mei.base.pitch.Accidentalc                |   t        j                  ddddd      }d|_        d|_        d	|_        t        j                         }||_        d
dt        j                         g|_        |}t        j                  dd      t        j                  dd
      g}	t        j                  |d      }
| j                  |||
       |j                  ddd       |j                  |j                  _        | j                  d
|j
                  j                  j                         | j!                  |j
                  j                  j"                  d   d   d   t
        j                         | j                  |	|j"                         |j                  |j                         | j                  d|j$                  j                         | j                  d|j
                  j&                  j                         | j                  d|j(                  j                         | j                  |j                  |j*                         y)z
        noteFromElement(): adds <artic>, <accid>, and <dot> elements held within

        (mostly-unit test; mock out Note, _processEmbeddedElements(),
        safePitch(), and makeDuration())
        r   rf   r  r   r  r  rh  r   r	  r
  zan accidentalr{   rg   r  r   N)rD   rE   rG   r   rC   r   rt  callr   r  r+   rK   r   r]   r  r   r    call_args_listr   r  r   r   )r$   r   r  r  r  r  rw   r  r`   expMockMakeDurr%   s              r&   	testUnit2zTest.testUnit2w  s    }}Vc#c,RS(?%%9"!0	nn& +&'m.D.D.F%G"))C+TYYsA->?%%dD1;7--c4='0'='=$K55<<GGHk77>>MMaPQRSTUV+44	6)9)H)HI(()C)CDKNN556K55<<GGHKOO667)668L8LMr(   c                   t        j                  ddddd      }|j                  t        j                  t         d             |j                  t        j                  t         dddi             |j                  t        j                  t         d	d	d
i             t	        j
                  |      }| j                  d|j                         | j                  d|j                         | j                  d|j                  j                         | j                  dt        |j                               | j                  |j                  d   t        j                         y)z
        noteFromElement(): adds <artic>, <accid>, and <dot> elements held within
        (corresponds to testUnit2() with no mocks)
        r   rf   r  r  r   dotr   staccr   r\  r  g      @r{   r   N)rD   rE   r  r   r   r  r+   r  r  r   r  ru  r   r    rt  r  s      r&   testIntegration2zTest.testIntegration2  s   
 }}Vc#c,RSEMMVHC.12EMMVHE"2GW;MNOEMMVHE"2GS>JK%%d+ 5 56f223FOO001C 4 456f2215}7M7MNr(   zmusic21.mei.base._tieFromAttrzmusic21.mei.base.addSlursc                   t        j                  ddddddddd	d
dddt        dddi      }d|_        d|_        t	        j
                         }	|	|_        g |_        dg|_        d|_        |	}
t        j                  |d      }| j                  |
|	|       |j                  ddd       |j                  dd       |j                  |j                         | j                  d|	j                         |	j                  j                  j                  dg       | j                  d|	j                         | j                  |j                  |	j                         |j                  ||	d       y)z
        noteFromElement(): adds @xml:id, @artic, and @tie attributes, and the slurBundle

        (mostly-unit test; mock out Note, _processEmbeddedElements(),
        safePitch(), and makeDuration())
        r   r  rf   r   r\  r  r  rh  r   r  rp   r   r&  123r   i1r   r	  r
  	staccato!a tie!slur bundlerg   r  r{   N)rD   rE   r   rG   r   rC   r   r  r+   rK   r   r   r  r   r   )r$   mockSlurmockTiemockArticListr  r  r  r  rw   r  r`   r%   s               r&   	testUnit3zTest.testUnit3  sS    }}VWc7CPSUZ\_-3S'7FTY-2D-: ; )@%%9"nn& +%'"&1]"'%%dM:;7--c3<00a8(()C)CD/!!((@@+O;??3)668L8LM(({MJr(   c                   t        j                  ddddddddd	d
dt        dddddi      }t        j                         }t        j                  ||      }| j                  d|j                         | j                  d|j                         | j                  d|j                  j                         | j                  d|j                         | j                  dt        |j                               | j                  |j                  d   t        j                          | j                  t#        j$                  d      |j"                         y)z
        noteFromElement(): adds @xml:id, @artic, and @tie attributes, and the slurBundle
        (corresponds to testUnit3() with no mocks)
        r   r  rf   r   r\  r  r  rh  r   r  rp   asdf1234r   r&  r   r*  r   r  r  r{   r   r  N)rD   rE   r   r   r#   r   r  r+   r  r  r   r  r   ru  r   r    rt  r   r  r$   rw   r"   r%   s       r&   testIntegration3zTest.testIntegration3  s   
 }}VWc7CPSUZ\_-3S&*gW^-2D-: ; **,
%%dJ7 5 56f223FOO001VYY/C 4 456f2215}7M7MN)6::6r(   zmusic21.mei.base.scaleToTupletzmusic21.pitch.Accidentalc                   t        j                  dddddddddd	      }d
|_        t        j                         }t        j                         |_        t        j                         |_        d|j                  _        ||_        g |_        d|_        d|_        |j                  }	t        j                  |d      }
| j                  |	|
       |j                  ddd       |j                  dd       |j                  |j                         |j                  ||       |j                  d       | j                  d|j
                  j                  j                         y)z
        noteFromElement(): adds tuplet-related attributes; plus @m21Beam where the
            duration doesn't require adjusting beams

        (mostly-unit test)
        r   rf   r  r   5r  r\  r  r  rh  m21TupletNumm21TupletNumbasem21TupletSearchrc  m21Beamr   r
  quarterzmade the tupletzthe accidentalr-  Nr  r   rg   )rD   rE   rG   r   rC   beamsr  r   r  r+   rK   fillr   )r$   r   rO   r  r  r  r  rw   r  r`   r%   s              r&   	testUnit4zTest.testUnit4  s6    }}Vc#c=@VY@G:='-S T &:"nn& NN,(,(8%-6%%* +%'""3
!1	**%%dM:6*--c4=00a8(()C)CD**;=))#.K--22==>r(   c                   t        j                  dddddddddd	      }t        j                         }t	        j
                  ||      }| j                  d
|j                         | j                  d|j                         | j                  d|j                  j                         | j                  d|j                         | j                  d|j                         | j                  d|j                         y)ze
        noteFromElement(): @m21TupletNum
        (corresponds to testUnit4() with no mocks)
        r   rf   r  r   r7  r  r\  r8  r   r  r  r=  N)rD   rE   r   r#   r   r  r+   r  r  r   r  r9  r:  r;  r4  s       r&   testIntegration4zTest.testIntegration4  s    
 }}Vc#c=@VY@G:='-S T **,
%%dJ7 5 56f223FOO$8$89f112f556&"8"89r(   zmusic21.duration.GraceDurationc           	        t        j                  ddddddd      }t        j                  t         d	      }|j                  |       d
|_        t        j                         }t        j                         |_        ||_        t        j                  t        j                        g|_        t        j                  t        j                        |_        d|j                  _        |}	t        j                  |d      }
| j                  |	|
       |j!                  ddd       |j!                  dd       |j!                  |j                         |j                  j"                  j!                  dd       | j                  |j                  |j                         | j                  |j                  |j$                         y)z
        noteFromElement(): test @grace and @m21Beam where the duration requires adjusting beams,
            and contained <syl>

        (mostly-unit test)
        r   rf   r  16r  r  r  r  rh  r<  gracer   r  r
  r=   16thr-  N      ?r   )rD   rE   r   r  rG   r   rC   r>  r   r  r   Durationr  r   r  r+   rK   r?  lyrics)r$   	mockGracer  r  r  r  rw   sylElemr  r`   r%   s              r&   	testUnit5zTest.testUnit5%  s_    }}Vc#d8?%-Q R--6(#/G%9"nn& NN, +&*nndjj&I%J"!%9J9J!K	&,	#%%dM:6*--c4=00q9(()C)CD66vwG//1E1EF33[5G5GHr(   c           	        t        j                  ddddddd      }t        j                  t         d	      }d
|_        |j	                  |       t        j                         }t        j                  ||      }| j                  d|j                         | j                  d|j                         | j                  d|j                  j                         | j                  d|j                  j                  d   j                          | j                  d|j                  j                  d   j                         | j                  d|j                  j                  d   j                          | j                  d|j                  j                  d   j                         | j                  dt#        |j$                               | j                  d
|j$                  d   j                         y)z
        noteFromElement(): test @grace and @m21Beam where the duration requires adjusting beams,
            and contained <syl>
        (corresponds to testUnit5() with no mocks)
        r   rf   r  rD  r  r  rE  r   r  zwords!r          rG  r{   r   rN  N)rD   rE   r   r  r  r   r#   r   r  r+   r  r  r   r  r>  	beamsListr  ru  rJ  )r$   rw   rL  r"   r%   s        r&   testIntegration5zTest.testIntegration5H  s    }}Vc#d8?%-Q R--6(#/G**,
%%dJ7v445f223!5!56FLL2215<<=&,,"8"8";"@"@AFLL2215<<=&,,"8"8";"@"@AC./6==#3#8#89r(   z!music21.mei.base.verseFromElementc                   d}t        j                  |      }d|_        t        j                         }t        j                         |_        ||_        g |_        |}t        j                  d      t        j                  d      gt        j                  d      ggfd}	|	|_        d   d   d   d	   d	   d   g}
t        j                  |d
      }| j                  ||       | j                  |
|j                         | j                  d|j                         |j                  t        j                  d	       |j                  t        j                  d       y)zW
        noteFromElement(): test contained <verse>

        (mostly-unit test)
          <note pname="D" oct="2" dur="16" xmlns="http://www.music-encoding.org/ns/mei">
            <verse>
                <syl>au</syl>
                <syl>luong</syl>
            </verse>
            <verse>
                <syl>sun</syl>
            </verse>
        </note>
        r
  aur\   luongsunc                V    t          d| j                  k(  sJ j                  d      S )zK
            Check that it gets called with the right elements
            r  r   )r   r,   r  )
inner_elemr  
vfeReturnss     r&   mockVerseFESideEffectz-Test.testUnit6.<locals>.mockVerseFESideEffect  s-     XU#z~~555>>!$$r(   r   r{   r-  rN  r  N)rD   r  rG   r   rC   r>  r  r   r  r+   rJ  r   assert_any_callANY)r$   mockVerseFEunused_mockMakeDurationr  r  r  rw   r  r`   r[  	expLyricsr%   rZ  s               @r&   	testUnit6zTest.testUnit6a  s4   	 %%9"nn& NN, +%'"~~40$..g2NO~~5124
	% #8]1%z!}Q'7Aq9IJ	%%dM:6*FMM2K223##DHHa#8##DHHa#8r(   c                   d}t        j                  |      }t        j                         }t	        j
                  ||      }| j                  dt        |j                               | j                  d|j                  d   j                         | j                  d|j                  d   j                         | j                  d|j                  d   j                         | j                  d|j                  d   j                         | j                  d|j                  d   j                         | j                  d|j                  d   j                         y	)
zn
        noteFromElement(): test contained <verse>
        (corresponds to testUnit6() with no mocks)
        rS  rO  rT  r   rV  r{   rW  rN  N)rD   r  r   r#   r   r  r+   ru  rJ  r  r  r4  s       r&   testIntegration6zTest.testIntegration6  s   
	 %**,
%%dJ7C./v}}Q/445&--"2"7"78a 0 5 56FMM!,334FMM!,334FMM!,334r(   zmusic21.note.Restc                   t        j                  dddddt        dddd	dd
di      }d|_        t	        j
                  d      }||_        d|_        |j                  }t        j                  |      }| j                  ||       |j                  |j                         |j                  dd       |j                  |j                  |       | j                  d|j                         y)z]
        restFromElement(): test @dur, @dots, @xml:id, and tuplet-related attributes
        restrh  r   r  rp   the idr9  r7  r:  m21TupletTyper  r   zthe durationznew rest
tupletizedr   r  r{   N)rD   rE   r   rG   r   rC   r   restFromElementr+   rK   r   )r$   rO   mockMakeDurmockRestrw   mockNewRestr`   r%   s           r&   testUnit1TestRestFromElementz!Test.testUnit1TestRestFromElement  s     }}VUCfh-;SBTVY-<g-G H $2 nnZ0 +".
**%%d+6*((+2J2J(K++C3**8+@+@$G;>>2r(   c                   t        j                  dddddt        dddd	dd
di      }t        j                  |      }| j                  t        dd      |j                         | j                  d|j                  j                         | j                  d|j                         | j                  d|j                  j                  d   j                         y)z}
        restFromElement(): test @dur, @dots, @xml:id, and tuplet-related attributes

        (without mock objects)
        re  rh  r   r  rp   rf  r9  r7  r:  rg  r  r   r   r?   r{   r   N)rD   rE   r   r   ri  r+   r   r  r   r  r   tupletsr  r  s      r&   testIntegration1zTest.testIntegration1  s     }}VUCfh-;SBTVY-<g-G H %%d+!Q)=)=>FOO001699-&//"9"9!"<"A"ABr(   c                >   t        j                  dddddt        dddd	dd
di      }t        j                  |      }| j                  |t        j                         | j                  |j                  j                         | j                  d|j                         y)z^
        spaceFromElement(): test @dur, @dots, @xml:id, and tuplet-related attributes
        re  rh  r   r  rp   rf  r9  r7  r:  rg  r  r   N)rD   rE   r   r   spaceFromElementr    r   Rest
assertTruestylehideObjectOnPrintr+   r   r  s      r&   testUnit2TestRestFromElementz!Test.testUnit2TestRestFromElement  s     }}VUC-3S-3X-;S-?-<g-/ 0 &&t,fdii0667699-r(   c                   t        j                  dddddt        dddd	dd
di      }t        j                  |      }| j                  t        dd      |j                         | j                  d|j                  j                         | j                  d|j                         | j                  d|j                  j                  d   j                         y)z~
        spaceFromElement(): test @dur, @dots, @xml:id, and tuplet-related attributes

        (without mock objects)
        spacerh  r   r  rp   rf  r9  r7  r:  rg  r  r   r   r?   r{   r   N)rD   rE   r   r   rr  r+   r   r  r   r  r   ro  r  r  s      r&   #testIntegration2TestRestFromElementz(Test.testIntegration2TestRestFromElement  s     }}WeS&#vx.<cCUWZ.=w.H I &&t,!Q)=)=>FOO001699-&//"9"9!"<"A"ABr(   z music21.mei.base.restFromElementc                    t        j                  dddi      }d|_        t        j                  |      }| j                  |j                  |       |j                  |d       y)z[
        mRestFromElement(): reacts properly to an Element with the @dur attribute
        mRestrh  r  r   zthe restN)rD   rE   rG   r   mRestFromElementr+   rK   r$   mockRestFromElementrw   r%   s       r&   testUnit3TestRestFromElementz!Test.testUnit3TestRestFromElement  sX    
 }}WeS\:+5(&&t,,996B33D$?r(   c                   t        j                  d      }t        j                         |_        t        j                  |      }| j                  |j                  |       |j                  |d       | j                  |j                         y)z^
        mRestFromElement(): reacts properly to an Element without the @dur attribute
        r|  N)rD   rE   r   rC   rG   r   r}  r+   rK   rt  m21wasMRestr~  s       r&   testUnit4TestRestFromElementz!Test.testUnit4TestRestFromElement  sk    
 }}W%+/>>+;(&&t,,996B33D$?**+r(   z!music21.mei.base.spaceFromElementc                    t        j                  dddi      }d|_        t        j                  |      }| j                  |j                  |       |j                  |d       y)z\
        mSpaceFromElement(): reacts properly to an Element with the @dur attribute
        mSpacerh  r  r   z
the spacerN)rD   rE   rG   r   mSpaceFromElementr+   rK   r$   	mockSpacerw   r%   s       r&   testUnit5TestRestFromElementz!Test.testUnit5TestRestFromElement  sV    
 }}Xucl;!-	''-//8))$5r(   c                   t        j                  d      }t        j                         |_        t        j                  |      }| j                  |j                  |       |j                  |d       | j                  |j                         y)z_
        mSpaceFromElement(): reacts properly to an Element without the @dur attribute
        r  N)rD   rE   r   rC   rG   r   r  r+   rK   rt  r  r  s       r&   testUnit6TestRestFromElementz!Test.testUnit6TestRestFromElement&  si    
 }}X&!%!1	''-//8))$5**+r(   c                F    t        j                  t         d| ||||      S )zM
        Factory function for the Element objects that are a <note>.
        r   r  )rD   rE   r   )r  r   octArgrh  r  s        r&   makeNoteElemsChordFromElementz"Test.makeNoteElemsChordFromElement;  s(    
 }}xt_E!'St= 	=r(   zmusic21.chord.Chordz music21.mei.base.noteFromElementc           
     F   t        j                  dddd      }dD cg c]  }t        j                  |dddd       }}|D ]  }|j	                  |        d	|_        d
|_        t        j                         }	|	|_        g |_        t        j                  |d      }
| j                  |	|
       |j                  dd       |j                  t        d      D cg c]  }|j
                   c}       | j                  d|	j                  j                         | j                  d|	j                  j                   j                         | j                  d|	j"                  j                         | j                  |j
                  |	j$                         yc c}w c c}w )zh
        chordFromElement(): all the basic attributes (i.e., @pname, @accid, @oct, @dur, @dots)
        chordr   rp   rh  r  r   cegNr   a noter	  r  r{   rO  notesr   )rD   rE   r   r  r  rG   r   rC   r   chordFromElementr+   rK   r~   r   r   r   r  r   r   )r$   mockNoteFromEr  r  	mockChordrw   xnoteElementseachElementmockNewChordr%   r   s               r&   testUnit1ChordFromElementzTest.testUnit1ChordFromElementC  sq    }}WS#-FG!02!0A ::1dCdS!0 	 2'KKK$ (%-"(?%~~'!-	%'"&&tT2v.00a8))UZ[\U]0^U]PQ1K1KU]0^)_LOO667L66==HHIL,,778)668M8MN%2 1_s    FFc           
     $   t        j                  dddd      }dD cg c]  }t        j                  |dddd	       }}|D ]  }|j	                  |        d
}t        j                  |      }| j                  ||j                         yc c}w )z
        chordFromElement(): all the basic attributes (i.e., @pname, @accid, @oct, @dur, @dots)

        (corresponds to testUnit1() with no mocks)
        r  r   rp   r  r   r  r  r   r   \Chord {C-natural in octave 4 | E-natural in octave 4 | G-natural in octave 4} Dotted QuarterN)	rD   rE   r   r  r  r   r  r+   fullNamer$   rw   r  r  r  r   r%   s          r&    testIntegration1ChordFromElementz%Test.testIntegration1ChordFromElementa  s     }}WS#-FG!02!0A ::1c3SQ!0 	 2'KKK$ (B&&t,v72s    Bc           
        t        j                  dddd      }dD cg c]  }t        j                  |dddd       }}|D ]  }|j	                  |        |j	                  t        j                  t
         d	d
             d|_        d|_        t        j                         }	|	|_        t        j                         g|_        |	}
t        j                  |d      }| j                  |
|	|       |j                  dd       |j                  t        d      D cg c]  }|j                   c}       | j                  d|	j                  j                  j                          | j#                  |	j                  j                  j$                  d   d   d   t        j                         | j                  d|	j&                  j                          | j                  d|	j                  j(                  j                          | j                  d|	j*                  j                          | j                  |j                  |	j,                         yc c}w c c}w )zI
        chordFromElement(): adds an <artic> element held within
        r  r   rp   r  r   r  Nr   r   r&  r   r  r	  r  r{   rO  r  r   )rD   rE   r   r  r  r   rG   r   rC   r   rt  r   r  r+   rK   r~   r   r    r!  r   r  r   r   )r$   r  r  r  r  rw   r  r  r  r  r`   r%   r   s                r&   testUnit2ChordFromElementzTest.testUnit2ChordFromElementq  s     }}WS#-FG!02!0A ::1dCdS!0 	 2'KKK$ (EMMVHE"2'BC%-"(?%~~'!-	&3&<&<&>%?"&&tT2<800a8))UZ[\U]0^U]PQ1K1KU]0^)_L66==HHIl88??NNqQRSTUVW+44	6LOO667L66==HHIL,,778)668M8MN/2  1_s    IIc           
     "   t        j                  dddd      }dD cg c]  }t        j                  |dddd	       }}|D ]  }|j	                  |        |j	                  t        j                  t
         d
d             d}t        j                  |      }| j                  ||j                         | j                  dt        |j                               | j                  |j                  d   t        j                         yc c}w )z
        noteFromElement(): adds <artic>, <accid>, and <dot> elements held within

        (corresponds to testUnit2() with no mocks)
        r  r   rp   r  r   r  r  r   r   r   r&  r  r  r{   r   N)rD   rE   r   r  r  r   r   r  r+   r  ru  r   r    rt  r  s          r&    testIntegration2ChordFromElementz%Test.testIntegration2ChordFromElement  s     }}WS#-FG!02!0A ::1c3SQ!0 	 2'KKK$ (EMMVHE"2'BCB&&t,v7C 4 456f2215}7M7MN2s    Dc                d   t        j                  dddddddt        dd	d
i      }dD 	cg c]  }	t        j	                  |	dddd       }
}	|
D ]  }|j                  |        d|_        d|_        t        j                         }||_        g |_        dg|_        d|_        t        j                  |d      }| j                  ||       |j                  dd       |j                  t        d      D cg c]  }|j                   c}       | j                  |j                  |j                         |j                  j                   j                  dg       | j                  d|j"                         | j                  d|j$                         |j                  ||d       yc c}	w c c}w )zc
        chordFromElement(): adds @xml:id, @artic, and @tie attributes, and the slurBundle
        r  rh  r   r  rp   r   r&  r)  r   r*  r   r  Nr   r  r	  r+  r,  r-  r  r{   rO  r  )rD   rE   r   r   r  r  rG   r   rC   r   r  r+   rK   r~   r   r   r  r   r   )r$   r.  r/  r0  r  r  r  r  rw   r  r  r  r  r%   r   s                  r&   testUnit3ChordFromElementzTest.testUnit3ChordFromElement  s    }}WeS&#wPW.4eUD.J K "12!0A ::1dCdS!0 	 2'KKK$ (%-"(?%~~'!-	%'"&1]"'&&t];v.00a8))UZ[\U]0^U]PQ1K1KU]0^)_)668M8MN""))AA;-P0<#3#34((|]K+2  1_s    F(5F-c                t   t        j                  dddddddt        dd	d
i      }dD cg c]  }t        j	                  |dddd       }}|D ]  }|j                  |        d}t        j                  |      }| j                  ||j                         | j                  dt        |j                               | j                  |j                  d   t        j                         | j                  d|j                         | j                  t        j                   d      |j                         yc c}w )z
        noteFromElement(): adds @xml:id, @artic, and @tie attributes, and the slurBundle

        (corresponds to testUnit3() with no mocks)
        r  rh  r   r  rp   r   r&  r3  r   r*  r   r  r  r   r   r  r{   r   r  N)rD   rE   r   r   r  r  r   r  r+   r  ru  r   r    rt  r   r   r  r  s          r&    testIntegration3ChordFromElementz%Test.testIntegration3ChordFromElement  s    }}WeS&#wPW.4j%.O P "12!0A ::1c3SQ!0 	 2'KKK$ (B&&t,v7C 4 456f2215}7M7MNVYY/)6::62s    D5c           
     d   t        j                  ddddddd      }dD cg c]  }t        j                  |ddd	d       }}|D ]  }	|j	                  |	        d
|_        t        j                  t        j                        |_        d|j
                  _
        t        j                         }
|
|_        g |_        d|_        |j
                  }t        j                  |d      }| j                  ||       |j                  dd       |j                  t        d      D cg c]  }|j
                   c}       | j                  |j
                  |
j                         |j                  |
|       | j                  d|
j                   j"                  j$                         yc c}w c c}w )zD
        chordFromElement(): adds tuplet-related attributes
        r  r   r7  r  rh  r9  r:  r;  r<  r   r  Nr   r  r=   r=  tupletifiedr-  r  r   rO  r  )rD   rE   r   r  r  rG   r   rC   r   rI  r  r   r  r+   rK   r~   r>  r?  r   )r$   rO   r  r  r  r  rw   r  r  r  r  r`   r%   r   s                 r&   testUnit4ChordFromElementzTest.testUnit4ChordFromElement  s    }}WS#BEAHU\.^ _ "12!0A ::1dCdS!0 	 2'KKK$ (%-"(,@Q@Q(R%-6%%*~~'!-	%'""/
**&&t];6*00a8))UZ[\U]0^U]PQ1K1KU]0^)_)668M8MN**<>L..33>>?)2" 1_s    F($F-c           
        t        j                  ddddddd      }dD cg c]  }t        j                  |ddd	d
       }}|D ]  }|j	                  |        d}t        j                  |      }| j                  ||j                         | j                  d|j                         | j                  d|j                         | j                  d|j                         yc c}w )zw
        noteFromElement(): adds tuplet-related attributes

        (corresponds to testUnit4() with no mocks)
        r  r   r7  r  r  r   r  r  r   r   zUChord {C-natural in octave 4 | E-natural in octave 4 | G-natural in octave 4} QuarterN)rD   rE   r   r  r  r   r  r+   r  r9  r:  r;  r  s          r&    testIntegration4ChordFromElementz%Test.testIntegration4ChordFromElement  s     }}WS#BEAHU\.^ _ "12!0A ::1c3SQ!0 	 2'KKK$ (; &&t,v7f112f556&"8"892s    C$c           
        t        j                  ddddd      }dD cg c]  }t        j                  |dd	d
d       }}|D ]  }	|j	                  |	        d|_        t        j                  t        j                        |_        d|j
                  _
        t        j                         }
|
|_        g |_        |
}t        j                  |d      }| j                  ||       |j                  dd       |j                  t        d      D cg c]  }|j
                   c}       | j                  |j
                  |
j                         |
j                   j"                  j                  dd       yc c}w c c}w )zy
        chordFromElement(): test @grace and @m21Beam when the duration does require
        adjusting the beams
        r  rD  r  r  rh  r<  rF  r   r  Nr   r   r  r=   rG  r-  rH  r   rO  r  )rD   rE   r   r  r  rG   r   rC   r   rI  r  r   r  r+   rK   r~   r>  r?  )r$   rK  r  r  r  r  rw   r  r  r  r  r`   r%   r   s                 r&   testUnit5ChordFromElementzTest.testUnit5ChordFromElement  sX    }}WTgX]-^_!02!0A ::1dCdS!0 	 2'KKK$ (%-"!%9J9J!K	&,	#~~'!-	%'"&&t];6*00q9))UZ[\U]0^U]PQ1K1KU]0^)_//1F1FG77H%2  1_s    E9E>c           
     B   t        j                  ddddd      }dD cg c]  }t        j                  |dd	d
d       }}|D ]  }|j	                  |        d}t        j                  |      }| j                  ||j                         | j                  d|j                         | j                  d|j                  j                         | j                  d|j                  j                  d   j                         | j                  d|j                  j                  d   j                         | j                  d|j                  j                  d   j                         | j                  d|j                  j                  d   j                         yc c}w )z
        noteFromElement(): @grace and @m21Beam when the duration does require adjusting the beams

        (corresponds to testUnit5() with no mocks)
        r  rD  r  r  r  r   r  r  r   r   r   zRChord {C-natural in octave 4 | E-natural in octave 4 | G-natural in octave 4} 16thrO  rG  r{   r   rN  N)rD   rE   r   r  r  r   r  r+   r  r  r   r  r>  rP  r  r  s          r&    testIntegration5ChordFromElementz%Test.testIntegration5ChordFromElement:  s[    }}WTgX]-^_!02!0A ::1c3SQ!0 	 2'KKK$ (8 &&t,v7f223!5!56FLL2215<<=&,,"8"8";"@"@AFLL2215<<=&,,"8"8";"@"@A2s    Fzmusic21.clef.clefFromStringzmusic21.clef.PercussionClefzmusic21.clef.TabClefc                   	 t        j                         }t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      g}|j                  t	        d      D cg c]  }t         j
                   c}       g d		fd|j                  _        t        j                  d	      |_        |j                  }t        j                  |      }| j                  ||       | j                  ||j                  j                         | j                  d
|j                         | j                  d
|j                         yc c}w )z
        clefFromElement(): all the elements that go in clef.clefFromString()...
                           'shape', 'line', 'dis', and 'dis.place'
        (mostly-unit test; only mock out clef and the ElementTree.Element)
        shapeliner  	dis.placer{   )theClefShaper  r  r  r   r  c                 .    rj                  d      S d S r  r  r  elemGetReturnss    r&   r  z0Test.testUnit1aClefFromElement.<locals>.<lambda>g      ~/A/A!/D/`\`/`r(   zclefFromString()rU  r   N)r   rC   r   r  r~   r]  rr   r  rG   r   clefFromElementr+   ru   r!  r   
r$   mockTabClefmockPercClefmockClefFromStringrw   expectedGetOrderr   r`   r%   r  s
            @r&   testUnit1aClefFromElementzTest.testUnit1aClefFromElementX  s     ~~ IIg.		'0BDIIgDV IIf-tyy/?;AWY58 <8a8 <=\`*...>P*Q'%22%%d+6* 	  !14883J3JKK223L334 !=s   (Fc                  	 t        j                         }t        j                  d      g}|j                  t	        d      D cg c]  }t         j
                   c}       dg		fd|j                  _        t        j                  d      |_        |j                  }t        j                  |      }| j                  ||       | j                  d|j                         | j                  ||j                  j                         | j                  d|j                         | j                  d|j                         yc c}w )	zQ
        clefFromElement(): same as testUnit1a() but with 'perc' "shape"
        r  r{   percc                 .    rj                  d      S d S r  r  r  s    r&   r  z0Test.testUnit1bClefFromElement.<locals>.<lambda>  r  r(   PercussionClef()rU  r   Nr   rC   r   r  r~   r]  rr   r  rG   r   r  r+   r   ru   r!  r  s
            @r&   testUnit1bClefFromElementzTest.testUnit1bClefFromElementt  s     ~~ IIg./58 <8a8 <= `$(NN8J$K!,,%%d+6*.99:  !14883J3JKK223L334 !=s   Ec                  	 t        j                         }t        j                  d      t        j                  d      g}|j                  t	        d      D cg c]  }t         j
                   c}       ddg		fd|j                  _        t        j                  d      |_        |j                  }t        j                  |      }| j                  ||       | j                  d|j                         | j                  ||j                  j                         | j                  d|j                         | j                  d|j                         yc c}w )	zP
        clefFromElement(): same as testUnit1c() but with 'TAB' "shape"
        r  r{   TABc                 .    rj                  d      S d S r  r  r  s    r&   r  z0Test.testUnit1cClefFromElement.<locals>.<lambda>  r  r(   r  rU  r   Nr  r  s
            @r&   testUnit1cClefFromElementzTest.testUnit1cClefFromElement  s    ~~ IIg.		'0BC58 <8a8 <=`$(NN8J$K!++%%d+6*.99:  !14883J3JKK223L334 !=s   Ec                    t        j                  d      }ddddd}|D ]  }|j                  |||           t        j                  }t        j                  |      }| j                  ||j                         y)z
        clefFromElement(): all the elements that go in clef.clefFromString()...
                           'shape', 'line', 'dis', and 'dis.place'
        (corresponds to testUnit1a, with real objects)
        r
   Gr  r   r  )r  r  r  r  N)	rD   rE   setr
   Treble8vaClefr   r  r+   	__class__r$   clefElemclefAttribseachKeyexpectedClassr%   s         r&    testIntegration1aClefFromElementz%Test.testIntegration1aClefFromElement  sn     ==( #S7S"GLL+g"67 #**%%h/(8(89r(   c                    t        j                  d      }ddi}|D ]  }|j                  |||           t        j                  }t        j                  |      }| j                  ||j                         y)zX
        PercussionClef

        (corresponds to testUnit1b, with real objects)
        r
   r  r  N)	rD   rE   r  r
   PercussionClefr   r  r+   r  r  s         r&    testIntegration1bClefFromElementz%Test.testIntegration1bClefFromElement  sj     ==('"GLL+g"67 #++%%h/(8(89r(   c                    t        j                  d      }ddi}|D ]  }|j                  |||           t        j                  }t        j                  |      }| j                  ||j                         y)zQ
        TabClef

        (corresponds to testUnit1c, with real objects)
        r
   r  r  N)	rD   rE   r  r
   TabClefr   r  r+   r  r  s         r&    testIntegration1cClefFromElementz%Test.testIntegration1cClefFromElement  sh     ==(&"GLL+g"67 #%%h/(8(89r(   c                (  	 t        j                         }t        j                  d      t        j                  t              t        j                  t              g}|j	                  t        d      D cg c]  }t         j                   c}       g d		fd|j                  _        t        j                  d      |_	        |j                  }t        j                  |      }| j                  ||       | j                  d|j                         | j                  ||j                  j                         | j                  d|j                         | j                  d|j                         | j                  d|j                          y	c c}w )
z@
        clefFromElement(): adds the "xml:id" attribute
        r  r   )r  theXMLIDr  c                 .    rj                  d      S d S r  r  r  s    r&   r  z/Test.testUnit2ClefFromElement.<locals>.<lambda>  r  r(   r  rU  r{   r  N)r   rC   r   r   r  r~   r]  rr   r  rG   r   r  r+   r   ru   r!  r   r  s
            @r&   testUnit2ClefFromElementzTest.testUnit2ClefFromElement  s#    ~~ IIg.		&0A499VCTU58 <8a8 <=9`$(NN8J$K!,,%%d+6*.99:  !14883J3JKK223L334VYY/ !=s   4Fzmusic21.stream.Voicezmusic21.mei.base._guessTupletsc                   d}t        j                         }||gfd|j                  _        t        j                  d      t        j                  d      g}t        j                  d      t        j                  d      t        j                  d      g}t
        j                   d|d	   _        t
        j                   d|d
   _        t
        j                   d|d   _        t        j                  |      |_        t        j                  |d	   d      t        j                  |d   d      g}ddgfd|_        d |_        d	dl	}	d	dl
m}
 |	j                         5  |	j                  d|
j                         t        j                  t        j                          d      |_        ddd       t        j                  d	         t        j                  d
         g}t        j$                  |      }|j                  j'                  d       | j)                  |j"                  |       | j+                  ||j,                         |j'                          | j+                  ||j"                  j.                  j,                         |j"                  j0                  j'                          | j)                  ||j2                         | j+                  ||j                  j,                         y# 1 sw Y   IxY w)a  
        layerFromElement(): basic functionality (i.e., that the tag-name-to-converter-function
                            mapping works; that tags not in the mapping are ignored; and that a
                            Voice object is returned. And "id" is set from the @n attribute.
        (mostly-unit test; only mock noteFromElement, _guessTuplets, and the ElementTree.Element)
        z@n valuec                 .    rj                  d      S d S r  r  r  s    r&   r  z1Test.testUnit1aLayerFromElement.<locals>.<lambda>  r  r(   r  note1rU  	imaginarynote2r   r   r{   rN  rq   NmockNoteFromElement return 1mockNoteFromElement return 2c                 &    j                  d      S r  r  r  mockNFEreturnss    r&   r  z1Test.testUnit1aLayerFromElement.<locals>.<lambda>
      .:L:LQ:Or(   c                    | S r  r  r  s    r&   r  z1Test.testUnit1aLayerFromElement.<locals>.<lambda>      Ar(   exceptions21ignorecategoryr   r>   r\   *)r   rC   rr   r  r   r   r   r,   iterfindwarningsmusic21r  catch_warningssimplefilterMusic21DeprecationWarningr   rH   rG   layerFromElementrK   r+   ru   r!  
coreAppendcoreElementsChangedr   )r$   mockTuplets	mockVoicemockNoteFromElementtheNAttributerw   r  iterfindReturnexpectedMNFEOrderr  r  expectedAppendCallsr%   r  r  s                @@r&   testUnit1aLayerFromElementzTest.testUnit1aLayerFromElement  s^    #~~'7` IIcNDIIcN;..g6..k:..g68 $(;;-t 4q#';;-y 9q#';;-t 4qNC!YY~a'8$?!YY~a'8$?A8:XY*O'"-($$&!!(\5[5[!\%)^^V]]_SZ%[I" '  $yy):;TYY~VWGX=YZ&&t,--c2//8  !24G4V4VW))+  !4!*!7!7!B!B!Q!Q	S22JJL		2  !14883J3JK '&s   *AK==Lc                   t        j                         }t        j                  d      t        j                  d      t        j                  d      g}t        j                   d|d   _        t        j                   d|d   _        t        j                   d|d   _        t        j                  |	      |_        t        j                  |d   d
      t        j                  |d   d
      g}ddgfd|_        d |_        dd
l}ddl	m
} |j                         5  |j                  d|j                         t        j                  t        j                         d      |_        d
d
d
       t        j                  d         t        j                  d         g}	d}
t        j"                  ||
      }|j
                  j%                  d       | j'                  |j                   |       | j)                  ||j*                         |j%                          | j)                  |	|j                   j,                  j*                         |j                   j.                  j%                          | j'                  |
|j0                         | j'                  d|j2                  j4                         y
# 1 sw Y   LxY w)zI
        Same as testUnit1a() *but* with ``overrideN`` provided.
        r  rU  r  r  r   r   r{   rN  rq   Nr  r  c                 &    j                  d      S r  r  r  s    r&   r  z1Test.testUnit1bLayerFromElement.<locals>.<lambda>3  r  r(   c                    | S r  r  r  s    r&   r  z1Test.testUnit1bLayerFromElement.<locals>.<lambda>4  r  r(   r  r  r  r   r  z	my own @nr  )r   rC   r   r   r,   r  r   r  r  r   r  r  r  r  r   rH   rG   r  rK   r+   ru   r!  r  r  r   rr   r   )r$   r  r  r	  rw   r  r  r  r  r  	overrideNr%   r  s               @r&   testUnit1bLayerFromElementzTest.testUnit1bLayerFromElement   s.    ~~..g6..k:..g68 $(;;-t 4q#';;-y 9q#';;-t 4qNC!YY~a'8$?!YY~a'8$?A8:XY*O'"-($$&!!(\5[5[!\%)^^V]]_SZ%[I" '  $yy):;TYY~VWGX=YZ	&&tY7--c2//8  !24G4V4VW))+  !4!*!7!7!B!B!Q!Q	S22JJLFII.DHH//0! '&s   %AJ;;Kc                  	 t        j                         }d|j                  _        t        j                  d      t        j                  d      t        j                  d      g}t        j
                   d|d   _        t        j
                   d|d   _        t        j
                   d|d	   _        t        j                  |
      |_        g d		fd|_        ddl	}ddl
m} |j                         5  |j                  d|j                         t        j                  t        j                          d      |_        ddd       | j#                  t        j$                  t        j&                  |       	 t	        j&                  |       y# 1 sw Y   OxY w# t        j$                  $ r7}| j)                  t        j*                  |j,                  d          Y d}~yd}~ww xY w)zI
        Same as testUnit1a() *but* without ``overrideN`` or @n.
        Nr  rU  r  r  r   r   r{   rN  rq   )r  r  r  r  c                 &    j                  d      S r  r  )r  mockNFEReturnss    r&   r  z1Test.testUnit1cLayerFromElement.<locals>.<lambda>b  r  r(   r  r  r  r   r  )r   rC   rr   rG   r   r   r,   r  r  r  r   r  r  r  r  r   rH   r0   MeiAttributeErrorr  r+   _MISSING_VOICE_IDr3   )
r$   r  r  r	  rw   r  r  r  maErrorr  s
            @r&   testUnit1cLayerFromElementzTest.testUnit1cLayerFromElementI  st    ~~ $..g6..k:..g68 $(;;-t 4q#';;-y 9q#';;-t 4qNCZ*O'($$&!!(\5[5[!\%)^^V]]_SZ%[I" ' 	$00$2G2GN	F!!$' '& %% 	FT33W\\!_EE	Fs%   <AF F" F"G,5-G''G,c                >   d}t        j                  |      }t        j                  |      }| j	                  dt        |             | j	                  d|j                         | j	                  d|d   j                         | j	                  d|d   j                         | j	                  d|d   j                         | j	                  d|d   j                         | j	                  d|d   j                         | j	                  d	|d   j                         y
)aR  
        layerFromElement(): basic functionality (i.e., that the tag-name-to-converter-function
                            mapping works; that tags not in the mapping are ignored; and that a
                            Voice object is returned. And "xml:id" is set.
        (corresponds to testUnit1a() but without mock objects)
        a  <layer n="so voice ID" xmlns="http://www.music-encoding.org/ns/mei">
                          <note pname="F" oct="2" dur="4" />
                          <note pname="E" oct="2" accid="f" dur="4" />
                          <imaginary awesome="true" />
                      </layer>rN  so voice IDrO  r   r  r{   F2E-2N
rD   r  r   r  r+   ru  r   offsetr  r  r$   inputXMLrw   r%   s       r&   !testIntegration1aLayerFromElementz&Test.testIntegration1aLayerFromElementq  s    "
 )&&t,CK(		2fQi../fQi../fQi556fQi556vay778q	 8 89r(   c                @   d}t        j                  |      }t        j                  |d      }| j	                  dt        |             | j	                  d|j                         | j	                  d|d   j                         | j	                  d|d   j                         | j	                  d|d   j                         | j	                  d|d   j                         | j	                  d|d   j                         | j	                  d	|d   j                         y
)zH
        (corresponds to testUnit1b() but without mock objects)
          <layer xmlns="http://www.music-encoding.org/ns/mei">
                          <note pname="F" oct="2" dur="4" />
                          <note pname="E" oct="2" accid="f" dur="4" />
                          <imaginary awesome="true" />
                      </layer>r  rN  rO  r   r  r{   r  r  Nr  r!  s       r&   !testIntegration1bLayerFromElementz&Test.testIntegration1bLayerFromElement  s    "
 )&&t];CK(		2fQi../fQi../fQi556fQi556vay778q	 8 89r(   c                V   d}t        j                  |      }| j                  t        j                  t        j
                  |       	 t        j
                  |       y# t        j                  $ r7}| j                  t        j                  |j                  d          Y d}~yd}~ww xY w)zH
        (corresponds to testUnit1c() but without mock objects)
        r%  r   N)	rD   r  r0   r   r  r  r+   r  r3   )r$   r"  rw   r  s       r&   !testIntegration1cLayerFromElementz&Test.testIntegration1cLayerFromElement  s    "
 )$00$2G2GN	F!!$'%% 	FT33W\\!_EE	Fs   A B(1-B##B(z!music21.mei.base.layerFromElementc           
        t        j                         }t        j                  d      t        j                  d      t        j                  d      g}t        j                   d|d   _        t        j                   d|d   _        t        j                   d|d   _        t        j                  |	      |_        t        t        |            D cg c])  }t        j                  ||   t        |dz         d
      + }}t        t        |            D cg c]  }d c}fd|_
        t        t        |            D cg c]  }d }}t        j                  |      }|j
                  j                  d       | j                  ||       | j                  ||j                         y
c c}w c c}w c c}w )a  
        staffFromElement(): basic functionality (i.e., that layerFromElement() is called with the
                            right arguments, and with properly-incrementing "id" attributes
        (mostly-unit test; only mock noteFromElement and the ElementTree.Element)
        layer1rU  layer2layer3layerr   r{   rN  rq   Nr"   zmockLayerFromElement return %ic                &    j                  d      S r  r  )r  r  r"   mockLFEReturnss      r&   r  z0Test.testUnit1StaffFromElement.<locals>.<lambda>  s    ^%7%7%:r(   r  )r   rC   r   r   r,   r  r~   ru  r   r   r  staffFromElementrK   r+   ru   r!  )	r$   mockLayerFromElementrw   findallReturnr   expectedMLFEOrderr`   r%   r0  s	           @r&   testUnit1StaffFromElementzTest.testUnit1StaffFromElement  s    ~~X6X6X68 #'++e4a"&++e4a"&++e4aMB ',C,>&?A&? "YY}Q'7QUPTU&? 	 ADI#mJ\D]^D]q:D]^: 	(>CCDV>WX>W4>WX&&t,--c26*  !24H4W4WXA^ Ys   .F5	F:	F?c                   d}t        j                  |      }t        j                  |      }| j	                  dt        |             t        t        |            D ]d  }| j	                  dt        ||                | j	                  d||   d   j                         | j	                  d||   d   j                         f | j	                  d|d   j                         | j	                  d|d   d   j                         | j	                  d	|d   j                         | j	                  d
|d   d   j                         | j	                  d|d   j                         | j	                  d|d   d   j                         y)a  
        staffFromElement(): basic functionality (i.e., that layerFromElement() is called with the
                            right arguments, and with properly-incrementing "id" attributes
        (corresponds to testUnit1() but without mock objects)
        a  <staff xmlns="http://www.music-encoding.org/ns/mei">
                          <layer>
                              <note pname="F" oct="2" dur="4" />
                          </layer>
                          <layer>
                              <note pname="A" oct="2" dur="4" />
                          </layer>
                          <layer>
                              <note pname="C" oct="2" dur="4" />
                          </layer>
                      </staff>rO  r{   rO  r   r  rp   r  r  A2r   rN  C2N)rD   r  r   r1  r+   ru  r~   r   r  r   r  )r$   r"  rw   r%   r   s        r&    testIntegration1StaffFromElementz%Test.testIntegration1StaffFromElement  sJ   
" )&&t,CK(s6{#AQF1I/S&)A,"5"56S&)A,"<"<= $
 	fQill+vay|::;fQill+vay|::;fQill+vay|::;r(   z$music21.mei.base.instrDefFromElementz"music21.mei.base._timeSigFromAttrsz!music21.mei.base._keySigFromAttrsz music21.mei.base.clefFromElementz(music21.mei.base._transpositionFromAttrsc                x   t        j                  t         dddddddddd	d
d
      }t        j                  t         ddddd      }|j                  |       t	        j
                  d      }||_        d|_        d|_        d|_        d|_        |j                  |j                  |j                  |j                  d}	dddd|j                  fg}
t        j                  |      }| j                  |	|       |j                  |       |j                  |       |j                  |       |j                  |       |
D ]!  \  }}| j                  t        ||      |       # |j                  t        j                         |j                  d   d   d   }| j                  d|j                         | j                  d|j!                  d             | j                  d|j!                  d             | j                  d|j!                  d             | j                  d|j!                  d              y!)"aO  
        staffDefFromElement(): proper handling of the following attributes (see function docstring
            for more information).

        @label, @label.abbr  @n, @key.accid, @key.mode, @key.pname, @key.sig, @meter.count,
        @meter.unit, @clef.shape, @clef.line, @clef.dis, @clef.dis.place, @trans.diat, @trans.demi
        staffDefFr   cdcdp	the labelthe l.rp   r  r)  

clef.shape	clef.linezclef.diszclef.dis.placelabelz
label.abbrr  r   r   r   r   instrDef71Clarinetzmidi.channelmidi.instrnummidi.instrnamemock instrumentmockTime returnmockKey returnmockClef returnmockTrans returnr   r   r   r
   partNamer?  partAbbreviationr@  partIdrp   transpositionr   r
   r  r  r  r  N)rD   rE   r   r  r   rC   rG   r   staffDefFromElementassertDictEqualrK   r+   getattrr]  r!  r,   rr   )r$   r`  mockClefmockKeymockTime	mockInstrrw   theInstrDeftheMockInstrumentr`   expectedAttrsr%   attrName	attrValuemockClefArgs                  r&   ,testUnit1StaffFromElementStaffDefFromElementz1Test.testUnit1StaffFromElementStaffDefFromElement  s     }}xx036SVZ7<{3;#VY25U%LM
 mmvhh$7<?RV>H,JK 	K  NN+<=!2	 1/ 1!3	"+"8"8%22"//$113
 37()9+A+ABD ))$/ 	Xv.))+6((.''-))$/#0HiW%6A9M $1 	((2--a03A61koog67koof56{u56 <=r(   c                   t        j                  t         ddddddddd	d
d	      }t        j                  t         ddddd      }|j                  |       t	        j
                  |      }| j                  |d   t        j                         | j                  |d   t        j                         | j                  |d   t        j                         | j                  |d   t        j                         | j                  d|d   j                          | j                  d|d   j"                         | j                  d|d   j$                         | j                  d|d   j&                         y)zX
        staffDefFromElement(): corresponds to testUnit1() without mock objects
        r;  r  r  r   r   r   r   majorr   r   )	rB  rC  r  r   r   r   r   r   r   r   rE  rp   rF  rG  rH  r   r   r   r
   r   r   NrD   rE   r   r  r   rX  r    r   rG  r   TimeSignaturer   r   r
   
TrebleClefr+   rV  r   r   r   r$   rw   r_  r%   s       r&   !testIntegration1aStaffFromElementz&Test.testIntegration1aStaffFromElement:	  sT   
 }}xx036St47sWZ18\`%bc mmvhh$7<?RV>H,JK 	K  ))$/ 	f\2J4G4GHfWou/B/BCfUmS-=-=>fVndoo>vl3::;w ; ;<&-"4"45F5M001r(   c                P   t        j                  t         ddddddddd	
      }t        j                  t         ddddd
      }|j                  |       |j                  t        j                  t         dddd
             t	        j
                  |      }| j                  |d   t        j                         | j                  |d   t        j                         | j                  |d   t        j                         | j                  |d   t        j                         | j                  d|d   j                          | j                  d|d   j"                         | j                  d|d   j$                         | j                  d|d   j&                         y)zR
        staffDefFromElement(): testIntegration1() with <clef> tag inside
        r;  r   r   r   r   rg  r   r   )r  r   r   r   r   r   r   r   rE  rp   rF  rG  rH  r
   r  r  )r  r  r   r   r   r   r   Nrh  rk  s       r&   !testIntegration1bStaffFromElementz&Test.testIntegration1bStaffFromElementV	  ss   
 }}xx0*.sRU0318\`%bc mmvhh$7<?RV>H,JK 	K EMMVHD/CQT:UVW ))$/ 	f\2J4G4GHfWou/B/BCfUmS-=-=>fVndoo>vl3::;w ; ;<&-"4"45F5M001r(   zmusic21.instrument.fromStringc                (   t        j                  t         dddddddddd	d
d
      }t        j                  d      }||_        d|_        d|_        d|_        d|_        |j
                  |j
                  |j
                  |j
                  d}	dddd|j
                  fg}
t        j                  |      }| j                  |	|       | j                  d|j                         |j                  |       |j                  |       |j                  |       |
D ]!  \  }}| j                  t        ||      |       # |j                  t        j                         |j                  d   d   d   }| j                  d|j                         | j                  d|j!                  d             | j                  d|j!                  d             | j                  d|j!                  d             | j                  d|j!                  d             y)z
        staffDefFromElement(): same as testUnit1() *but* there's no <instrDef> so we have to use
            music21.instrument.fromString()
        r;  r<  r   r=  r>  r?  r@  rp   r  r)  rA  r   rK  rL  rM  rN  rO  rP  rQ  rS  rU  rW  r   r
   r  r  r  r  N)rD   rE   r   r   rC   rG   r   rX  rY  r+   r   rK   rZ  r]  r!  r,   rr   )r$   r`  r[  r\  r]  r^  mockFromStringrw   r`  r`   ra  r%   rb  rc  rd  s                  r&   testUnit2StaffFromElementzTest.testUnit2StaffFromElementr	  s    }}xx036SVZ7<{3;#VY25U%LM
 !NN+<=&7# 1/ 1!3	"0"="=%22"//$113
 37()9+A+ABD ))$/ 	Xv.I001((.''-))$/#0HiW%6A9M $1 	((2--a03A61koog67koof56{u56 <=r(   c                   t        j                  t         ddddddddd	d
dd
      }t        j                  |      }| j                  |d   t        j                         | j                  |d   t        j                         | j                  |d   t        j                         | j                  |d   t        j                         | j                  d|d   j                         | j                  d|d   j                          | j                  d|d   j"                         | j                  d|d   j$                         y)z\
        staffDefFromElement(): corresponds to testUnit2() but without mock objects
        r;  r   r  r  r   rg  r   r   r   r   clarinet)
r  rC  rB  r   r   r   r   r   r   rD  r   r   r   r   r
   r   r   N)rD   rE   r   r   rX  r    r   rG  r   ri  r   r   r
   rj  r+   rV  r   r   r   r  s      r&    testIntegration2StaffFromElementz%Test.testIntegration2StaffFromElement	  s!   
 }}xx0*.SPS0318\`47sU_%ab ))$/ 	f\2J4G4GHfWou/B/BCfUmS-=-=>fVndoo>vl3::;w ; ;<&-"4"45F5M001r(   zmusic21.instrument.Instrumentc                L   t        j                  t         dddddddddd	d
d
      }t        j                  d      }	t
        j                  |_        |	|_        d|_        d|_        d|_        d|_        |j                  |j                  |j                  |j                  d}
d|j                  fg}t        j                  |      }| j                  |
|       | j                  d|j                         |j                  |       |j                  |       |j                  |       |D ]!  \  }}| j                  t        |	|      |       # |j                  t        j                          |j"                  d   d   d   }| j                  d|j$                         | j                  d|j'                  d             | j                  d|j'                  d             | j                  d|j'                  d             | j                  d|j'                  d             y)z
        staffDefFromElement(): same as testUnit1() *but* there's no <instrDef> so we have to use
          music21.instrument.fromString() *and* that raises an InstrumentException.
        r;  r<  r   r=  r>  r?  r@  rp   r  r)  rA  r   rK  rL  rM  rN  rO  rP  rW  r   r
   r  r  r  r  N)rD   rE   r   r   rC   r   InstrumentExceptionr  rG   r   rX  rY  r+   r   rK   rZ  r]  r!  r,   rr   )r$   r`  r[  r\  r]  r^  rp  mockInstrInitrw   r`  r`   ra  r%   rb  rc  rd  s                   r&   testUnit3StaffFromElementzTest.testUnit3StaffFromElement	  s     }}xx036SVZ7<{3;#VY25U%LM
 !NN+<=%/%C%C"%6" 1/ 1!3	"/"<"<%22"//$113 *9+A+ABC ))$/ 	Xv.I001((.''-))$/#0HiW%6A9M $1 	((2--a03A61koog67koof56{u56 <=r(   c                   t        j                  t         ddddddddd	d
d	      }t        j                  |      }| j                  |d   t        j                         | j                  |d   t        j                         | j                  |d   t        j                         | j                  |d   t        j                         | j                  d|d   j                         | j                  d|d   j                          | j                  d|d   j"                         | j                  d|d   j$                  j&                         y)\
        staffDefFromElement(): corresponds to testUnit3() but without mock objects
        r;  r   r  r  r   rg  r   r   r   r   )	r  rC  rB  r   r   r   r   r   r   r   r   r   r   r
   r   r   r   N)rD   rE   r   r   rX  r    r   
Instrumentr   ri  r   r   r
   rj  r+   r   r   r   rW  r   r  s      r&    testIntegration3StaffFromElementz%Test.testIntegration3StaffFromElement	  s$   
 }}xx0*.SPS0318\`47s%LM ))$/ 	f\2J4I4IJfWou/B/BCfUmS-=-=>fVndoo>w ; ;<&-"4"45F5M001| 4 B B O OPr(   c                    t        j                  t         dddd      }d|_        t        j
                  |_        d|j                  i}	t        j                  |      }
| j                  |	|
       y)	z?
        staffDefFromElement(): only specifies a meter
        r;  rp   r   r   r   rL  r   N)
rD   rE   r   rG   r   rv  r  r   rX  rY  )r$   r`  r[  r\  r]  r^  rp  rw  rw   r`   r%   s              r&   testUnit4StaffFromElementzTest.testUnit4StaffFromElement
  sq     }}xx0PS:U V 1%/%C%C"X223 ))$/ 	Xv.r(   c                    t        j                  t         dddd      }t        j                  |      }| j                  |d   t        j                         | j                  d|d   j                         y)	rz  r;  rp   r   r   r   r   z1/3N)
rD   rE   r   r   rX  r    r   ri  r+   r   r  s      r&    testIntegration4StaffFromElementz%Test.testIntegration4StaffFromElement0
  so    
 }}xx0PS:U V ))$/ 	fWou/B/BCw ; ;<r(   z$music21.mei.base.staffDefFromElementc           
        t        j                  d      }t        d      D cg c]+  }t        j                  t         ddt	        |      i      - }}|D ]  }|j                  |        d |_        t        d      D ci c]  }t	        |      d|  }}t        j                  |di       }| j                  ||       | j                  t        |      |j                         |D ]  }|j                  |d        yc c}w c c}w )	zN
        staffGrpFromElement(): it's not a very complicated function!
        staffGrprz   r;  r  r   c                *    d| j                  d       S )N
processed r  )rr   )r  unused_ys     r&   r  z8Test.testStaffGrpUnit1StaffFromElement.<locals>.<lambda>I
  s    :aeeCj\9Rr(   r  N)rD   rE   r~   r   r   r  r  r   staffGrpFromElementr+   ru  r   r\  )r$   mockStaffDefFErw   r  
innerElemseachElemr`   r%   s           r&   !testStaffGrpUnit1StaffFromElementz&Test.testStaffGrpUnit1StaffFromElement?
  s    
 }}Z(MRSTXWMU mmvhh$7c!fNMU 	 W"HKK! #%R"6;Ah?hCFj,,h?))$b96*Z.*C*CD"H**8T: #W
 @s   0DDc           
        t        j                  d      }t        d      D cg c]6  }t        j                  t         dt	        |dz         d|dz    dd      8 }}|D ]  }|j                  |        d	t        j                  d
      id	t        j                  d      id	t        j                  d      id	t        j                  d      id}t        j                  |d      }| j                  ||       yc c}w )zX
        staffGrpFromElement(): with <staffDef> directly inside this <staffGrp>
        r  rz   r;  r{   rg  r   r  r   r   r   r   r<  B-E-A-rp   r  r   r   NrD   rE   r~   r   r   r  r   r   r   r  rY  )r$   rw   r  r  r  r`   r%   s          r&    testStaffGrpInt1StaffFromElementz%Test.testStaffGrpInt1StaffFromElementS
  s     }}Z(  %Qx)  (! mmvhh$714QU:;a%{,DE  ( 	 ) #HKK! #.///1
 ))$5Xv.)s   ;C<c           
     \   t        j                  d      }t        d      D cg c]6  }t        j                  t         dt	        |dz         d|dz    dd      8 }}t        j                  t         d      }|D ]  }|j                  |        |j                  |       d	t        j                  d
      id	t        j                  d      id	t        j                  d      id	t        j                  d      id}t        j                  |d      }| j                  ||       yc c}w )zW
        staffGrpFromElement(): with <staffDef> embedded in another <staffGrp>
        r  rz   r;  r{   rg  r   r  r   r   r<  r  r  r  r  Nr  )r$   rw   r  r  innerGrpr  r`   r%   s           r&    testStaffGrpInt2StaffFromElementz%Test.testStaffGrpInt2StaffFromElementg
  s    }}Z(  %Qx)  (! mmvhh$714QU:;a%{,DE  ( 	 ) ==F88!45"HOOH% #H.///1
 ))$5Xv.)s   ;D)c                    t        j                  dddddd      }d|_        d	|_        |j                  |j                  gg d
}t        j                  |      }| j                  ||       |j                  |       |j                  |       y)z
        scoreDefFromElement(): proper handling of the following attributes (see function docstring
            for more information).

        @meter.count, @meter.unit, @key.accid, @key.mode, @key.pname, @key.sig
        r;  4srg  r   r   r   r   r   r   r   rL  rM  )all-part objectswhole-score objectsN)rD   rE   rG   r   scoreDefFromElementr+   rK   )r$   r\  r]  rw   r`   r%   s         r&   testUnit1ScoreDefFromElementz!Test.testUnit1ScoreDefFromElement
  s     }}ZDg@CSV1X Y 1/)1)>)>@T@T(U+-/ ))$/ 	6*((.''-r(   c                   t        j                  dddddd      }t        j                  |      }| j	                  |d   d	   t
        j                         | j	                  |d   d
   t        j                         | j                  d|d   d	   j                         | j                  d|d   d
   j                         | j                  d|d   d
   j                         y)zX
        scoreDefFromElement(): corresponds to testUnit1() without mock objects
        r;  r  rg  r   r   r  r   r  r   r{   r   rz   N)rD   rE   r   r  r    r   ri  r   r   r+   r   r   r   r  s      r&   #testIntegration1ScoreDefFromElementz(Test.testIntegration1ScoreDefFromElement
  s    
 }}ZDg@CSV1X Y ))$/ 	f%78;U=P=PQf%78;S=M=MN'9 :1 = I IJ&);"<Q"?"D"DEF#56q9@@Ar(   z$music21.mei.base.staffGrpFromElementc                   t        j                  dddddd      }t        j                  t         d      }t        j                  t         dd	d
d      }|j                  |       |j                  |       d|_        d|_        d	ddii|_        |j                  |j                  gg ddid}t        j                  |      }| j                  ||       |j                  |       |j                  |       |j                  |d       y)zJ
        scoreDefFromElement(): test for a <staffGrp> held within
        r;  r  rg  r   r   r  r   r  rp   rG  r  rD  rL  rM  r   z
A clarinet)r  r  rp   N)	rD   rE   r   r  rG   r   r  r+   rK   )	r$   mockStaffGrpFEr\  r]  rw   r  r;  r`   r%   s	            r&   testUnit2ScoreDefFromElementz!Test.testUnit2ScoreDefFromElement
  s
    }}ZDg@CSV1X Y==F88!45==F88!4.1J(GI!H 1/'*\<,H&I#)1)>)>@T@T(U+-&57
 ))$/ 	6*((.''-..x>r(   c                \   t        j                  dddddd      }t        j                  t         d      }t        j                  t         dd	d
d      }|j                  |       |j                  |       t	        j
                  |      }| j                  |d   d   t        j                         | j                  |d   d   t        j                         | j                  d|d   d   j                         | j                  d|d   d   j                         | j                  d|d   d   j                         | j                  d	|d	   d   j                         | j                  d
|d	   d   j                          | j                  |d	   d   t"        j$                         y)zX
        scoreDefFromElement(): corresponds to testUnit2() without mock objects
        r;  r  rg  r   r   r  r   r  rp   rG  r  r  r   r{   r   rz   r   N)rD   rE   r   r  r   r  r    r   ri  r   r   r+   r   r   r   rV  rR  r   rG  )r$   rw   r  r;  r%   s        r&   #testIntegration2ScoreDefFromElementz(Test.testIntegration2ScoreDefFromElement
  s   
 }}ZDg@CSV1X Y==F88!45==F88!4.1J(GI!H ))$/ 	f%78;U=P=PQf%78;S=M=MN'9 :1 = I IJ&);"<Q"?"D"DEF#56q9@@AfSk,7>>?VC[%>%G%GHfSk,79L9LMr(   c                   t        j                  d      }t        d      D cg c]  }t        j                  d       }}d|i}ddg}t        j
                  |d   d      t        j
                  |d   d      g}t        j                  ||      }| j                  ||       | j                  ||j                         yc c}w )z\
        _processesEmbeddedElements(): that single m21 objects are handled properly
        translator returnrq   rN  r   r   Nr{   )
r   rC   r~   rD   rE   r   r   _processEmbeddedElementsru   r!  )r$   mockTranslatorr   elementsrU  r`   expectedCallsr%   s           r&   testUnit1EmbeddedElementszTest.testUnit1EmbeddedElements
  s     5HI388<8aEMM&)8<>*')<=8A;5tyy!d7ST..xA  62  0M0MN =s   Cc                j   t        j                  d      }t        j                  ddg      }t        j                  d      t        j                  d      g}||d}g d}t	        j
                  ||      }| j                  ||       |j                  |d	   d
       |j                  |d   d
       y
)zb
        _processesEmbeddedElements(): that iterables of m21 objects are handled properly
        r  rq   
embedded 1
embedded 2r   beam)r   r  )r  r  r  r   Nr{   )r   rC   rD   rE   r   r  ru   rK   )r$   r  mockBeamTranslatorr  rU  r`   r%   s          r&   testUnit2EmbeddedElementszTest.testUnit2EmbeddedElements
  s     5HI!^^,9UVMM&)5==+@A)3EFD..xA  62..x{DA228A;Er(   c                   t        j                  d      }t        j                  d      t        j                  d      g}d|i}d}dg}t        j
                  j                  |d   j                  |      }t	        j                  |||      }| j                  ||       |j                  |d   d       |j                  j                  |       y)	za
        _processesEmbeddedElements(): that un-translated elements are reported properly
        r  rq   r   breamoceanr{   r   N)r   rC   rD   rE   r   _UNPROCESSED_SUBELEMENTr:   r,   r  ru   rK   
printDebug)	r$   rB  r  r  rU  
callerNamer`   expErrr%   s	            r&   testUnit3EmbeddedElementszTest.testUnit3EmbeddedElements  s    
 5HIMM&)5==+AB>*
'(--44Xa[__jQ..x*M  62..x{DA66v>r(   c                   d}t        j                  d|ddd      }t        j                  d      }t        j                  d      }t        j                         |_        t        j                  |g      |_        t        j                  d	      }d
}t        j                  |||      }| j                  ||       |j
                  j                  |       |j                  j                  |       y)M
        addSlurs(): element with @m21SlurStart is handled correctly
        $ae0b1570-451f-4ee9-a136-2094e26a797br   Nm21SlurStart
m21SlurEndslurr   r-  	mock slurrq   objectT
rD   rE   r   rC   addSpannedElementsgetByIdLocalr   addSlursr+   rK   r$   theUUIDrw   r"   mockNewSlurobjr`   r%   s           r&   testUnit1AddSlurszTest.testUnit1AddSlurs  s     9}}VW;?59-; < ^^M2
nn[1)-)9&"&..{m"L
nnX&tS*56*77@&&>>sCr(   c                   d}t        j                  d|ddd      }t        j                         }t        j                         }||_        |j                  |       t        j                  dd      }d	}t        j                  |||      }| j                  ||       | j                  |gt        |             | j                  |gt        |      d
   j                                y)r  r  r   Nr  r   E-7       @r  Tr   )rD   rE   r   r#   SluridLocalr  r   Noter   r  r+   ru   r   getSpannedElements)r$   r  rw   r"   theSlurr  r`   r%   s           r&   testIntegration1AddSlurszTest.testIntegration1AddSlurs0  s     9}}VW;?59-; < **,
,,.!'"iiS1tS*56*  'D,<=  #Z(8(;(N(N(PQr(   c                   d}t        j                  dd|dd      }t        j                  d      }t        j                  d      }t        j                         |_        t        j                  |g      |_        t        j                  d	      }d
}t        j                  |||      }| j                  ||       |j
                  j                  |       |j                  j                  |       y)zK
        addSlurs(): element with @m21SlurEnd is handled correctly
        r  r   Nr  r   r-  r  rq   r  Tr  r  s           r&   testUnit2AddSlurszTest.testUnit2AddSlursE  s     9}}VT;B59-; < ^^M2
nn[1)-)9&"&..{m"L
nnX&tS*56*77@&&>>sCr(   zmusic21.spanner.Slurc                &   t        j                  ddddd      }t        j                  d      }t        j                  d      |_        t        j                  d      |_        t        j                         |j
                  _        t        j                  d	      }t        j                         |_        t        j                  |g
      |_        t        j                  d      }d}t        j                  |||      }| j                  ||       |j                  j                  |j
                         |j
                  j                  j                  |       |j                  j                  d       |j                  j                  |       y)`
        addSlurs(): element with @slur is handled correctly (both an 'i' and 't' slur)
        r   N1i 2tr  r   r-  zslurBundle.appendr  zmock new slurrq   r  Tr  )rD   rE   r   rC   r  rG   r  r  r   r  r+   rK   )r$   r.  rw   r"   r  r  r`   r%   s           r&   testUnit3AddSlurszTest.testUnit3AddSlurs\  s*   
 }}VT;?5<-> ? ^^M2
 NN+>?
 ${ ;37>>3C0nn_5)-)9&"&..{m"L
nnX&tS*56*11(2G2GH00HHM77<&&>>sCr(   c                   t        j                  ddddd      }t        j                         }t        j                         }d|_        |j                  |       t        j                  dd	      }d
}t        j                  |||      }| j                  ||       | j                  |t        j                  gt        |             | j!                  t        |      d   t        j                         | j                  |gt        |      d   j#                                | j                  |gt        |      d   j#                                y)r  r   Nr  r  r   r  r  r  r  Tr{   r   )rD   rE   r   r#   r  r  r  r   r  r   r  r+   ru   r   r]  r   r    r  )r$   rw   r"   r  r  r`   r%   s          r&   testIntegration3AddSlurszTest.testIntegration3AddSlursv  s    }}VT;?5<-> ? **,
,,.'"iiS1tS*56*  '488!4d:6FGd:.q17<<@  #Z(8(;(N(N(PQ  #Z(8(;(N(N(PQr(   c                    t        j                  ddddd      }t        j                  d      }t        j                  d      }d}t	        j
                  |||      }| j                  ||       y)zZ
        addSlurs(): nothing was added; all three slur-related attributes missing
        r   Nr  r   r-  r  FrD   rE   r   rC   r   r  r+   r$   rw   r"   r  r`   r%   s         r&   testUnit4AddSlurszTest.testUnit4AddSlurs  sf     }}VT;?59-; < ^^M2
nnX&tS*56*r(   c                    t        j                  ddddd      }t        j                  d      }t        j                  d      }d}t	        j
                  |||      }| j                  ||       y)	z_
        addSlurs(): nothing was added; @slur is present, but only "medial" indicators
        r   Nz1m 2mr  r   r-  r  Fr  r  s         r&   testUnit5AddSlurszTest.testUnit5AddSlurs  sf     }}VT;?5<-> ? ^^M2
nnX&tS*56*r(   c                "   t        j                  ddddd      }t        j                  d      }t        j                  t              |_        t        j                  d      }d	}t        j                  |||      }| j                  ||       y)

        addSlurs(): nothing was added; when the Slur with id of @m21SlurStart can't be found

        NB: this tests that the inner function works---catching the IndexError
        r   $07f5513a-436a-4247-8a5d-85c10c661920Nr  r   r-  )r  r  F)	rD   rE   r   rC   
IndexErrorr  r   r  r+   r  s         r&   testUnit6AddSlurszTest.testUnit6AddSlurs  sx     }}V5[37-1%34 ^^M2
"&..Z"H
nnX&tS*56*r(   c                   t        j                  ddddd      }t        j                         }t	        j
                  dd      }d	}t        j                  |||      }| j                  ||       | j                  g t        |             y)
r  r   r  Nr  r   r  r  r  F)rD   rE   r   r#   r   r  r   r  r+   ru   r   r  s         r&   testIntegration6AddSlurszTest.testIntegration6AddSlurs  s~     }}V5[37-1%34 **,
iiS1tS*56*  T*%56r(   c                ,   t        d      D cg c]  }t        j                          }}t        t        |            D ]  }t        j                  d| d      ||   _        d||   j                  j
                  _        t        j                         ||   j                  _        t        j                         ||   j                  _        d||   j                  _
         g d}t        j                  |       t        t        |            D ]U  }||   j                  j
                  j                          ||   j                  j                  j                  d||          W |d   j                  j                  j                  d       y	c c}w )
zi
        beamTogether(): with three mock objects, that their "beams" attributes are set properly
        rO  thing  beamsr   rG  )r  r  r  rN  r  N)r~   r   rC   ru  r>  __len__rG   r?  setAllr   r  r   beamTogetherrK   r$   r   
someThingsr   expectedTypess        r&   testBeamTogether1zTest.testBeamTogether1  sA    16a91dnn&
9s:'A"&..6!F1C"DJqM78JqM''4'+~~'7JqM$)-)9JqM&*0JqM""' ( : 	*%s:'AqM''??AqM$$<<V]STEUV ( 	1""::6B :s   Fc                Z   t        d      D cg c]  }t        j                          }}t        t        |            D ]  }t        j                  d| d      ||   _        d||   j                  j
                  _        t        j                         ||   j                  _        t        j                         ||   j                  _        d||   j                  _
         g d}d|d   j                  j
                  _        d|d   j                  j
                  _        t        j                  |       d	D ]U  }||   j                  j
                  j                          ||   j                  j                  j                  d||          W |d
   j                  j                  j                  d       dD ]h  }| j                  d||   j                  j                  j                         | j                  d||   j                  j                  j                         j yc c}w )zj
        beamTogether(): with four mock objects, the middle two of which already have "beams" set
        rz   r  r  r   rG  )r  NNr  rN  r{   )r   rO  rO  r  )r{   rN  N)r~   r   rC   ru  r>  r  rG   r?  r  r   r  r   r  rK   r+   r   r  s        r&   testBeamTogether2zTest.testBeamTogether2  s    16a91dnn&
9s:'A"&..6!F1C"DJqM78JqM''4'+~~'7JqM$)-)9JqM&*0JqM""' ( : 45
1##034
1##0*%AqM''??AqM$$<<V]STEUV  	1""::6BAQ
1 3 3 8 8 C CDQ
1 3 3 : : E EF ) :s   H(c                   t        d      D cg c]  }t        j                          }}d|d<   dD ]  }t        j                  d| d      ||   _        d||   j                  j                  _        t        j                         ||   j                  _        t        j                         ||   j                  _        d||   j                  _	         g d	}t        j                  |       dD ]U  }||   j                  j                  j                          ||   j                  j                  j                  d||          W |d
   j                  j                  j                  d       yc c}w )zg
        beamTogether(): with four mock objects, one of which doesn't have a "beams" attribute
        rz   r?   rN  )r   r{   rO  r  r  r   rG  )r  r  Nr  rO  r  N)r~   r   rC   r>  r  rG   r?  r  r   r  r   r  rK   r  s        r&   testBeamTogether3zTest.testBeamTogether3  s9    16a91dnn&
9
1A"&..6!F1C"DJqM78JqM''4'+~~'7JqM$)-)9JqM&*0JqM""'  @ 	*%AqM''??AqM$$<<V]STEUV  	1""::6B! :s   E2c           	        t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}g }t        d      D ]1  }|j                  t        j                  dd| d	| d
             3 t        j                  |      |j                  _        t        j                  |       |j                  j                  j                  |       t        d      D ]L  }| j                  d|j
                  d|    d          | j                  d|j
                  d	|    d          N y)zS
        _ppTies(): that three ties are specified correctly in the m21Attr
        r=   c                     i S r  r  r  r(   r&   r  z$Test.testUnitTies1.<locals>.<lambda>'      Br(   r@   rA   score//r   rO  start end startidendidr   rq   r   r  N)r   rC   r   r   r   r!   r   r   r~   r  rD   rE   r  _ppTiesrK   r+   r$   mockConverterexpectedIterfindr  r   s        r&   testUnitTies1zTest.testUnitTies1   s5    0F0F0HI +J 7%)^^%5" xwvhcJqA!!%--FSTRU,JNqc
?T #U V  /3nn..Y""+]#""++CCDTUqAS-"7"7&"Ee"LMS-"7"7$qc
"CE"JK r(   c                L   t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}t        j                  dddd	
      g}t        j                  |      |j                  _
        t        j                  |       |j                  j                  j                  |       | j                  dt        |j
                               |j                  j                  d       y)z_
        _ppTies(): <tie> without @startid and @endid is properly announced as failing
        r=   c                     i S r  r  r  r(   r&   r  z$Test.testUnitTies2.<locals>.<lambda>A  r  r(   r@   rA   r  r   4.1z4.2tstamptstamp2r   rq   r   zAImporting <tie> without @startid and @endid is not yet supported.N)r   rC   r   r   r   r!   r   r   rD   rE   r  r  rK   r+   ru  rA  r$   rB  r  r  r  s        r&   testUnitTies2zTest.testUnitTies29  s     0F0F0HI +J 7%)^^%5" xwvhcJ--SX6YZ[.2nn..Y""+]#""++CCDTUC 5 56700O	Qr(   c           	        t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}g }t        d      D ]1  }|j                  t        j                  dd| d	| d
             3 t        j                  |      |j                  _        d |_        g |_        t        j                  |       |j                  j                  j!                  |       g }| j#                  dt%        |j                               |j                  D ]b  }| j'                  |t         j                         | j#                  dt%        |j(                               |j                  |j(                         d t        d      D ]N  }| j+                  |j
                  d|    d   |v        | j+                  |j
                  d	|    d   |v        P y)zx
        _ppSlurs(): that three slurs are specified correctly in the m21Attr,
        and put in the slurBundle
        r=   c                     i S r  r  r  r(   r&   r  z%Test.testUnitSlurs1.<locals>.<lambda>Y  r  r(   r@   rA   r  r  rO  r  r  r  r   rq   c                 ,    t        j                  d      S Nza fake Slurr   rC   r  r(   r&   r  z%Test.testUnitSlurs1.<locals>.<lambda>b      t~~m'Dr(   $   r  r  N)r   rC   r   r   r   r!   r   r   r~   r  rD   rE   r  r  r"   _ppSlursrK   r+   ru  r    r  rt  )r$   r.  r  r  r  r   expectedIdLocaleachSlurs           r&   testUnitSlurs1zTest.testUnitSlurs1P  s    0F0F0HI +J 7%)^^%5" xwvhdKqA!!%--EKA3<CGs8M#N O  /3nn..Y""+D#% m$""++CCDTUC 8 89:%00H!!(DNN;RX%5%5!67""8#3#34 1
 qAOOM11F1#,?O./ 0OOM11D*=lK./ 0 r(   c                   t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}t        j                  dddd	
      g}t        j                  |      |j                  _
        d |_        g |_        t        j                  |       |j                  j                  j                  |       | j                  dt!        |j                               | j                  dt!        |j
                               |j"                  j                  d       y)za
        _ppSlurs(): <slur> without @startid and @endid is properly announced as failing
        r=   c                     i S r  r  r  r(   r&   r  z%Test.testUnitSlurs2.<locals>.<lambda>  r  r(   r@   rA   r  r  r	  z4.3r
  r   rq   c                 ,    t        j                  d      S r  r  r  r(   r&   r  z%Test.testUnitSlurs2.<locals>.<lambda>  r  r(   r   zBImporting <slur> without @startid and @endid is not yet supported.N)r   rC   r   r   r   r!   r   r   rD   rE   r  r  r"   r  rK   r+   ru  rA  )r$   rB  r.  r  r  r  s         r&   testUnitSlurs2zTest.testUnitSlurs2x  s    0F0F0HI +J 7%)^^%5" xwvhdK--%TY7Z[\.2nn..Y""+D#% m$""++CCDTUC 8 89:C 5 56700P	Rr(   c                *   t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}g }t        d      D ];  }|j                  t        j                  dd| d	| d
| d| d| d             = t        j                  |      |j                  _        t        j                  |       |j                  j                  j                  |       t        d      D ]q  }| j                  d|j
                  d|    d          | j                  d|j
                  d|    d          | j                  d|j
                  d	|    d          s y)zq
        _ppBeams(): that three beamed notes are specified correctly in the m21Attr

        with @plist
        r=   c                     i S r  r  r  r(   r&   r  z%Test.testUnitBeams1.<locals>.<lambda>  r  r(   r@   rA   r  beamSpanrO  start-end-#start- #mid- #end-)r   r  plistr   rq   r  r<  r  mid-r  Nr   rC   r   r   r   r!   r   r   r~   r  rD   rE   r  _ppBeamsrK   r+   r  s        r&   testUnitBeams1zTest.testUnitBeams1  sn    0F0F0HI +J 7%)^^%5" xwvhhOqA!!j39!15aSz186!F1#/N&(   /3nn..Y""+m$""++CCDTUqAWm&;&;fQCL&I)&TUZ)>)>aSz)J9)UVV]%:%:T!:%Fy%QR r(   c           	        t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}g }t        d      D ]1  }|j                  t        j                  dd| d	| d
             3 t        j                  |      |j                  _        t        j                  |       |j                  j                  j                  |       t        d      D ]L  }| j                  d|j
                  d|    d          | j                  d|j
                  d|    d          N y)zt
        _ppBeams(): that three beamed notes are specified correctly in the m21Attr

        without @plist
        r=   c                     i S r  r  r  r(   r&   r  z%Test.testUnitBeams2.<locals>.<lambda>  r  r(   r@   rA   r  r   rO  r#  #end-r  r   rq   r  r!  r<  r  r"  Nr(  r  s        r&   testUnitBeams2zTest.testUnitBeams2  s4    0F0F0HI +J 7%)^^%5" xwvhhOqA!!%--
ELQC=CH8N#O P  /3nn..Y""+m$""++CCDTUqAWm&;&;fQCL&I)&TUV]%:%:T!:%Fy%QR r(   c                L   t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}t        j                  dddd	
      g}t        j                  |      |j                  _
        t        j                  |       |j                  j                  j                  |       | j                  dt        |j
                               |j                  j                  d       y)ze
        _ppBeams(): <beamSpan> without @startid and @endid is properly announced as failing
        r=   c                     i S r  r  r  r(   r&   r  z%Test.testUnitBeams3.<locals>.<lambda>  r  r(   r@   rA   r  r   z12.4z13.1r
  r   rq   r   zFImporting <beamSpan> without @startid and @endid is not yet supported.N)r   rC   r   r   r   r!   r   r   rD   rE   r  r)  rK   r+   ru  rA  r  s        r&   testUnitBeams3zTest.testUnitBeams3  s     0F0F0HI +J 7%)^^%5" xwvhhO--
fY_;`ab.2nn..Y""+m$""++CCDTUC 5 56700T	Vr(   c                   t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}d}d}g }t        d	      D ]5  }|j                  t        j                  dd
| d| d| ||d             7 t        j                  |      |j                  _        t        j                  |       |j                  j                  j                  |       t        d	      D ]  }| j                  ||j
                  d|    d          | j                  ||j
                  d|    d          | j                  ||j
                  d|    d          | j                  ||j
                  d|    d          | j                  ||j
                  d|    d          | j                  ||j
                  d|    d           y)zx
        _ppTuplets(): that three notes in a tuplet are specified correctly in the m21Attr

        with @plist
        r=   c                     i S r  r  r  r(   r&   r  z'Test.testUnitTuplets1.<locals>.<lambda>  r  r(   r@   rA   r  
tupletSpanr   r   rO  r#  r$  r%  )r&  numnumbaser   rq   r!  r9  r:  r'  r"  Nr   rC   r   r   r   r!   r   r   r~   r  rD   rE   r  
_ppTupletsrK   r+   r$   r  r  theNum
theNumbaser  r   s          r&   testUnitTuplets1zTest.testUnitTuplets1  s    0F0F0HI +J 7%)^^%5" xwvhjQ
qA!!%--#*1#VA3fQC!@%#-/#0 1  /3nn..Y""+&""++CCDTUqAV]%:%:VA3<%H%XYZ*22VA3<@ASTVV]%:%:T!:%F~%VWZ*22T!:>?QRTV]%:%:T!:%F~%VWZ*22T!:>?QRT r(   c                X   t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}d}d}t        j                  d||d	
      g}t        j                  |      |j                  _
        d}t        j                  |       |j                  j                  j                  |       | j                  dt        |j
                               |j                  j                  |       y)z}
        _ppTuplets(): <tupletSpan> without (@startid and @endid) or
        @plist is properly announced as failing
        r=   c                     i S r  r  r  r(   r&   r  z'Test.testUnitTuplets2.<locals>.<lambda>  r  r(   r@   rA   r  r4  r   r   r5  r6  r   rq   zRImporting <tupletSpan> without @startid and @endid or @plist is not yet supported.r   N)r   rC   r   r   r   r!   r   r   rD   rE   r  r8  rK   r+   ru  rA  )r$   rB  r  r  r:  r;  r  
expWarnings           r&   testUnitTuplets2zTest.testUnitTuplets2  s     0F0F0HI +J 7%)^^%5" xwvhjQ
--7=*/UW X.2nn..Y""+A
 	&""++CCDTUC 5 56700<r(   c                   t        j                  t        j                               }t	        d       |_        t        j                         |_        dt         dt         dt         d}d}d}g }t        d	      D ]3  }|j                  t        j                  dd
| d| ||d             5 t        j                  |      |j                  _        t        j                  |       |j                  j                  j                  |       dD ]  }| j                  ||j
                  d|    d          | j                  ||j
                  d|    d          | j                  d|j
                  d|    d          | j                  ||j
                  d|    d          | j                  ||j
                  d|    d          | j                  d|j
                  d|    d           y)z
        _ppTuplets(): that three notes in a tuplet are specified correctly in the m21Attr

        without @plist (this should set @m21TupletSearch attributes)
        r=   c                     i S r  r  r  r(   r&   r  z'Test.testUnitTuplets3.<locals>.<lambda>5  r  r(   r@   rA   r  r4  r   r   rO  r#  r-  )r   r  r5  r6  r   rq   r   rN  r!  r9  r:  r  r;  r"  r  Nr7  r9  s          r&   testUnitTuplets3zTest.testUnitTuplets3,  s    0F0F0HI +J 7%)^^%5" xwvhjQ
qA!!%--ELQC=CH?ECM8O#P Q  /3nn..Y""+&""++CCDTUAV]%:%:VA3<%H%XYZ*22VA3<@ASTVW*22VA3<@ARSUV]%:%:T!:%F~%VWZ*22T!:>?QRTUM$9$9D*$EFW$XY r(   c                D   d}t        j                  t        j                               }t	        j
                  |      |_        t        d       |_        d|j                  d   d<   d|j                  d   d<   t        dddddi}t        d	i}t        j                  |       |j                  j                  d
t         d      }|j                  j                  d
t         d      }| j                  ||j                         | j                  ||j                         y)z.
        _ppConclude(): that it works
        zB<mei><music><note xml:id="one"/><note xml:id="two"/></music></mei>r=   c                     i S r  r  r  r(   r&   r  z(Test.testUnitConclude1.<locals>.<lambda>Y  r  r(   14rQ  newr  otherrL  z*//*[@z="one"]z="two"]N)r   rC   r   r   rD   r  r   r   r!   r   _ppConcluderF   r+   r   )r$   theDocumentr  expNoteOneAttribexpNoteTwoAttribnoteOnenoteTwos          r&   testUnitConclude1zTest.testUnitConclude1R  s     _0F0F0HI%*%5%5k%B" +J 7.2e$U+04e$W-"E5$F"E?',,11F6('2JK,,11F6('2JK)7>>:)7>>:r(   c                z   t        d      D cg c]  }t        j                          }}t        j                  ddddd      }t        j                  ||       |D ]V  }| j                  d|j                         | j                  d|j                         | j                  d|j                         X yc c}w )	zg
        scaleToTuplet(): with three objects, the "tuplet search" attributes are set properly.
        rO  	tupletDefr   400z
the forest)r9  r:  r;  r   N)r~   r   r  rD   rE   r   scaleToTupletr+   r9  r:  r;  )r$   r   objsrw   r  s        r&   testTuplets1zTest.testTuplets1k  s     &+1X.X		X.}}[599>8D%FG
 	4&CT3#3#34UC$8$89\3+>+>?  /s   B8zmusic21.duration.Tupletc                   t        d      D cg c]  }t        j                          }}|D ]P  }t        j                         |_        d|j
                  _        t        j                         g|j
                  _        R t        j                  ddddd      }d	|_
        t        j                  d
ddd      }t        j                  ||       | j                  d|j                         |j                   D ]  }| j                  ||        |D ]5  }| j                  d|j
                  j                  d   j                         7 yc c}w )zx
        scaleToTuplet(): with three objects, their
        duration is scaled properly. (With @m21TupletType).
        rO  duration typerS  r   rT  banana)r9  r:  rg  r   a Tupletr     numberNotesActualdurationActualnumberNotesNormaldurationNormalr   N)r~   r   r  r   rC   r   r  ro  rD   rE   rG   r   r   rU  r+   r   r!  r$   rO   r   rV  r  rw   expectedCalleachCalls           r&   testTuplets2zTest.testTuplets2|  s    &+1X.X		X.C>>+CL /CLL$(NN$4#5CLL   }}[599>6>%@A #-
yy2o36X 	4&J112"11H\84 2CXs||';';A'>'C'CD % /s   Ec                   t        d      D cg c]*  }t        j                  t        j                               , }}|D ]P  }t        j                         |_        d|j
                  _        t        j                         g|j
                  _        R t        j                  ddddd	      }d
|_
        t        j                  dddd      }t        j                  ||       | j                  d|j                         |j                   D ]  }| j                  ||        |D ]5  }| j                  d|j
                  j                  d   j                         7 yc c}w )zy
        scaleToTuplet(): with three objects, their duration is
        scaled properly. (With @tuplet == 'i1').
        rO  specrY  rS  r   rT  r*  r9  r:  tupletr   r[  r   r\  r]  r  r   N)r~   r   rC   r   r  r   r  ro  rD   rE   rG   r   r   rU  r+   r   r!  rb  s           r&   testTuplets3zTest.testTuplets3  s$    ;@(C(QDIIK0(CC>>+CL /CLL$(NN$4#5CLL   }}[$\a<@2B C",
yy2o36X 	4&J112"11H\84 2CWcll&:&:1&=&B&BC ! Ds   /Ec                n   t        j                  t        j                               }t        j                         |_        d|j                  _        t        j                         g|j                  _        t        j                  ddddd      }d	|_	        t        j                  d
ddd      }t        j                  ||       | j                  d|j                         | j                  ||j                  d          | j                  d|j                  j                  d   j
                         y)zl
        scaleToTuplet(): with one object, its duration is scaled properly. (With @tuplet == 't1').
        rg  rY  rS  r   rT  t1ri  r   r[  r   r\  r]  r{   r   r  N)r   rC   r   r  r   r  ro  rD   rE   rG   r   r   rU  r+   r   r!  )r$   rO   r  rw   rc  s        r&   testTuplets4zTest.testTuplets4  s    
 nn$))+.~~'+ $ 01}}[$\a<@2B C",
yy2o36X 	3%J112z'@'@'CD!5!5a!8!=!=>r(   c                   t        d      D cg c]*  }t        j                  t        j                               , }}|D ]P  }t        j                         |_        d|j
                  _        t        j                         g|j
                  _        R t        j                  t        j                               |d<   t        j                  ddddd	
      }d|_        t        j                  dddd      }t        j                  ||       | j!                  d|j"                         |j$                  D ]  }| j!                  ||        | j!                  d|d   j
                  j                  d   j                         | j!                  g |d   j
                  j$                         | j!                  d|d   j
                  j                  d   j                         yc c}w )z
        scaleToTuplet(): with three objects, their duration is scaled properly. (One of the objects
        isn't a Note/Chord/Rest).
        rO  rg  rY  r{   rS  r   rT  r*  ri  r   r[  r   r\  r]  rN  r  r   N)r~   r   rC   r   r  r   r  ro  r
   rj  rD   rE   rG   r   r   rU  r+   r   r!  rb  s           r&   testTuplets5zTest.testTuplets5  s    ;@(C(QDIIK0(CC>>+CL /CLL$(NN$4#5CLL   ..doo&78Q}}[$\a<@2B C",
yy2o36X 	4&J112"11H\84 2$q'"2"2":":1"="B"BCT!W--<<=$q'"2"2":":1"="B"BC' Ds   /G%c                   t        j                  dddi      }| j                  t        j                  t        j
                  |       	 t        j
                  |       t        j                  dddi      }| j                  t        j                  t        j
                  |       	 t        j
                  |       y# t        j                  $ r7}| j                  t        j                  |j                  d          Y d}~d}~ww xY w# t        j                  $ r7}| j                  t        j                  |j                  d          Y d}~yd}~ww xY w)	z
        tupletFromElement(): when either @num or @numbase isn't in the element, raise an
            MeiAttributeError.
        rj  r5  r   r   r   Nr6  r  )	rD   rE   r0   r   r  tupletFromElementr+   _MISSING_TUPLET_DATAr3   )r$   rw   errs      r&   testTuplets6zTest.testTuplets6  s    }}Xucl;$00$2H2H$O	E""4( }}Xy#.>?$00$2H2H$O	E""4( %% 	ET66DD	E %% 	ET66DD	Es0   
B> (D >D-DDE-EEzmusic21.mei.base.beamTogetherc                J   t        j                  dddd      }t        d      D cg c]*  }t        j                  t        j                               , }}|D ]X  }t        j                  t        j                               g|j                  _	        d|j                  j                  d	   _
        Z ||_        d
 |_        t        j                  |      }| j                  ||       |j!                  |       | j#                  d|d	   j                  j                  d	   j                         | j#                  d|d   j                  j                  d	   j                         | j#                  d|d   j                  j                  d	   j                         yc c}w )zc
        tupletFromElement(): everything set properly in a triplet; no extraneous elements
        rj  r   r  r?  r   rO  rg  defaultr   c                    | S r  r  r  s    r&   r  z#Test.testTuplets7.<locals>.<lambda>      r(   r  r{   r  rN  N)rD   rE   r~   r   rC   r   r  r   Tupletro  r  rG   r  r   rr  ru   rK   r+   )	r$   mockBeamrO   mockEmbeddedrw   r   	mockNotesr  r%   s	            r&   testTuplets7zTest.testTuplets7  sG    }}Xcc.JK?DQxHx!T^^5x	HC$(NN8I$J#KCLL +4CLL  #(  #,
*''-  F3((3)A,"7"7"?"?"B"G"GHIaL$9$9$A$A!$D$I$IJ1!6!6!>!>q!A!F!FG Is   /F c                   t        j                  dddd      }t        d      D cg c]*  }t        j                  t        j                               , }}|D ]X  }t        j                  t        j                               g|j                  _	        d|j                  j                  d	   _
        Z d
D ]-  }t        j                  t        j                               ||<   / ||_        d |_        t        j                   |      }	| j#                  ||	       |j%                  |       | j'                  d|d	   j                  j                  d	   j                         | j'                  d|d   j                  j                  d	   j                         | j'                  d|d   j                  j                  d	   j                         yc c}w )zk
        tupletFromElement(): everything set properly in a triplet; extraneous elements interposed
        rj  r   r  r?  r   r   rg  rw  r   )r{   rN  rz   c                    | S r  r  r  s    r&   r  z#Test.testTuplets8.<locals>.<lambda>  ry  r(   r  rO  r  r?   NrD   rE   r~   r   rC   r   r  r   rz  ro  r  r
   rj  rG   r  r   rr  ru   rK   r+   
r$   r{  rO   r|  rw   r   r}  r  r   r%   s
             r&   testTuplets8zTest.testTuplets8  sj    }}Xcc.JK?DQxHx!T^^5x	HC$(NN8I$J#KCLL +4CLL  #(  A>>t/@AIaL "+
*''-  F3((3)A,"7"7"?"?"B"G"GHIaL$9$9$A$A!$D$I$IJ1!6!6!>!>q!A!F!FG I   /Gc                   t        j                  dddd      }t        d      D cg c]*  }t        j                  t        j                               , }}|D ]X  }t        j                  t        j                               g|j                  _	        d|j                  j                  d	   _
        Z d
D ]-  }t        j                  t        j                               ||<   / ||_        d |_        t        j                   |      }	| j#                  ||	       |j%                  |       | j'                  d|d   j                  j                  d	   j                         | j'                  d|d   j                  j                  d	   j                         | j'                  d|d   j                  j                  d	   j                         yc c}w )z
        tupletFromElement(): everything set properly in a triplet; extraneous elements interposed,
            prepended, and appended
        rj  r   r  r?  r      rg  rw  r   )r   rN  rO  r?      c                    | S r  r  r  s    r&   r  z#Test.testTuplets9.<locals>.<lambda>6  ry  r(   r  r{   rz   r  r   Nr  r  s
             r&   testTuplets9zTest.testTuplets9%  sj    }}Xcc.JK?DQxHx!T^^5x	HC$(NN8I$J#KCLL +4CLL  #(  !A>>t/@AIaL !"+
*''-  F3((3)A,"7"7"?"?"B"G"GHIaL$9$9$A$A!$D$I$IJ1!6!6!>!>q!A!F!FG Ir  c                @   t        d      D cg c]  }t        j                  d       }}t        d      D cg c]  }d }}t        j                  |      }t        t        |            D ]$  }| j                  ||   ||   j                         & yc c}w c c}w )zl
        _guessTuplets(): given a list of stuff without tuplet-guessing attributes, make no changes
        r?   r  r  N)r~   r   r  r   _guessTupletsru  r+   r  r$   r   theLayerexpectedDursr%   r   s         r&   testTuplet10zTest.testTuplet10@  s     ;@(C(QDIIC0(C%*1X.XX.##H-s<()A\!_fQi.E.EF * D.s
   B	Bc                   t        d      D cg c]  }t        j                  d       }}d|d   _        d|d   _        d|d   _        d|d	   _        d|d	   _        d|d	   _        t        d	d
      t        d	d
      t        d	d
      ddg}t        j                  |      }t        t        |            D ]$  }| j                  ||   ||   j                         & dD ]\  }| j                  t        ||   d             | j                  t        ||   d             | j                  t        ||   d             ^ yc c}w )z]
        _guessTuplets(): with 5 notes, a triplet at the beginning is done correctly
        r?   r  r  r  r   r   r  r  rN  rO  rD  r;  r9  r:  Nr~   r   r  r;  r9  r:  r   r   r  ru  r+   r  r  r  r  s         r&   testTuplet11azTest.testTuplet11aL  s/    ;@(C(QDIIC0(C&-##& '*$&+##& '*$ AAASQ##H-s<()A\!_fQi.E.EF *AWXa[2CDEWXa[.ABWXa[2DEF  D   E c                   t        d      D cg c]  }t        j                  d       }}d|d   _        d|d   _        d|d   _        d|d	   _        d|d	   _        d|d	   _        dt        d
d	      t        d
d	      t        d
d	      dg}t        j                  |      }t        t        |            D ]$  }| j                  ||   ||   j                         & dD ]\  }| j                  t        ||   d             | j                  t        ||   d             | j                  t        ||   d             ^ yc c}w )zZ
        _guessTuplets(): with 5 notes, a triplet in the middle is done correctly
        r?   r  r  r  r{   r   r  r  rO  rN  )r{   rO  r;  r9  r:  Nr  r  s         r&   testTuplet11bzTest.testTuplet11bb  s/    ;@(C(QDIIC0(C&-##& '*$&+##& '*$Xa^Xa^Xa^SQ##H-s<()A\!_fQi.E.EF *AWXa[2CDEWXa[.ABWXa[2DEF  Dr  c                   t        d      D cg c]  }t        j                  d       }}d|d   _        d|d   _        d|d   _        d|d	   _        d|d	   _        d|d	   _        ddt        dd
      t        dd
      t        dd
      g}t        j                  |      }t        t        |            D ]$  }| j                  ||   ||   j                         & dD ]\  }| j                  t        ||   d             | j                  t        ||   d             | j                  t        ||   d             ^ yc c}w )zW
        _guessTuplets(): with 5 notes, a triplet at the end is done correctly
        r?   r  r  r  rN  r   r  r  rz   rO  )rN  rz   r;  r9  r:  Nr  r  s         r&   testTuplet11czTest.testTuplet11cx  s/    ;@(C(QDIIC0(C&-##& '*$&+##& '*$S(1a.(1a.(1a.Q##H-s<()A\!_fQi.E.EF *AWXa[2CDEWXa[.ABWXa[2DEF  Dr  z,music21.instrument.instrumentFromMidiProgramc                    t        j                  dddi      }d}d|_        |j                  }t        j                  |      }| j                  ||       |j                  |       y)zE
        instrDefFromElement(): when @midi.instrnum is given
        rE  rI  rF  r   G   zGuess Which InstrumentNrD   rE   rG   r   instrDefFromElementr+   rK   )r$   mockFromProgrw   expFromProgArgr`   r%   s         r&   testUnit1InstrDefzTest.testUnit1InstrDef  s_    
 }}Z$0GH$<!,,))$/6*,,^<r(   c                    t        j                  dddi      }d}d|_        |j                  }t        j                  |      }| j                  ||       |j                  |       y)zT
        instrDefFromElement(): when @midi.instrname is given, and it works
        rE  rJ  Tubar   zThat's right: tubaNr  )r$   rp  rw   expFromStringArgr`   r%   s         r&   testUnit2InstrDefzTest.testUnit2InstrDef  sb    
 }}Z1A60JK!&:#!..))$/6*../?@r(   zmusic21.mei.base.instrumentc                $   t         j                  |_        t        j                  dddi      }d}t	        j
                         |_        t        |j                  _        t	        j
                         |j                  _
        d|j                  j                  _        |j                  j                  }t        j                  |      }| j                  ||       |j                  j                  |       | j                  ||j                         y)zh
        instrDefFromElement(): when @midi.instrname is given, and it explodes (AttributeError)
        rE  rJ  Gold-Plated Kazoor   N)r   rv  rD   rE   r   rC   
fromStringAttributeErrorr  r{  rG   rR  r   r  r+   rK   r$   r^  rw   r  r`   r%   s         r&   testUnit3aInstrDefzTest.testUnit3aInstrDef  s     )3(F(F	%}}Z1ACV0WX.#~~/	+9	(,0NN,<	)59	))2''44))$/6*445EF)6??;r(   c                8   t         j                  |_        t        j                  dddi      }d}t	        j
                         |_        t         j                  |j                  _        t	        j
                         |j                  _	        d|j                  j                  _
        |j                  j                  }t        j                  |      }| j                  ||       |j                  j                  |       | j                  ||j                         y)zu
        instrDefFromElement(): when @midi.instrname is given,
        and it explodes (InstrumentException)
        rE  rJ  r  r   N)r   rv  rD   rE   r   rC   r  r  r{  rG   rR  r   r  r+   rK   r  s         r&   testUnit3bInstrDefzTest.testUnit3bInstrDef  s     )3(F(F	%}}Z1ACV0WX.#~~/	+5+I+I	(,0NN,<	)59	))2''44))$/6*445EF)6??;r(   c                   t        j                  d      }t        j                         t        j                         t        j                         dd}t	        j
                  ||      }dD ]>  }| j                  ||   j                         | j                  ||   j                         @ | j                  d|d          y)zR
        _makeBarlines(): when @left and @right are None, nothing happens
        measurerz   r  rp   r  r   r   N)
rD   rE   r   Measurer   _makeBarlinesr  leftBarlinerightBarliner+   r$   rw   stavesr   s       r&   testMakeBarline1zTest.testMakeBarline1  s     }}Y'~~'fnn.>V^^EU\]^##D&1 AfQi334fQi445 ! 	F3K(r(   c                n   t        j                  dddd      }t        j                         t        j                         t        j                         dd}t	        j
                  ||      }dD ]  }| j                  ||   j                  t        j                         | j                  d||   j                  j                         | j                  ||   j                  t        j                         | j                  d||   j                  j                          | j                  d|d	          y
)zg
        _makeBarlines(): when @left and @right are a simple barline, that barline is assigned
        r  dblleftr  r   rz   r  r  doubler   N)rD   rE   r   r  r   r  r    r  r	   r  r+   r  r  r  s       r&   testMakeBarline2zTest.testMakeBarline2  s     }}Y/NO~~'fnn.>V^^EU\]^##D&1 A!!&)"7"7EXvay'<'<'A'AB!!&)"8"8#++FXvay'='='B'BC	 !
 	F3K(r(   c                n   t        j                  dddd      }t        j                         t        j                         t        j                         dd}t	        j
                  ||      }dD ]  }| j                  ||   j                  t        j                         | j                  d||   j                  j                         | j                  ||   j                  t        j                         | j                  d	||   j                  j                          | j                  d|d
          y)z\
        _makeBarlines(): when @left and @right are "rptboth," that's done properly
        r  r  r  r   rz   r  r  zheavy-lightr  r   N)rD   rE   r   r  r   r  r    r  r	   r  r+   r  r  r  s       r&   testMakeBarline3zTest.testMakeBarline3  s     }}Y	I/VW~~'fnn.>V^^EU\]^##D&1 A!!&)"7"7D]F1I,A,A,F,FG!!&)"8"8#**EWfQi&<&<&A&AB	 !
 	F3K(r(   c                   t        j                  t        j                  t        j                         t        j                         g      g      t        j                  t        j                  t        j                         t        j                         g      g      d}t        j                  |d       | j                  d|d   j                  d   d   j                         | j                  d|d   j                  d   d   j                         | j                  d|d   j                  d   d   j                         | j                  d|d   j                  d   d   j                         y)	z
        _correctMRestDurs(): nothing happens when there isn't at object with "m21wasMRest"

        This is an integration test of sorts, using no Mock objects.
        rp   r  r  r  rp   r   r{   r  N)
r   r  r   r   rs  r   _correctMRestDursr+   voicesr  r$   r  s     r&   testCorrectMRestDurs1zTest.testCorrectMRestDurs1  s    ~~v||TYY[$))+4N'O&PQ~~v||TYY[$))+4N'O&PQSvs+fSk003A6DDEfSk003A6DDEfSk003A6DDEfSk003A6DDEr(   c                   t        j                  t        j                  t        j                         g      g      t        j                  t        j                  t        j                         t        j                         g      g      d}d|d   d   d   _        t        j                  |d       | j                  d|d   j                  d   d   j                         | j                  d|d   j                  d   d   j                         | j                  d|d   j                  d   d   j                         | j                  t        |d   j                  d   d   d	             y
)z
        _correctMRestDurs(): things with "m21wasMRest" are adjusted properly

        This is an integration test of sorts, using no Mock objects.
        r  Trp   r   r  r  r  r{   r  N)r   r  r   r   rs  r  r   r  r+   r  r  r  r  r  s     r&   testCorrectMRestDurs2zTest.testCorrectMRestDurs2  s!    ~~v||TYY[M'B&CD~~v||TYY[$))+4N'O&PQS(,sAq%vs+fSk003A6DDEfSk003A6DDEfSk003A6DDE!3!3A!6q!9=IJr(   c                   t        j                  t        j                  t        j                         g      t        j                  t        j                         g      g      t        j                  t        j                  d      t        j                  t        j                         g      g      d}d|d   d   d   _        d|d   d   d   _        t        j                  |d       | j                  d|d   j                  d   d   j                         | j                  d|d   j                  d   d   j                         | j                  d|d	   j                  d   d   j                         | j                  t        |d   d   d   d
             | j                  t        |d   d   d   d
             y)z
        _correctMRestDurs(): works with more than 1 voice per part,
        and for things that aren't Voice

        This is an integration test of sorts, using no Mock objects.
        z4/4r  Trp   r   r{   r  r  r  r  N)r   r  r   r   rs  r   ri  r  r  r   r  r+   r  r  r  r  r  s     r&   testCorrectMRestDurs3zTest.testCorrectMRestDurs3,  sr    ~~v||TYY[M'BFLLRVR[R[R]Q^D_&`a~~u':':5'A6<<QUQZQZQ\P]C^&_`b(,sAq%(,sAq%vs+fSk003A6DDEfSk003A6DDEfSk003A6DDEQ!2MBCQ!2MBCr(   z!music21.mei.base.staffFromElementz"music21.mei.base._correctMRestDurszmusic21.mei.base._makeBarlineszmusic21.stream.Measurec                4   t          d}t        j                  dddi      }t        d      D cg c]'  }t        j                  |dt	        |dz         i      ) }	}|	D ]  }
|j                  |
        d}g d	}t        j                  d
      }t        j                  d      }t        j                  d      |_
        t        d      D cg c]  }t        j                  d|dz            c}}D ]<  }t        j                  t        j                        |_        d|j                  _        > fd|_        d |_        d|_        t        t        t        |	                  fd|_        t        j                  d      |_        t!        |      D ci c]  \  }}|||    }}}t#        j$                  |||||      }| j'                  ||       | j)                  t        |	      |j*                         |	D ]  }
|j-                  |
|        | j)                  t        |      |j*                         t        t        |	            D ]-  }|j-                  |t/        |j1                  d                   / |j-                  |j                  gt/        |j1                  d                   | j)                  d|j                  j2                         |j5                  |d       |j5                  ||       yc c}w c c}w c c}}w )a,  
        measureFromElement(): test 1
            - "elem" has an @n attribute
            - some staves have <mRest> without @dur (same behaviour to as if no staves did)
            - a rest-filled measure is created for the "n" value in "expectedNs" that's missing a
              corresponding <staff> element, and its Measure has the same @n as "elem"
            - activeMeter isn't None, and it is larger than the (internal) maxBarDuration

        mocked: staffFromElement(), stream.Measure() and Voice, _correctMRestDurs(), _makeBarlines()
        staffr  r  r  r   rO  r{   r   r  r"   rU  activeMeter      @rz   Measure r=   c                 &    j                  d      S r  r  r  r  mockMeasRetss     r&   r  z'Test.testMeasureUnit1.<locals>.<lambda>a      ,2B2B12Er(   c                    |S r  r  rw   r  s     r&   r  z'Test.testMeasureUnit1.<locals>.<lambda>c      Fr(   Nc                 &    j                  d      S r  r  r  r  staffFEreturnss     r&   r  z'Test.testMeasureUnit1.<locals>.<lambda>h      .2D2DQ2Gr(   r   r.  r  rp   )r   rD   rE   r~   r   r  r   rC   r   rI  barDurationr  r  rG   r   ru  	enumerater   measureFromElementrY  r+   r   r\  intrr   r   rK   r$   r  mockMeasuremockMakeBarlinesmockCorrectDursmockStaffFEstaffTagrw   r  innerStaffs	eachStaff	backupNum
expectedNsr"   r  r   r`   measr%   r  r  s                      @@r&   testMeasureUnit1zTest.testMeasureUnit1>  s   " XU#}}YT{;RWXYRZ[RZQu}}XsCAJ6GHRZ[$IKK	" % 	)
^^6
nn-8"*"3"3C"8 JOqRAhq1ug,>?R D NNH4E4EFDM*-DMM' ! #F'B$'+$eC$456"G!%W!=	/8/DE/Dtq!Ax{N/DE((y*jR]^Xv.[);+A+AB$I''	j'I % 	X(>(>?s;'(A''#dhhsm2D'E )##Y%;%;$<SRUEW#Xi44778//#>00x@] \ S  Fs   ,L
#L#Lc                    t          d}t          d}t          d}t        j                  dddd      }t        d	      D cg c]'  }t        j                  |d
t	        |dz         i      ) }}t        |      D ]v  \  }}t        j                  |d
di      }	|	j                  t        j                  |dt	        |dz         dd             |j                  |	       |j                  |       x d}
g d}t        j                         }t        j                  d      }t        j                  ||
|||      }| j                  dt        |j                                      |D ]  }| j!                  ||v         dD ]>  }| j                  d||   j"                         | j                  dt        ||                | j%                  ||   d   t&        j(                         | j                  dt        ||   d                | j%                  ||   d   d   t*        j,                         | j                  t/        |      ||   d   d   j0                  j2                         | j%                  ||   j4                  t6        j8                         | j                  d||   j4                  j:                         A | j                  d|d   j"                         | j                  dt        |d                | j%                  |d   d   t&        j(                         | j                  dt        |d   d                | j%                  |d   d   d   t*        j<                         | j                  |j>                  j@                  |d   d   d   jB                  j@                         | j%                  |   j4                  t6        j8                         | j                  d||   j4                  j:                         yc c}w )a  
        measureFromElement(): test 1
            - "elem" has an @n attribute
            - some staves have <mRest> without @dur (same behaviour to as if no staves did)
            - a rest-filled measure is created for the "n" value in "expectedNs" that's missing a
              corresponding <staff> element, and its Measure has the same @n as "elem"
            - activeMeter isn't None, and it is larger than the (internal) maxBarDuration
            - the right barline is set properly ("dbl")

        no mocks
        r  r-  r   r  r  r  )r  r  r   rO  r  r{   rp   r  r  r   r  8/8rz   r  r   rN  r   r  r   N)"r   rD   rE   r~   r   r  r  r   r#   r   ri  r   r  r+   ru  keysrt  r  r    r   r   r   r  r  r   r^   r  r	   r  r  rs  r  r  r   )r$   r  layerTagnoteTagrw   r  r  r   r  	thisLayerr  r  r"   r  r%   eachNs                   r&   testMeasureIntegration1zTest.testMeasureIntegration1  sq    XU#XU#HD/}}YTE/JKRWXYRZ[RZQu}}XsCAJ6GHRZ[%k2LAyhSzBIU]]7<?APQE
[^2_a bY'KK	" 3 	)
**,
))%0((y*jR]^ 	C./EOOEVO,  
 %ER!5!56QF5M 23!!&-"2FLLAQF5M!$4 56!!&-"21"5tyyASZq)9!)<)B)B)I)IJ!!&-"<"<ckkJXve}'A'A'F'FG % 	VC[//0Cs,-fSk!nfll;CsA/0fSk!nQ/;00>>Q*33AA	CfUm88#++F6%=#=#=#B#BCQ \s   ,Pc                   t          d}t        j                  d      }t        d      D cg c]'  }t        j                  |dt	        |dz         i      ) }	}|	D ]  }
|j                  |
        d}g d}t        j                  d	
      }t        j                  d
      }t        j                  d      |_
        t        d      D cg c]  }t        j                  d|dz    
        c}}D ]M  }t        j                  t        j                        |_        t        j                  d   |j                  _        O fd|_        d |_        d|_        t!        t        t#        |	                  fd|_        t        j                  d
      |_        t%        |      D ci c]  \  }}|||    }}}t        j&                  |||||      }| j)                  ||       | j+                  t#        |	      |j,                         |	D ]  }
|j/                  |
|        | j+                  t#        |      |j,                         t        t#        |	            D ]  }|j/                  ||        |j/                  |j                  g|       | j+                  d|j                  j0                         |j3                  |d       |j3                  ||       yc c}w c c}w c c}}w )a  
        measureFromElement(): test 2
            - "elem" doesn't have an @n attribute
            - all staves have <mRest> without @dur
            - a rest-filled measure is created for the "n" value in "expectedNs" that's missing a
              corresponding <staff> element, and it properly uses "backupNum"

        mocked: staffFromElement(), stream.Measure() and Voice, _correctMRestDurs(), _makeBarlines()
        r  r  rO  r  r{   r   r   r  r"   rU  r  g      (@rz   r  r=   Nc                 &    j                  d      S r  r  r  s     r&   r  z'Test.testMeasureUnit2.<locals>.<lambda>  r  r(   c                    |S r  r  r  s     r&   r  z'Test.testMeasureUnit2.<locals>.<lambda>  r  r(   c                 &    j                  d      S r  r  r  s     r&   r  z'Test.testMeasureUnit2.<locals>.<lambda>  r  r(   r   r.  r  rp   )r   rD   rE   r~   r   r  r   rC   r   rI  r  r   rj  r  r  rG   r   ru  r  r  rY  r+   r   r\  r   rK   r  s                      @@r&   testMeasureUnit2zTest.testMeasureUnit2  s     XU#}}Y'RWXYRZ[RZQu}}XsCAJ6GHRZ[$IKK	" % 	)
^^6
nn-8"*"3"3D"9 JOqRAhq1ug,>?R D NNH4E4EFDM*.*=*=d*CDMM' ! #F'B$'+$eC$456"G!%W!=	/8/DE/Dtq!Ax{N/DE((y*jR]^Xv.[);+A+AB$I''	j'I % 	X(>(>?s;'(A'')'< )##Y%;%;$<Y#Oi44778//$?00x@_ \ S  Fs   ,K'#K,0K1c                   t          d}t          d}t          d}t        j                  dddi      }t        d      D cg c]'  }t        j                  |d	t	        |d
z         i      ) }}|D ]a  }t        j                  |d	di      }|j                  t        j                  |             |j                  |       |j                  |       c d}	g d}
t        j                         }t        j                  d      }t        j                  ||	|
||      }| j                  dt        |j                                      |
D ]  }| j                  ||v         | j                  d|v        |
D ]I  }| j                  |	||   j                          | j                  dt        ||                | j#                  ||   d   t$        j&                         | j                  d
t        ||   d                | j#                  ||   d   d   t(        j*                         | j                  |j,                  j.                  |d   d   d   j0                  j.                         | j#                  ||   j2                  t4        j6                         | j                  d||   j2                  j8                         L yc c}w )a  
        measureFromElement(): test 2
            - "elem" doesn't have an @n attribute
            - all staves have <mRest> without @dur (and only 3 of the 4 are specified at all)
            - a rest-filled measure is created for the "n" value in "expectedNs" that's missing a
              corresponding <staff> element, and it properly uses "backupNum"
            - the right barline is set properly ("rptboth")

        no mocks
        r  r-  r|  r  r  r  r   rO  r  r{   rp   r   r  r  r?   
next @leftrN  r   r   r  N)r   rD   rE   r~   r   r  r   r#   r   ri  r   r  r+   ru  r  rt  r  r    r   r   r   rs  r  r  r   r  r	   r  r  )r$   r  r  mRestTagrw   r  r  r  r  r  r  r"   r  r%   r  s                  r&   testMeasureIntegration2zTest.testMeasureIntegration2  sd    XU#XU#XU#}}Y/CDRWXYRZ[RZQu}}XsCAJ6GHRZ[$IhSzBIU]]845Y'KK	"	 % 	)
**,
))%0((y*jR]^ 	C./EOOEVO,  ./  EYu(<(<=QF5M 23!!&-"2FLLAQF5M!$4 56!!&-"21"5tyyA[44BB#C[^A.77EEG!!&-"<"<cjjIWfUm&@&@&E&EF  1 \s   ,Kc                   t          d}t          d}t        j                  dddi      }t        j                  |ddd	      }	|j                  |	       t        j                  |ddi      }
|j                  |
       d
}dg}t	        j
                  d      }t	        j
                  d      }t        j                  d      |_        t	        j
                  d      |_	        d |_
        d|_	        d|_	        dt	        j
                  d      i|_	        d|j                  i}t        j                  |||||      }| j                  ||       |j                  |
|       |j                  |	|       |j                  |j                  d       |j                  j                  j                  d|j                  d          y)a  
        measureFromElement(): test 3a
            - there is one part
            - there is a <staffDef> which has its required @n attribute

        mocked: staffFromElement(), staffDefFromElement, stream.Measure(),
        _correctMRestDurs(), _makeBarlines(),
        r  r;  r  r  r  r   rp   r7  )r  linesr   r"   rU  r  r  	Measure 1c                    |S r  r  r  s     r&   r  z(Test.testMeasureUnit3a.<locals>.<lambda>O  r  r(   NstaffFromElement() return valuer
   SomeClefr.  r   r  r   )r   rD   rE   r  r   rC   r   rI  r  rG   r  r   r  rY  rK   insert)r$   r  r  r  r  r  r  staffDefTagrw   staffDefElem	staffElemr  r  r"   r  r`   r%   s                    r&   testMeasureUnit3azTest.testMeasureUnit3a0  s    XU#)}}YT{;}}[sS9QRL!MM(C:>	I	U
^^6
nn-8"*"3"3C"8#'>>{#C 'B$'+$#D '-t~~:/N&O#112((y*jR]^Xv.++I*+M..|ZH++K,D,DR+P  ''??''/	1r(   c                   t          d}t          d}t        j                  dddi      }t        j                  |ddi      }	|j                  |	       t        j                  |dd	i      }
|j                  |
       d
}d	g}t	        j
                  d      }t	        j
                  d      }t        j                  d      |_        t	        j
                  d      |_	        d |_
        d|_	        d|_	        d	|j                  i}t        j                  |||||      }| j                  ||       |j                  |
|       |j                  |j                  d       | j                  d|j                  j                   j"                         |j$                  j                  t        j&                  j)                  dd             y)a  
        measureFromElement(): test 3b
            - there is one part
            - there is a <staffDef> which does not have its required @n attribute

        mocked: staffFromElement(), environLocal, stream.Measure(),
        _correctMRestDurs(), _makeBarlines(),
        r  r;  r  r  r  r   r  r7  rp   r   r"   rU  r  r  r  c                    |S r  r  r  s     r&   r  z(Test.testMeasureUnit3b.<locals>.<lambda>  r  r(   Nr  r.  r   r  r   
<staffDef>@n)r   rD   rE   r  r   rC   r   rI  r  rG   r  r   r  rY  rK   r+   r  r   rA  _UNIMPLEMENTED_IMPORTr:   )r$   rB  r  r  r  r  r  r   rw   r  r  r  r  r"   r  r`   r%   s                    r&   testMeasureUnit3bzTest.testMeasureUnit3bf  s    XU#)}}YT{;}}['3HL!MM(C:>	I	U
^^6
nn-8"*"3"3C"8#'>>{#C 'B$'+$#D 112((y*jR]^Xv.++I*+M++K,D,DR+PK44;;FFG00&&--lDA	Cr(   c           
        t          d}t          d}t          d}t          d}t        j                  d      }|j                  t        j                  |dddd	d
             t        j                  |ddi      }t        j                  |ddi      }|j                  t        j                  |             |j                  |       |j                  |       d}dg}	t	        j
                         }
t        j                  d      }t        j                  |||	|
|      }| j                  dgt        |j                                      | j                  ||d   j                         | j                  dt        |d                d}d}|d   D ]<  }t        |t         j"                        rd} t        |t$        j&                        s;d}> | j)                  |       | j)                  |       y)aq  
        measureFromElement(): test 3
            - there is one part
            - there is a <staffDef> which has its required @n attribute

        NB: I won't bother making an integration equivalent to unit test 3b, since I would have to
            mock "environLocal" to know whether it worked, and "no mocks" is the whole point of this

        no mocks
        r  r-  r   r;  r  rp   r7  r   r<  )r  r  rC  rB  r   r  r   r  rN  FTN)r   rD   rE   r  r   r#   r   ri  r   r  r+   r   r  r  ru  
isinstancer   r   r
   BassClefrt  )r$   r  r  r  r   rw   
innerStaff
innerLayerr  r  r"   r  r%   
foundVoice	foundClefitems                   r&   testMeasureIntegration3zTest.testMeasureIntegration3  s    XU#XU#HD/)}}Y'EMM+C#DGWZ7\ ] 	^]]8S#J?
]]8S#J?
%--01*%J	U
**,
))%0((y*jR]^ 	#V[[] 34F3K$6$67Cs,-
	3KD$-!
D$--0 		  
 	
#	"r(   z!music21.mei.base.sectionScoreCorec                `   d|_         t        j                  d      }g d}t        j                  d      }t        j                         }d}t        j                         }|j                   }t        j                  ||||||      }	| j                  ||	       |j                  ||||||       y)zI
        Mock sectionScoreCore(). This is very straight-forward.
        r?   sectionr  z12/8r   r  nextMeasureLeftbackupMeasureNumN)rG   rD   rE   r   ri  r	   r  r   r#   r   sectionFromElementr+   rK   )
r$   mockCorerw   	allPartNsr  r  r  r"   r`   r%   s
             r&   testSection1zTest.testSection1  s    
 !"}}Y'#	))&1**,**,
((((y+)8:JJX 	6*(()2)35@9H:J 	) 	Lr(   z music21.mei.base.allPartsPresentzmusic21.stream.Partzmusic21.stream.Scorec                H   t        j                  d      }ddg|_        ddgddgdd	d
df|_        d |_        t	        j
                         }t	        j
                         |_        t	        j
                         }t	        j
                         |_        ||gfd|_        t	        j
                  t        j                        }||g g}	t        j                  ||      }
| j                  |	|
       |j                  |       |j                  ||j                  |       |j                  ||g       | j                  d|j                  j                         | j                  d|j                  j                         |j                  j                  d       |j                  j                  d       |j                  j                  d       |j                  j                  d       | j                  |j                          | j                  |j                          y)z
        scoreFromElement(): unit test with all basic functionality

        It's two parts, each with two things in them.

        Mocks on allPartsPresent(), sectionScoreCore(), stream.Part(), and stream.Score().
        rB   rp   r  z1-1z1-2z2-1z2-2r  rR  rJ  thingsc                    | d   | d   gS )Nr   r{   r  r  s    r&   r  z%Test.testScoreUnit1.<locals>.<lambda>  s    1Q41,r(   c                 &     j                  d      S r  r  )mockPartReturnss   r&   r  z%Test.testScoreUnit1.<locals>.<lambda>  s    ':':1'=r(   r=   r.  rN  N)rD   rE   rG   r  r   rC   r  r   r#   r   scoreFromElementr+   rK   r   r\  r  atSoundingPitch)r$   	mockScoremockPartr  mockAllPartsrw   	mockPart1	mockPart2r"   r`   r%   r   s              @r&   testScoreUnit1zTest.testScoreUnit1  s    }}W%%(#J!(-u~UEN!K!('8!= 6	NN$	>>+	NN$	>>+	$i0=^^W-B-BC
y"-&&tZ86*,,T2((|/H/HU_(`))9i*@AI,,778I,,778((/((/((/((/223223r(   c                &   d}t        j                  |      }t        j                         }t	        j
                  ||      }| j                  dt        |j                               | j                  dt        |             | j                  dt        |j                  d                | j                  dt        |j                  d                | j                  |j                  d   j                         | j                  |j                  d   j                         | j                  |j                  d   d   t        j                         | j                  |j                  d   d   t        j                         | j                  dt        |j                  d   d                | j                  dt        |j                  d   d                | j                  |j                  d   d   d   t        j                         | j                  |j                  d   d   d   t        j                         | j                  dt        |j                  d   d   d                | j                  dt        |j                  d   d   d                | j                  |j                  d   d   d   d   t        j                          | j                  d|j                  d   d   d   d   j"                         | j                  d|j                  d   d   d   d   j$                         | j                  |j                  d   d   d   d   t        j                          | j                  d|j                  d   d   d   d   j"                         | j                  d|j                  d   d   d   d   j$                         | j                  |j                  d   d   d   d   t        j                          | j                  d	|j                  d   d   d   d   j"                         | j                  d
|j                  d   d   d   d   j$                         | j                  |j                  d   d   d   t&        j(                         | j                  |j                  d   d   d   t*        j,                         | j                  d|j                  d   d   d   j.                         | j                  |j                  d   d   d   t&        j0                         | j                  |j                  d   d   d   t*        j,                         | j                  d|j                  d   d   d   j.                         y)z
        scoreFromElement(): integration test with all basic functionality

        It's two parts, each with two things in them.
        a  <score xmlns="http://www.music-encoding.org/ns/mei">
            <scoreDef meter.count="8" meter.unit="8">
                <staffGrp>
                    <staffDef n="1" clef.shape="G" clef.line="2"/>
                    <staffDef n="2" clef.shape="F" clef.line="4"/>
                </staffGrp>
            </scoreDef>
            <section>
                <measure>
                    <staff n="1">
                        <layer n="1">
                            <note pname="G" oct="4" dur="2" slur="1i"/>
                            <note pname="A" oct="4" dur="2" slur="1t"/>
                        </layer>
                    </staff>
                    <staff n="2">
                        <layer n="1">
                            <note pname="G" oct="2" dur="1"/>
                        </layer>
                    </staff>
                </measure>
            </section>
        </score>rN  rO  r{   r   G4r  A4G2r  r  N)rD   r  r   r#   r   r!  r+   ru  partsr  r"  r    r   r  r   r   r  r  r  r
   rj  r   ri  r   r  r4  s       r&   testScoreIntegration1zTest.testScoreIntegration1  sw   . %**,
&&tZ8 	C-.CK(CQ01CQ01a889a889fll1oa0&..Afll1oa0&..ACQ 234CQ 234fll1oa03V\\Bfll1oa03V\\BCQ 21 567CQ 21 567fll1oa03A6		Bv||Aq1!4Q7FFGfll1oa03A6DDEfll1oa03A6		Bv||Aq1!4Q7FFGfll1oa03A6DDEfll1oa03A6		Bv||Aq1!4Q7FFGfll1oa03A6DDEfll1oa03T__Efll1oa03U5H5HIQ 21 5 A ABfll1oa03T]]Cfll1oa03U5H5HIQ 21 5 A ABr(   z#music21.mei.base.measureFromElementz#music21.mei.base.sectionFromElementz$music21.mei.base.scoreDefFromElementc                B   d}t        j                  |      }t        j                         }dg}t        j                  t        j
                        }d}	d}
t        j                  t        j                        g}d|i||
|	f|_        t        j                  t        j
                        }|gddid|_        dd	i|_        d|gi}|||
|	f}t        j                  |||      }| j                  ||       | j                  d
|j                         |j                  t        j                  ||dd
|       | j                  t         d|j                   d
   d
   d
   j"                         |j                  t        j                  |       | j                  t         d|j                   d
   d
   d
   j"                         |j                  t        j                  |       | j                  t         d|j                   d
   d
   d
   j"                         | j                  d|d
   j$                  j                         |d
   j$                  j'                  d|       |d
   j$                  j'                  dd       |d
   j$                  j'                  dd	       y)ak  
        sectionScoreCore(): everything basic, as called by scoreFromElement()
            - no keywords
                - and the <measure> has no @n; it would be set to "1" automatically
            - one of everything (<section>, <scoreDef>, and <staffDef>)
            - that the <measure> in here won't be processed (<measure> must be in a <section>)
            - things in a <section> are appended properly (different for <score> and <section>)

        mocked:
            - measureFromElement()
            - sectionFromElement()
            - scoreDefFromElement()
            - staffDefFromElement()
          <score xmlns="http://www.music-encoding.org/ns/mei">
            <scoreDef meter.count="8" meter.unit="8"/>
            <staffDef n="1" clef.shape="G" clef.line="2"/>
            <measure/>
            <section>
                <measure>
                    <staff n="1">
                        <layer n="1">
                            <note pname="G" oct="4" dur="1"/>
                        </layer>
                    </staff>
                </measure>
            </section>
        </score>rp   r=   r{   barline for the next Measurewhateverr  r  rp   treble clefr   Nr  r  r  r"   r  scoreDefr;  rO  rO  )rD   r  r   rC   r   ri  r   rH   rG   r   sectionScoreCorer+   r   rK   r]  r   r!  r,   r  r\  )r$   mockStaffDFEmockScoreDFEmockSectionFEmockMeasureFErw   r"   r  expActiveMeterexpMeasureNum	expNMLeftexpPart1scoreDefActiveMeterr`   r%   s                  r&   testCoreUnit1zTest.testCoreUnit1W  si   * %^^%
E	1D1DE2	NNFMM:;'*Ho&4i&P" #nne6I6IJ:M9N+5u*=%?! &0$?!($niG&&tY
C 	6*M445--dhh.7:M>B?@9C 	. 	E 	F87+]-I-I!-LQ-OPQ-R-V-VW,,TXXzBF88,l.I.I!.LQ.OPQ.R.V.VW,,TXXzBF88,l.I.I!.LQ.OPQ.R.V.VWHQK..99:**30CD**36**3>r(   c                Z   d}t        j                  |      }t        j                         }dg}t	        j
                  |||      \  }}}}| j                  d|j                         | j                  |       | j                  d|       | j                  dt        |             | j                  d|v        | j                  dt        |d                |d   d   d   }| j                  |t        j                         | j                  d|j                         | j                  dt        |             d}	d}
d}| j                  ||   t        j                         | j                  dt        ||                | j                  ||   d   t         j"                         | j                  d||   d   j$                         | j                  ||	   t&        j(                         | j                  ||
   t*        j,                         | j                  d||
   j                         y	)
a  
        sectionScoreCore(): everything basic, as called by scoreFromElement()
            - no keywords
                - and the <measure> has no @n; it would be set to "1" automatically
            - one of everything (<section>, <scoreDef>, and <staffDef>)
            - that the <measure> in here won't be processed (<measure> must be in a <section>)
            - things in a <section> are appended properly (different for <score> and <section>)
        r0  rp   r  r{   r   rO  rN  r*  NrD   r  r   r#   r   r7  r+   r   r  ru  rt  r    r   r  r  r   r   r  r  r
   rj  r   ri  r$   rw   r"   r  parsedr  r  r  r  	clefIndextimeSigIndex
voiceIndexs               r&   testCoreIntegration1zTest.testCoreIntegration1  s    %**,
E	AEAVAV)ZB)>_.> 	 7 78/*,-CK(v&Cs,-c{1~a dFNN3DKK(CI&	
d:.=CZ 012d:.q1499=tJ/2AABd9ot?d<0%2E2EF\ 2 > >?r(   c                   d}t        j                  |      }t        j                         }dg}t        j                  t        j
                        }d|i|_        t        j                  t        j                        }	d}
d}t        j                  t        j
                        g}d|i|	||
f|_        t        j                  t        j                        }|gddid|_        dd	i|_        d||d
   gi}||	||
f}t        j                  |||      }| j                  ||       |j                  t        j                  d|||       |j                  t        j                  ||dd|       | j                  t         d|j                  d
   d
   d
   j                          |j                  t        j                  |       | j                  t         d|j                  d
   d
   d
   j                          |j                  t        j                  |       | j                  t         d|j                  d
   d
   d
   j                          | j                  d|j"                  j$                         | j                  d
|d
   j"                  j$                         |j"                  j'                  d|       |j"                  j'                  dd       |j"                  j'                  dd	       y)a(  
        sectionScoreCore(): everything basic, as called by sectionFromElement()
            - no keywords
                - but the <measure> elements do have @n so those values should be used
            - one of most things (<section>, <scoreDef>, and <staffDef>)
            - two of <measure> (one in a <section>)
            - things in a <section> are appended properly (different for <score> and <section>)

        This test is roughly equivalent to testCoreUnit1()
        but with a <section> instead of a <score>.
        Note that, because the <measure> *should* be processed here, this test is indeed more
        complicated.

        mocked:
            - measureFromElement()
            - sectionFromElement()
            - scoreDefFromElement()
            - staffDefFromElement()
          <section xmlns="http://www.music-encoding.org/ns/mei">
            <scoreDef meter.count="8" meter.unit="8"/>
            <staffDef n="1" clef.shape="G" clef.line="2"/>
            <measure n="400">
                <staff n="1">
                    <layer n="1">
                        <note pname="E" oct="7" dur="1"/>
                    </layer>
                </staff>
            </measure>
            <section>
                <measure n="92">
                    <staff n="1">
                        <layer n="1">
                            <note pname="G" oct="4" dur="1"/>
                        </layer>
                    </staff>
                </measure>
            </section>
        </section>rp   r=   r{   r1  r2  r  r3  r4  r   )r"   r  Nr5  r  r6  r;  rO  rO  )rD   r  r   rC   r   rH   rG   r   ri  r   r7  r+   rK   r]  r   r!  r,   r  r   r\  )r$   r8  r9  r:  r;  rw   r"   r  expMeas1r<  r=  r>  r?  r@  r`   r%   s                   r&   testCoreUnit2zTest.testCoreUnit2  s   4( %^^%
E	>>6==9&)8_"1D1DE2	NNFMM:;'*Ho&4i&P" #nne6I6IJ:M9N+5u*=%?! &0$?!(HQK01niG&&tY
C 	6*--dhh99C:M 	. 	O 	--dhh.7:M>B @A9C 	. 	E 	F87+]-I-I!-LQ-OPQ-R-V-VW,,TXXzBF88,l.I.I!.LQ.OPQ.R.V.VW,,TXXzBF88,l.I.I!.LQ.OPQ.R.V.VW 	HOO667HQK..99:''-@A''U3''];r(   c                0   d}t        j                  |      }t        j                         }dg}t	        j
                  |||      \  }}}}| j                  d|j                         | j                  |       | j                  d|       | j                  dt        |             | j                  d|v        | j                  dt        |d                |d   d   }d}	d}
d}| j                  |t        j                         | j                  d|j                         | j                  dt        |             | j                  ||   t        j                         | j                  dt        ||                | j                  ||   d   t         j"                         | j                  d	||   d   j$                         | j                  ||	   t&        j(                         | j                  ||
   t*        j,                         | j                  d||
   j                         |d   d   }d}	d}
d}| j                  |t        j                         | j                  d
|j                         | j                  dt        |             | j                  |d   t        j                         | j                  dt        |d                | j                  |d   d   t         j"                         | j                  d|d   d   j$                         y)a  
        sectionScoreCore(): everything basic, as called by sectionFromElement()
            - no keywords
                - but the <measure> elements do have @n so those values should be used
            - one of most things (<section>, <scoreDef>, and <staffDef>)
            - two of <measure> (one in a <section>)
            - things in a <section> are appended properly (different for <score> and <section>)
        rK  rp   r  rN  r{   r   r\  rO  E7\   r*  NrC  rD  s               r&   testCoreIntegration2zTest.testCoreIntegration2E  s   ( %**,
E	AEAVAV)ZB)>_.> 	 7 78/*,-CK(v&Cs,- c{1~	
dFNN3dkk*CI&d:.=CZ 012d:.q1499=tJ/2AABd9ot?d<0%2E2EF\ 2 > >?c{1~	
dFNN3T[[)CI&d1gv||4CQL)d1gaj$))4tAwqz889r(   c                   d}t        j                  |      }t        j                         }dg}t        j                  t        j
                        }d}	d}
t        j                  t        j                        }d|i|_        |}d}|
dz   }d|gi}||||f}t        j                  |||||	|
	      }| j                  ||       |j                  t        j                  |
dz   |||
       | j                  d|j                         | j                  d|j                         | j                  d|j                         | j                  |	|d   d   d   j                         y)a9  
        sectionScoreCore(): everything basic, as called by sectionFromElement()
            - all keywords
                - and the <measure> has no @n; it should use the backupNum
                - activeMeter = a MagicMock (we expect this returned)
                - nextMeasureLeft = 'next left measure' (expected in the Measure)
                - backupMeasureNum = 900 (expected in the Measure)

        mocked:
            - measureFromElement()
            - sectionFromElement()
            - scoreDefFromElement()
            - staffDefFromElement()
        &  <section xmlns="http://www.music-encoding.org/ns/mei">
            <measure>
                <staff n="1">
                    <layer n="1">
                        <note pname="G" oct="4" dur="1"/>
                    </layer>
                </staff>
            </measure>
        </section>rp   r=   znext left measurer   )	spect_setNr{   r  r  r"   r   )rD   r  r   rC   r   ri  r   rH   rG   r   r7  r+   rK   r]  r   r  )r$   r8  r9  r:  r;  rw   r"   r  r  r  r  rL  r<  r>  r=  r`   r%   s                    r&   testCoreUnit3zTest.testCoreUnit3  s]   * %^^%
E	nne.A.AB->>FMM:&)8_"$	(1,($niG&&tY
P[7F8HJ
 	6*--dhh.>.B.7:E9C	 	. 	E 	M445L334L334&)C.*;*G*GHr(   c                   d}t        j                  |      }t        j                         }dg}t	        j
                  d      }t        j                  d      }d}t        j                  ||||||      \  }}}}| j                  d|j                         | j                  |       | j                  d|       | j                  dt        |             | j                  d|v        | j                  dt        |d                |d   d	   }d	}	d}
| j                  |t         j"                         | j                  d|j$                         | j                  d
t        |             | j                  ||
   t         j&                         | j                  dt        ||
                | j                  ||
   d	   t(        j*                         | j                  d||
   d	   j,                         | j                  ||	   t        j                         | j                  d||	   j.                         | j1                  ||	   |j2                         y)a  
        sectionScoreCore(): everything basic, as called by sectionFromElement()
            - all keywords
                - and the <measure> has no @n; it should use the backupNum
                - activeMeter = a MagicMock (we expect this returned)
                - nextMeasureLeft = 'next left measure' (expected in the Measure)
                - backupMeasureNum = 900 (expected in the Measure)
        rS  rp   r  r  r   r  i  r{   r   rN  r*  N)rD   r  r   r#   r   ri  r	   r  r   r7  r+   r   r  ru  rt  r    r   r  r  r   r   r  r  r  rJ   r  )r$   rw   r"   r  r  r  r  rE  r  repeatIndexrH  s              r&   testCoreIntegration3zTest.testCoreIntegration3  s    %**,
E	))%0**W-AEAVAV#+-B/>_.> 	 7 78/*./CK(v&Cs,-c{1~
dFNN3dkk*CI&d:.=CZ 012d:.q1499=tJ/2AABd;/<${"3"="=>d;')9)9:r(   c                   d}t        j                  |      }t        j                         }dg}t        j                  t        j
                        }	t        j                  t        j                        }
|	|
d|_        t        j                  t        j                        }d|i|_        |}|
}d}d|	gi}||||f}t        j                  j                  t         dt         d      }t        j                  |||      }| j!                  ||       |j"                  j%                  |       t        j&                  j                  d	d
      }|j(                  j%                  |       |j%                  t        j*                  d|||       | j!                  d|j,                         | j!                  d|j,                         |j%                  t        j*                  |       y)ad  
        sectionScoreCore(): as called by sectionFromElement()
            - there's an "rptboth" barline, so we have to return a "nextMeasureLeft"
            - the <staffDef> gives a TimeSignature, so we have to change "activeMeter" (and return)
            - there's a <staffDef> without @n attribute, so we have to warn the user about it
            - there's an unknown element, so we have to debug-warn the user

        mocked:
            - measureFromElement()
            - sectionFromElement()
            - scoreDefFromElement()
            - staffDefFromElement()
            - environLocal
          <section xmlns="http://www.music-encoding.org/ns/mei">
            <bogus>5</bogus>  <!-- this will be ignored -->
            <staffDef n="1" meter.count="6" meter.unit="8"/>
            <staffDef key.accid="3s" key.mode="minor"/>  <!-- this will be ignored -->
            <measure n="42" right="rptboth">
                <staff n="1"><layer n="1"><note pname="G" oct="4" dur="1"/></layer></staff>
            </measure>
        </section>rp   r=   )rp   r  r   r{   bogusr  r  r  rU  r   N)rD   r  r   rC   r   rH   r	   r  rG   r   ri  r   r  r:   r   r7  r+   r  rK   r  rA  r]  r   )r$   r8  r9  r:  r;  rB  rw   r"   r  rL  	expRepeatexpMeterr<  r>  r=  r`   expPrintDebugr%   rC  s                      r&   testCoreUnit4zTest.testCoreUnit4  s   , %^^%
E	 >>6==9NNCJJ7	+39%M">>5+>+>?%,h$7!!	($niG44;;vhe<L?Ehg<NP&&tY
C 	6*66}E,,33L$G009--dhh./.7:H9C	 	. 	E 	M445L334,,TXXzBr(   c                d   d}t        j                  |      }t        j                         }dg}t	        j
                  |||      \  }}}}t        j                  j                  dd      }	|j                  j                  |	       | j                  d|j                         | j                  |t        j                         | j                  d|       | j                  dt        |             | j!                  d|v        | j                  dt        |d                |d   d   }
d}d}d}| j                  |
t"        j$                         | j                  d	|
j&                         | j                  d
t        |
             | j                  |
|   t"        j(                         | j                  dt        |
|                | j                  |
|   d   t*        j,                         | j                  d|
|   d   j.                         | j                  |
|   t0        j2                         | j                  d|
|   j                         | j                  |
|   t        j                         | j                  d|
|   j4                         | j7                  |
|   |
j8                         y)a  
        sectionScoreCore(): as called by sectionFromElement()
            - there's an "rptboth" barline, so we have to return a "nextMeasureLeft"
            - the <staffDef> gives a TimeSignature, so we have to change "activeMeter" (and return)
            - there's a <staffDef> without @n attribute, so we have to warn the user about it
            - there's an unknown element, so we have to debug-warn the user
        r[  rp   r  r  6/8r{   r   rN  r   rO  r*  r  N)rD   r  r   r#   r   r7  r  r:   rA  rK   r+   r   r    r	   r  ru  rt  r   r  r  r   r   r  r  r   ri  r  rJ   r  )r$   rB  rw   r"   r  rE  r  r  r  rC  r  rG  rH  rX  s                 r&   testCoreIntegration4zTest.testCoreIntegration4V  sI    %**,
E	AEAVAVW[W`WaBc>_.> ,,33L$G009 	 7 78oszz:,-CK(v&Cs,-c{1~
dFNN3T[[)CI&d:.=CZ 012d:.q1499=tJ/2AABd<0%2E2EF\ 2 > >?d;/<[ 1 ; ;<d;'):):;r(   c                L   d}t        j                  |      }t        j                         }dg}t	        j
                  |||      \  }}}}| j                  d|j                         | j                  |       | j                  d|       | j                  dt        |             | j                  d|v        | j                  dt        |d                |d   d   d   }| j                  |t        j                         |d   d   d   }	d}
d}d}d}| j                  |	t        j                         | j                  d|	j                          | j                  d	t        |	             | j                  |	|   t        j"                         | j                  dt        |	|                | j                  |	|   d   t$        j&                         | j                  d
|	|   d   j(                         | j                  |	|
   t*        j,                         | j                  |	|   t.        j0                         | j                  d|	|   j2                         | j                  d|	|   j4                         | j                  |	|   t6        j8                         | j                  d|	|   j                         |d   d   d   }	| j                  |	t        j                         | j                  d|	j                          | j                  dt        |	             | j                  |	d   t        j"                         | j                  dt        |	d                | j                  |	d   d   t$        j&                         | j                  d|	d   d   j(                         y)ao  
        sectionScoreCore(): as called by scoreFromElement()

        With a preposterously embedded set of <section> elements, we have to ensure that
        staff-related metadata are cascaded properly into the <measure>

        NOTE there is no unit test corresponding to this integration test---this
            is really all about the cumulative effect
        aL  <score xmlns="http://www.music-encoding.org/ns/mei">
            <scoreDef key.sig="1f" key.mode="minor">
                <staffGrp>
                    <staffDef n="1" clef.line="4" clef.shape="F"/>
                </staffGrp>
            </scoreDef>
            <staffDef n="1" meter.count="6" meter.unit="8"/>
            <section>
                <staffDef n="1" label="tuba"/>
                <section>
                    <measure n="42">
                        <staff n="1"><layer n="1"><note pname="C" oct="1" dur="1"/></layer></staff>
                    </measure>
                </section>
            </section>
            <section>
                <measure n="402">
                    <staff n="1"><layer n="1"><note pname="C" oct="2" dur="1"/></layer></staff>
                </measure>
            </section>
        </score>rp   rb  rN  r{   r   rO  r   rz   C1r   i  r8  N)rD   r  r   r#   r   r7  r+   r   r  ru  rt  r    r   r  r   r  r  r   r   r  r  r
   r  r   r   r   r   r   ri  )r$   rw   r"   r  rE  r  r  r  instrr  rF  keysigIndextimesigIndexrH  s                 r&   testCoreIntegration5zTest.testCoreIntegration5  s   * %**,
E	AEAVAVW[W`WaBc>_.>
 	 7 78/*,-CK(v&Cs,-sAq!eZ__5c{1~a 	
dFNN3T[[)CI&d:.=CZ 012d:.q1499=tJ/2AABd9ot}}=d;/1A1ABT+.556${"3"8"89d<0%2E2EF\ 2 > >?c{1~a dFNN3dkk*CI&d1gv||4CQL)d1gaj$))4tAwqz889r(   c                    t        j                  dddi      }t        j                  |      }| j	                  |t
        j                         | j                  d|j                         y)z=
        barLineFromElement(): <barLine rend="dbl"/>
        barLinerendr  r   r  N	rD   rE   r   barLineFromElementr    r	   r  r+   r  r  s      r&   testBarLine1zTest.testBarLine1  sP     }}Y?((.fckk26;;/r(   c                    t        j                  d      }t        j                  |      }| j	                  |t
        j                         | j                  d|j                         y)z2
        barLineFromElement(): <barLine/>
        rl  regularNrn  r  s      r&   testBarLine2zTest.testBarLine2  sJ     }}Y'((.fckk2FKK0r(   c                   d}t        j                  |      }|j                         }| j                  dt	        |j
                  d   j                                      |j
                  d   j                         d   }| j                  |t        j                         | j                  |j                  d       | j                  |j                  j                  d       y)z
        Ensure that instrument details are imported properly.

        There should be one instrument called "Clarinet."
        a  <?xml version="1.0" encoding="UTF-8"?>
            <mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="2013">
            <music><score>
                <scoreDef meter.count="8" meter.unit="8">
                    <staffGrp>
                        <staffDef n="1" label="Clarinet" trans.diat="-2" trans.semi="-3">
                            <clef shape="F" line="4"/>
                        </staffDef>
                    </staffGrp>
                </scoreDef>
                <section>
                    <scoreDef key.sig="1f" key.mode="major"/>
                    <measure n="1">
                        <staff n="1">
                            <layer n="1" xml:id="asdf">
                                <note pname="E" oct="2" dur="1"/>
                            </layer>
                        </staff>
                    </measure>
                </section>
            </score></music></mei>
        r{   r   rG  r   N)r   r   rI   r+   ru  r-  getInstrumentsr    r   r{  rR  rW  r   )r$   	meiSourcerS   r%   rg  s        r&   testInstrumentDetailszTest.testInstrumentDetails  s    	, )))4CQ > > @ABQ..03eZ%:%:;4,,995Ar(   c                   ddl m} ddl m} |j                         dz  dz  dz  }|j	                  |      }t               }|j                         D ]8  }| j                  t        |      ||       |j                  t        |             : y )Nr   )common)	converterr*   testztest_file.mei)
r   ry  rz  getSourceFilePathparser  recurseassertNotInr   add)r$   ry  rz  fpr\  seen_idsels          r&   testUniqueInstanceszTest.testUniqueInstances#  sp    "%%%'%/&8?JOOB5))+BRVXr2LLB  r(   N)__name__
__module____qualname__r'   r.   r6   r;   r   patchrV   ra   rd   rk   rn   rx   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(  r*  r1  r8  r;  r>  rD  rG  rJ  rV  rZ  ra  rf  rk  rq  ry  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  r  r  r  r#  r'  r1  r5  r@  rB  rM  rQ  ra  rc  rm  rp  rw  rz  r  r  r  r  staticmethodr  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  re  rl  rn  rq  rt  rx  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  r  r  r  r  r*  r.  r1  r<  rA  rE  rQ  rW  re  rk  rn  rp  ru  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  r(  r.  rA  rI  rM  rQ  rV  rY  r`  rc  rj  rp  rs  rw  r  r  r(   r&   r   r   9   s   HH 	Fb TZZ+,TZZ*+TZZ+,TZZ-.TZZ./TZZ34TZZ/0@ 1 5 0 / - , -@8	9	999
333	FB	G
4<<<<<<++ TZZ124 34 TZZ671 81	+D	D TZZ/0TZZ23TZZ./2 0 4 12 TZZ/0TZZ23TZZ./< 0 4 1<&?,/*+7(7$E.66(6( TZZ/0: 1:,6(6.	+6 TZZ23P 4P TZZ23X 4X TZZ23L 4L TZZ23	+ 4	+ TZZ23< 4< TZZ23< 4< TZZ236 46 TZZ89+ :+ TZZ89	+ :	+ TZZ89	+ :	+++++=	9	977777///./"18 TZZ/0[ 1[$ TZZ/0X 1X2 TZZ#$TZZ;<TZZ,-TZZ/0N 1 . = %N62
2 TZZ#$TZZ;<TZZ,-TZZ/0TZZ34N 5 1 . = %
NBO$ TZZ#$TZZ;<TZZ,-TZZ/0TZZ12TZZ/0TZZ+,K - 1 3 1 . = %K@7( TZZ#$TZZ;<TZZ,-TZZ/0TZZ01TZZ*+? , 2 1 . = %?B:( TZZ#$TZZ;<TZZ,-TZZ/0TZZ01I 2 1 . = %
I<:2 TZZ#$TZZ;<TZZ,-TZZ/0TZZ34+9 5 1 . = %
+9Z5B TZZ#$TZZ/0TZZ013 2 1 %3*C". C" TZZ23
@ 4
@ TZZ23, 4, TZZ34
6 5
6 TZZ34, 5,( = = TZZ%&TZZ;<TZZ/0TZZ23O 4 1 = 'O48  TZZ%&TZZ;<TZZ/0TZZ23O 4 1 = 'O<O& TZZ%&TZZ;<TZZ/0TZZ23TZZ12TZZ/0TZZ+,L - 1 3 4 1 = 'L<7* TZZ%&TZZ;<TZZ/0TZZ23TZZ01@ 2 4 1 = '
@<:. TZZ%&TZZ;<TZZ/0TZZ23TZZ01I 2 4 1 = '
I6B< TZZ-.TZZ-.TZZ&'5 ( / /52 TZZ-.TZZ-.TZZ&'5 ( / /5* TZZ-.TZZ-.TZZ&'5 ( / /5*: : :  TZZ-.TZZ-.TZZ&'0 ( / /02 TZZ23TZZ&'TZZ01+L 2 ( 4+LZ TZZ23TZZ&'TZZ01$1 2 ( 4$1L TZZ23TZZ&'TZZ01#F 2 ( 4#FJ:2:,F* TZZ34Y 5Y8#<R TZZ67TZZ45TZZ34TZZ23TZZ:;7> < 4 5 6 8
7>t2828 TZZ/0TZZ67TZZ45TZZ34TZZ23TZZ:;1> < 4 5 6 8 11>f20 TZZ/0TZZ/0TZZ67TZZ45TZZ34TZZ23TZZ:;2> < 4 5 6 8 1 12>hQ0 TZZ/0TZZ/0TZZ67TZZ45TZZ34TZZ23TZZ:;/ < 4 5 6 8 1 1/&= TZZ67; 8;&/(/2 TZZ45TZZ34. 5 6..B$ TZZ45TZZ34TZZ67? 8 5 6?8N:OF  TZZ/0? 1?(D*R*D. TZZ&'D (D2R,+++&7.C*G8C6L2 TZZ/0Q 1Q, TZZ&'$0 ($0N TZZ&'TZZ/0R 1 (R6SDS6 TZZ/0V 1V,$TN TZZ/0= 1=6$ZL;2@" TZZ)*E +E4 TZZ)*D +D0 TZZ)*? +?( TZZ)*D +D4E( TZZ;<TZZ01TZZ/0H 1 2 =H( TZZ;<TZZ01TZZ/0H 1 2 =H. TZZ;<TZZ01TZZ/0H 1 2 =H0
GG,G,G4 TZZ>?= @= TZZ/0A 1A TZZ-.< /<* TZZ-.< /<4)) ) FKD$ TZZ34TZZ45TZZ01TZZ()TZZ&'<A ( * 2 6 5
<A|8Dt TZZ34TZZ45TZZ01TZZ()TZZ&'<A ( * 2 6 5
<A|0Gd TZZ34TZZ45TZZ01TZZ()TZZ67/1 8 * 2 6 5
/1b TZZ34TZZ45TZZ01TZZ()TZZ/0,C 1 * 2 6 5
,C\,#l TZZ34L 5L0 TZZ23TZZ34TZZ%&TZZ&'$4 ( ' 5 4$4LCCJ TZZ56TZZ56TZZ67TZZ67K? 8 8 7 7K?Z5@n TZZ56TZZ56TZZ67TZZ67`< 8 8 7 7`<DJ:X TZZ56TZZ56TZZ67TZZ67=I 8 8 7 7=I~8;t TZZ/0TZZ56TZZ56TZZ67TZZ67AC 8 8 7 7 1
ACF TZZ/05< 15<nO:j01
$BL
!r(   r   __main__)$__doc__
__future__r   unittest	xml.etreer   rD   collectionsr   	fractionsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   music21.meir   music21.mei.baser   r   TestCaser   r  mainTestr  r(   r&   <module>r     s    # 
 + #   !               # #
tO!8 tO!n_ zGT r(   