§
    ƒØjÓk  ã                  ó"  — d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZ  G d„ dej        ¦  «        Z G d„ dej        ¦  «        Zedk    rddlZ ej        e¦  «         dS dS )a&  
Tests for :mod:`music21.humdrum.spineParser`.

The tests live in this companion module rather than at the bottom of
spineParser.py because spineParser is large; only the testCopyAndDeepcopy
test stays in spineParser so its `globals()` picks up the parser classes
for the deep-copy round trip.
é    )ÚannotationsN)Úbar)Úcommon)Údynamics)Úexpressions)Úroman)Ústream)Ú	testFiles)ÚHumdrumDataCollectionÚ	KernSpineÚSpineCommentÚ
SpineEventÚflavorsÚhdStringToMeasureÚkernTandemToObjectc                  ó  — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z ej        d¦  «        d„ ¦   «         Z ej        d¦  «        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestc                óü  — t          t          j        ¦  «        }|                     ¦   «          |j                             d¦  «        }|                      |j        d¦  «         |                      |j        j        d¦  «         |j                             d¦  «        }d„ |j	        D ¦   «         }|                      |g d¢¦  «         |                      |j
        d¦  «         |                      |t          ¦  «         d S )Né   é   c                ó   — g | ]	}|j         ‘Œ
S © )Úid)Ú.0Úcss     úŠ/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/humdrum/tests.pyú
<listcomp>z(Test.testLoadMazurka.<locals>.<listcomp>E   s   € Ð=Ð=Ð= B˜"œ%Ð=Ð=Ð=ó    )r   é   é	   é
   é   é   é   é   é   é   é   é    é#   é$   é'   é(   Úkern)r   r
   Úmazurka6ÚparseÚspineCollectionÚgetSpineByIdÚassertEqualr   ÚparentSpineÚchildSpinesÚ	spineTypeÚassertIsInstancer   )ÚselfÚhf1Úspine5Úspine1Úspine1Childrens        r   ÚtestLoadMazurkazTest.testLoadMazurka*   sö   € õ $¥IÔ$6Ñ7Ô7ˆØ�	Š	‰Œˆð$ Ô$×1Ò1°!Ñ4Ô4ˆØ×Ò˜œ AÑ&Ô&Ð&Ø×Ò˜Ô+Ô.°Ñ2Ô2Ð2àÔ$×1Ò1°!Ñ4Ô4ˆØ=Ð=¨&Ô*<Ð=Ñ=Ô=ˆØ×Ò˜ØVÐVÐVñ	Xô 	Xð 	Xð 	×Ò˜Ô)¨6Ñ2Ô2Ð2Ø×Ò˜f¥iÑ0Ô0Ð0Ð0Ð0r   c                ó6  — t          d¦  «        }|                     ¦   «         }|                      |j        j        j        d¦  «         |                      |j        j        d¦  «         |                      |j        j        d         j	        j        d¦  «         d S )Nz40..ccccc##_wtLLK~v/zdouble-sharpr   é   )
r   ÚtoNoter3   ÚpitchÚ
accidentalÚnameÚdurationÚdotsÚtupletsÚdurationNormal)r8   ÚaÚbs      r   ÚtestSingleNotezTest.testSingleNoteL   s�   € åÐ-Ñ.Ô.ˆØ�HŠH‰JŒJˆØ×Ò˜œÔ+Ô0°.ÑAÔAÐAØ×Ò˜œœ¨!Ñ,Ô,Ð,Ø×Ò˜œÔ+¨AÔ.Ô=ÔBÀAÑFÔFÐFÐFÐFr   c                ó   — t          j        ¦   «         }t          d|¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        t          j	        ¦  «         |                      |j        j
        d¦  «         |                      |j        j        d¦  «         |                      |j        j        t          j        ¦  «         |                      |j        t          j	        ¦  «         |                      |j        j
        d¦  «         |                      |j        j        d¦  «         d S )Nz=29a;:|:é   rH   ÚendÚregularÚstart)r	   ÚMeasurer   r3   ÚnumberÚnumberSuffixr7   ÚrightBarliner   ÚRepeatÚ	directionÚtypeÚpauser   ÚFermataÚleftBarline)r8   Úm0Úm1s      r   ÚtestMeasureBoundarieszTest.testMeasureBoundariesT   s  € ÝŒ^ÑÔˆÝ˜z¨2Ñ.Ô.ˆØ×Ò˜œ BÑ'Ô'Ð'Ø×Ò˜œ¨#Ñ.Ô.Ð.à×Ò˜bœo­s¬zÑ:Ô:Ð:Ø×Ò˜œÔ2°EÑ:Ô:Ð:Ø×Ò˜œÔ-¨yÑ9Ô9Ð9Ø×Ò˜bœoÔ3µ[Ô5HÑIÔIÐIØ×Ò˜bœn­c¬jÑ9Ô9Ð9Ø×Ò˜œÔ1°7Ñ;Ô;Ð;Ø×Ò˜œÔ,¨iÑ8Ô8Ð8Ð8Ð8r   c                ó–  — t          d¦  «        }|                      t          |¦  «        d¦  «         t          d¦  «        }|                      t          |¦  «        d¦  «         t          d¦  «        }|                      t          |¦  «        d¦  «         t          d¦  «        }|                      t          |¦  «        d¦  «         d S )	Nz*M3/1z!<music21.meter.TimeSignature 3/1>z*M3/0z!<music21.meter.TimeSignature 6/1>z*M3/00z"<music21.meter.TimeSignature 12/1>z*M3/000z"<music21.meter.TimeSignature 24/1>)r   r3   Ústr)r8   Úms     r   ÚtestMeterBrevezTest.testMeterBreveb   s°   € Ý˜wÑ'Ô'ˆØ×Ò�˜Q™œÐ!DÑEÔEÐEÝ˜wÑ'Ô'ˆØ×Ò�˜Q™œÐ!DÑEÔEÐEÝ˜xÑ(Ô(ˆØ×Ò�˜Q™œÐ!EÑFÔFÐFÝ˜yÑ)Ô)ˆØ×Ò�˜Q™œÐ!EÑFÔFÐFÐFÐFr   c                ó–   — t          t          j        ¦  «        }|                     ¦   «          |j        }|                     ¦   «          dS )zT
        test loading a fake piece with spine paths, lyrics, dynamics, etc.
        N)r   r
   ÚfakeTestr0   r	   Úshow)r8   ÚhdcÚmss      r   Úx_testFakePiecezTest.x_testFakePiecel   s9   € õ $¥IÔ$6Ñ7Ô7ˆØ�	Š	‰ŒˆØŒZˆØ
�Š‰	Œ	ˆ	ˆ	ˆ	r   c                ó˜  — t          t          j        ¦  «        }|                     ¦   «          |j        }d}|                     ¦   «         D ]h}t          |d¦  «        r!|j        j        dk    r|j	        dk    r|dz  }Œ3t          |d¦  «        r%|j
        D ]}|j        dk    r|j	        dk    r|dz  }ŒŒi|                      |d¦  «         d S )Nr   rA   zG#r?   r   ÚpitcheséV   )r   r
   r/   r0   r	   ÚrecurseÚhasattrrA   rC   Úbeatrh   r3   )r8   r9   ÚmasterStreamÚgSharpCountÚnÚps         r   ÚtestSpineMazurkazTest.testSpineMazurkau   sà   € å#¥IÔ$6Ñ7Ô7ˆð
 	�	Š	‰ŒˆØ”zˆð ˆà×%Ò%Ñ'Ô'ð 	)ð 	)ˆAÝ�q˜'Ñ"Ô"ð ) q¤w¤|°tÒ';Ð';Ø”6˜Q’;�;Ø 1Ñ$�KøÝ˜˜IÑ&Ô&ð )Øœð )ð )�AØ”v ’~�~¨!¬&°Aª+¨+Ø# qÑ(˜øøà×Ò˜ bÑ)Ô)Ð)Ð)Ð)r   c                ór   — ddl m} t          j        ¦   «         dz  }|dz  }|                     |¦  «        }d S )Nr   )Ú	converterÚhumdrumzMissa_Sine_nomine-Kyrie.krn)Úmusic21rs   r   ÚgetSourceFilePathr0   )r8   rs   Ú
parserPathÚsineNominePathÚunused_myScores        r   ÚtestParseSineNominezTest.testParseSineNomine—   sG   € Ø%Ð%Ð%Ð%Ð%Ð%ÝÔ-Ñ/Ô/°)Ñ;ˆ
Ø#Ð&CÑCˆØ"Ÿš¨Ñ8Ô8ˆˆˆr   c                ó‚  — t          t          j        ¦  «        }|                     ¦   «          |j        }|                      |j        d                              d¦  «                             ¦   «         ¦  «         |  	                    |j        d                              d¦  «                             ¦   «         ¦  «         d S )Nr   é   r   )
r   r
   ÚsplitSpines2r0   r	   Ú
assertTrueÚpartsÚmeasureÚ	hasVoicesÚassertFalse)r8   r9   rm   s      r   ÚtestSplitSpineszTest.testSplitSpinesž   s–   € Ý#¥IÔ$:Ñ;Ô;ˆØ�	Š	‰ŒˆØ”zˆØ�Š˜Ô*¨1Ô-×5Ò5°aÑ8Ô8×BÒBÑDÔDÑEÔEÐEØ×Ò˜Ô+¨AÔ.×6Ò6°qÑ9Ô9×CÒCÑEÔEÑFÔFÐFÐFÐFr   c                ón   — t          t          j        ¦  «        }|                     ¦   «          |j        }d S ©N)r   r
   rb   r0   r	   )r8   r9   Úunused_ss      r   Úx_testMoveDynamicszTest.x_testMoveDynamics¥   s*   € Ý#¥IÔ$6Ñ7Ô7ˆØ�	Š	‰Œˆà”:ˆˆˆr   c                óÐ   — ddl m} t          t          j        ¦  «        }|                     ¦   «          |j        }|                     |¦  «        }|                      |d¦  «         d S )Nr   )ÚtextzMagijago ickewyan)	ru   r‰   r   r
   rb   r0   r	   ÚassembleLyricsr3   )r8   r‰   r9   ÚsÚlyricss        r   ÚtestLyricsInSpinezTest.testLyricsInSpine¬   sh   € Ø Ð Ð Ð Ð Ð Ý#¥IÔ$6Ñ7Ô7ˆØ�	Š	‰ŒˆàŒJˆØ×$Ò$ QÑ'Ô'ˆà×Ò˜Ð!4Ñ5Ô5Ð5Ð5Ð5r   c                ón   — t          t          j        ¦  «        }|                     ¦   «          |j        }dS )zÇ
        Currently this does not work since a second split on a stream that
        already resulted from a split does not parse properly.  Shows up also
        in strangeWTCOpening, below.
        N)r   r
   Ú	splitLotsr0   r	   ©r8   r9   Úunused_masterStreams      r   ÚtestSplitSpines2zTest.testSplitSpines2¶   s/   € õ $¥IÔ$7Ñ8Ô8ˆØ�	Š	‰ŒˆØ!œjÐÐÐr   c                óF   — t          t          j        ¦  «        }|j        }d S r…   )r   r
   ÚstrangeWTCOpeningr	   r�   s      r   ÚtestParseStrangeSplitzTest.testParseStrangeSplitÀ   s    € Ý#¥IÔ$?Ñ@Ô@ˆØ!œjÐÐÐr   c                ó  — t          j        ddd¦  «        }t          |¦  «        }|                     ¦   «          |j        }|                      t          |j        ¦  «        d¦  «         t          |j        d          	                    t          j
        ¦  «        ¦  «        }|                      d„ |D ¦   «         g d¢¦  «         |                      d„ |D ¦   «         g d	¢¦  «         |\  }}}|                      |                     ¦   «         ¦  «         |                      d
„ |j        D ¦   «         dg¦  «         |                      |                     ¦   «         ¦  «         |                      t          |j        ¦  «        d¦  «         |                      t!          d„ |j        D ¦   «         ¦  «        ddg¦  «         |                      |                     ¦   «         ¦  «         |                      d„ |j        D ¦   «         dg¦  «         dS )a&  
        2/4 piece: m1 has one half note in a single spine; m2 splits into two
        spines (split indicator immediately *after* the =2 barline) with a half
        note on each, merges back to one spine before =3, and m3 has a single
        half note.

        Test is AI-assisted.
        ú	\s\s\s\s+ú	z5
**kern
*M2/4
=1
2c
=2
*^
2d    2e
*v    *v
=3
2f
*-
r   r   c                ó   — g | ]	}|j         ‘Œ
S r   ©rQ   ©r   r_   s     r   r   z.Test.testSplitAfterBarline.<locals>.<listcomp>à   ó   € Ð5Ð5Ð5 q˜!œ(Ð5Ð5Ð5r   ©r   r?   é   c                ó&   — g | ]}|j         j        ‘ŒS r   ©rD   ÚquarterLengthr›   s     r   r   z.Test.testSplitAfterBarline.<locals>.<listcomp>á   ó   € ÐEÐEÐE°q˜!œ*Ô2ÐEÐEÐEr   ©ç       @r¤   r¤   c                ó&   — g | ]}|j         j        ‘ŒS r   ©rA   rC   ©r   ro   s     r   r   z.Test.testSplitAfterBarline.<locals>.<listcomp>å   ó   € Ð9Ð9Ð9¨1˜!œ'œ,Ð9Ð9Ð9r   ÚCr?   c              3  óB   K  — | ]}|j         D ]}|j        j        V — ŒŒd S r…   ©ÚnotesrA   rC   ©r   Úvro   s      r   ú	<genexpr>z-Test.testSplitAfterBarline.<locals>.<genexpr>ê   ó5   è è € ÐDÐD A¸A¼GÐDÐD°q�1”7”<ÐDÐDÐDÐDÐDÐDÐDr   ÚDÚEc                ó&   — g | ]}|j         j        ‘ŒS r   r¦   r§   s     r   r   z.Test.testSplitAfterBarline.<locals>.<listcomp>ï   r¨   r   ÚFN©ÚreÚsubr   r0   r	   r3   Úlenr   ÚlistÚgetElementsByClassrP   r‚   r�   r¬   r~   ÚvoicesÚsorted©r8   Úkrnrd   r‹   Úmeasuresr[   Úm2Úm3s           r   ÚtestSplitAfterBarlinezTest.testSplitAfterBarlineÄ   óä  € õ Œf�\ 4ð *ñ ô ˆõ $ CÑ(Ô(ˆØ�	Š	‰ŒˆØŒJˆà×Ò�˜QœW™œ qÑ)Ô)Ð)Ý˜œ œ
×5Ò5µf´nÑEÔEÑFÔFˆØ×ÒÐ5Ð5¨HÐ5Ñ5Ô5°y°y°yÑAÔAÐAØ×ÒÐEÐE¸HÐEÑEÔEÀÀÀÑWÔWÐWà‰
ˆˆB�Ø×Ò˜Ÿš™œÑ(Ô(Ð(Ø×ÒÐ9Ð9°´Ð9Ñ9Ô9¸C¸5ÑAÔAÐAà�Š˜Ÿš™œÑ'Ô'Ð'Ø×Ò�˜RœY™œ¨Ñ+Ô+Ð+Ø×ÒÝÐDÐD¨¬ÐDÑDÔDÑDÔDØ�#ˆJñ	
ô 	
ð 	
ð
 	×Ò˜Ÿš™œÑ(Ô(Ð(Ø×ÒÐ9Ð9°´Ð9Ñ9Ô9¸C¸5ÑAÔAÐAÐAÐAr   c                ó  — t          j        ddd¦  «        }t          |¦  «        }|                     ¦   «          |j        }|                      t          |j        ¦  «        d¦  «         t          |j        d          	                    t          j
        ¦  «        ¦  «        }|                      d„ |D ¦   «         g d¢¦  «         |                      d„ |D ¦   «         g d	¢¦  «         |\  }}}|                      |                     ¦   «         ¦  «         |                      d
„ |j        D ¦   «         dg¦  «         |                      |                     ¦   «         ¦  «         |                      t          |j        ¦  «        d¦  «         |                      t!          d„ |j        D ¦   «         ¦  «        ddg¦  «         |                      |                     ¦   «         ¦  «         |                      d„ |j        D ¦   «         dg¦  «         dS )a/  
        Same shape as testSplitAfterBarline but with the spine split placed
        *before* the =2 barline (the barline therefore appears within both new
        spines).  Humdrum syntax permits this; only adjacency rules constrain
        spine path indicators.

        Test is AI-assisted.
        r—   r˜   z;
**kern
*M2/4
=1
2c
*^
=2    =2
2d    2e
*v    *v
=3
2f
*-
r   r   c                ó   — g | ]	}|j         ‘Œ
S r   rš   r›   s     r   r   z/Test.testSplitBeforeBarline.<locals>.<listcomp>  rœ   r   r�   c                ó&   — g | ]}|j         j        ‘ŒS r   r    r›   s     r   r   z/Test.testSplitBeforeBarline.<locals>.<listcomp>  r¢   r   r£   c                ó&   — g | ]}|j         j        ‘ŒS r   r¦   r§   s     r   r   z/Test.testSplitBeforeBarline.<locals>.<listcomp>  r¨   r   r©   r?   c              3  óB   K  — | ]}|j         D ]}|j        j        V — ŒŒd S r…   r«   r­   s      r   r¯   z.Test.testSplitBeforeBarline.<locals>.<genexpr>  r°   r   r±   r²   c                ó&   — g | ]}|j         j        ‘ŒS r   r¦   r§   s     r   r   z/Test.testSplitBeforeBarline.<locals>.<listcomp>  r¨   r   r´   Nrµ   r½   s           r   ÚtestSplitBeforeBarlinezTest.testSplitBeforeBarlineñ   rÃ   r   c                ó~  — t          j        ddd¦  «        }t          |¦  «        }|                     ¦   «          |j        }|                      t          |j        ¦  «        d¦  «         t          |j        d          	                    t          j
        ¦  «        ¦  «        }|                      d„ |D ¦   «         g d¢¦  «         |                      d„ |D ¦   «         g d	¢¦  «         |\  }}}|                      |                     ¦   «         ¦  «         |                      d
„ |j        D ¦   «         dg¦  «         |                      |                     ¦   «         ¦  «         |                      t          |j        ¦  «        d¦  «         |                      t!          d„ |j        D ¦   «         ¦  «        ddg¦  «         |                      |                     ¦   «         ¦  «         |                      t          |j        ¦  «        d¦  «         |                      t!          d„ |j        D ¦   «         ¦  «        ddg¦  «         dS )aê  
        2/4 piece: m1 has one half note in a single spine; m2 splits into two
        spines (half note on each), then merges back to one spine at the end of
        m2; m3 immediately splits again into two spines (half note on each)
        and the piece ends without re-merging.

        Expected layout: one Part with three Measures, each two quarters long;
        m1 has no voices, m2 and m3 each have two voices with one half note
        each.

        Test is AI-assisted.
        r—   r˜   zD
**kern
*M2/4
=1
2c
=2
*^
2d    2e
*v    *v
=3
*^
2f    2g
*-    *-
r   r   c                ó   — g | ]	}|j         ‘Œ
S r   rš   r›   s     r   r   z7Test.testSplitMergeImmediateResplit.<locals>.<listcomp>?  rœ   r   r�   c                ó&   — g | ]}|j         j        ‘ŒS r   r    r›   s     r   r   z7Test.testSplitMergeImmediateResplit.<locals>.<listcomp>@  r¢   r   r£   c                ó&   — g | ]}|j         j        ‘ŒS r   r¦   r§   s     r   r   z7Test.testSplitMergeImmediateResplit.<locals>.<listcomp>D  r¨   r   r©   r?   c              3  óB   K  — | ]}|j         D ]}|j        j        V — ŒŒd S r…   r«   r­   s      r   r¯   z6Test.testSplitMergeImmediateResplit.<locals>.<genexpr>I  r°   r   r±   r²   c              3  óB   K  — | ]}|j         D ]}|j        j        V — ŒŒd S r…   r«   r­   s      r   r¯   z6Test.testSplitMergeImmediateResplit.<locals>.<genexpr>P  r°   r   r´   ÚGNrµ   r½   s           r   ÚtestSplitMergeImmediateResplitz#Test.testSplitMergeImmediateResplit  s  € õ Œf�\ 4ð *ñ ô ˆõ $ CÑ(Ô(ˆØ�	Š	‰ŒˆØŒJˆà×Ò�˜QœW™œ qÑ)Ô)Ð)Ý˜œ œ
×5Ò5µf´nÑEÔEÑFÔFˆØ×ÒÐ5Ð5¨HÐ5Ñ5Ô5°y°y°yÑAÔAÐAØ×ÒÐEÐE¸HÐEÑEÔEÀÀÀÑWÔWÐWà‰
ˆˆB�Ø×Ò˜Ÿš™œÑ(Ô(Ð(Ø×ÒÐ9Ð9°´Ð9Ñ9Ô9¸C¸5ÑAÔAÐAà�Š˜Ÿš™œÑ'Ô'Ð'Ø×Ò�˜RœY™œ¨Ñ+Ô+Ð+Ø×ÒÝÐDÐD¨¬ÐDÑDÔDÑDÔDØ�#ˆJñ	
ô 	
ð 	
ð
 	�Š˜Ÿš™œÑ'Ô'Ð'Ø×Ò�˜RœY™œ¨Ñ+Ô+Ð+Ø×ÒÝÐDÐD¨¬ÐDÑDÔDÑDÔDØ�#ˆJñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó.  ‡— t          j        ddd¦  «        }t          |¦  «        Š‰                     ¦   «          ˆfd„‰j                             ¦   «                              t          j        ¦  «        D ¦   «         }|  	                    |g d¢¦  «         dS )zÀ
        ``**dynam`` events on the same line as a kern note attach at that note's
        offset.  Sanity-check companion to testDynamAttachedMisaligned.

        Test is AI-assisted.
        r—   r˜   z¢
**kern    **dynam
*staff1    *staff1
*M4/4     *
=1        =1
2c        f
2d        p
=2        =2
4e        sf
4f        .
4g        .
4a        .
*-        *-
c                ól   •— g | ]0}|j         t          |                     ‰j        ¦  «        ¦  «        f‘Œ1S r   ©ÚvalueÚfloatÚgetOffsetInHierarchyr	   ©r   Údrd   s     €r   r   z1Test.testDynamAttachedAligned.<locals>.<listcomp>k  óN   ø€ ð Uð Uð UØð ”'�5 ×!7Ò!7¸¼
Ñ!CÔ!CÑDÔDÐEð Uð Uð Ur   ©©Úfç        )rp   r¤   ©Úsfç      @N©
r¶   r·   r   r0   r	   rj   rº   r   ÚDynamicr3   ©r8   r¾   Úfoundrd   s      @r   ÚtestDynamAttachedAlignedzTest.testDynamAttachedAlignedT  s¬   ø€ õ Œf�\ 4ð *ñ ô ˆõ $ CÑ(Ô(ˆØ�	Š	‰ŒˆðUð Uð Uð UØœ*×,Ò,Ñ.Ô.×AÒAÅ(ÔBRÑSÔSðUñ Uô Uˆà×Ò˜Ð EÐ EÐ EÑFÔFÐFÐFÐFr   zHKnown pre-existing gap; see TODO in SpineCollection.attachNonKernEvents.c                ó.  ‡— t          j        ddd¦  «        }t          |¦  «        Š‰                     ¦   «          ˆfd„‰j                             ¦   «                              t          j        ¦  «        D ¦   «         }|  	                    |g d¢¦  «         dS )a^  
        A ``**dynam`` event on a line where the kern column has '.' (no new note
        event) should still attach -- to the stream at the offset of the most
        recently-sounding note.  Currently fails: misaligned dynamics are
        silently dropped.  See TODO in `SpineCollection.attachNonKernEvents`.

        Test is AI-assisted.
        r—   r˜   z®
**kern    **dynam
*staff1    *staff1
*M4/4     *
=1        =1
2c        f
.         p
2d        .
=2        =2
4e        sf
4f        .
4g        .
4a        .
*-        *-
c                ól   •— g | ]0}|j         t          |                     ‰j        ¦  «        ¦  «        f‘Œ1S r   rÕ   rÙ   s     €r   r   z4Test.testDynamAttachedMisaligned.<locals>.<listcomp>‹  rÛ   r   )rÝ   )rp   rß   rà   Nrã   rå   s      @r   ÚtestDynamAttachedMisalignedz Test.testDynamAttachedMisalignedo  s®   ø€ õ Œf�\ 4ð *ñ ô ˆõ $ CÑ(Ô(ˆØ�	Š	‰ŒˆðUð Uð Uð UØœ*×,Ò,Ñ.Ô.×AÒAÅ(ÔBRÑSÔSðUñ Uô Uˆð 	×Ò˜Ð EÐ EÐ EÑFÔFÐFÐFÐFr   c                ó.  ‡— t          j        ddd¦  «        }t          |¦  «        Š‰                     ¦   «          ˆfd„‰j                             ¦   «                              t          j        ¦  «        D ¦   «         }|  	                    |g d¢¦  «         dS )aK  
        A ``**harm`` event on a line where the kern column has '.' should still
        attach -- to the stream at the offset of the most recently-sounding
        note.  Currently fails: misaligned harm events are silently dropped.
        See TODO in `SpineCollection.attachNonKernEvents`.

        Test is AI-assisted.
        r—   r˜   z¼
**kern    **harm
*staff1    *staff1
*M4/4     *
*C:       *C:
=1        =1
2c        I
.         V
2g        .
=2        =2
4f        IV
4g        V
4a        vi
4c        I
*-        *-
c                ól   •— g | ]0}|j         t          |                     ‰j        ¦  «        ¦  «        f‘Œ1S r   )Úfigurer×   rØ   r	   )r   Úrrd   s     €r   r   z3Test.testHarmAttachedMisaligned.<locals>.<listcomp>®  sN   ø€ ð Wð Wð WØð ”(�E !×"8Ò"8¸¼Ñ"DÔ"DÑEÔEÐFð Wð Wð Wr   )©ÚIrß   )ÚVrß   )ÚIVrâ   )rñ   ç      @)Úviç      @)rð   ç      @N)
r¶   r·   r   r0   r	   rj   rº   r   ÚRomanNumeralr3   rå   s      @r   ÚtestHarmAttachedMisalignedzTest.testHarmAttachedMisaligned‘  s¹   ø€ õ Œf�\ 4ð *ñ ô ˆõ  $ CÑ(Ô(ˆØ�	Š	‰ŒˆðWð Wð Wð WØœ*×,Ò,Ñ.Ô.×AÒAÅ%ÔBTÑUÔUðWñ Wô Wˆð 	×ÒØØVÐVÐVñ	
ô 	
ð 	
ð 	
ð 	
r   c                óØ  — t          j        ddd¦  «        }t          |¦  «        }|                     ¦   «          |j        }|                      t          |j        ¦  «        d¦  «         t          |j        d          	                    t          j
        ¦  «        ¦  «        }|                      d„ |D ¦   «         g d¢¦  «         |                      d„ |D ¦   «         g d	¢¦  «         |\  }}}|                      d
„ |j        D ¦   «         dg¦  «         |                      t          d„ |j        D ¦   «         ¦  «        ddg¦  «         |                      d„ |j        D ¦   «         dg¦  «         dS )z®
        Blank lines should not affect parsing.  Same shape as
        testSplitAfterBarline but with blank lines sprinkled throughout.

        Test is AI-assisted.
        r—   r˜   z;

**kern
*M2/4

=1
2c

=2
*^

2d    2e
*v    *v

=3

2f
*-
r   r   c                ó   — g | ]	}|j         ‘Œ
S r   rš   r›   s     r   r   z9Test.testBlankLinesPreserveSplitParse.<locals>.<listcomp>Ö  rœ   r   r�   c                ó&   — g | ]}|j         j        ‘ŒS r   r    r›   s     r   r   z9Test.testBlankLinesPreserveSplitParse.<locals>.<listcomp>×  r¢   r   r£   c                ó&   — g | ]}|j         j        ‘ŒS r   r¦   r§   s     r   r   z9Test.testBlankLinesPreserveSplitParse.<locals>.<listcomp>Ú  r¨   r   r©   c              3  óB   K  — | ]}|j         D ]}|j        j        V — ŒŒd S r…   r«   r­   s      r   r¯   z8Test.testBlankLinesPreserveSplitParse.<locals>.<genexpr>Ü  r°   r   r±   r²   c                ó&   — g | ]}|j         j        ‘ŒS r   r¦   r§   s     r   r   z9Test.testBlankLinesPreserveSplitParse.<locals>.<listcomp>ß  r¨   r   r´   N)r¶   r·   r   r0   r	   r3   r¸   r   r¹   rº   rP   r¬   r¼   r»   r½   s           r   Ú testBlankLinesPreserveSplitParsez%Test.testBlankLinesPreserveSplitParse¶  st  € õ Œf�\ 4ð *ñ ô ˆõ& $ CÑ(Ô(ˆØ�	Š	‰ŒˆØŒJˆà×Ò�˜QœW™œ qÑ)Ô)Ð)Ý˜œ œ
×5Ò5µf´nÑEÔEÑFÔFˆØ×ÒÐ5Ð5¨HÐ5Ñ5Ô5°y°y°yÑAÔAÐAØ×ÒÐEÐE¸HÐEÑEÔEÀÀÀÑWÔWÐWà‰
ˆˆB�Ø×ÒÐ9Ð9°´Ð9Ñ9Ô9¸C¸5ÑAÔAÐAØ×ÒÝÐDÐD¨¬ÐDÑDÔDÑDÔDØ�#ˆJñ	
ô 	
ð 	
ð 	×ÒÐ9Ð9°´Ð9Ñ9Ô9¸C¸5ÑAÔAÐAÐAÐAr   c                óÜ  ‡— t          j        ddd¦  «        }t          |¦  «        }|                     ¦   «          |j        Šˆfd„‰                     ¦   «                              t          j        ¦  «        D ¦   «         }ˆfd„‰                     ¦   «                              t          j
        ¦  «        D ¦   «         }|                      |g d¢¦  «         |                      |g d¢¦  «         dS )	z—
        Blank lines mixed into a kern + dynam + harm piece should not affect
        which events attach where.

        Test is AI-assisted.
        r—   r˜   a7  
**kern    **dynam    **harm
*staff1    *staff1    *staff1
*M4/4     *         *
*C:       *         *C:

=1        =1        =1
2c        f         I

2d        p         V
=2        =2        =2

4e        sf        I
4f        .         IV
4g        .         V
4a        .         vi
*-        *-        *-
c                ób   •— g | ]+}|j         t          |                     ‰¦  «        ¦  «        f‘Œ,S r   )rÖ   r×   rØ   )r   rÚ   r‹   s     €r   r   z;Test.testBlankLinesPreserveDynamAndHarm.<locals>.<listcomp>ý  sL   ø€ ð Jð Jð JØð ”�˜q×5Ò5°aÑ8Ô8Ñ9Ô9Ð:ð Jð Jð Jr   c                ób   •— g | ]+}|j         t          |                     ‰¦  «        ¦  «        f‘Œ,S r   )rí   r×   rØ   )r   rî   r‹   s     €r   r   z;Test.testBlankLinesPreserveDynamAndHarm.<locals>.<listcomp>ÿ  sL   ø€ ð Mð Mð MØð ”�5 ×!7Ò!7¸Ñ!:Ô!:Ñ;Ô;Ð<ð Mð Mð Mr   rÜ   )rï   )rñ   r¤   )rð   râ   )rò   ró   )rñ   rõ   )rô   rö   N)r¶   r·   r   r0   r	   rj   rº   r   rä   r   r÷   r3   )r8   r¾   rd   ÚdynÚharmr‹   s        @r   Ú"testBlankLinesPreserveDynamAndHarmz'Test.testBlankLinesPreserveDynamAndHarmá  s  ø€ õ Œf�\ 4ð *ñ ô ˆõ$ $ CÑ(Ô(ˆØ�	Š	‰ŒˆØŒJˆðJð Jð Jð JØŸ	š	™œ×6Ò6µxÔ7GÑHÔHðJñ Jô JˆðMð Mð Mð MØŸš™œ×7Ò7½Ô8JÑKÔKðMñ Mô Mˆà×Ò˜ÐCÐCÐCÑDÔDÐDØ×ÒØØVÐVÐVñ	
ô 	
ð 	
ð 	
ð 	
r   c                óø   — t          j        ddd¦  «        }t          |¦  «        }|                     ¦   «          d„ |j                             ¦   «         j        D ¦   «         }|                      |g d¢¦  «         dS )a	  
        Verify that each lyric syllable from a ``**text`` spine attaches to the
        kern note on the same line.  Existing testLyricsInSpine only checks
        the assembled lyric string; this checks the per-note mapping.

        Test is AI-assisted.
        r—   r˜   z
**kern    **text
*staff1    *staff1
*M4/4     *
=1        =1
4c        Ma
4d        gi
4e        ja
4f        go
*-        *-
c                ó4   — g | ]}|j         j        |j        f‘ŒS r   )rA   rC   Úlyricr§   s     r   r   z3Test.testLyricsCorrectlyAligned.<locals>.<listcomp>  s3   € ð ?ð ?ð ?Øð œ7œ<¨¬Ð1ð ?ð ?ð ?r   ))r©   ÚMa)r±   Úgi)r²   Úja)r´   ÚgoN)r¶   r·   r   r0   r	   rj   r¬   r3   )r8   r¾   rd   ÚnotesAndLyricss       r   ÚtestLyricsCorrectlyAlignedzTest.testLyricsCorrectlyAligned  s—   € õ Œf�\ 4ð 
*ñ 
ô 
ˆõ $ CÑ(Ô(ˆØ�	Š	‰Œˆð?ð ?Ø#&¤:×#5Ò#5Ñ#7Ô#7Ô#=ð?ñ ?ô ?ˆà×ÒØØ@Ð@Ð@ñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó  — t          t          j        ¦  «        }|                     ¦   «          |j        }|j        d         }g }|t                   D ]}|                     |j        ¦  «         Œ|  	                    d|v ¦  «         d S )Nr?   zspine comment)
r   r
   rb   r0   r	   r   r   ÚappendÚcommentr~   )r8   r9   r‹   rp   ÚcommentsÚcs         r   ÚtestSpineCommentszTest.testSpineComments#  s}   € Ý#¥IÔ$6Ñ7Ô7ˆØ�	Š	‰ŒˆØŒJˆØŒG�AŒJˆØˆØ•<”ð 	'ð 	'ˆAØ�OŠO˜AœIÑ&Ô&Ð&Ð&Ø�Š˜¨8Ð3Ñ4Ô4Ð4Ð4Ð4r   c                ó  — t          t          j        ¦  «        }|                     ¦   «          |j        }i ddg d¢ddddf“ddg d	¢d
d
ddf“ddg d¢ddddf“ddg d¢ddddf“ddg d¢ddddf“ddg d¢ddddf“ddg d¢ddddf“dd g d!¢dd"d#df“d$d%g d&¢d"d
d'd(f“d)dg d¢ddddf“d*dg d¢ddddf“d+d,g d-¢ddddf“d.d/g d0¢d
d
ddf“d1d2g d3¢d4d4ddf“d5d6g d7¢d8dd#df“d9d:g d;¢ddddf“d<d=g d¢ddddf“d>g d?¢d@dAd#dfd=g d¢ddddfdBg dC¢d
dAdDd(fd=g d¢ddddfdEg dF¢d@dAd'd(fdGg dH¢ddddfd=g d¢ddddfd=g d¢ddddfdIg d¢ddddfdJœ	¥}|                     ¦   «                              t          j        ¦  «        D ]“}|j	        }|j
        }|                     ¦   «         j        }|                     ¦   «         j        }|                     ¦   «         }	|                     ¦   «         }
|||||	|
f}|                      |||j                 ¦  «         Œ”d S )KNrß   úI in C major©r   r|   é   r©   é5   Fç      ð?zii in C major)r?   r   r    r±   r¤   ziii in C major)r|   r  é   r²   ç      @zIV in C major)r   r    r   r´   râ   zI64 in C major)r  r   r|   rÑ   é@   ró   zV in C major)r  r  r?   rõ   zvi in C major©r    r   r|   ÚArö   zV6 in C major)r  r?   r  ÚBr   ç       @zviio65/i in C major©r?   r   é   r  éA   Tç      "@ç      &@ç      (@zi in c minor)r   rž   r  ç      *@ziio in c minor)r?   r   r#  ç      ,@zIII in c minor)rž   r  r!   zE-ç      .@zN6 in c minor)r   r#  r   zD-ç      0@zi64 in c minor)r  r   rž   ç      1@zV in c minorzIt6 in c minor)r#  r   r   zF#zA-zFr43 in c minor)r#  r   r?   r   é+   zGer65 in c minor)r#  r   rž   r   ziv in c minor)r   r#  r   zI in c minor©	ç      2@g      4@g      5@g      7@ç      8@ç      ;@ç      >@g      @@g     €@@)r   r
   ÚharmScaleDegreesr0   r	   Úflattenrº   r   r÷   ÚfigureAndKeyÚpitchClassesÚrootrC   ÚbassÚinversionNameÚ	isSeventhr3   Úoffset©r8   r9   r‹   ÚgroundTruthr  r5  r6  r7  r8  r9  r:  ÚassertTuples               r   ÚtestHarmSpineDegreeszTest.testHarmSpineDegrees.  s¤  € Ý#¥IÔ$>Ñ?Ô?ˆØ�	Š	‰ŒˆØŒJˆð
Ø�. ) ) )¨S°#°r¸5ÐAð
à�/ 9 9 9¨c°3¸¸EÐBð
ð Ð" J J J°°S¸"¸eÐDð
ð �/ 9 9 9¨c°3¸¸EÐBð	
ð
 Ð" I I I¨s°C¸¸UÐCð
ð �. * * *¨c°3¸¸EÐBð
ð �/ 9 9 9¨c°3¸¸EÐBð
ð �/ : : :¨s°C¸¸EÐBð
ð Ð'¨¨¨¸¸SÀ"ÀdÐKð
ð �. ) ) )¨S°#°r¸5ÐAð
ð �> 9 9 9¨c°3¸¸EÐBð
ð �> 9 9 9¨c°3¸¸EÐBð
ð Ð# Y Y Y°°S¸"¸eÐDð
ð Ð# Z Z Z°°t¸RÀÐGð
ð �? I I I¨t°S¸!¸UÐCð
ð  Ð# Y Y Y°°S¸"¸eÐDð!
ð" �> : : :¨s°C¸¸UÐCð#
ð$ $ Y Y Y°°d¸A¸uÐEØ! : : :¨s°C¸¸UÐCØ$ l l l°C¸¸rÀ4ÐHØ! : : :¨s°C¸¸UÐCØ% | | |°T¸4ÀÀTÐJØ" I I I¨s°C¸¸UÐCØ! : : :¨s°C¸¸UÐCØ! : : :¨s°C¸¸UÐCØ! 9 9 9¨c°3¸¸EÐBð5
ð 
ð 
ˆð8 —I’I‘K”K×2Ò2µ5Ô3EÑFÔFð 	Dð 	DˆDØÔ,ˆLØÔ,ˆLØ—9’9‘;”;Ô#ˆDØ—9’9‘;”;Ô#ˆDØ ×.Ò.Ñ0Ô0ˆMØŸšÑ(Ô(ˆIàØØØØØðˆKð ×Ò˜[¨+°d´kÔ*BÑCÔCÐCÐCð	Dð 	Dr   c                ó†  — t          t          j        ¦  «        }|                     ¦   «          |j        }i ddg d¢ddddf“ddg d	¢d
d
ddf“ddg d¢ddddf“ddg d¢ddddf“ddg d¢ddddf“ddg d¢ddddf“ddg d¢ddddf“dd g d!¢ddd"d#f“d$d%g d¢ddddf“d&d'g d¢ddddf“d(d)g d¢ddddf“d*d+g d¢ddddf“d,d-g d	¢d
d
ddf“d.d/g d¢ddddf“d0d1g d2¢ddddf“d3d4g d5¢ddd"d#f“d6d7g d8¢ddd9df“d:g d;¢d
dd<dfd=g d>¢ddd9dfd?g d@¢ddd<dfdAg dB¢dddCdfdg d¢ddddfdDg dE¢dddCdfd g d!¢ddd"d#fdFg dG¢ddd9dfdHg dI¢ddd<dfdJg dK¢ddd9dfdLg dM¢ddd<dfdNg dO¢d
ddCdfd/g d¢ddddfdPg dQ¢dddCdfd4g d5¢ddd"d#fdRœ¥}|                     ¦   «                              t          j        ¦  «        D ]“}|j	        }|j
        }|                     ¦   «         j        }|                     ¦   «         j        }|                     ¦   «         }	|                     ¦   «         }
|||||	|
f}|                      |||j                 ¦  «         Œ”d S )SNrß   zI7 in C major)r   r|   r  r  r©   r  Tr  zIV7 in C major)r   r    r   r|   r´   r¤   zviio7 in C major)r  r?   r   r#  r   r  ziii7 in C major)r|   r  r  r?   r²   râ   zvi7 in C major)r    r   r|   r  r  ró   zii7 in C major)r?   r   r    r   r±   rõ   zV7 in C major)r  r  r?   r   rÑ   rö   r  r  r  Fr'  zi7 in a minorr(  ziv7 in a minorr)  z-VII7 in a minorr*  zIII7 in a minorr+  zVI7 in a minorr,  ziio7 in a minorr/  zV7 in a minor)r|   r#  r  r?   g      3@zi in a minorr  r0  zI65 in C major)r|   r  r  r   r$  zIV2 in C major)r|   r   r    r   é*   zviio65 in C majorr"  ziii2 in C major)r?   r|   r  r  zvi43 in C major)r|   r  r    r   r-  zV43 in C major)r?   r   r  r  zi65 in a minor)r   r|   r  r    ziv2 in a minor)r   r?   r   r    z-VII65 in a minor)r  r?   r   r  zIII2 in a minor)r  r   r|   r  zVI43 in a minor)r   r|   r   r    zV43 in a minor)r  r?   r|   r#  )g      9@g      :@r1  g      <@g      =@r2  g      ?@g      B@g     €B@g      C@g     €C@g      D@g     €D@g      E@g     €E@)r   r
   ÚharmSeventhsr0   r	   r4  rº   r   r÷   r5  r6  r7  rC   r8  r9  r:  r3   r;  r<  s               r   ÚtestHarmSpineSeventhszTest.testHarmSpineSevenths_  s#  € Ý#¥IÔ$:Ñ;Ô;ˆØ�	Š	‰ŒˆØŒJˆð!
Ø�/ = = =°#°s¸A¸tÐDð!
àÐ" L L L°#°s¸A¸tÐDð!
ð Ð$ m m m°S¸#¸qÀ$ÐGð!
ð Ð# ] ] ]°C¸¸aÀÐFð	!
ð
 Ð" L L L°#°s¸A¸tÐDð!
ð Ð" L L L°#°s¸A¸tÐDð!
ð �/ = = =°#°s¸A¸tÐDð!
ð �. ) ) )¨S°#°r¸5ÐAð!
ð �? L L L°#°s¸A¸tÐDð!
ð Ð# \ \ \°3¸¸QÀÐEð!
ð Ð% } } }°c¸3ÀÀ4ÐHð!
ð Ð$ m m m°S¸#¸qÀ$ÐGð!
ð Ð# \ \ \°3¸¸QÀÐEð!
ð Ð$ m m m°S¸#¸qÀ$ÐGð!
ð �? M M M°3¸¸QÀÐEð!
ð  �> 9 9 9¨c°3¸¸EÐBð!!
ð" Ð# ] ] ]°C¸¸bÀ$ÐGð#!
ð$ $ \ \ \°3¸¸RÀÐFØ&¨¨¨°s¸CÀÀTÐJØ$ m m m°S¸#¸rÀ4ÐHØ$ l l l°C¸¸bÀ$ÐGØ# \ \ \°3¸¸QÀÐEØ# ] ] ]°C¸¸bÀ$ÐGØ! 9 9 9¨c°3¸¸EÐBØ# \ \ \°3¸¸RÀÐFØ# \ \ \°3¸¸RÀÐFØ&¨¨¨°s¸CÀÀTÐJØ$ m m m°S¸#¸rÀ4ÐHØ$ l l l°C¸¸bÀ$ÐGØ$ m m m°S¸#¸qÀ$ÐGØ# ] ] ]°C¸¸bÀ$ÐGØ! 9 9 9¨c°3¸¸EÐBðA!
ð !
ð !
ˆðD —I’I‘K”K×2Ò2µ5Ô3EÑFÔFð 	Dð 	DˆDØÔ,ˆLØÔ,ˆLØ—9’9‘;”;Ô#ˆDØ—9’9‘;”;Ô#ˆDØ ×.Ò.Ñ0Ô0ˆMØŸšÑ(Ô(ˆIàØØØØØðˆKð ×Ò˜[¨+°d´kÔ*BÑCÔCÐCÐCð	Dð 	Dr   c                óF  — t          t          j        ¦  «        }|                     ¦   «          |j        }i dd“dd“dd“dd“dd“dd“dd“d	d“d
d“dd“dd“dd“dd“dd“dd“dd“dd“ddddddddddœ	¥}|                     ¦   «                              t          j        ¦  «        D ]y}| 	                    ¦   «         }| 
                    ¦   «         }|                     ¦   «         }|                     ¦   «         }||||f}	|                      |	||j                 ¦  «         Œzd S )Nrß   )FFFFr  r¤   r  râ   ró   rõ   rö   r!  r%  r&  r'  r(  r)  r*  r+  r,  )TTFF)TFTF)TFFTr.  )r   r
   r3  r0   r	   r4  rº   r   r÷   ÚisAugmentedSixthÚisItalianAugmentedSixthÚisFrenchAugmentedSixthÚisGermanAugmentedSixthr3   r;  )
r8   r9   r‹   r=  r  rE  rF  rG  rH  r>  s
             r   ÚtestHarmSpineAugmentedSixthsz!Test.testHarmSpineAugmentedSixths–  sé  € Ý#¥IÔ$>Ñ?Ô?ˆØ�	Š	‰ŒˆØŒJˆð
àÐ-ð
ð Ð-ð
ð Ð-ð	
ð
 Ð-ð
ð Ð-ð
ð Ð-ð
ð Ð-ð
ð Ð-ð
ð Ð-ð
ð Ð-ð
ð Ð.ð
ð Ð.ð
ð Ð.ð
ð Ð.ð
ð  Ð.ð!
ð" Ð.ð#
ð$ Ð.ð%
ð& -Ø.Ø,Ø.Ø,Ø.Ø.Ø.Ø.ð7
ð 
ð 
ˆð: —I’I‘K”K×2Ò2µ5Ô3EÑFÔFð 	Dð 	DˆDØ#×4Ò4Ñ6Ô6ÐØ&*×&BÒ&BÑ&DÔ&DÐ#Ø%)×%@Ò%@Ñ%BÔ%BÐ"Ø%)×%@Ò%@Ñ%BÔ%BÐ"à Ø'Ø&Ø&ð	ˆKð ×Ò˜[¨+°d´kÔ*BÑCÔCÐCÐCð	Dð 	Dr   c                ó´   — ddl m} |                     d¦  «        }|j        }|                      |j        ¦  «         |                      d|j        ¦  «         d S )Nr   )Úcorpuszpalestrina/agnus_0Ú
Palestrina)ru   rK  r0   ÚmetadataÚassertIsNotNoneÚcomposerÚassertIn)r8   rK  r  Úmds       r   ÚtestMetadataRetrievedzTest.testMetadataRetrievedÄ  s_   € Ø"Ð"Ð"Ð"Ð"Ð"Ø�LŠLÐ-Ñ.Ô.ˆØŒZˆØ×Ò˜Rœ[Ñ)Ô)Ð)Ø�Š�l B¤KÑ0Ô0Ð0Ð0Ð0r   c                óx  — t           d         }dt           d<   t          t          j        ¦  «        }|                     ¦   «          |j        }dt           d<   t          t          j        ¦  «        }|                     ¦   «          |j        }|t           d<   |j        d                              d¦  «        j        d         }|j        d                              d¦  «        j        d         }|  	                    |j
        j        d¦  «         |  	                    |j
        j        d¦  «         |  	                    t          |j
        j        d         j        ¦  «        d¦  «         |  	                    |j
        j        d         j        j        d¦  «         |  	                    |j
        j        d¦  «         |  	                    |j
        j        d¦  «         |  	                    t          |j
        j        d         j        ¦  «        d	¦  «         |  	                    |j
        j        d         j        j        d¦  «         d S )
NÚJRPFTr   r   zEighth Triplet (1/2 QL)z8DurationTuple(type='eighth', dots=1, quarterLength=0.75)zDotted Eighth Triplet (1/2 QL)z7DurationTuple(type='eighth', dots=0, quarterLength=0.5))r   r   r
   ÚdottedTupletr0   r	   r   r€   r¬   r3   rD   ÚfullNamerE   ÚreprrF   rG   )r8   Ú
prevFlavorrd   r  Úhdc2rÚ   ÚcnÚdns           r   ÚtestFlavorszTest.testFlavorsË  sÚ  € Ý˜U”^ˆ
Ø��‰Ý#¥IÔ$:Ñ;Ô;ˆØ�	Š	‰ŒˆØŒJˆØ��‰Ý$¥YÔ%;Ñ<Ô<ˆØ�
Š
‰ŒˆØŒKˆØ#��‰ØŒW�QŒZ×Ò Ñ"Ô"Ô(¨Ô+ˆØŒW�QŒZ×Ò Ñ"Ô"Ô(¨Ô+ˆØ×Ò˜œÔ-Ð/HÑIÔIÐIØ×Ò˜œÔ)¨1Ñ-Ô-Ð-Ø×Ò�˜bœkÔ1°!Ô4ÔCÑDÔDØSñ	Uô 	Uð 	Uà×Ò˜œÔ,¨QÔ/Ô>ÔCÀQÑGÔGÐGØ×Ò˜œÔ-Ð/OÑPÔPÐPØ×Ò˜œÔ)¨1Ñ-Ô-Ð-Ø×Ò�˜bœkÔ1°!Ô4ÔCÑDÔDØRñ	Tô 	Tð 	Tà×Ò˜œÔ,¨QÔ/Ô>ÔCÀQÑGÔGÐGÐGÐGr   N) Ú__name__Ú
__module__Ú__qualname__r=   rJ   r\   r`   rf   rq   rz   rƒ   r‡   r�   r’   r•   rÂ   rÊ   rÒ   rç   ÚunittestÚskiprê   rø   rÿ   r  r  r  r?  rC  rI  rR  r\  r   r   r   r   r   )   s  € € € € € ð 1ð  1ð  1ðDGð Gð Gð9ð 9ð 9ðGð Gð Gðð ð ð*ð *ð *ðD9ð 9ð 9ðGð Gð Gðð ð ð6ð 6ð 6ð)ð )ð )ð)ð )ð )ð+Bð +Bð +BðZ+Bð +Bð +BðZ4
ð 4
ð 4
ðlGð Gð Gð6 €X„]ð :ñ ;ô ;ðGð Gñ;ô ;ðGð@ €X„]ð :ñ ;ô ;ð!
ð !
ñ;ô ;ð!
ðF)Bð )Bð )BðV$
ð $
ð $
ðL
ð 
ð 
ð85ð 5ð 5ð/Dð /Dð /Dðb5Dð 5Dð 5Dðn,Dð ,Dð ,Dð\1ð 1ð 1ðHð Hð Hð Hð Hr   r   c                  ó   — e Zd ZdZd„ ZdS )ÚTestExternalTc                ó¤   — t          t          j        ¦  «        }|                     ¦   «          | j        r|j                             ¦   «          d S d S r…   )r   r
   Ú
sousaStarsr0   rc   r	   )r8   r9   s     r   ÚtestShowSousazTestExternal.testShowSousaç  sK   € Ý#¥IÔ$8Ñ9Ô9ˆØ�	Š	‰ŒˆØŒ9ð 	ØŒJ�OŠOÑÔÐÐÐð	ð 	r   N)r]  r^  r_  rc   rf  r   r   r   rc  rc  ä  s(   € € € € € Ø€Dðð ð ð ð r   rc  Ú__main__)Ú__doc__Ú
__future__r   r¶   r`  ru   r   r   r   r   r   r	   Úmusic21.humdrumr
   Úmusic21.humdrum.spineParserr   r   r   r   r   r   r   ÚTestCaser   rc  r]  ÚmainTestr   r   r   ú<module>rn     s¯  ððð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðx
Hð x
Hð x
Hð x
Hð x
Hˆ8Ôñ x
Hô x
Hð x
Hðvð ð ð ð �8Ô$ñ ô ð ð ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   