o
    f                     @   s  d dl mZ d dl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
Z
d dlZd dlZG dd deZG dd deZG dd	 d	eZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZG d)d* d*eZ G d+d, d,eZ!G d-d. d.eZ"G d/d0 d0eZ#G d1d2 d2eZ$G d3d4 d4eZ%G d5d6 d6eZ&G d7d8 d8eZ'G d9d: d:eZ(G d;d< d<eZ)G d=d> d>eZ*G d?d@ d@eZ+G dAdB dBeZ,G dCdD dDeZ-G dEdF dFeZ.G dGdH dHe.Z/G dIdJ dJeZ0G dKdL dLeZ1G dMdN dNeZ2G dOdP dPZ3G dQdR dReZ4G dSdT dTeZ5G dUdV dVeZ6G dWdX dXeZ7G dYdZ dZeZ8G d[d\ d\eZ9G d]d^ d^eZ:G d_d` d`eZ;G dadb dbeZ<G dcdd ddeZ=G dedf dfeZ>G dgdh dheZ?G didj djeZ@G dkdl dleZAG dmdn dneZBG dodp dpeZCG dqdr dreZDG dsdt dteZEG dudv dveZFG dwdx dxeZGG dydf dfeZ>G dzd{ d{eZHG d|d} d}eZIG d~d deZJG dd deZKG dd deZLG dd deZMG dd de.ZNG dd deZOG dd deZPG dd deZQG dd deZRG dd deZSG dd deZTG dd deZUG dd deZVi deFdede&dedede5de/de*de9de6de7de8de-de:de;dede<i de0de?de>de=dede@deAde1de2deBdeCdeDdeEdedeGdeHdeIi de"de de$dedede+de4deJdedeKdeLdedeMde,deNdeOdePe(e#eQee!eRe%e)e'eSeeTeUeVed˜ZWdd̈́ ZXddτ ZYddф ZZddӄ Z[e\dkrhd dl]Z^e^j_`dաZaeZeab ZcedeWe Zfegd֠hef dS dS )    )OrderedDictN)Fractionc                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	d%ddZ
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$S )&Xml_nodec                 C   s(   g | _ d | _d | _d| _d | _i | _d S )NZxml_node)	_children_data	_original_name_parent_attribute_dictself r   ]/home/lily/lilypond-2.24.4/release/binaries/mingw/lilypond/lilypond-2.24.4/python/musicxml.py__init__&   s   
zXml_node.__init__c                 C      | j S N)r	   r   r   r   r   
get_parent.      zXml_node.get_parentc                 C   s   | j | jd | kS Nr   )r	   get_typed_children	__class__r   r   r   r   is_first1   s   zXml_node.is_firstc                 C   r   r   )r   r   r   r   r   original4   r   zXml_node.originalc                 C   r   r   )r   r   r   r   r   get_name7   r   zXml_node.get_namec                 C   s,   | j r| j S | jsdS ddd | jD S )N c                 S   s   g | ]}|  qS r   get_text.0cr   r   r   
<listcomp>A       z%Xml_node.get_text.<locals>.<listcomp>)r   r   joinr   r   r   r   r   :   s
   zXml_node.get_textc              
   C   sT   t | | }|r(t d|jddd t|j D f  | }|s	d S d S )Nz  In: <%s %s>
 c                 S      g | ]}d | qS )z%s=%sr   r   itemr   r   r   r    I   r!   z$Xml_node.message.<locals>.<listcomp>)	lywarningZprogressr   r"   listr
   itemsr   )r   msgpr   r   r   messageC   s   

zXml_node.messager   c                 C   s   t d|| jddd t| j D f  dd | jD }|r't d | jD ]	}||d  q*|r;t | t d| j  d S )	Nz%s<%s%s>r   c                 S   r$   )z %s=%sr   r%   r   r   r   r    N   r!   z!Xml_node.dump.<locals>.<listcomp>c                 S   s   g | ]	}t |ts|qS r   )
isinstance	Hash_textr   r   r   r   r    O   s
    

z    z</%s>
)	r'   debug_outputr   r"   r)   r
   r*   r   dump)r   indentZnon_text_childrenr   r   r   r   r2   L   s   



zXml_node.dumpc                    s    sg S  fdd| j D S )Nc                    s   g | ]	}t | r|qS r   )r.   r   klassr   r   r    ]       z/Xml_node.get_typed_children.<locals>.<listcomp>r   )r   r5   r   r4   r   r   Y   s   zXml_node.get_typed_childrenc                 C      |  t|S r   r   	get_classr   nmr   r   r   get_named_children_      zXml_node.get_named_childrenc                 C   s
   |  |S r   get_maybe_exist_named_childr;   r   r   r   get_named_childb      
zXml_node.get_named_childc                    s    fdd| j D S )Nc                    s   g | ]} |r|qS r   r   r   	predicater   r   r    f       z)Xml_node.get_children.<locals>.<listcomp>r7   )r   rD   r   rC   r   get_childrene      zXml_node.get_childrenc                 C   r   r   r7   r   r   r   r   get_all_childrenh   r   zXml_node.get_all_childrenc                 C   r8   r   )get_maybe_exist_typed_childr:   r   namer   r   r   r@   k   r>   z$Xml_node.get_maybe_exist_named_childc                 C   sB   |  |}t|dkrd S t|dkrttd|j  |d S )Nr      zBmore than one child of class %s, all but the first will be ignored)r   lenwarningswarn___name__r   r5   cnr   r   r   rI   n   s   

z$Xml_node.get_maybe_exist_typed_childc                 C   s:   |  |}t|dkrt| j td||f |d S )NrL   z#Child is not unique for %s found %dr   )r   rM   r'   error__dict__RuntimeErrorrR   r   r   r   get_unique_typed_childx   s   

zXml_node.get_unique_typed_childc                 C   s   |  |}|rt| S |S r   r@   intr   )r   rK   defaultnr   r   r   get_named_child_value_number      
z%Xml_node.get_named_child_value_numberNr   )rQ   
__module____qualname__r   r   r   r   r   r   r-   r2   r   r=   rA   rF   rH   r@   rI   rW   r\   r   r   r   r   r   $   s$    	
	
	r   c                   @      e Zd Zdd ZdS )Music_xml_nodec                 C   s.   t |  td| _td| _d| _d | _d S )Nr   F)r   r   r   durationstartZ	convertedvoice_idr   r   r   r   r      s
   



zMusic_xml_node.__init__NrQ   r_   r`   r   r   r   r   r   rb          rb   c                   @      e Zd Zdd Zdd ZdS )Music_xml_spannerc                 C      t | dr| jS dS )Ntyper   )hasattrrk   r   r   r   r   get_type   s   
zMusic_xml_spanner.get_typec                 C      t | dr
t| jS dS )Nsizer   rl   rY   ro   r   r   r   r   get_size      

zMusic_xml_spanner.get_sizeN)rQ   r_   r`   rm   rq   r   r   r   r   ri      s    ri   c                   @   rh   )Measure_elementc                 C      |  d}|r| S | jS Nvoicer@   r   re   r   rv   r   r   r   get_voice_id      
Measure_element.get_voice_idc                    s*    j t} fdd|D }|d  kS )Nc                    s*   g | ]}|     kst|tr|qS r   )ry   r.   
Attributesr   r   r   r   r       s    z,Measure_element.is_first.<locals>.<listcomp>r   )r	   r   rs   r   rS   r   r   r   r      s   zMeasure_element.is_firstN)rQ   r_   r`   ry   r   r   r   r   r   rs      s    rs   c                   @   $   e Zd Zdd Zdd Zdd ZdS )Workc                 C   s   |  |}|r| S dS )Nr   r@   r   )r   tagZwtr   r   r   get_work_information   s   
zWork.get_work_informationc                 C   
   |  dS )Nz
work-titler   r   r   r   r   get_work_title   rB   zWork.get_work_titlec                 C   r   )Nzwork-numberr   r   r   r   r   get_work_number   rB   zWork.get_work_numberN)rQ   r_   r`   r   r   r   r   r   r   r   r      s    r   c                   @   s|   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )Identificationc                 C   sd   |  d}g }|D ]#}| }t|dr'|j }d|d|g}|| q	|| q	d|S )Nrightsrk   r   z: r0   )r=   r   rl   rk   titler"   append)r   r   retrtextZrights_typeresultr   r   r   
get_rights   s   



zIdentification.get_rightsc                 C   s0   |  d}g }|D ]	}||  q	d|S )Nsourcer0   )r=   r   r   r"   )r   r   r   r   r   r   r   
get_source   s
   

zIdentification.get_sourcec                 C   s8   |  d}|D ]}t|dr|j|kr|   S qd S )Ncreatorrk   )r=   rl   rk   r   )r   rk   creatorsir   r   r   get_creator   s   
zIdentification.get_creatorc                 C   s@   |  d}|r	|S | d}|D ]}t|ds|   S qd S )Ncomposerr   rk   )r   r=   rl   r   )r   r   r   r   r   r   r   get_composer   s   


zIdentification.get_composerc                 C   r   )NZarrangerr   r   r   r   r   get_arranger   rB   zIdentification.get_arrangerc                 C   r   )NZeditorr   r   r   r   r   
get_editor   rB   zIdentification.get_editorc                 C   s    |  d}|r	|S |  d}|S )NlyricistZpoetr   )r   vr   r   r   get_poet   s
   

zIdentification.get_poetc                 C   s4   |  d}|r|d  |}|r|d  S d S d S )Nencodingr   )r=   r   )r   rk   encchildrenr   r   r   get_encoding_information  s   
z'Identification.get_encoding_informationc                 C   r   )Nsoftwarer   r   r   r   r   get_encoding_software  rB   z$Identification.get_encoding_softwarec                 C   r   )Nzencoding-dater   r   r   r   r   get_encoding_date  rB   z Identification.get_encoding_datec                 C   r   )Nencoderr   r   r   r   r   get_encoding_person  rB   z"Identification.get_encoding_personc                 C   r   )Nzencoding-descriptionr   r   r   r   r   get_encoding_description  rB   z'Identification.get_encoding_descriptionc                 C   s>   |  d}g }|D ]}| d}|D ]	}||  qq	|S )Nr   r   )r=   r   r   )r   r   r   eZ	softwaressr   r   r   get_encoding_software_list  s   

z)Identification.get_encoding_software_listc                 C   sP   |  d}|D ]}| d}|D ]}t|dr$|jdkr$|     S qqd S )NZmiscellaneouszmiscellaneous-fieldrK   description)r=   rl   rK   r   )r   ZmiscmZmisc_fieldsZmfr   r   r   get_file_description"  s   

z#Identification.get_file_descriptionN)rQ   r_   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s    		r   c                   @   <   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )Creditc                 C   s   |  d}|d ur| S d S )Nzcredit-typer   )r   rk   r   r   r   rm   .     
zCredit.get_typec                    s  |  |}|jdd | |}|jdd | |}|jdd | d}d }d }d  d }d }	d }
|d ur~t|drDttt|d}t|drRt	tt|d}t|dr`t	tt|d t|drjt|d}t|drtt|d}	t|d	r~t|d	}
|r|t
|kr r t
|kr|
s|r|
d
ks|d
krdS  r t|kr t
|k r|
s|r|
d
ks|d
krdS |
s|r|
dks|dkr|r|t|krdS |
s|r|
dks|dkr|r|t
|krdS |r|t|kr t|krdS |	r|	dkr r |d krdS |	r|	dkr|r|t|krdS |	r0|	dkr0 r0 t|kr0dS |	r:|	dkr:dS t fddt|D dkrLdS d S )NT)reversecredit-words	font-size	default-x	default-yhalignvalignjustifycenterr   Zsubtitleleftr   rightr   r   toprL   Zbottomc                    s   g | ]
\}}| kr|qS r   r   )r   r   r&   yr   r   r    j  s    z$Credit.find_type.<locals>.<listcomp>   )get_font_sizessortget_default_ysget_default_xsr@   rl   rY   floatgetattrroundmaxminrM   	enumerate)r   creditssizesZysZxswordsro   xr   r   r   r   r   r   	find_type5  sv   












 $$$$ zCredit.find_typec                 C   sH   g }|D ]}| d}|d urt|dr|t|d qdd |D S )Nr   r   c                 S   s   g | ]}t t|qS r   )rY   r   )r   ro   r   r   r   r    v  rE   z)Credit.get_font_sizes.<locals>.<listcomp>)r@   rl   r   r   )r   r   r   credr   r   r   r   r   p  s   
zCredit.get_font_sizesc                 C   R   g }|D ]}| d}|d urt|dr|t|d qtttttt|S )Nr   r   r@   rl   r   r   r)   mapr   r   )r   r   Z
default_xsr   r   r   r   r   r   x     
zCredit.get_default_xsc                 C   r   )Nr   r   r   )r   r   Z
default_ysr   r   r   r   r   r     r   zCredit.get_default_ysc                 C   s   |  d}|d ur| S dS )Nr   r   r   )r   r   r   r   r   r     r   zCredit.get_textN)	rQ   r_   r`   rm   r   r   r   r   r   r   r   r   r   r   ,  s    ;r   c                   @   ra   )Durationc                 C   s   t |  tdd }|S )NrL      )rY   r   r   )r   durr   r   r   
get_length  s   zDuration.get_lengthN)rQ   r_   r`   r   r   r   r   r   r         r   c                   @   s   e Zd ZdddZdS )r/   r   c                 C   s   t | j  d S r   )r'   r1   r   strip)r   r3   r   r   r   r2     rG   zHash_text.dumpNr^   )rQ   r_   r`   r2   r   r   r   r   r/     s    r/   c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Pitchc                 C      |  td}|  }|S )NsteprW   r:   r   r   r   chr   r   r   r   get_step     zPitch.get_stepc                 C   s"   |  td}|  }t|S )NoctaverW   r:   r   r   rY   r   r   r   r   r   r   
get_octave  s   zPitch.get_octavec                 C      |  td}t|S )NalterrI   r:   	utilitiesinterpret_alter_elementr   r   r   r   r   get_alteration     
zPitch.get_alterationc                 C   s4   t  }|  |_t|  |_|  d |_	|S Nr   )
musicexpr   r   Z
alterationmusicxml2ly_conversionmusicxml_step_to_lilyr   r   r   r   )r   r,   r   r   r   to_lily_object  s
   
zPitch.to_lily_objectN)rQ   r_   r`   r   r   r   r   r   r   r   r   r     s
    r   c                   @   r~   )	Unpitchedc                 C   r   Nzdisplay-stepr   r   r   r   r   r     r   zUnpitched.get_stepc                 C   *   |  td}|r|  }t|S d S Nzdisplay-octaver   r   r   r   r   r     s
   zUnpitched.get_octavec                 C   B   d }|   }|rt }t||_|  }|r|r|d |_|S r   r   r   r   r   r   r   r   r   r   r,   r   r   r   r   r   r        
zUnpitched.to_lily_objectN)rQ   r_   r`   r   r   r   r   r   r   r   r     s    	r   c                   @   ra   )rs   c                 C   rt   ru   rw   rx   r   r   r   ry     rz   r{   N)rQ   r_   r`   ry   r   r   r   r   rs     rg   c                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )r|   c                 C   s    t |  i | _d | _d | _d S r   )rs   r   _dict_original_tag_time_signature_cacher   r   r   r   r        

zAttributes.__init__c                 C   s.   | j | j}| jr|d | jkS |d | kS r   )r	   r   r   r   r}   r   r   r   r     s   zAttributes.is_firstc                 C   s   | j | d S r   )r   update)r   dictr   r   r   set_attributes_from_previous     z'Attributes.set_attributes_from_previousc                 C   s    |   D ]	}|| j| < qd S r   )rH   r   r   )r   r   r   r   r   	read_self  s   zAttributes.read_selfc                 C   s   | j |S r   )r   getrJ   r   r   r   get_named_attribute     zAttributes.get_named_attributec                 C   s<   t |dk rdS d}|dd D ]}||7 }qt||d S )Nr   r   )rM   r   )r   sigr[   r   r   r   r   single_time_sig_to_fraction  s   
z&Attributes.single_time_sig_to_fractionc                 C   sT   |   }|rt|dkrdS t|d tr%d}|D ]	}|| |7 }q|S | |S )Nr   rL   )get_time_signaturerM   r.   r)   r  )r   r
  lr   r   r   r   get_measure_length  s   
zAttributes.get_measure_lengthc              	   C   s  	 	 | j r| j S zf| d}|sW dS |dr"ttd W dS g }g }| D ]-}t|trB|	 
 d}dd |D }q*t|trW|t|	  || g }q*t|d	 trit|d
kri|d	 }|| _ |W S  ttfy   | td Y dS w )zEReturn time sig as a(beat, beat-type) tuple. For compound signatures,timeNzsenza-misuraz3Senza-misura time signatures are not yet supported!)r   r   +c                 S      g | ]}t |qS r   )rY   )r   jr   r   r   r    !  r!   z1Attributes.get_time_signature.<locals>.<listcomp>r   rL   z8Unable to interpret time signature! Falling back to 4/4.)r   r  r@   r'   r(   rP   rH   r.   Beatsr   r   splitBeatTyper   rY   r)   rM   KeyError
ValueErrorr-   )r   mxlZ	signatureZcurrent_sigr   beatsr   r   r   r  
  sD   




zAttributes.get_time_signaturec                 C   st   g d}|  d}|s|S |d}|r| |d< |d}|r)t| |d< |d}|r8t| |d< |S )	N)Gr   r   Zclefsignr   linerL   zclef-octave-changer   )r  r@   r   rY   )r   Zclefinfor  r  r  r   r   r   r   get_clef_information0  s   



zAttributes.get_clef_informationc           
      C   s&  	 	 	 |  d}|sdS |d}|r2|d}d}|r | }|r&|dkr(d}t| }||fS g }d}| D ]V}t|trH|  }q:t|trX|	|t
|g q:t|trd}	t|d	rit|j}	|	dkr|	t|kr||	d
  	t| d  q:|td|	t|f  q:|S )z=return(fifths, mode) tuple if the key signatures is given as keyNfifthsmoder   majorr   r	  numberrL   r   zXKey alteration octave given for a non-existing alteration nr. %s, available numbers: %s!)r  r@   r   rY   rH   r.   KeyStepr   KeyAlterr   r   r   	KeyOctaverl   r"  rM   r-   rP   )
r   r  Z
fifths_elmZ	mode_noder   r  ZalterationsZcurrent_stepr   nrr   r   r   get_key_signature@  sH   







 

zAttributes.get_key_signaturec                 C   r   )NZ	transpose)r  r   r   r   r   get_transpositioni  rB   zAttributes.get_transpositionN)rQ   r_   r`   r   r   r  r  r  r  r  r  r  r'  r(  r   r   r   r   r|     s    &)r|   c                   @   ra   )Barlinec           	      C   sR  i }|  d}|  d}|  d}d }|r| }|rnt|drnt }ddd|jd|_|jd	kr8|d
ksA|jdkrC|dkrCd }t|dr]zt|j|_W n t	y\   d|_Y nw | |_
|jdkrj||d< n||d< |rt|drt }dddd|jd|_| |_
|jdkr||d< n||d< |rt }||_||d< t| S )N	bar-stylerepeatending	directionr	  rL   )forwardbackwardr   r.  zheavy-lightr/  zlight-heavytimesr      rk   )rd   stopZdiscontinuer   )r@   r   rl   r   ZRepeatMarkerr  r-  rY   r0  r  eventZEndingMarkerrk   r   ZBarLiner)   values)	r   ZretvalZbartype_elementZrepeat_elementZending_elementZbartyper+  r,  br   r   r   r   o  sN   









zBarline.to_lily_objectN)rQ   r_   r`   r   r   r   r   r   r)  m  r   r)  c                   @   ra   )Partialc                 C   s   t |  || _d S r   )rs   r   partial)r   r7  r   r   r   r        

zPartial.__init__Nrf   r   r   r   r   r6    rg   r6  c                   @   s*   e Zd ZdddddZdd Zdd	 ZdS )
StemZstemDownZstemUpNZstemNeutral)ZdownZupZdoublenonec                 C   s6   g }| j |  d }t }|r||_|| |S r   )stem_value_dictr  r   r   Z	StemEventvaluer   )r   r4  r<  Z
stem_valuer   r   r   to_stem_event  s   
zStem.to_stem_eventc                 C   s@   g }t  }t| drtt| d|_|jd ur|| |S )Ncolor)r   ZStemstyleEventrl   r   hex_to_colorr   r>  r   )r   stylesZ	style_elmr   r   r   to_stem_style_event  s   


zStem.to_stem_style_event)rQ   r_   r`   r;  r=  rA  r   r   r   r   r9    s    	r9  c                   @   s   e Zd Z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Zd d! Zd
S )"NoteheadZslashz'slashZtrianglez	'triangleZdiamondz'diamondZsquarez'laZcrossNr   z'crosszcircle-xz'xcirclezinverted trianglez
arrow downzarrow upZslashedzback slashedZnormalZclusterr:  z#fZdoz'dorez'rez'miz'faz'ti)miZfaZsoZlaZtic                 C   s   g }|    }| j|d }t }|r||_t| dr%t| ddk|_	t| dr3t
t| d|_|js@|j	d us@|jd urE|| t| drV| jdkrV|t  |S )Nfilledyesr>  parentheses)r   r   notehead_styles_dictr  r   ZNotestyleEventstylerl   r   rE  r   r?  r>  r   rG  ZParenthesizeEvent)r   r@  r  rI  r3  r   r   r   r     s   


zNotehead.to_lily_object)rQ   r_   r`   rH  r   r   r   r   r   rB    sV    	
rB  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zd!ddZ		d"ddZd S )#Notec                 C   s    t |  d| _d| _d| _d S )Nr   FrL   )rs   r   instrument_name_after_grace	_durationr   r   r   r   r     r   zNote.__init__c                 C   r   )Ngracer?   r   r   r   r   is_grace  rB   zNote.is_gracec                 C   s&   |   sdS | t}| jpt|dS )NFzsteal-time-previous)rO  rI   GracerL  rl   )r   grr   r   r   is_after_grace  s   
zNote.is_after_gracec                 C   s6   |  d}|r|  }t|S |  drdS d S )Nrk   rN  r1  )r@   r   r   r   musicxml_duration_to_log)r   r   logr   r   r   get_duration_log  s   


zNote.get_duration_logc                 C   s*   |   }|d urt| t}||fS d S r   )rU  rM   r   Dot)r   rT  dotsr   r   r   get_duration_info  s
   zNote.get_duration_infoc                 C      dS )NrL   r   r   r   r   r   
get_factor     zNote.get_factorc                 C      |  tdS )Npitchr9   r   r   r   r   get_pitches  r>   zNote.get_pitchesc                 C   4   |  d}|D ]}| }|D ]}|| qqd S )Nnotehead)r=   r   add_associated_event)r   r3  Z	noteheadsZnhr@  rI  r   r   r   set_notehead_style     
zNote.set_notehead_stylec                 C   r_  Nstem)r=   r=  ra  )r   r3  stemsre  r4  r   r   r   r   set_stem_directions&  rc  zNote.set_stem_directionsc                 C   r_  rd  )r=   rA  ra  )r   r3  rf  re  r@  rI  r   r   r   set_stem_style-  rc  zNote.set_stem_stylec                 C   s   ddl m} ddlm} |  }|r.| }|d |_|d |_| ts,| j	|
  |_|S | j	dkr8|| j	S | tdtjtj	f  d S )Nr   )rational_to_lily_duration)r   rL   z5Encountered note at %s without type and duration(=%s))r   ri  r   r   rX  Zduration_logrW  rI   rP  rM  r   factorr-   rP   Zmxl_noterd   )r   ri  r   r   dr   r   r   initialize_duration4  s$   





zNote.initialize_durationc                 C   s:   |  t}| }t }||_| d}|r|j|_|S )N
accidental)rI   r   r   r   	NoteEventr]  r@   
cautionary)r   Z	mxl_pitchr]  r3  Zaccr   r   r   initialize_pitched_eventL  s   

zNote.initialize_pitched_eventc                 C   s    |  t}t }| |_|S r   )rI   r   r   rn  r   r]  )r   	unpitchedr3  r   r   r   initialize_unpitched_eventY  s   

zNote.initialize_unpitched_eventTc                 C   s(   |  t}t }|r| }||_|S r   )rI   Restr   Z	RestEventr   r]  )r   convert_rest_positionsrestr3  r]  r   r   r   initialize_rest_eventa  s   
zNote.initialize_rest_eventc                 C   s   d }d }d }|  tr|  }n|  tr|  }n|  tr%| |}n| td |r3| 	 |_
| | | | |rD| | |S )Nzcannot find suitable event)rI   r   rp  r   rr  rs  rv  r-   rP   rl  rc   rb  rh  rg  )r   Zconvert_stem_directionsrt  r]  rc   r3  r   r   r   r   k  s"   








zNote.to_lily_objectN)T)TT)rQ   r_   r`   r   rO  rR  rU  rX  rZ  r^  rb  rg  rh  rl  rp  rr  rv  r   r   r   r   r   rJ    s$    
rJ  c                   @   r~   )	Part_listc                 C   s   t |  i | _d S r   )rb   r   _id_instrument_name_dictr   r   r   r   r     r8  zPart_list.__init__c                 C   sN   ddi}|  dD ]}| dD ]}|j}|d}| ||< qq	|| _d S )NrL   
score-partzscore-instrumentzinstrument-name)r=   idrA   r   rx  )r   mappingZ
score_partZinstrrz  rK   r   r   r   generate_id_instrument_dict  s   

z%Part_list.generate_id_instrument_dictc                 C   s8   | j s|   | j |}|r|S ttd|  dS )Nz$Unable to find instrument for ID=%s
zGrand Piano)rx  r|  r  r'   r(   rP   )r   rz  rK  r   r   r   get_instrument  s   zPart_list.get_instrumentN)rQ   r_   r`   r   r|  r}  r   r   r   r   rw    s    rw  c                   @   r~   )Measurec                 C      t |  d| _d S r   )rb   r   r7  r   r   r   r   r     r8  zMeasure.__init__c                 C   s   t | do	| jdkS )NimplicitrF  )rl   r  r   r   r   r   is_implicit  rG   zMeasure.is_implicitc                 C   r\  )Nnoter9   r   r   r   r   	get_notes  r>   zMeasure.get_notesN)rQ   r_   r`   r   r  r  r   r   r   r   r~    s    r~  c                   @   r   )
Syllabicc                 C   s   |   }|dkp|dkS )Nbeginmiddler   )r   r   r   r   r   	continued  s   zSyllabic.continuedc                 C      t dkS )Nr  r   r   r   r   r   r       zSyllabic.beginc                 C   r  )Nr  r  r   r   r   r   r    r  zSyllabic.middlec                 C   r  )Nendr  r   r   r   r   r    r  zSyllabic.endN)rQ   r_   r`   r  r  r  r  r   r   r   r   r    s
    r  c                   @   ra   )Lyricc                 C   s   t | ddS )z
        Return the number attribute(if it exists) of the lyric element.

        @rtype: number
        @return: The value of the number attribute
        r"  N)r   r   r   r   r   
get_number  s   zLyric.get_numberN)rQ   r_   r`   r  r   r   r   r   r    r   r  c                   @   ra   )Soundc                 C   rj   )z
        Return the tempo attribute(if it exists) of the sound element.
        This attribute can be used by musicxml2ly for the midi output(see L{musicexp.Score}).

        @rtype: string
        @return: The value of the tempo attribute
        tempoN)rl   r  r   r   r   r   	get_tempo  s   
zSound.get_tempoN)rQ   r_   r`   r  r   r   r   r   r    r   r  c                   @   rh   )	Notationsc                 C   s(   |  d}dd |D }|r|d S d S )Ntiedc                 S   s   g | ]	}|j d kr|qS )rd   rk   )r   tr   r   r   r      r6   z%Notations.get_tie.<locals>.<listcomp>r   )r=   )r   ZtsZstartsr   r   r   get_tie  s
   
zNotations.get_tiec                 C   s
   |  tS r   )r   Tupletr   r   r   r   get_tuplets  rB   zNotations.get_tupletsN)rQ   r_   r`   r  r  r   r   r   r   r    s    r  c                   @   rh   )Time_modificationc                 C   s,   |  d}|  d}t| t| fS )Nzactual-notesznormal-notesrX   )r   r5  ar   r   r   get_fraction  s   

zTime_modification.get_fractionc                 C   s:   |  d}|r| d}t|  }|t|fS d S )Nznormal-typez
normal-dotr@   r=   r   rS  r   r   rM   )r   tuplet_typerW  rT  r   r   r   get_normal_type     


z!Time_modification.get_normal_typeN)rQ   r_   r`   r  r  r   r   r   r   r    s    r  c                   @   ra   )
Accidentalc                 C   s   t |  d| _d| _d S NF)rb   r   Z	editorialro  r   r   r   r   r        

zAccidental.__init__Nrf   r   r   r   r   r    r   r  c                   @   r   )r  c                 C   s:   | d}|r|d}t|  }|t|fS d S )Nztuplet-typez
tuplet-dotr  )r   tuplet_noter  rW  rT  r   r   r   duration_info_from_tuplet_note  r  z%Tuplet.duration_info_from_tuplet_notec                 C      |  d}|r| |S d S Nztuplet-normalr@   r  r   tupletr   r   r   r       

zTuplet.get_normal_typec                 C   r  Nztuplet-actualr  r  r   r   r   get_actual_type  r  zTuplet.get_actual_typec                 C   s"   |r| d}|rt| S d S )Nztuplet-numberrX   )r   r  Z	tuplet_nrr   r   r   get_tuplet_note_count   s   zTuplet.get_tuplet_note_countc                 C      |  | dS r  r  r@   r   r   r   r   get_normal_nr(  r  zTuplet.get_normal_nrc                 C   r  r  r  r   r   r   r   get_actual_nr+  r  zTuplet.get_actual_nrN)	rQ   r_   r`   r  r  r  r  r  r  r   r   r   r   r    s    r  c                   @   ra   )Slurc                 C   r   r   r  r   r   r   r   rm   1  r   zSlur.get_typeNrQ   r_   r`   rm   r   r   r   r   r  /  r   r  c                   @   ra   )Tiedc                 C   r   r   r  r   r   r   r   rm   7  r   zTied.get_typeNr  r   r   r   r   r  5  r   r  c                   @   rh   )Beamc                 C   s   |   S r   r   r   r   r   r   rm   <  r  zBeam.get_typec                 C   s   t | dr
| jdkS dS )Nr"  1T)rl   r"  r   r   r   r   
is_primary?  rr   zBeam.is_primaryN)rQ   r_   r`   rm   r  r   r   r   r   r  ;  s    r  c                   @   ra   )Octave_shiftc                 C   rn   )Nro      rp   r   r   r   r   rq   H  rr   zOctave_shift.get_sizeN)rQ   r_   r`   rq   r   r   r   r   r  F  r   r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )rs  c                 C   r  r  )rb   r   _is_whole_measurer   r   r   r   r   S  r8  zRest.__init__c                 C   r   r   )r  r   r   r   r   is_whole_measureW  r   zRest.is_whole_measurec                 C   s"   |  td}|r|  S d S r   )rI   r:   r   r   r   r   r   r   r   Z  s   zRest.get_stepc                 C   r   r   )rI   r:   r   r   rY   )r   r   octr   r   r   r   a  s
   zRest.get_octavec                 C   r   r   r   r   r   r   r   r   i  r   zRest.to_lily_objectN)rQ   r_   r`   r   r  r   r   r   r   r   r   r   rs  Q  s    rs  c                   @   ra   )Bendc                 C   s   |  d}t|S )Nz
bend-alter)r@   r   r   )r   r   r   r   r   
bend_alterw  r8  zBend.bend_alterN)rQ   r_   r`   r  r   r   r   r   r  u  r   r  c                   @   r   )

ChordPitchc                 C   rY  )Nz	root-stepr   r   r   r   r   step_class_name~  r[  zChordPitch.step_class_namec                 C   rY  )Nz
root-alterr   r   r   r   r   alter_class_name  r[  zChordPitch.alter_class_namec                 C   s   |  t|  }|  S r   )rW   r:   r  r   r   r   r   r   r   r     s   zChordPitch.get_stepc                 C   s   |  t|  }t|S r   )rI   r:   r  r   r   r   r   r   r   r     s   

zChordPitch.get_alterationN)rQ   r_   r`   r  r  r   r   r   r   r   r   r  |  s
    r  c                   @   rh   )Bassc                 C   rY  )Nz	bass-stepr   r   r   r   r   r    r[  zBass.step_class_namec                 C   rY  )Nz
bass-alterr   r   r   r   r   r    r[  zBass.alter_class_nameN)rQ   r_   r`   r  r  r   r   r   r   r    s    r  c                   @   r~   )ChordModificationc                 C   s*   |  td}dddd|  dS )Nzdegree-typerL   r	  )addr   subtractr   )rI   r:   r  r   r   r   r   r   r   rm     s   zChordModification.get_typec                 C   s*   |  td}d}|rt|  }|S )Nzdegree-valuer   )rI   r:   rY   r   r   )r   r   r<  r   r   r   	get_value  s
   zChordModification.get_valuec                 C   r   )Nzdegree-alterr   r   r   r   r   	get_alter  r   zChordModification.get_alterN)rQ   r_   r`   rm   r  r  r   r   r   r   r    s    r  c                   @   r~   )Framec                 C      |  ddS )Nzframe-fretsr   r\   r   r   r   r   	get_frets  r  zFrame.get_fretsc                 C   r  )Nzframe-strings   r  r   r   r   r   get_strings  r  zFrame.get_stringsc                 C   r  )Nz
first-fretrL   r  r   r   r   r   get_first_fret  r  zFrame.get_first_fretN)rQ   r_   r`   r  r  r  r   r   r   r   r    s    r  c                   @   r   )

Frame_Notec                 C   r  )NstringrL   r  r   r   r   r   
get_string  r  zFrame_Note.get_stringc                 C   r  )NZfretr   r  r   r   r   r   get_fret  r  zFrame_Note.get_fretc                 C   r  )NZ	fingeringr	  r  r   r   r   r   get_fingering  r  zFrame_Note.get_fingeringc                 C   s   |  d}|rt|ddS dS )NZbarrerk   r   )r@   r   r   r[   r   r   r   	get_barre  r]   zFrame_Note.get_barreN)rQ   r_   r`   r  r  r  r  r   r   r   r   r    s
    r  c                   @   r   )
Musicxml_voicec                 C   s"   g | _ i | _d | _g | _d| _d S r  )	_elements_staves_start_staff_lyrics_has_lyricsr   r   r   r   r     s
   
zMusicxml_voice.__init__c                 C   s   | j | t|tr'|tr'|t }| js"|ts"|| _d| j	|< |
t}| js6t|dk| _|D ]}| }|d urM|| jvrM| j| q8d S )NTr   )r  r   r.   rJ  rI   Staffr   r  rP  r  r   r  r  rM   Z
has_lyricsr  r  )r   r   rK   Zlyricsr  r&  r   r   r   add_element  s"   


zMusicxml_voice.add_elementc                 C   s   | j || d S r   )r  insert)r   idxr   r   r   r   r    s   zMusicxml_voice.insertc                 C   s    t | jdkr| jrdgS | jS )Nr   r  )rM   r  r  r   r   r   r   get_lyrics_numbers  s   z!Musicxml_voice.get_lyrics_numbersN)rQ   r_   r`   r   r  r  r  r   r   r   r   r    s
    r  c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )Partc                 C   s   t |  i | _i | _d S r   )rb   r   _voices_staff_attributes_dictr   r   r   r   r     r  zPart.__init__c                 C   s4   | }|r|  dkr|j}|r|  dks
|dS )Nzscore-partwise	part-list)r   r	   rA   r  r   r   r   get_part_list  s
   
zPart.get_part_listc                 C   s$   |D ]}|j |_|j|_d|_qd S )NT)
_prev_when_when_prev_measure_position_measure_positionrL  )r   pending_gracesrQ  r   r   r   graces_to_aftergraces  s
   zPart.graces_to_aftergracesc                 C   s  	 |   }td}td}i }d}| t}td}td}td}	|}
d}d}g }|D ]}| sj|rd|rd|jdkrd| }|
| }||krbd}||krPd}|dkrb|rb|d|||| f  |}|}
td}	d}g }| D ]N}|	 d	kr}d}t
|tr| r| }|D ]}||_qg }n|r||_n|| t
|tr|j|_||_|	|_qrt
|trqrtd}|jtkr|| |  |j }|}d
|v rt|d
  nd}td|}|tr#|t}| | }|	 d	kr| }|  | g }|t!rtd}|t"}|r#|r#| |kr#d|_#|tdkr4|t$r4|}|}	||_|	|_t
|t%rK|& rK||_'||_(t
|t%r]|) r]||_||_nt
|t%rn|& rn|| n	|tdkrwg }||_*|tdkr|}|	}||7 }|	|7 }	n|tdk r||7 }|	|7 }	|	dk r||	8 }d}	|}|	}|j+dkr|,d}|r|-|j.|_/qr|  | g }|rd}|r| r| }|
| }||kr||_|}q,dS )z"Set durations and starting points.r   rL   Nr	  TZ
incompleteZoverfullz(%s measure? Expected: %s, Difference: %sZbackup	divisionsr  
instrumentF)0r  r   r   r~  r  r7  r  r-   rH   r   r.   rs   ry   re   r   FiguredBassdenominatorZ
_divisionsr  r  r/   r   r|   r  r  r   copyrY   r   rI   r   r   r  rP  rs  r  ChordrJ  rO  r  r  rR  rM  r   r@   r}  rz  rK  )r   Z	part_listZnowrj  Zattributes_dictZattributes_objectmeasuresZlast_momentZlast_measure_positionZmeasure_positionZmeasure_start_momentZis_first_measureZprevious_measurer  r   ZlengthZnew_nowZproblemre   Zassign_to_next_voicer[   r   r   r  Zmxl_durru  r  Zmeasure_endr   r   r   	interpret  s   

















 zPart.interpretc                 C   sr   t  |}g |_|j  |_||_|dkrd}|jD ]}t|dr&|j|kr1t|ts1|j| q|js7d S |S )NNoner  r"  )	r  r   r   r   rl   r"  r.   r/   r   )partattrstaff
attributesr   r   r   r   extract_attributes_for_staff  s   

z!Part.extract_attributes_for_staffc                 C   s  d }t  }| t}g }|D ]}|jdkr|t|j ||  qi }|D ]Q}|d}d }	|r9|	 }	nt
|trH|drF|}	nd}	|	d urN|	}|d}
d }|
r\|
	 }nd}|	ri|	|vrit ||	< |	rz|rz|tsz|	|vrz|||	< q)i }t| D ]\}}||vr|g||< q|| | qd }g }d }|D ]}|td}|r|	 }n|tdr|}nd}|dkr|}t
|tst
|tst
|tst
|tst
|tst
|tst
|tst
|tsqt
|tr|s|}qt
|trt| D ]\}}| ||}|r|D ]
}|| | qqqt
|ts1t
|ts1t
|trCt| D ]
}|| | q7qt
|tr\|jrV||j | n|| qt
|tsht
|trn|| qt|dr}t|ddkr}q|D ]
}|| | qg }|| | q|D ]
}|| | qg }|rt| D ]+\}}| ||}|  || j|< |D ]}||  d| || j!d   qq|| _"d S )	Nr   rv   chordr  r  r  zprint-objectZno)#r   r   r~  r7  r   r6  extendrH   r@   r   r.   rJ  r  rI   rP  r)   r*   r:   r|   	Directionr)  Harmonyr  Printr  r  keysre   rl   r   r  r  r  r  r  )r  Z
last_voiceZvoicesr  elementsr   Zvoice_to_staff_dictr[   re   ZvidZstaff_idZsidZstaff_to_voice_dictr   r   Z
start_attrZassign_to_next_noterz  ZvidsZstaff_attributesr   r   r   r   extract_voices  s   









$



zPart.extract_voicesc                 C   r   r   )r  r   r   r   r   
get_voicesI  r   zPart.get_voicesc                 C   r   r   )r  r   r   r   r   get_staff_attributesL  r   zPart.get_staff_attributesN)rQ   r_   r`   r   r  r  r  r  r   r  r  r   r   r   r   r    s     * r  c                   @      e Zd ZdS )BarStyleNrQ   r_   r`   r   r   r   r   r  P      r  c                   @   r  )r  Nr  r   r   r   r   r  T  r  r  c                   @   r  )BeatUnitNr  r   r   r   r   r  X  r  r  c                   @   r  )BeatUnitDotNr  r   r   r   r   r  \  r  r  c                   @   r  )r  Nr  r   r   r   r   r  `  r  r  c                   @   r  )BracketNr  r   r   r   r   r	  d  r  r	  c                   @   r  )r  Nr  r   r   r   r   r  h  r  r  c                   @   r  )DashesNr  r   r   r   r   r
  l  r  r
  c                   @   r  )DirTypeNr  r   r   r   r   r  p  r  r  c                   @   r  r  Nr  r   r   r   r   r  t  r  r  c                   @   r  )rV  Nr  r   r   r   r   rV  x  r  rV  c                   @   r  )ElisionNr  r   r   r   r   r  |  r  r  c                   @   r  )ExtendNr  r   r   r   r   r    r  r  c                   @   r  )r  Nr  r   r   r   r   r    r  r  c                   @   r  )	GlissandoNr  r   r   r   r   r    r  r  c                   @   r  )rP  Nr  r   r   r   r   rP    r  rP  c                   @   r  )r  Nr  r   r   r   r   r    r  r  c                   @   r  )Hash_commentNr  r   r   r   r   r    r  r  c                   @   r  )r$  Nr  r   r   r   r   r$    r  r$  c                   @   r  r  r  r   r   r   r   r    r  c                   @   r  )r%  Nr  r   r   r   r   r%    r  r%  c                   @   r  )r#  Nr  r   r   r   r   r#    r  r#  c                   @   r  )
Part_groupNr  r   r   r   r   r    r  r  c                   @   r  )PedalNr  r   r   r   r   r    r  r  c                   @   r  )	PerMinuteNr  r   r   r   r   r    r  r  c                   @   r  )r  Nr  r   r   r   r   r    r  r  c                   @   r  )RootNr  r   r   r   r   r    r  r  c                   @   r  )
Score_partNr  r   r   r   r   r    r  r  c                   @   r  )SlideNr  r   r   r   r   r    r  r  c                   @   r  )r  Nr  r   r   r   r   r    r  r  c                   @   r  )TextNr  r   r   r   r   r    r  r  c                   @   r  )TypeNr  r   r   r   r   r    r  r  c                   @   r  )	Wavy_lineNr  r   r   r   r   r    r  r  c                   @   r  )WedgeNr  r   r   r   r   r    r  r  c                   @   r  )WordsNr  r   r   r   r   r    r  r  z#commentz#textrm  r  Zbarliner*  ZbassZbeamr  z	beat-typez	beat-unitzbeat-unit-dotZbendZbracketr  ZcreditZdashesZdegreedotr-  zdirection-typerc   Zelisionr  framez
frame-notezfigured-bassZ	glissandorN  ZharmonyZidentificationz	key-alterz
key-octavezkey-stepZlyricZmeasureZ	notationsr  r`  zoctave-shiftr  z
part-groupr  Zpedalz
per-minuter]  printru  rootry  Zslide)ZslurZsoundr  re  Zsyllabicr   ztime-modificationr  r  rk   rq  z	wavy-lineZwedger   Zworkc                 C   s<   |  dd} |  dd} | d  | dd    } t| S )N-rP   #Zhash_r   rL   )replaceupperlowerstr)rK   r   r   r   name2class_name%  s   r&  c                 C   s4   t | }|r	|S t| }t|tfi }|t | < |S r   )
class_dictr  r&  rk   rb   )rK   Z	classname
class_namer5   r   r   r   r:   -  s   
r:   c                 C   s   | j }|d u s| jjdkrd S t|}| }| |_||_| j|_dd |  D |_	dd |j	D |_	|j	D ]}||_
q6t|  D ]\}}||j|< ||j|< qB|S )NZ_Commentc                 S   r  r   )lxml_demarshal_noder   rS   r   r   r   r    D  r!   z'lxml_demarshal_node.<locals>.<listcomp>c                 S   s   g | ]}|r|qS r   r   )r   r   r   r   r   r    E  r!   )r   r   rQ   r:   r   r   r   r   Zgetchildrenr   r	   r)   r*   rU   r
   )noderK   r5   py_noder   kr   r   r   r   r)  8  s    

r)  c                 C   s   | j }t|}| }||_dd | jD |_|jD ]}||_q| jr8t| j D ]\}}||j	|< ||j
|< q)d |_| j| jkrH| jrH| j|_| |_|S )Nc                 S   r  r   )minidom_demarshal_noder*  r   r   r   r    W  r!   z*minidom_demarshal_node.<locals>.<listcomp>)ZnodeNamer:   r   Z
childNodesr   r	   r  r)   r*   rU   r
   r   ZnodeTypeZ	TEXT_NODEdatar   )r+  rK   r5   r,  r   r<   r<  r   r   r   r.  Q  s    

r.  __main__zbeethoven.xmlr0   )icollectionsr   r  Z	fractionsr   rC  sysrN   Zlilylibr'   r   r   r   objectr   rb   ri   rs   r   r   r   r   r/   r   r   r|   r)  r6  r9  rB  rJ  rw  r~  r  r  r  r  r  r  r  r  r  r  r  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r
  r  r  rV  r  r  r  r  rP  r  r  r$  r%  r#  r  r  r  r  r  r  r  r  r  r  r  r  r  r'  r&  r:   r)  r.  rQ   Z
lxml.etreeZlxmlZetreeparseZtreeZgetrootZmxl_treesortedr  Zksr  r"   r   r   r   r   <module>   s  e	dd	 41 *$	'  c	
 !"#$%&'()*+,-./01234F
