
    rhh\                        S r SSKJr  SSKrSSKJr  SSKJr  \R                  " S5      rS r	SS jr
S	 rSS
 jrSS jr " S S\R                  5      r\/r\S:X  a  SSKr\R$                  " \5        gg)ac  
**N.B. in Dec. 2014 MuseData access was removed from music21 because the rights conflicted with
access computationally from music21.  This module is retained for anyone who has such access,
however it is completely untested now and errors cannot and will not be fixed.**


Functions for translating music21 objects and
:class:`~music21.musedata.base.MuseDataHandler` instances. Mostly,
these functions are for advanced, low level usage. For basic importing of MuseData
files from a file or URL to a :class:`~music21.stream.Stream`, use the music21
converter module's :func:`~music21.converter.parse` function.
    )annotationsN)clef)environmentzmusedata.translatec                    SSK Jn  UR                  5       nU  H`  nSnUS:X  a  SnOAUS:X  a  SnO8US:X  a  S	nO/US
:X  a  SnSnO$US;   a  SnSnO[        R	                  SU/5        MO  UR                  XT5        Mb     U$ )a2  
Given a musedata beam symbol, converter to a music21 Beams object representation.

>>> from music21.musedata import translate
>>> translate._musedataBeamToBeams('[[')
<music21.beam.Beams <music21.beam.Beam 1/start>/<music21.beam.Beam 2/start>>
>>> translate._musedataBeamToBeams('===')
<music21.beam.Beams <music21.beam.Beam 1/continue>/<music21.beam.Beam
        2/continue>/<music21.beam.Beam 3/continue>>

>>> translate._musedataBeamToBeams(r']/')  # must escape backslash
<music21.beam.Beams <music21.beam.Beam 1/stop>/<music21.beam.Beam 2/partial/right>>

r   )beamN[start]stop=continue/partialright)\z\\leftzcannot interpret beams char:)music21r   BeamsenvironLocal
printDebugappend)
beamSymbolr   beamsObjchar	directionbeamTypes         T/home/james-whalen/.local/lib/python3.13/site-packages/music21/musedata/translate.py_musedataBeamToBeamsr   #   s     zz|H 	3;HS[HS[!HS[ HI]" HI##%CT$JK 	,' * O    c                p   SSK Jn  SSK Jn  SSK Jn  [	        U 5      S:X  a)  UR                  5       nU S   R                  5       Ul        O/UR                  U  Vs/ s H  ofR                  5       PM     sn5      nU S   R                  5       Ul
        U S   R                  5       nUb  U H  nUR                  U5        M     U S   R                  5       n	U	b  [        U	5      Ul        U S   R!                  5        H  n
UR"                  R%                  U
5        M      U S   R'                  5        H  nUR(                  R%                  U5        M      / nU S   R+                  5        H  nUR%                  U5        M     U S   R-                  5       (       aY  UR/                  S5      Ul        Ub=  UR                  b0  UR                  R0                  S;   a  UR/                  S5      Ul        X\4$ Ub=  UR                  b0  UR                  R0                  S;   a  UR/                  S	5      Ul        X\4$ s  snf )
z
Given a list of MuseDataRecord objects, return a configured
:class:`~music21.note.Note` or :class:`~music21.chord.Chord`.

Optionally pass a previous element, which may be music21 Note, Chord, or Rest;
this is used to determine tie status
r   note)chord)tie   r	   )r	   r   r   r   )r   r"   r#   r$   lenNotegetPitchObjectpitchChordgetQuarterLengthquarterLength	getLyricsaddLyricgetBeamsr   beamsgetArticulationObjectsarticulationsr   getExpressionObjectsexpressionsgetDynamicObjectsisTiedTietype)recordspreviousElementr"   r#   r$   postr	lyricListlyric
beamsCharsaedynamicObjsds                 r    _musedataRecordListToNoteOrChordrD   O   s    
7|qyy{QZ..0
 {{@1,,.@A !446D 
$$&IEMM%   $$&J)*5

 QZ..0!!!$ 1QZ,,." / KQZ))+1 , qz777#&?+>+>+J ""''+@@77:.
  &?+>+>+J""''+@@776?U As   H3c                   [        X5      u  pVU (       a=  UR                  U5        U H$  nUR                  UR                  U5      U5        M&     U$ UR                  U5        U H$  nUR                  UR                  U5      U5        M&     U$ N)rD   
coreAppend
coreInsertgetOffsetBySite)	hasVoicespendingRecordseLastmvActiverA   rB   rC   s           r   _processPendingrO      s    5nLNA1Aq0091=  H 	
QALL**1-q1 Hr   c           	     	   SSK Jn  SSK Jn  SSK Jn  Uc  UR	                  5       nOUnUR                  5       nU R                  5       Ul        UR                  Ul        U R                  5       nSnSn	[        U5       GHw  u  pUR                  5       (       d  M  UR                  5       (       a  SnUR                  5       nOSnSnU
[        U5      S-
  ::  a  XzS	-      nOSnUR                  5       nUb*  UR                  5       (       d  UR!                  5       Ul        US:X  a  UR$                  R'                  5       nUb  UR$                  R'                  5       Ul        UR$                  R+                  5       Ul        UR$                  R/                  5       Ul        UR$                  R3                  5       nUbH  UR5                  U5      nUR7                  5       (       a"  UR9                  5       nUR;                  SU5        UR=                  5       n/ nU GH9  nUR?                  5       (       a9  U(       a  [A        UUXU5      n	/ nUR;                  SU5        UR                  5       nURC                  5       (       aj  U(       a  [A        UUXU5      n	/ nURE                  5       nURG                  5       Ul$        U(       a  URK                  U5        OURK                  U5        Un	M  URM                  5       (       a  URO                  U5        M  URQ                  5       (       d  GM  U(       a  [A        UUXU5      n	/ nURO                  U5        GM<     U(       a  [A        UUXU5      n	Ub)  U(       a"  URS                  5         URU                  SU5        URS                  5         US:X  a1  UR,                  b$  URW                  5       S
:  a  URY                  5         URK                  U5        US	-  nGMz     URS                  5         U R[                  5       nUb0  UR]                  5       R_                  U/ SQSS9  URa                  SS9  U Rb                  S	:X  a_  [(        Rd                  " USS9URg                  URh                  5      Rk                  5       l        URm                  SS9  URa                  SS9  UR;                  SU5        U$ )z?
Translate a musedata part to a :class:`~music21.stream.Part`.
r   streamr!   )tempoNTF   r%   g      ?)r'   r*   KeySignature)classFilterListinPlace)rW   )recurse)7r   rR   r"   rS   ScorePartgetPartNameidpartNamegetMeasures	enumeratehasNotesrJ   Voicer&   getMeasureObjectgetBarObjectrightBarlineparentgetClefObjectr   getTimeSignatureObjecttimeSignaturegetKeySignaturekeySignaturegetDirective	TempoTextisCommonTempoTextgetMetronomeMarkinsert
getRecordsisBackrO   isRestRestr+   r,   rG   isChordr   isNotecoreElementsChangedrH   barDurationProportionpadAsAnacrusisgetTranspositionIntervalObjectflatten	transposemakeAccidentalsstagebestClefgetElementsByClassMeasurefirst	makeBeams)museDataPartinputM21rR   r"   rS   spmdmObjsbarCountrL   mIndexmdmrJ   rN   mdmNextrM   c	directivettmmmdrObjsrK   mdrr<   	tIntervals                            r   musedataPartToStreamPartr      s    LLNA##%ADAJ &&(G H E )||~~==??IllnGIG S\A%%qj)GG  " w'7'7'9'9 %113ANq=

((*A}113!jj??AAO ZZ779AN

//1I$__Y/'')),,.BHHQO .."  C zz|| "+I~uQXYE%'N G$ ,,.zz|| "+I~uQXYE%'NIIK"%"6"6"8&&q)LLO %%c* "+I~uQXYE%'N%%c*[ ` #I~uQE 7'')LLG$	q=Q__8&&(3.  " 	
QAg *j ;;=I			i.O&* 	 	, 	
$'Q<@MM!UY<ZV^^,2249	D!	$' HHQNHr   c                   SSK Jn  SSK Jn  Uc  UR                  5       nOUnU R	                  5       nUR                  5       nUR                  SU5        US   R                  5       Ul        US   R                  5       Ul
        US   R                  5       Ul        US   R                  5       Ul        U H  n[        Xt5        M     U$ )a  
Given an museDataWork object, build into a multi-part
:class:`~music21.stream.Score` with metadata.

This assumes that this MuseDataHandler 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   rQ   )metadata)r   rR   r   rY   getPartsMetadataro   getWorkTitletitlegetMovementNumbermovementNumbergetMovementTitlemovementNamegetWorkNumbernumberr   )museDataWorkr   rR   r   r   mdpObjsmdmdParts           r   museDataWorkToStreamScorer   C  s      LLN ##%G				BHHQOqz&&(BH
446Baj113BO
 
((*BI + Hr   c                  ,    \ rS rSrS rS rS rS rSrg)Testim  c                   SSK Jn  SSK Jn  UR                  5       S-  S-  S-  S-  nUR	                  5       nUR                  U5        [        U5      nU R                  [        UR                  5      S5        U R                  UR                  S   R                  S	5        U R                  [        UR                  S   R                  5       R                  5      S
5        g )Nr   )musedatacommonr   testPrimitivetest01z01.mdr%   zClarinet in A6   )r   r   r   getSourceFilePathMuseDataWorkaddFiler   assertEqualr&   partsr\   rX   notesAndRests)selfr   r   fp1mdwr   s         r   	testBasicTest.testBasico  s    $"'')'(*9:<DEGNO##%C%c* 	QWWq)8QWWQZ//1??@"Er   c                    [        S5      nU R                  [        U5      S5        [        S5      nU R                  [        U5      S5        [        S5      nU R                  [        U5      S5        g )Nr   z3<music21.beam.Beams <music21.beam.Beam 1/continue>>z]\zR<music21.beam.Beams <music21.beam.Beam 1/stop>/<music21.beam.Beam 2/partial/left>>z]/zS<music21.beam.Beams <music21.beam.Beam 1/stop>/<music21.beam.Beam 2/partial/right>>)r   r   str)r   r;   s     r   testGetBeamsTest.testGetBeams  sn    #C(TN	P $E*I`	b $D)Ia	cr   c                    g)zX
testing a piece with 1 flat to make sure that sharps appear but normal B-flats do not.
N )r   s    r   testAccidentalsTest.testAccidentals  s     	r   c                   SSK Jn  SSK Jn  UR                  5       S-  S-  S-  nUR	                  U5      nUR
                  S   R                  SS5      nU R                  [        US   R                  5       R                  5      S	5        U R                  [        US   R                  5       R                  5      S5        U R                  [        US	   R                  5       R                  5      S5        U R                  [        US
   R                  5       R                  5      S5        U R                  [        US   R                  5       R                  5      S5        g )Nr   )	converterr   r   r   r   r%      rT            )r   r   r   r   parser   measuresr   r&   rX   r   )r   r   r   fpDirr   r   s         r   testBackBasicTest.testBackBasic  s   %"((*Z7/IHTOOE" 771:&&q!,Xa[002@@A1EXa[002@@A1EXa[002@@A1EXa[002@@A1EXa[002@@A1Er   r   N)	__name__
__module____qualname____firstlineno__r   r   r   r   __static_attributes__r   r   r   r   r   m  s    Flcr6Fr   r   __main__rF   )__doc__
__future__r   unittestr   r   r   Environmentr   r   rD   rO   r   r   TestCaser   
_DOC_ORDERr   mainTestr   r   r   <module>r      s    #   &&';<)X=@cL&TXF8 XFd ((
zT r   