
    3j                       d Z ddlmZ ddlZddlZddlZddlZddlmZ ddlm	Z	 ddlm
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ej,                  rddlmZ  ej0                  d      Zej4                  ej6                  ej8                  ej:                  ej<                  ej>                  dZ 	 	 d#	 	 	 	 	 	 	 d$dZ!	 	 	 	 	 	 	 	 	 	 d%dZ"	 	 	 	 	 	 d&dZ#	 	 	 	 	 	 	 	 	 	 	 	 d'dZ$d(dZ%d#dZ&dddZ' G d dejP                        Z) G d  d!ejT                        Z+e,d"k(  rddlZ ejZ                  e+       yy))aD  
Functions for translating music21 objects and
:class:`~music21.abcFormat.ABCHandler` instances.
Mostly, these functions are for advanced, low level usage.
For basic importing of ABC files from a file or URL to a
:class:`~music21.stream.Stream`, use the music21 converter
module's :func:`~music21.converter.parse` function.
    )annotationsN)articulations)bar)clef)chord)common)environment)exceptions21)harmony)meter)note)spanner)stream)tempo)tie	abcFormatzabcFormat.translate)staccatoupbowdownbowaccentstrongaccenttenutoc                
   ddl m} |t        j                         }n|}|t	        j
                         }d}d}g }| j                         rH| j                         }t        j                  t        |j                      |j                  |            }n| g}t        |      dk  rd}	nd}	d}
d}|D ]  }t        j                  rt        ||j                         sJ |	r|j#                         rt        j$                         }|j&                  |j&                  j)                         }|||_        |j&                  j-                         r|j/                  t        j0                        j3                  d      }|sFt	        j0                  |      }|j&                  j-                         |_        |j7                  |       n?t        j                  t        j0                  |d         }|j9                  |       d|_        |j&                  j-                         dk(  rd|_        |j<                  |j<                  j)                         }|||_        |j<                  jA                         rx|j/                  t        j0                        j3                  d      }tC        |      r?t        j                  t        j0                  |d         }|j9                  |       d|_        |
dz  }
n|}tE        ||||	      \  }}|	sUt        |t        j$                        sq|
dk(  r7|jF                  +|jI                         dk  r$|jK                          d|_        n||_        |dz  }|jM                  |        |jO                          	 tQ        |d	       |s|tZ        j\                     s|	r^|j_                  t        j$                        ja                         }t        j                  r|J t[        jb                  |d
      |_-        n'|je                  dt[        jb                  |d
             |dk7  r|jg                  |d	       |	r&|tT        jh                     r	 |jk                  d	       g }|j3                  d      D ]%  }|js                  d|       |j7                  |       ' |D ]  }|ju                  |        |jO                          |S # tR        tT        jV                  tX        f$ r Y bw xY w# tT        jV                  t        jl                  f$ r"}tn        jq                  d|        Y d}~d}~ww xY w)z
    Handler conversion of a single Part of a Score with multiple Parts.
    Results are added into the provided inputM21 object
    or a newly created Part object

    The part object is then returned.
    r   r   N   FT         ?inPlace)recursezError in beaming. Ignoring: );music21r   r   Partr   SpannerBundledefinesMeasuressplitByMeasuretypingcastlist
ABCHandlermergeLeadingMetaDatalenTYPE_CHECKING
isinstanceABCHandlerBarhasNotesMeasureleftBarTokengetBarObjectleftBarlineisRepeatBracket
getByClassRepeatBracketgetByCompleteStatusnumberappendaddSpannedElementscompleteStatusrightBarTokenrightBarlineisRepeatanyparseTokenstimeSignaturebarDurationProportionpadAsAnacrusis
coreAppendcoreElementsChangedreBarABCTranslateExceptionr   MeterExceptionZeroDivisionErrorr   ClefgetElementsByClassfirstbestClefinsert	transposeTimeSignature	makeBeamsStreamExceptionenvironLocalwarn
coreInsertremove)
abcHandlerinputM21spannerBundler   pclefSetpostTranspositionmergedHandlersbarHandlersuseMeasuresbarCountmeasureNumbermhdstbLeft
rbSpannersrbbRightmermsps                         H/DATA/.local/lib/python3.12/site-packages/music21/abcFormat/translate.pyabcToStreamPartrm   :   s    "KKM--/G 24N !!# !//1  T)*>*>%?%CY%C%CK%PR % >a
 HM b)"9"9:::
 2;;= .."C
 *446$&+CO??224!.!9!9':O:O "<<O<OPU<V 
 &$2237$&OO$C$C$E	%,,R0#[[)>)>
1N--c2,0) 668A=,0)+))668%'-C$ ##,,.
 "/!9!9--"//B/B5/I :#[[)>)>
1N--c2,0) MHC
 &1S![%I"7 :c6>>:
 1}!2!2!>,,.4&&(!"CJ
 +
"LLu x a
 1TYY<$$V^^4::<A##}$}]]1d3AFHHQa67A	%t4q,,-	BKKK%
 
B//5	Q
		" 6 R   HO "5#7#79JK * $$f&<&<= 	B <QC@AA	Bs*   S %T S>=S>#U$UUc                   ddl m} d}d}| j                  D ]@  }t        ||j                        rt        |||||      \  }}-t        ||j                        rt        ||       Pt        ||j                        r:t        j                  r|j                  J |j                  |j                         t        ||j                        r:t        j                  r|j                  J |j                  |j                         t        ||j                        st        j                  r|j                   J |j                  |j                          C |j#                          ||fS )z5
    parses all the tokens in a measure or part.
    r   r   F)r!   r   tokensr-   ABCMetadatametadataToM21ObjectABCNoteparseABCNoteABCSlurStartr&   r,   slurObjrD   ABCCrescStartcrescObjABCDimStartdimObjrE   )rb   rc   rZ   r_   r   r\   r[   ts           rl   r@   r@      s,    "GYYa../)<3)7K*&w 9,,-C 9112##yy,,,LL#9223##zz---LL$9001##xx+++LL"% & g%%    c                @
   ddl m} | j                  r| j                  d   }t        j                  dd|      j                         j                         }t        j                  dd|      }t        j                  |      }	 |dv rt        j                  |      }n'|j                  d      ryt        j                  |      }|j                  |d	
       |j                          t!        | |j"                        r| j$                  syg }g }| j$                  D ]e  }t!        ||j&                        s|j(                  }t*        j,                  r|J |j/                  |       |j/                  |j0                         g t3        j4                  |      }	| j6                  |	j8                  _        | j:                  rt=        j>                  | j:                        }
|
j@                  :|
jC                  |	j8                  jD                  |	j8                  jF                         |	j8                  jI                  |
       tK        tM        |	jN                              D ](  }|	jN                  |   jP                  }|||   |_)        * |j                  |	       y| jT                  rtW        jX                         }nZtW        jZ                  | j(                        }|j\                  jP                  %| j0                  |j\                  jP                  _)        | j6                  |j8                  _        | j:                  rt=        j>                  | j:                        }
|
j@                  :|
jC                  |j8                  jD                  |j8                  jF                         |j8                  jI                  |
       | j^                  w| j^                  dv r6t_        j`                  | j^                        |_/        d|j^                  _1        n3| j^                  dk(  r$t_        j`                  | j^                        |_/        | jd                  D ]  }|jg                  |        | jh                  r|jk                         }g |_6        to        | jl                        rd| jl                  jq                         }|tr        vr8tr        |   } |       }|jl                  j/                  |       to        | jl                        rd|j                  |d	
       y# t        $ r Y 6w xY w)zG
    Parse an ABCNote object and add it to the destination stream.
    r   r   " z[()])NCzN.C.zNo ChordNone>NFsetActiveSite)startcontinuenormalstop):r!   r   chordSymbolsresublstriprstripr   cleanedFlatNotationr   NoChord
startswithChordSymbolrD   rE   
ValueErrorr-   ABCChord	subTokensrr   	pitchNamer&   r,   r9   accidentalDisplayStatusr   ChordquarterLengthdurationactiveTupletcopydeepcopydurationNormalsetDurationTypetypedotsappendTupletranger+   pitches
accidentaldisplayStatusisRestr   RestNotepitchr   TiestyleapplicableSpannersr:   inGracegetGracer   r?   pop_abcArticulationsToM21)rz   rc   r   cs_namecspitchNameListaccStatusListtSubpnc
thisTupletpIndexaccnspantokenArticulationStrm21ArticulationClassm21ArticulationObjs                     rl   rs   rs      s    " 	~~..#&&b'*113::<&&W-,,W5
	<<__W-##C(((1NN2UN3##%
 !Y''({{ $&KKD$	 1 12^^''>)>$$R($$T%A%AB   KK&#$??

 >>q~~6J((0**1::??AJJOOLJJ##J/C		N+F))F#..C$1&$9! , 	q 88		A		!++&Aww!!-343L3L""0#$??

 >>q~~6J((0**1::??AJJOOLJJ##J/ 55uu--&& ((D##A& ) 99

A!//"#$??#6#6#8 #+AA#9:N#O !5!7OO""#56 !//" 	q.W  		s   +T .8T 	TTc                   | j                         r4| j                         }||r||_        ||fS |j                  |       ||fS | j	                         ri| j                         }|
|r||_        n||j                  |       | j                         \  }}|!|d}|r||_        n|j                  |       |}||fS | j                         r5| j                         }	t        j                  r|	J |j                  |	       ||fS )a  
    Parse a single ABCMetadata token, that does not represent what
    music21 considers metadata, such as a time signature, key signature,
    clef, or tempo, and put it in dst.

    This function uses coreAppend operations, so if called separately,
    dst.coreElementsChanged() should be called before accessing the stream.

    Returns the changed transposition and whether clef was set.
    F)isMetergetTimeSignatureObjectrA   rD   isKeygetKeySignatureObjectkeySignaturegetClefObjectr   isTempogetMetronomeMarkObjectr&   r,   )
rz   rc   r\   r[   r_   tsksclefObjtranspositionmmObjs
             rl   rq   rq     s   " 	yy{%%'>$&!8 g%%5 r"4 g%%3 
$$&>k!C^NN2!"!2=#<G "w' - g%% 
((*$$$ug%%r{   c                "   ddl m} ddl m} |t        j                         }n|}|j                         }|j                  d|       d}| j                  D ]l  }t        ||j                        s|j                         rV|j                  j                  dd      j                         }	 | j                  t        j                   d|            | _        |j'                         rI|dk(  r"|j)                  d|j                         |dz  }|j)                  d	|j                         |dz  }|j+                         r|j)                  d
|j                         |j-                         r|j)                  d|j                         6|j/                         sH|j)                  dt1        |j                               o g }	| j3                         }
t5        |
      dk(  r|	j7                  |
d          n6t9        dt5        |
            D ]  }|
d   |
|   z   }|	j7                  |         g }|	D ]  }t;        |      }|j7                  |         |D ]  }|j=                  d|        |j?                          |S # t$        $ r Y 7w xY w)a  
    Given an abcHandler object, build into a
    multi-part :class:`~music21.stream.Score` with metadata.

    This assumes that this ABCHandler defines a single work (with 1 or fewer reference numbers).

    if the optional parameter inputM21 is given a music21 Stream subclass, it will use that object
    as the outermost object.  However, inner parts will
    always be made :class:`~music21.stream.Part` objects.
    r   r   )metadatazabc-versionr~   z(\d+).(\d+).?(\d+)?titler   alternativeTitlecomposerlocaleOfCompositionr8   ) r!   r   r   r   ScoreMetadatarN   ro   r-   rp   	isVersiondatareplacestripreturnAbcVersionFromMatchr   match
abcVersionAttributeErrorisTitleadd
isComposerisOriginisReferenceNumberintsplitByVoicer+   r9   r   rm   rU   rE   )rW   rX   r   r   smd
titleCountrz   vpartHandlerstokenCollectionsinewABCHandlerpartListpartHandlerrZ   s                   rl   abcToStreamScorer     s7    " LLN 
			BHHQO Ja../{{}FFNN="5;;=,6,P,P!7;-J) ?FF7AFF+!OJ FF-qvv6!OJz166* ,aff5 $$&xQVV-? D L!..0
!,Q/0 q#./0A,Q/2B12EEM . 1 H#K( $ 	Q Hi & s   ,*J	JJc                   |t        j                         }n|}| j                         r| j                         }|||v rt	        ||         }|S g }t        |j                               D ]"  \  }}	 t	        |      }|j                  |       $ |D ]  }	|j                  |	d        |j                          |S |j                  t	        |              |S # t        $ r t        j                  d|        Y w xY w)z
    Convert a multi-work stream into one or more complete works packed into an Opus Stream.

    If a `number` argument is given, and a work is defined by
    that number, that work is returned.
    zFailure for piece number Fr   )r   OpusdefinesReferenceNumberssplitByReferenceNumberr   sorteditemsr9   
IndexErrorrS   rT   rD   rE   )
rW   rX   r8   opusabcDict	scoreListkeyvaluescscoreDocuments
             rl   abcToStreamOpusr     s    {{}
 ))+335&G"3#GFO4D" K I$W]]_5
UI)%0B$$R( 6 "+UC "+$$& K 	$Z01K " I %%(A#&GHIs   2C!C<;C<Fr   c          
        |st        j                  |       } d}d}| j                  t        j                        }t        t        |            D ]d  }||   }|j                  |j                  }|t        d      |j                  j                  }t        j                  |j                        }|xj                  |z  c_        ||kD  s~|j                  |      \  }	}
d|
_        |j                  j                  |
j                  k7  rF	 |
j!                         |
_        |t        |      dz
  k7  r||dz      j                  |||dz      _        d|
_        d|
_        |	j                  dz   |
_        |dz  }| j+                  t        j                  |	j,                  |	j                  z         |
       g |s| S y# t"        j$                  $ r#}t        d|j                   d|d|       d}~ww xY w)a9  
    Re-bar overflow measures using the last known time signature.

    >>> irl2 = corpus.parse('irl', number=2)
    >>> irl2.metadata.title
    'Aililiu na Gamhna, S.35'
    >>> music21Part = irl2[1]

    The whole part is in 2/4 time, but there are some measures expressed in 4/4 time
    without an explicit time signature change, an error in abc parsing due to the
    omission of barlines. The method will split those measures such that they conform
    to the last time signature, in this case 2/4. The default is to reBar in place.
    The measure numbers are updated accordingly.

    (NOTE: reBar is called automatically in abcToStreamPart, hence not demonstrated below.)

    The key signature and clef are assumed to be the same in the second measure after the
    split, so both are omitted. If the time signature is not the same in the second measure,
    the new time signature is indicated, and the measure following returns to the last time
    signature, except in the case that a new time signature is indicated.

    >>> music21Part.measure(15).show('text')
    {0.0} <music21.note.Note A>
    {1.0} <music21.note.Note A>

    >>> music21Part.measure(16).show('text')
    {0.0} <music21.note.Note A>
    {0.5} <music21.note.Note B->
    {1.0} <music21.note.Note A>
    {1.5} <music21.note.Note G>

    An example where the time signature wouldn't be the same. This score is
    mistakenly marked as 4/4, but has some measures that are longer.

    >>> irl15 = corpus.parse('irl', number=15)
    >>> irl15.metadata.title
    'Esternowe, S. 60'
    >>> music21Part2 = irl15.parts.first()  # 4/4 time signature
    >>> music21Part2.measure(1).show('text')
    {0.0} <music21.note.Note C>
    {1.0} <music21.note.Note A>
    {1.5} <music21.note.Note G>
    {2.0} <music21.note.Note E>
    {2.5} <music21.note.Note G>
    >>> music21Part2.measure(1)[-1].duration.quarterLength
    1.5

    >>> music21Part2.measure(2).show('text')
    {0.0} <music21.meter.TimeSignature 1/8>
    {0.0} <music21.note.Note E>

    * Changed in v5: inPlace is False by default, and a keyword only argument.
    Nr   z$No time signature found in this PartzProblem with measure z (z): r   )r   r   rK   r   r0   r   r+   rA   rG   barDurationr   r   opFrachighestTimer8   splitAtQuarterLengthbestTimeSignaturer
   rR   r   r   rN   offset)music21Partr   lastTimeSignaturemeasureNumberOffsetallMeasuresmeasureIndexmusic21MeasuretsEndmEndm1m2ri   s               rl   rF   rF   <  s   n mmK000@Kc+./$\2''3 . < <$'(NOO!--;;}}^778!44%<#88?FB#B ,,::bnnLc')';';'=B$  3{#3a#77"<!#34BBJFWL1$45C"BOBG		ABI1$v}}RYY-GH"M7 0J  ) $33 c//0E0E/FbHZZ]^_]`ac ccs   F<<G2G--G2c                      e Zd Zy)rG   N)__name__
__module____qualname__ r{   rl   rG   rG     s    r{   rG   c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)Testc                    ddl m} dD ]?  } |j                         }|j                  |      }t	        |      }|j                          A y )Nr   r   r  )r!   r   ABCFilereadstrr   show)selfr   tfafahr   s         rl   	testBasiczTest.testBasic  sC    %
B& #""$BBB $AFFH-
r{   c                p   ddl m} ddlm} |j                  dddf|j
                  ddd	f|j                  d
ddf|j                  dddf|j                  ddd	ffD ]Z  \  }}}} |j                         }|j                  |      }t        |      }	| j                  |	j                  j                  |       \ y)z?
        NB -- only title is checked. not meter or key
        r   r   	testFilesFyrareprisarnz3/4FzMystery ReelzC|GzThe Ale is Dearz4/4DzKitchen GirlzWilliam and Nancyz6/8N)r!   r   music21.abcFormatr!  fyrareprisarnmysteryReel	aleIsDear	kitchGirlwilliamAndNancyr  r  r   assertEqualr   r   )
r  r   r!  r  titleEncodedunused_meterEncodedunused_keyEncodedr  r  r   s
             rl   testGetMetaDatazTest.testGetMetaData  s    
 	&/ $$oucB""ND#>  "3UCB  .%=&&(;UCHK
FR24E #""$BBB $AQZZ--|<K
r{   c                "   ddl m} ddlm} |j                  } |j
                         }t        |j                  |            }| j                  t        |j                        d       | j                  t        |j                  d   j                         j                        d       | j                  t        |j                  d   j                         j                        d       | j                  t        |j                  d   t        j                           d       |j                  d   j                         j                  t        j                        d	   j                   D cg c]  }|j"                   }}| j                  |g d
       |j                  d   j                         j                  t        j                        d   j                   D cg c]  }|j"                   }}| j                  |g d       y c c}w c c}w )Nr   r   r   r   o   r             )zF#4D4B3   )E4zC#4A3)r!   r   r&  r!  r)  r  r   r  r,  r+   partsflattennotesAndRestsr   r   rK   r   nameWithOctave)r  r   r!  r  r  r   rZ   r   s           rl   
testChordszTest.testChords  s   %/  Y RZZ^,QWWq)QWWQZ//1??@#FQWWQZ//1??@#F 	QWWQZ45r: ,-771:+=+=+?+R+RKK,,#G,$ % ,$a!! ,$ % 34+,771:+=+=+?+R+RKK,,#G,$ % ,$a!! ,$ % 34%%s   +HHc                T   ddl m} ddlm} |j                  } |j
                         }t        |j                  |            }| j                  t        |j                        d       | j                  t        |j                  d   j                         j                        d       | j                  t        |j                  d   j                         j                        d       | j                  t        |j                  d   j                         j                        d       y )	Nr   r   r   r8     r      r   )r!   r   r&  r!  testPrimitivePolyphonicr  r   r  r,  r+   r;  r<  r=  r  r   r!  r  r  r   s         rl   testMultiVoicezTest.testMultiVoice  s    %/..Y RZZ^,QWWq)QWWQZ//1??@!DQWWQZ//1??@"EQWWQZ//1??@!Dr{   c           	     z   ddl m} ddlm} |j                  } |j
                         }t        |j                  |            }g }|j                         j                  D ]  }|j                  |j                          g d}| j                  ||D 	cg c]  }	t        j                  |	       c}	       y c c}	w )Nr   r   r   )(UUUUUU?rG  rG  皙?rH  rH  rH  rH  UUUUUU?rI  rI  rI  rI  rI  $I$I?rJ  rJ  rJ  rJ  rJ  rJ  UUUUUU?rK  rK  rK  rK  rK  UUUUUU?rL  rL  rL  rL  rL  rL  rL  rL  rL  rL  rL  r   )r!   r   r&  r!  testPrimitiveTupletr  r   r  r<  r=  r9   r   r,  r   r   )
r  r   r!  r  r  r   r   r   
shouldFindxs
             rl   testTupletszTest.testTuplets  s    %/**Y RZZ^,**ALL) +	

 	: F:aq!1: FG Fs   B8
c                @   ddl m} ddlm}  |j                         }|j                  |j                         t        |      }|j                  d   j                  t        j                        j                         }| j                  |j                  j                  d       | j                  |j                   j                  d       |j"                  d   }|j"                  d   }| j                  |j%                  |      |j&                  z   d       | j                  |j"                  d   j(                  d       | j                  |j%                  |      |j&                  z   d       | j                  |j"                  d   j(                  d        |j                         }|j                  |j*                         t        |      }|j                  d   j                  t        j                        j                         }| j                  |j                  j                  d       | j                  |j                   j                  d	       |j"                  d   }|j"                  d   }| j                  |j%                  |      |j&                  z   d
       | j                  |j"                  d   j(                  d       | j                  |j%                  |      |j&                  z   d       | j                  |j"                  d   j(                  d       y )Nr   r   r   g      @g       @r   r   g      @g      ?g      @g      @g      @g      @)r!   r   r&  r!  r)   processhectorTheHeror   r;  rK   r   r0   rL   r,  r   r   r   r=  getOffsetBySitepaddingLeftbeattheAleWifesDaughter)r  r   r!  r  r   r  n0n1s           rl   testAnacrusisPaddingzTest.testAnacrusisPadding#  sp   %/ "Y!!#


9**+R WWQZ**6>>:@@B 	55s;22C8 a a ++B/"..@#F))!,1137++B/"..@#F))!,1137 "Y!!#


9001R WWQZ**6>>:@@B 	55s;22C8a a ++B/"..@#F))!,1137++B/"..@$G))!,1148r{   c                   ddl m} ddl m} |j                  d      }| j	                  |j
                  d       | j	                  |j                  j
                  d        |j                         }|j                  |       |j                         }|j                          t        |      }| j	                  t        |      d       y )Nr   corpusr   essenFolksong/testez	teste.abcessenFolksong   )r!   r]  r   getWorkr,  nameparentr  openreadcloser   r+   )r  r]  r   fpr  r  ops          rl   testOpusImportzTest.testOpusImportS  s    "% ^^12+.9Y 
WWY

R R!$r{   c                    ddl m} ddlm} |j                  } |j
                         }t        |j                  |            }|J y )Nr   r   r   )r!   r   r&  r!  	sicutRosar  r   r  rD  s         rl   
testLyricszTest.testLyricse  sA     	&/  Y RZZ^,}}r{   c                   ddl m} |j                  d      }| j                  t	        |j
                        d       |j                  d      j                  d   }| j                  |j                  d       | j                  t	        |j                         j                        d       |j                  d      j                  d   }| j                  |j                  d       | j                  t	        |j                         j                        d	       |j                  d
      j                  d   }| j                  |j                  d       | j                  t	        |j                         j                        d       |j                  d      j                  d   }| j                  |j                  d       | j                  t	        |j                         j                        d       |j                         }| j                  |j                  j                  d       | j                  |j                  j                  d       | j                  t	        |j                        d       | j                  |j                  d   t        j                      j#                         j$                  d       | j                  |j                  d   t        j                      j#                         j$                  d       | j                  |j                  d   t        j                      j#                         j$                  d       | j                  |j                  d   t        j                      j#                         j&                  d       | j                  |j                  d
   t        j                      j#                         j$                  d       y )Nr   r\  zjosquin/milleRegretsr5  r           Z   r   P   r8  V   N   zMille regretszJosquin des Prezr$  r#  )r!   r]  parser,  r+   scoresgetScoreByNumberr;  r  r<  r=  mergeScoresr   r   r   r   rJ   rL   signoctaveChange)r  r]  op1p2p3p4sMergeds           rl   testMultiWorkImportedzTest.testMultiWorkImportedx  s   "LL/0QXX*"((+C(RZZ\778"="((+C(RZZ\778"="((+C(RZZ\778"="((+C(RZZ\778"=--/))//A))224FGW]]+Q/q)$))4::<AA3Gq)$))4::<AA3Gq)$))4::<AA3Gq)$))4::<II2Nq)$))4::<AA3Gr{   c           	     0   ddl m} ddl m} |j                  d      }| j	                  t        |j                        d       |j                  d      j                  d   }| j	                  |j                  d       | j	                  t        |j                         j                        d       | j	                  t        t        |j                         j                  t        j                                    d	       | j	                  t        |j                         j                  t        j                              d
   j!                         |j#                  d             | j	                  t        |j                         j                  t        j                              d
   j%                         |j#                  d             | j	                  t        |j                         j                  t        j                              d   j!                         |j#                  d             | j	                  t        |j                         j                  t        j                              d   j%                         |j#                  d             y )Nr   r\  r   znottingham-dataset/reelsa-cr   Q   rn  M         r:  C3   G3B2)r!   r]  r   rt  r,  r+   ru  rv  r;  r  r<  r=  r(   rK   r   r   rootPitchbass)r  r]  r   rz  r{  s        rl   testChordSymbolszTest.testChordSymbols  s   "!LL67QXX* #))!,C(RZZ\778"=T"**,"A"A'BUBU"VWXZ\]bjjl==g>Q>QRSTUV[[]T*	,bjjl==g>Q>QRSTUV[[]T*	, 	bjjl==g>Q>QRSTVW\\^T*	,bjjl==g>Q>QRSTVW\\^T*	,r{   c                0   ddl m} d}|j                  |d      }| j                  t	        |t
        j                           d       | j                  t	        |t
        j                           d       t        j                  |      }| j                  d|j                  t
        j                        j                         j                         | j                  d|j                  t
        j                        j                         j                         y )	Nr   	converterz
            T: No Chords
            M: 4/4
            L: 1/1
            K: C
            [| "C" C | "NC" C | "C" C | "N.C." C | "C" C
            | "No Chord" C | "C" C | "None" C | "C" C | "Other"
            C |]
            abcformat	   r5  r`  )r!   r  rt  r,  r+   r   r   r   realizeChordSymbolDurationsrK   lastr   rL   )r  r  
target_strscores       rl   testNoChordzTest.testNoChord  s    %
 
59U7#6#678!<U7??34a833E:E44W5H5HI!TVMM	3E44W5H5HI"UW]]	4r{   c                $   ddl m} g d}g d}t        t        ||            D ]  \  }\  }} |j                  d|z         }|j                          |j                         } |j                  d|z         }|j                          |j                         }	| j                  ||j                         | j                  ||	j                         | j                  d|j                         | j                  d|	j                          g d}g d	}t        t        ||            D ]  \  }\  }} |j                  d|z         }|j                          |j                         } |j                  d|z         }|j                          |j                         }	| j                  d
|z  |j                         | j                  d
|z  |	j                         | j                  d|j                         | j                  d|	j                          y )Nr   r   )Cr$  r%  AEBzF#zC#)AmEmBmzF#mzC#mzG#mzD#mzA#mzK:majorminor)r  r#  BbEbAbDbGbCb)r  DmGmCmFmBbmEbmAbmrs  )
r!   r   	enumerateziprp   preParser   r,  sharpsmode)
r  r   r  r  r   majNameminNameamks_majorks_minors
             rl   testAbcKeyImportzTest.testAbcKeyImport  s   % ;E%.s5%/@%A!A!&&&tg~6BKKM//1H&&&tg~6BKKM//1HQ0Q0Whmm4Whmm4 &B ?C%.s5%/@%A!A!&&&tg~6BKKM//1H&&&tg~6BKKM//1HR!VX__5R!VX__5Whmm4Whmm4 &Br{   c                X   ddl m} |j                  d      }| j                  t	        |j
                        d       |j                  d      }| j                  |j                  j                  d       |j                  d      }| j                  |j                  j                  d       y )	Nr   r\  r^  r`  r5  zAsien, Ostasien, China, Sichuanr  zAmerika, Mittelamerika, Mexiko)	r!   r]  rt  r,  r+   ru  rv  r   r   )r  r]  rz  r   s       rl   testLocaleOfCompositionImportz"Test.testLocaleOfCompositionImport  s    "LL./QXX*q!779Z[q!779YZr{   c                   ddl m} ddlm} |j	                  |j
                        }| j                  t        |t        j                           d       |j	                  |j                        }| j                  t        |t        j                           d       | j                  |t        j                     j                         j                  j                  d       |j	                  |j                         }| j                  t        |j"                  j                         j%                  t&        j(                        j                         j*                        d       y )Nr   r   r  r   r8  r6  )r&  r!  r!   r  rt  morrisonsJigr,  r+   r   RepeatdraughtOfAler   r   rL   r   r>  rS  r;  rK   r   r0   notes)r  r!  r  r   s       rl   testRepeatBracketsAzTest.testRepeatBracketsA  s    /%OOI223 	Qszz]+Q/
 OOI223Qszz]+Q/499++-33BBDI OOI334QWW]]_??OUUW]]^`abr{   c                   ddl m} ddlm} ddlm} |j                  |j                        }| j                  t        |t        j                           d       |j                  |j                        }| j                  t        |t        j                           d       |j                  d      }| j                  t        |t        j                           d       y )Nr   r   r  r\  r   r5  JollyTinkersReel)r&  r!  r!   r  r]  rt  r  r,  r+   r   r6   rS  )r  r!  r  r]  r   s        rl   testRepeatBracketsBzTest.testRepeatBracketsB  s    /%"OOI223Qw4456: OOI334Qw4456:LL+,Qw4456:r{   c                   ddl m} ddlm} |j	                  |j
                        }|j                         j                  t        j                        }| j                  t        |      d       | j                  t        |d         d       |j	                  |j                        }|j                         j                  t        j                        }| j                  t        |      d       | j                  t        |d         d       |j	                  |j                        }|t        j                     }| j                  t        |      d       | j                  t        |d         d       y )	Nr   r   r  r   z)<music21.tempo.MetronomeMark Quarter=100>r   z)<music21.tempo.MetronomeMark Quarter=211>z1<music21.tempo.MetronomeMark maestoso Quarter=90>)r&  r!  r!   r  rt  fullRiggedShipr<  rK   r   TempoIndicationr,  r+   strr)  theBeggerBoy)r  r!  r  r   mmStreams        rl   testMetronomeMarkAzTest.testMetronomeMarkA   s   /%OOI44599;11%2G2GHX*Xa[)+VWOOI//099;11%2G2GH 	X*Xa[)+VWOOI223U**+ 	X*Xa[)+^_r{   c                H    ddl m} dD ]  }|j                  |      }|J  y )Nr   r\  )zToCashellImGoingJig.abczSundayIsMyWeddingDayJig.abczSinkHimDoddieHighlandFling.abczRandyWifeOfGreenlawReel.abczPassionFlowerHornpipe.abczNightingaleClog.abczMountainRangerHornpipe.abczLadiesPandelettsReel.abczJauntingCarHornpipe.abczGoodMorrowToYourNightCapJig.abczChandlersHornpipe.abcz"AlistairMaclalastairStrathspey.abcr!   r]  rt  r  r]  fnr   s       rl   testTranslateAzTest.testTranslateA8  s-     	#
B R A= =
r{   c                   ddl m} t        j                  ddd      }| j	                  |j                         |j                  d             | j                  |j                  d   |j                                t        j                  d      }| j	                  |j                         |j                  d	             | j	                  |j                         |j                  d             | j	                  |j                  d   |j                  d             t        j                  d
      }| j	                  |j                         |j                  d
             | j	                  |j                  d   |j                  d             | j	                  |j                  d   |j                  d             t        j                  d      }| j	                  |j                         |j                  d             | j	                  |j                  d   |j                  d             | j	                  |j                  d   |j                  d             | j	                  |j                  d   |j                  d             y )Nr   r  ebbbdominant)r  r  kindzB-2ze-7/b-zE-3zb-3zB-3r   r6  bb3b2r  D3r   zF#3)
r!   r   r   r   r,  r  r  assertIsr   r  )r  r   r   s      rl   testCleanFlatzTest.testCleanFlatO  s   !  dJGEKK$67bjjmRWWY/  *EKK$67EKK$67AE(:;
   'EKK$67AE(:;AD(9:  'EKK$56AD(9:AD(9:AE(:;r{   c                H    ddl m} dD ]  }|j                  |      }|J  y)zf
        Dylan -- this could be too slow to make it a test!

        Numbers 637 and 749 fail
        r   r\  )zairdsAirs/book4.abcNr  r  s       rl   xtestTranslateBzTest.xtestTranslateBk  s)     	#)BR A= = *r{   c                6    ddl m} |j                  dd      }y )Nr   r\  zhan2.abci  )r8   r  r  r]  unuseds      rl   testTranslateBrokenDurationz Test.testTranslateBrokenDurationy  s    "j5r{   c                    ddl m} |j                  dd      }|j                         j                  D cg c]  }|j
                  j                   }}| j                  |g d       y c c}w )Nr   r  zL:1/8
a-a-ar  r  )r   r   r   )r!   r  rt  r<  r=  r   r   assertListEqual)r  r  r  r   tiess        rl   testTiesTranslatezTest.testTiesTranslate}  sX    %u=$)MMO$A$AB$Aq

$ABT#@A Cs   A*c                2    ddl m} |j                  d      }y )Nr   r\  z0josquin/laDeplorationDeLaMorteDeJohannesOckeghemr  r  s      rl   xtestMergeScoreszTest.xtestMergeScores  s    "PQr{   N)r  r  r  r  r0  r?  rE  rP  rZ  ri  rl  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r{   rl   r  r    s{    <=,58E&H0.9`%$	& HH,.42!5H
[c*;`0!.<8
!6BRr{   r  __main__)NN)rW   abcFormat.ABCHandlerrX   zstream.Part | NonerY   zspanner.SpannerBundle | Nonereturnstream.Part)
rb   r  rc   stream.Measure | stream.PartrZ   r  r_   boolr  tuple[int, bool])rz   zabcFormat.ABCNoterc   r  r  r   )rz   zabcFormat.ABCMetadatarc   r  r\   r   r[   r  r_   r  r  r  )N).__doc__
__future__r   r   unittestr   r&   r!   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r,   r   EnvironmentrS   StaccatoUpBowDownBowAccentStrongAccentTenutor   rm   r@   rs   rq   r   r   rF   Music21ExceptionrG   TestCaser  r  mainTestr  r{   rl   <module>r     s   #   	  !              	! '{&&'<= &&  $$""!..""  "&04$ . 	D"&"&	#"& "& 	"&
 "&Hf/f/	#f/ 
f/R2&2&	#2& 2& 	2&
 2& 2&jUn$N #( bJ	L99 	
_R8 _RF zGT r{   