o
    fU                    @   sl  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	da
dadadadd ZG dd dZG d	d
 d
eZG 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d  Zd!d" Zd#d$ Zd%d& Zd'd( Z d)d* Z!d+d, Z"d-d. Z#d/d0 Z$d1d2 Z%d3d4 Z&d5d6 Z'd7d8 Z(d9d: Z)d;d< Z*ea+G d=d> d>Z,G d?d@ d@Z-G dAdB dBe-Z.G dCdD dDe.Z/G dEdF dFe.Z0G dGdH dHe.Z1G dIdJ dJe-Z2G dKdL dLe2Z3G dMdN dNZ4G dOdP dPZ5G dQdR dRZ6G dSdT dTZ7G dUdV dVZ8G dWdX dXe2Z9G dYdZ dZe-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=ZAG didj dje=ZBG dkdl dle=ZCG dmdn dne=ZDG dodp dpe=ZEG dqdr dre=ZFG dsdt dte=ZGG dudv dve<ZHG dwdx dxe<ZIG dydz dze=ZJG d{d| d|e<ZKG d}d~ d~e<ZLG dd deLZMG dd de<ZNG dd de<ZOG dd deOZPG dd deOZQG dd dePZRG dd deRZSG dd de-ZTG dd de2ZUG dd de<ZVG dd deVZWG dd de<ZXG dd de<ZYG dd de<ZZG dd dZ[G dd dZ\G dd de<Z]G dd deOZ^G dd deOZ_G dd de<Z`G dd de`ZaG dd de`ZbG dd de`ZcG dd de-ZdG dd de.ZeG dd de-ZfG dd de-ZgG dd de-ZhG dd de-ZiG dd de-ZjG dd de-ZkG dd de-ZlG dd de-ZmG dd de2ZnG ddĄ de-ZoG ddƄ de-ZpG ddȄ dȃZqG ddʄ deqZrG dd̄ derZsG dd΄ derZtG ddЄ derZuG dd҄ d҃ZvddԄ Zwddք Zxdd؄ Zyezdkr4ex  ew  ey Z{e{|ed  e{}e  ed dڃZ~eddۃZe~efdd݄Zee{e dS dS )    FractionNF c                 C   sf   |  dd}td|r+td}||}d}|D ]
}|d| d 7 }q|d7 }|S d| d }|S )	N"z\"z	.*[
]+.*z[\n\r]+z\markup { \center-column { z\line {"z"} z} })replacerematchcompilesplit)Zinput_stringZ	retstringZrxstringss r   ]/home/lily/lilypond-2.24.4/release/binaries/mingw/lilypond/lilypond-2.24.4/python/musicexp.pyescape_instrument_string(   s   

r   c                   @      e Zd Zdd Zdd ZdS )Output_stack_elementc                 C   s   t d| _d S )N   )r   factorselfr   r   r   __init__7      zOutput_stack_element.__init__c                 C   s   t  }| j|_|S N)r   r   )r   or   r   r   copy:   s   zOutput_stack_element.copyN)__name__
__module____qualname__r   r   r   r   r   r   r   6   s    r   c                   @   s   e Zd 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d Zd d! Zd"d# Zd$S )%Output_printerzf
    A class that takes care of formatting (eg.: indenting) a
    Music expression as a .ly file.
    c                 C   s:   d| _ d| _d| _tj| _d| _t g| _d| _	d | _
d S )Nr      r   H   F)_line_indent_nestingsysstdout_file	_line_lenr   _output_state_stack
_skipspace_last_durationr   r   r   r   r   F   s   

zOutput_printer.__init__c                 C   
   || _ d S r   )r&   )r   filer   r   r   set_fileP      
zOutput_printer.set_filec                 C   s   |  d| d  |   d S )Nz
\version "r   )print_verbatimnewline)r   versionr   r   r   dump_versionS   s   zOutput_printer.dump_versionc                 C   s   | j | j S r   )r#   r"   r   r   r   r   
get_indentW      zOutput_printer.get_indentc                 C   s   | j d }| j |  d S N)r(   appendr   )r   Zlastr   r   r   overrideZ   s   
zOutput_printer.overridec                 C   s    |    | jd  j|9  _d S r5   )r8   r(   r   )r   r   r   r   r   
add_factor^   s   zOutput_printer.add_factorc                 C   s   | j d= | j stdd S )Nr6   zempty stack)r(   RuntimeErrorr   r   r   r   revertb   s   zOutput_printer.revertc                 C   s   | j d jS r5   )r(   r   r   r   r   r   duration_factorg   r4   zOutput_printer.duration_factorc                 C   s   |  j |7  _ d S r   )r!   r   r   r   r   r   r/   j      zOutput_printer.print_verbatimc                 C   s   |  j |d|d |d |d 7  _ |  j |d|d |d |d |d	 |d
 |d 8  _ | | d S )N<\<<<{>\>>>z->z_>z^>})r#   countr/   r=   r   r   r   unformatted_outputm   s"   "z!Output_printer.unformatted_outputc                 C   s   | j |krd S | | d S r   )r*   rH   r=   r   r   r   print_duration_stringx   s   
z$Output_printer.print_duration_stringc                 C   sR   t |d t | j | jkr|   d| _| js|  jd7  _| | d| _d S )Nr   T F)lenr!   r'   r0   r)   rH   r=   r   r   r   add_word   s   

zOutput_printer.add_wordc                 C   s.   | j | jd  d| j | j | _d| _d S )N
rJ   T)r&   writer!   r"   r#   r)   r   r   r   r   r0      s   
zOutput_printer.newlinec                 C   s
   d| _ d S NT)r)   r   r   r   r   	skipspace   r.   zOutput_printer.skipspacec                 C   s   |  | d S r   )dump)r   argr   r   r   __call__   r   zOutput_printer.__call__c                 C   s<   | j rd| _ | | d S t|}|D ]}| | qd S NF)r)   rH   	utilitiesZ1split_string_and_preserve_doublequoted_substringsrL   )r   r   Zwordswr   r   r   rQ      s   zOutput_printer.dumpc                 C   s   |    | j  d | _d S r   )r0   r&   closer   r   r   r   rW      s   

zOutput_printer.closeN)r   r   r   __doc__r   r-   r2   r3   r8   r9   r;   r<   r/   rH   rI   rL   r0   rP   rS   rQ   rW   r   r   r   r   r   @   s&    

r   c                   @   sF   e Z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S )Durationc                 C   s   d| _ d| _td| _d S Nr   r   )duration_logdotsr   r   r   r   r   r   r      s   zDuration.__init__c                 C   s   d| j | j| jj| jjf S )Nz(ly:make-duration %d %d %d %d))r[   r\   r   	numeratordenominatorr   r   r   r   lisp_expression   s
   zDuration.lisp_expressionNFc                 C   s   |s| j }| jdk r|rddd}nddd}|| jd}ndd	| j>  }|d
| j 7 }|td	d	krK|jd	krD|d|j|jf 7 }n|d|j 7 }| rSt|a	|S )Nr   ZbreveZlonga)r6   z\brevez\longa1z%dr   .z*%d/%dz*%d)
r   r[   getr\   r   r^   r]   isdigitintly_dur)r   r   Zscheme_modeZlonger_dictdur_strr   r   r   ly_expression   s    


zDuration.ly_expressionc                 C   s"   |  | j|  }|| d S r   )rh   r   r<   rI   )r   	outputterrg   r   r   r   print_ly   s   zDuration.print_lyc                 C      |   S r   rh   r   r   r   r   __repr__      zDuration.__repr__c                 C   s"   t  }| j|_| j|_| j|_|S r   )rY   r\   r[   r   )r   dr   r   r   r      s
   zDuration.copyc                 C   s\   t dd| j > d d| j> }t| j}d|> }| jdk r"t |}nt d|}|| | j S Nr   r   )r   r\   absr[   r   )r   Zdot_factlogdurbaser   r   r   
get_length   s   



zDuration.get_lengthrT   )
r   r   r   r   r_   rh   rj   rm   r   ru   r   r   r   r   rY      s    
rY   c                 C   s   | a dS )z
    Implement the midi command line option '-m' and '--midi'.
    If True, add midi-block to .ly file (see L{musicexp.Score.print_ly}).

    @param option: Indicates whether the midi-block has to be added or not.
    @type option: boolean
    N)midi_optionZoptionr   r   r   set_create_midi   s   	rx   c                   C   s   zt W S  ty   Y dS w )zy
    Return, if exists the state of the midi-option.

    @return: The state of the midi-option.
    @rtype: boolean
    F)rv   	NameErrorr   r   r   r   get_create_midi   s
   rz   c                 C      | a d S r   )transpose_optionrw   r   r   r   set_transpose     r}   c                 C   sd   z| dkr
dt  W S | dkrtt }| W S W d S  ty1   | dkr'Y dS | dkr.Y dS Y d S w )Nstringz\transpose c %sintegerr   r   )r|   generic_tone_to_pitch	semitones	Exception)ZoptTypepr   r   r   get_transpose  s   

r   c                 C   r{   r   )tab_clef_optionrw   r   r   r   set_tab_clef   r~   r   c                   C   0   zdt ft dkpt dk W S  ty   Y dS w )NZtabZ	moderntab)r   ry   r   r   r   r   get_tab_clef%  
   r   c                 C   r{   r   )string_numbers_optionrw   r   r   r   set_string_numbers.  r~   r   c                   C   r   )Ntf)r   ry   r   r   r   r   get_string_numbers3  r   r   c                 C   s   dddddddd}t  }|   }|d|d |_|dd	dd	}t|d td
 d d |_||dd  d|_	|S )Nr   r6   r`   r      )r   esr   ZesesZsesisZisis',r   a      )
PitchstriplowerrG   octaver   ordsteprc   
alteration)ZtoneZaccidentals_dictr   Ztone_r   r   r   r   :  s   	r   c                 C   s   || j  }t| j}|dk r||d |  7 }n| jdkr%||d | 7 }|| jkr`d |dd v r;ttd |S z||d |d d| j|  7 }W |S  ty_   ttd Y |S w |S )Nr      r   z;Language does not support microtones contained in the piecer   )            ?)r   re   r   lywarning_KeyError)pitchZ	notenamesZaccidentalsr   Z	halftonesr   r   r   pitch_genericO  s0   



	r   c                 C   s4   t | g dg d}d|v r|S |ddddS )Ncro   er   gr   br   ehihr   haesaseesr   r   r   r   r   r   r   r   pitch_generale     r   c                 C      t | S r   )r   )r   r   r   r   pitch_nederlandsm  rn   r   c                 C   s8   t | g dg d}|ddddddddS )	Ndor   mifasollasi)r   ZqbZqdro   ZbqtqZdqZbtr   Zdtr   r   r   r   r   pitch_catalanq     $r   c                 C   sL   t | g dg d}|dkrdS |d dkr |ddddS |d	dS )
Nr   ro   r   r   r   r   r   r   hesr   r   r   r   ZaaZeer   r   r   r   r   pitch_deutschw  s   r   c                 C   s8   t | g dg d}|d |dd  dddd S )Nr   )r   ZqfZqsr   r   r   Zfqr   Zsqr   r   r   r   r   pitch_english  r   r   c                 C   s(   t | g dg d}|ddddS )Nr   )r   cbZcsr   ZbcZtcZscr   r   r   r   r   pitch_espanol     r   c                 C      t | g dg d}|S )N)r   u   rér   r   r   r   r   r   ZsbZsdro   r   r   r   r   r   pitch_francais     r   c                 C   r   )Nr   r   r   r   r   r   r   pitch_italiano  r   r   c                 C   s    t | g dg d}|ddS )Nr   Zessr   r   Zisshessr   r   r   r   r   r   pitch_norsk  s   r   c                 C   s(   t | g dg d}|ddddS )Nr   )r   ZbqtZsqtr   ZbbqZbtqZssqZstqr   r   r   r   r   pitch_portugues  r   r   c                 C   4   t | g dg d}|dkrdS |ddddS )	Nr   r   r   r   r   r   r   r   r   r   r   r   r   pitch_suomi  r   r   c                 C   r   )	Nr   r   r   r   r   r   r   r   r   r   r   r   r   pitch_svenska  r   r   c                 C   r   )Nr   )r   ZhbZhkkr   r   r   r   r   pitch_vlaams  r   r   c                 C   s.   t ttttttttt	t
td}|| tad S )N)Z
nederlandsu   catalàZdeutschZenglishu   españolu	   françaisZitalianoZnorsku
   portuguêsZsuomiZsvenskaZvlaams)r   r   r   r   r   r   r   r   r   r   r   r   rc   r   pitch_generating_function)ZlanguageZfunction_dictr   r   r   set_pitch_language  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d ZdS ) r   c                 C   s   d| _ d| _d| _d| _d S Nr   F)r   r   r   _force_absolute_pitchr   r   r   r   r        
zPitch.__init__c                 C   rk   r   rl   r   r   r   r   rm     rn   zPitch.__repr__c                 C   sj   |   }| j|j7  _| j|j7  _| j|j7  _|  |  |  }| j||  7  _|S r   )r   r   r   r   	normalizer   )r   Zintervalr   Z	target_str   r   r   
transposed  s   zPitch.transposedc                 C   sT   | j dk r|  j d7  _ |  jd8  _| j dk s|  j| j d 7  _| j d | _ d S )Nr   r   r   r   r   r   r   r   r   r     s   

zPitch.normalizec                 C   s   d| j | j| jf S )Nz(ly:make-pitch %d %d %d)r   r   r   r   r   r   r   r_     s   zPitch.lisp_expressionc                 C   s*   t  }| j|_| j|_| j|_| j|_|S r   )r   r   r   r   r   )r   r   r   r   r   r     s   z
Pitch.copyc                 C   s   | j | jd  S )Nr   r   r   r   r   r   steps     zPitch.stepsc                 C   s   | j d g d| j  | j S )N   )r   r   r   r   r   	      r   r   r   r   r   r     s   zPitch.semitonesc                 C   sv   | j dk rg d| j r|  j d7  _ |  jd8  _n| j dkr5g d| j r5|  j d8  _ |  jd7  _|   d S )Nr   )TFFTFFFr   )FFTFFFT)r   r   r   r   r   r   r   normalize_alteration   s   zPitch.normalize_alterationc                 C   s   || j  }d| _ |dkrd S d|dk  }|  }t|| |   dkr;|  j|7  _|   t|| |   dks$|  j || |   7  _ |   d S )Nr   r   r6   r   )r   r   rq   r   r   r   )r   numberZsemiZsignprevr   r   r   add_semitones	  s   
zPitch.add_semitonesc                 C   r   r   r   r   r   r   r   ly_step_expression  rn   zPitch.ly_step_expressionc                 C   s6   | j dkrd| j d  S | j dk rd| j  d  S dS )Nr   r   r   r6   r   r   )r   r   r   r   r   absolute_pitch  s
   

zPitch.absolute_pitchc                 C   sr   t s| a |  S t jd t j }| jd | j }|| }| a |dkr*d|d d  S |dk r7d| d d  S dS )Nr   r   r   r   r   )previous_pitchr   r   r   )r   Zprevious_pitch_stepsZthis_pitch_stepsZ
pitch_diffr   r   r   relative_pitch!  s   zPitch.relative_pitchc                 C   s2   |   }tr| js||  7 }|S ||  7 }|S r   )r   relative_pitchesr   r   r   r=   r   r   r   rh   1  s   
zPitch.ly_expressionc                 C      ||    d S r   rl   )r   ri   r   r   r   rj   9  r   zPitch.print_lyN)r   r   r   r   rm   r   r   r_   r   r   r   r   r   r   r   r   rh   rj   r   r   r   r   r     s     	r   c                   @   sn   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dZdd Zdd ZdS )Musicc                 C   s    d | _ td| _d| _d | _d S )Nr   r   )parentr   startcomment
identifierr   r   r   r   r   >  s   

zMusic.__init__c                 C   s   t dS Nr   r   r   r   r   r   ru   D  rn   zMusic.get_lengthc                 C      dS Nr   r   r   r   r   r   get_propertiesG     zMusic.get_propertiesc                 C   r   rT   r   r   r   r   r   has_childrenJ  r   zMusic.has_childrenc                 C   s   | j r
| j j| S d S r   )r   elementsindexr   r   r   r   	get_indexM  s   zMusic.get_indexc                 C   s   | j jS r   )	__class__r   r   r   r   r   nameS  rn   z
Music.namec                 C   s   |   }|  }d||f S Nz(make-music '%s %s))r  r   )r   r  propsr   r   r   r_   V  s   zMusic.lisp_expressionc                 C   r+   r   )r   )r   r   r   r   r   	set_start]  r.   zMusic.set_startc                 C   s   || r| S d S r   r   r   	predicater   r   r   
find_first`  s   zMusic.find_firstNc                 C   sX   |s| j }|s	d S |dkr|  d S |d}|D ]}|r%|d|  |  qd S )NrM   % )r   r0   r
   rH   )r   printertextlineslr   r   r   print_commente  s   

zMusic.print_commentc                 C   s&   | j r|d| j   d S | | d S N\%s)r   rj   r   r  r   r   r   print_with_identifierv  s   zMusic.print_with_identifierc                 C   r   r   rl   r  r   r   r   rj   |  r   zMusic.print_lyr   )r   r   r   r   ru   r   r   r  r  r_   r  r  r  r  rj   r   r   r   r   r   =  s    
r   c                   @   r   )MusicWrapperc                 C      t |  d | _d S r   )r   r   elementr   r   r   r   r        

zMusicWrapper.__init__c                 C      | j | d S r   )r  rj   r   funcr   r   r   rj     r   zMusicWrapper.print_lyNr   r   r   r   rj   r   r   r   r   r        r  c                   @   r   )ModeChangingMusicWrapperc                 C      t |  d| _d S )NZnotemode)r  r   moder   r   r   r   r     r  z!ModeChangingMusicWrapper.__init__c                 C   s   |d| j   t| | d S r  )r!  r  rj   r  r   r   r   rj     s   z!ModeChangingMusicWrapper.print_lyNr  r   r   r   r   r    r  r  c                   @   r   )RelativeMusicc                 C   r  r   )r  r   	basepitchr   r   r   r   r     r  zRelativeMusic.__init__c                 C   sD   t }da | jatst a|dttt f  t| | |a d S )NTz\relative %s%s)r   r#  r   r   r   r   r  rj   )r   r  Zprev_relative_pitchesr   r   r   rj     s   
zRelativeMusic.print_lyNr  r   r   r   r   r"    r  r"  c                   @   r   )TimeScaledMusicc                 C   sD   t |  d| _d| _d| _d | _d| _d | _d | _d | _	d | _
d S )Nr   actualbracket)r  r   r]   r^   display_numberdisplay_typedisplay_bracketactual_typenormal_typedisplay_numeratordisplay_denominatorr   r   r   r   r     s   

zTimeScaledMusic.__init__c                 C   s  | j d u r|d |  n| j dkr"ttd |d |  dddd| jd }| jd	kr;| jr;d
| j }n#| jdkr^| jsF| jr^| jrM| j}nd}| jrV| j}nd}d||f }| j	d	krx| j
rx| j
 }|d||f  |  ni| j	dkr| jd u r|d |  nV| jdkr| j
 }| jr| j }n|}| js| jr|d| j|| j|f  |  n*|d||f  |  n| jd u r|d |  n| jdkr|d|  |  |d| j| jf  |t| j| j t| | |  d S )Nz\once \omit TupletBracketZcurvedz=Tuplet brackets of curved shape are not correctly implementedz7\once \override TupletBracket.stencil = #ly:slur::printz#fz$tuplet-number::calc-denominator-textz!tuplet-number::calc-fraction-text)Nr%  bothr%  z7(tuplet-number::non-default-tuplet-denominator-text %s)r.  z7(tuplet-number::non-default-tuplet-fraction-text %s %s)zO\once \override TupletNumber.text = #(tuplet-number::append-note-wrapper %s %s)z\once \omit TupletNumberza\once \override TupletNumber.text = #(tuplet-number::non-default-fraction-with-notes %s %s %s %s)zO\once \override TupletNumber.text = #(tuplet-number::fraction-with-notes %s %s)z'\once \override TupletNumber.text = #%sz\times %d/%d )r)  r0   r   r   r   rc   r'  r-  r,  r(  r+  r_   r*  r]   r^   r9   r   r  rj   r;   )r   r  Zbase_number_functionZnumZdenZbase_durationZden_durationZnum_durationr   r   r   rj     s   















zTimeScaledMusic.print_lyNr  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d Z	dd Z
dd Zdd ZdS )NestedMusicc                 C   s   t |  g | _d S r   )r   r   r  r   r   r   r   r     r  zNestedMusic.__init__c                 C      |r
| j | d S d S r   )r  r7   )r   Zwhatr   r   r   r7        zNestedMusic.appendc                 C   s   | j S r   r  r   r   r   r   r     s   zNestedMusic.has_childrenc                 C   s   |j d u sJ |d u s|| jv sJ d}|r%| j|}|dkr$|d7 }n|dk r,d}n	|dkr5t| j}| j|| | |_ d S rZ   )r   r  r  rK   insert)r   Zsucceltdiridxr   r   r   insert_around  s   

zNestedMusic.insert_aroundc                 C   s   dd dd | jD  S )N'elements (list %s)rJ   c                 S      g | ]}|  qS r   r_   .0xr   r   r   
<listcomp>      z.NestedMusic.get_properties.<locals>.<listcomp>)joinr  r   r   r   r   r     s   zNestedMusic.get_propertiesc                 C   s$   dd dd tt|| jD  S )Nr9  rJ   c                 S   r:  r   r;  r<  r   r   r   r?    r@  z5NestedMusic.get_subset_properties.<locals>.<listcomp>)rA  listfilterr  r	  r   r   r   get_subset_properties  s   z!NestedMusic.get_subset_propertiesc                 C   sJ   |j | ksJ | j|}||7 }t|t| jd }t|d}| j| S rp   )r   r  r  minrK   max)r   musicr6  r7  r   r   r   get_neighbor  s   

zNestedMusic.get_neighborc                 C   s$   || j v sJ | j | d |_d S r   )r  remover   r   r  r   r   r   delete_element(  s   
zNestedMusic.delete_elementc                 C   s    || _ | jD ]}|| qd S r   )r   r  r  r   r   r   r   r   r   r  .  s   
zNestedMusic.set_startc                 C   s:   t | |}|r
|S | jD ]}||}|r|  S qd S r   )r   r  r  )r   r
  rr   r   r   r   r  3  s   

zNestedMusic.find_firstN)r   r   r   r   r7   r   r8  r   rD  rH  rK  r  r  r   r   r   r   r0    s    	r0  c                   @   s.   e Zd Zdd ZdddZdd Zdd	 Zd
S )SequentialMusicc                 C   s   d }t | jd }|dkr5t| j| ts5t| j| ts5|d8 }|dkr5t| j| ts5t| j| tr|dkrFt| j| trF| j| }|S rp   )rK   r  
isinstance
ChordEventBarLine)r   valueZatr   r   r   get_last_event_chord@  s    
z$SequentialMusic.get_last_event_chordTc                 C   sV   |d | j r| | |r|  | jD ]}|| q|d |r)|  d S d S )NrB   rF   )r   r  r0   r  rj   )r   r  r0   r   r   r   r   rj   L  s   

zSequentialMusic.print_lyc                 C   s   |   }| |}d||f S r  )r  rD  )r   Zpredr  r  r   r   r   lisp_sub_expressionZ  s   
z#SequentialMusic.lisp_sub_expressionc                 C   s&   | j D ]}|| || 7 }qd S r   )r  r  ru   rL  r   r   r   r  a  s   

zSequentialMusic.set_startN)T)r   r   r   rS  rj   rT  r  r   r   r   r   rN  ?  s
    
rN  c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
RepeatedMusicc                 C   s   d| _ d| _g | _d | _d S )NZvoltar   )repeat_typerepeat_countendingsrG  r   r   r   r   r   h  r   zRepeatedMusic.__init__c                 C   sN   t |tr
|| _d S t |trt | _|| j_d S ttd|| d  d S )Nz;unable to set the music %(music)s for the repeat %(repeat)s)rG  repeat)	rO  r   rG  rB  rN  r  r   r   r   r   rG  r   r   r   	set_musicn  s   




zRepeatedMusic.set_musicc                 C   r  r   )rY  r7   r[  r   r   r   
add_endingx  r   zRepeatedMusic.add_endingc                 C   sz   | d| j| jf  | jr| j| nttd | d | jr;| d | jD ]}|| q,| d d S d S )Nz\repeat %s %szencountered repeat without body{}z\alternative {rF   )	rQ   rW  rX  rG  rj   r   r   r   rY  )r   r  r   r   r   r   rj   {  s   


zRepeatedMusic.print_lyN)r   r   r   r   r\  r]  rj   r   r   r   r   rV  g  s
    
rV  c                   @   $   e Zd Zdd Zdd Zdd ZdS )Lyricsc                 C   s
   g | _ d S r   Zlyrics_syllablesr   r   r   r   r     r.   zLyrics.__init__c                 C   s,   | |   |  | d |  d S )NrF   )rQ   rh   r0   r  r   r   r   rj     s   
zLyrics.print_lyc                 C   s   d}| j D ]}||7 }q|S )Nz&\lyricmode {\set ignoreMelismata = ##tra  )r   Zlstrr  r   r   r   rh     s   

zLyrics.ly_expressionNr   r   r   r   rj   rh   r   r   r   r   r`    s    r`  c                   @   rU  )
Headerc                 C   
   i | _ d S r   header_fieldsr   r   r   r   r     r.   zHeader.__init__c                 C   s   || j |< d S r   re  )r   fieldrR  r   r   r   	set_field  r   zHeader.set_fieldc                 C   s   | |d  |dkr;d|v r;|dd}| d |d}|D ]}|  | d| d  q!| d	 |  n| | |  d S )
Nz = ZtexidocrM   r   r   z\markup \column {z	\line { "z"}rF   )rQ   r   r
   r0   )r   keyrR  r  Z
substringsr   r   r   r   format_header_strings  s   




zHeader.format_header_stringsc                 C   sZ   | d |  t| j D ]\}}|r| ||| q| d |  |  d S )Nz	\header {rF   )rQ   r0   rB  rf  itemsrj  )r   r  r   vr   r   r   rj     s   

zHeader.print_lyN)r   r   r   r   rh  rj  rj   r   r   r   r   rc    s
    rc  c                   @   rU  )
Paperc                 C   sX   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _g | _d S )Nr6   r   )global_staff_size
page_widthpage_height
top_marginbottom_marginleft_marginright_marginZsystem_left_marginZsystem_right_marginsystem_distancetop_system_distanceindentshort_indentinstrument_namesr   r   r   r   r     s   
zPaper.__init__c                 C   s*   |dkr| d||f  |  d S d S )Nr   z
%s = %s\cm)rQ   r0   )r   r  rg  rR  r   r   r   print_length_field  s   zPaper.print_length_fieldc                 C   s<   d}| j D ]}|d}|D ]}t|t|kr|}qq|S )Nr   rM   )ry  r
   rK   )r   resultr  r  liner   r   r   get_longest_instrument_name  s   

z!Paper.get_longest_instrument_namec                 C   s$  | j dkr|d| j   |  |d |  |  | |d| j | |d| j | |d| j | |d| j | |d| j | |d	| j	 | |d
| j
 | |d| j t|  d | j }| jdkrx| |d| j|  | jdkr| |d| j|  |d |  d S )Nr   z#(set-global-staff-size %s)z\paper {zpaper-widthzpaper-heightz
top-marginzbottom-marginzleft-marginzright-marginzbetween-system-spacezpage-top-space   rw  zshort-indentrF   )rn  rQ   r0   rz  ro  rp  rq  rr  rs  rt  ru  rv  rK   r}  rw  rx  )r   r  Zchar_per_cmr   r   r   rj     sB   





zPaper.print_lyN)r   r   r   r   rz  r}  rj   r   r   r   r   rm    s
    	rm  c                   @   rU  )
Layoutc                 C   rd  r   context_dictr   r   r   r   r   	  r.   zLayout.__init__c                 C   s   || j vrg | j |< d S d S r   r  )r   contextr   r   r   add_context     
zLayout.add_contextc                 C   s0   |  | || j| vr| j| | d S d S r   )r  r  r7   )r   r  itemr   r   r   set_context_item  s   
zLayout.set_context_itemc                 C   s   t | j rI|d |  t | j D ]&\}}|d|  |  |D ]}|| |  q(|d |  q|d |  d S d S )Nz	\layout {z\context { \%srF   )rB  r  rk  rQ   r0   )r   r  r  Zdefsro   r   r   r   rj     s   





zLayout.print_lyN)r   r   r   r   r  r  rj   r   r   r   r   r    s
    r  c                   @   D   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S )rP  c                 C       t |  d | _d | _d | _d S r   )r0  r   after_grace_elementsgrace_elements
grace_typer   r   r   r   r   &     

zChordEvent.__init__c                 C   &   |r| j s	t | _ | j | d S d S r   )r  rN  r7   rJ  r   r   r   append_grace,  
   zChordEvent.append_gracec                 C   r  r   )r  rN  r7   rJ  r   r   r   append_after_grace2  r  zChordEvent.append_after_gracec                 C   s   dd | j D g kS )Nc                 S   $   g | ]}t |tst |tr|qS r   rO  	NoteEvent	RestEventr=  r   r   r   r   r?  9  
    
z+ChordEvent.has_elements.<locals>.<listcomp>r3  r   r   r   r   has_elements8  s   zChordEvent.has_elementsc                 C   s&   t d}| jD ]	}t|| }q|S r   )r   r  rF  ru   )r   r  r   r   r   r   ru   <  s   
zChordEvent.get_lengthc                 C   s"   dd | j D }|r|d jS d S )Nc                 S   r  r   r  r  r   r   r   r?  C  r  z+ChordEvent.get_duration.<locals>.<listcomp>r   )r  duration)r   note_eventsr   r   r   get_durationB  s   
zChordEvent.get_durationc                 C   s
  dd | j D }dd | j D }dd | j D }| jr|d | jr<| j r<| jr0|d| j  n|d | j|d n'| jrcttd	| j  | jrT|d| j  n|d | j|d |d
 |D ]}t|dsmqe|	| qe|r}|d | nYt
|dkr|d | nK|rg }d }d }|D ] }	|	jr|	jD ]}
t|
tr|
jr|
}q||	  |st}q|r||  |dd|  |a|  }|r|| n	 |D ]}|| q|D ]}t|dsq|| q| jr|d | j|d | | d S )Nc                 S      g | ]	}t |tr|qS r   )rO  r  r  r   r   r   r?  K      
z'ChordEvent.print_ly.<locals>.<listcomp>c                 S   s$   g | ]}t |trt |ts|qS r   )rO  RhythmicEventr  r  r   r   r   r?  N  s
    
c                 S   s   g | ]	}t |ts|qS r   )rO  r  r  r   r   r   r?  R  r  z\afterGrace {r  z\graceFz&Grace note with no following music: %sr^  print_before_noter   r   <%s>rJ   print_after_noterF   )r  r  r  r  rj   r   r   r   hasattrr  rK   associated_eventsrO  	StemEventrR  r7   chord_element_lyr   rh   rA  r  r  r  )r   r  r  Zrest_eventsZother_eventsr   Zpitchesr#  Zstemr>  Zaevr  r   r   r   rj   J  sx   




zChordEvent.print_lyN)
r   r   r   r   r  r  r  ru   r  rj   r   r   r   r   rP  %  s    rP  c                   @   r   )Partialc                 C   r  r   )r   r   partialr   r   r   r   r     r  zPartial.__init__c                 C   s"   | j r|d| j    d S d S )Nz\partial %s)r  rQ   rh   r  r   r   r   rj     s   zPartial.print_lyNr  r   r   r   r   r    r  r  c                   @   r_  )rQ  c                 C   s   t |  d| _d | _d S r   )r   r   
bar_numbertyper   r   r   r   r        

zBarLine.__init__c                 C   s   ddddddddd	d
dd | jd }|d ur|d|  n|d	 | jdkr9| jd dkr9|d| j  n| jdkrF|d| j  |  d S )N!;rb   z..z.|z|.z||r   |r   r   )dasheddottedZheavyzheavy-heavyzheavy-lightzlight-heavyzlight-lightnoneZregularZshortZtickz	\bar "%s"r   
   z\barNumberCheck #%d z %% %d)rc   r  rQ   r  r/   r0   )r   r  Z
bar_symbolr   r   r   rj     s,   


zBarLine.print_lyc                 C   r   )Nz | r   r   r   r   r   rh     r   zBarLine.ly_expressionNrb  r   r   r   r   rQ    s    rQ  c                       s,   e Zd Z fddZdd Zdd Z  ZS )Eventc                    s   t t|   d | _d | _d S r   )superr  r   before_note
after_noter   r  r   r   r     s   
zEvent.__init__c                 C      | j r|| j  d S d S r   )r  rQ   r  r   r   r   r       zEvent.print_before_notec                 C   r  r   )r  rQ   r  r   r   r   r    r  zEvent.print_after_note)r   r   r   r   r  r  __classcell__r   r   r  r   r    s
    r  c                   @   rU  )
	SpanEventc                 C   s&   t |  d| _d| _d| _d| _d S )Nr   Zsolid)r  r   span_direction	line_type	span_typesizer   r   r   r   r     s
   

zSpanEvent.__init__c                 C   r   rO   r   r   r   r   r   wait_for_note  r   zSpanEvent.wait_for_notec                 C   s
   d| j  S )Nz'span-direction  %d)r  r   r   r   r   r     r.   zSpanEvent.get_propertiesc                 C   r+   r   )r  r   r  r   r   r   set_span_type  r.   zSpanEvent.set_span_typeN)r   r   r   r   r  r   r  r   r   r   r   r    s
    r  c                       $   e Zd Z fddZdd Z  ZS )BreatheEventc                       t    d| _d S )Nz\breather  r   r  r   r  r   r   r     r  zBreatheEvent.__init__c                 C   r   r   r   r   r   r   r   rh     r   zBreatheEvent.ly_expressionr   r   r   r   rh   r  r   r   r  r   r        r  c                       r  )CaesuraEventc                    r  )Nz\caesurar  r   r  r   r   r     r  zCaesuraEvent.__init__c                 C   r   r   r   r   r   r   r   rh     r   zCaesuraEvent.ly_expressionr  r   r   r  r   r    r  r  c                   @   r_  )	SlurEventc                 C   s8   ddd | jd}|r| jdkr|| d S d S d S )Nz\slurDottedz\slurDashedr  r  r   r6   rc   r  r  rQ   r   r  commandr   r   r   r     s   
zSlurEvent.print_before_notec                 C   s8   ddd | jd}|r| jdkr|| d S d S d S )Nz
\slurSolidr  r   r6   r  r  r   r   r   r    s   
zSlurEvent.print_after_notec                 C      ddd | jdS )N()r6   r   r   rc   r  r   r   r   r   rh        zSlurEvent.ly_expressionNr   r   r   r  r  rh   r   r   r   r   r    s    r  c                   @      e Zd Zdd ZdS )	BeamEventc                 C   r  )N[]r  r   r  r   r   r   r   rh     r  zBeamEvent.ly_expressionNr   r   r   rh   r   r   r   r   r        r  c                   @   r  )
PedalEventc                 C      dddd | jdS )Nz
\sustainOnz\sustainOff\sustainOnz\sustainOffr6   r   r   r   r  r   r   r   r   rh        
zPedalEvent.ly_expressionNr  r   r   r   r   r    r  r  c                   @   r_  )TextSpannerEventc                 C   sP   t | dr| jdkr|d t | dr&dddd| jd	}|| d S d S )
Nstylewavez+\once \override TextSpanner.style = #'trillforce_directionz\textSpannerDownz\textSpannerNeutralz\textSpannerUpr  r   )r  r  rQ   rc   r  )r   r  r>  r   r   r   r    s   


z"TextSpannerEvent.print_before_notec                 C      d S r   r   r  r   r   r   r  %  r   z!TextSpannerEvent.print_after_notec                 C   sh   t | dr| jdkrdS tdkrddd| jdS t | dr*| jdkr*td	kr*dS d
dd| jdS )Nr  ignorer   r  z\startTextSpanz\stopTextSpanr  stopZtrill\startTrillSpan\stopTrillSpan)r  r  whatOrnamentrc   r  r   r   r   r   rh   (  s   

zTextSpannerEvent.ly_expressionNr  r   r   r   r   r    s    r  c                   @   r_  )BracketSpannerEventc                 C   sF   | j dkr!| jdkr|d n
| jdkr|d |d d S d S )Nr6   r   z/\once \override LigatureBracket.direction = #UPz1\once \override LigatureBracket.direction = #DOWNz\[)r  r  rQ   r  r   r   r   r  9  s   


z%BracketSpannerEvent.print_before_notec                 C   s   | j dkr|d d S d S )Nr   z\])r  rQ   r  r   r   r   r  C  r  z$BracketSpannerEvent.print_after_notec                 C   r   r   r   r   r   r   r   rh   H  r   z!BracketSpannerEvent.ly_expressionNr  r   r   r   r   r  7  s    
r  c                   @   rU  )
OctaveShiftEventc                 C   r   rT   r   r   r   r   r   r  M  r   zOctaveShiftEvent.wait_for_notec                 C   s   ddd |d| _d S )Nr   r6   )Zupdownr   rc   r  r  r   r   r   r  P     zOctaveShiftEvent.set_span_typec                 C   sR   z
ddd| j  }W n ty   ttd| j   d}Y nw |d| j 9 }|S )Nr   r   )      z4Invalid octave shift size found: %s. Using no shift.r   r6   )r  r   r   r   r   r  )r   rR  r   r   r   ly_octave_shift_indicatorS  s   z*OctaveShiftEvent.ly_octave_shift_indicatorc                 C   s,   |   }d}|rd| }|dd| jdS )Nr   z\ottava #%sz
\ottava #0r  )r  rc   r  )r   r6  rR  r   r   r   rh   _  s   
zOctaveShiftEvent.ly_expressionN)r   r   r   r  r  r  rh   r   r   r   r   r  L  s
    r  c                   @   r  )TrillSpanEventc                 C   s   dddd | jdS )Nr  r   r  r  r  r   r   r   r   rh   j  r  zTrillSpanEvent.ly_expressionNr  r   r   r   r   r  i  r  r  c                   @   r   )GlissandoEventc                 C   s>   | j dkrdddd| jd }|r|d|  d S d S d S )Nr6   zdashed-linezdotted-lineZzigzag)r  r  Zwavyz&\once \override Glissando.style = #'%s)r  rc   r  rQ   )r   r  r  r   r   r   r  q  s   

z GlissandoEvent.print_before_notec                 C   s   ddd | jdS )Nz
\glissandor   r  r  r   r   r   r   rh   |  s
   
zGlissandoEvent.ly_expressionN)r   r   r   r  rh   r   r   r   r   r  p  s    r  c                   @   4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )ArpeggioEventc                 C   s   t |  d| _d| _d S r   )r  r   	directionnon_arpeggiater   r   r   r   r     r  zArpeggioEvent.__init__c                 C   r   rO   r   r   r   r   r   r    r   zArpeggioEvent.wait_for_notec                 C   s>   | j r
|d d S ddd| jd}|r|| d S d S )Nz\arpeggioBracketz\arpeggioArrowDownz\arpeggioArrowUpr  r   )r  rQ   rc   r  )r   r  r6  r   r   r   r    s   
zArpeggioEvent.print_before_notec                 C   s   | j s| jr|d d S d S )Nz\arpeggioNormal)r  r  rQ   r  r   r   r   r    s   zArpeggioEvent.print_after_notec                 C   r   )Nz	\arpeggior   r   r   r   r   rh     r   zArpeggioEvent.ly_expressionN)r   r   r   r   r  r  r  rh   r   r   r   r   r    s    	r  c                   @   r  )TieEventc                 C   r   )N~r   r   r   r   r   rh     r   zTieEvent.ly_expressionNr  r   r   r   r   r    r  r  c                   @   r  )HairpinEventc                 C   s   dddd |d| _d S )Nr   r6   )Z	crescendoZdecrescendoZ
diminuendor   r  r  r   r   r   r    s
   zHairpinEvent.set_span_typec                 C   s"   | j dkrdS ddd| jdS )Nr   z\!r@   rD   r   r   )r  rc   r  r   r   r   r   hairpin_to_ly  s   
zHairpinEvent.hairpin_to_lyc                 C      dddd | jdS N^r   -r   r6   r   rc   r  r   r   r   r   direction_mod     zHairpinEvent.direction_modc                 C   rk   r   )r  r   r   r   r   rh     rn   zHairpinEvent.ly_expressionc                 C   s*   |   }|r|d|  |f  d S d S )N%s%s)r  rQ   r   )r   r  valr   r   r   rj     s   zHairpinEvent.print_lyN)r   r   r   r  r  r   rh   rj   r   r   r   r   r    s    r  c                   @   r  )DynamicsEventc                 C   s   t |  d | _d| _d S r   r  r   r  r  r   r   r   r   r     r  zDynamicsEvent.__init__c                 C   r   rO   r   r   r   r   r   r    r   zDynamicsEvent.wait_for_notec                 C   s   | j rd| j  S d S r  r  r   r   r   r   rh        
zDynamicsEvent.ly_expressionc                 C   r  r  r  r   r   r   r   r     r  zDynamicsEvent.direction_modc                 C   s&   | j r|d|  | j f  d S d S Nz%s\%s)r  rQ   r   r  r   r   r   rj     s   zDynamicsEvent.print_lyN)r   r   r   r   r  rh   r   rj   r   r   r   r   r    s    r  c                   @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )	MarkEvent\defaultc                 C      t |  || _d S r   )r  r   markr   r  r   r   r   r     r  zMarkEvent.__init__c                 C   r   rT   r   r   r   r   r   r    r   zMarkEvent.wait_for_notec                 C      | j rd| j  S dS )N%sz"ERROR"r  r   r   r   r   ly_contents  r  zMarkEvent.ly_contentsc                 C   s   d|    S )Nz\mark %s)r  r   r   r   r   rh     r4   zMarkEvent.ly_expressionN)r
  )r   r   r   r   r  r  rh   r   r   r   r   r	    s
    
r	  c                   @   r  )MusicGlyphMarkEventc                 C   r  )Nz$\markup { \musicglyph "scripts.%s" }r   r  r   r   r   r   r    r  zMusicGlyphMarkEvent.ly_contentsN)r   r   r   r  r   r   r   r   r    r  r  c                   @   rU  )
	TextEventc                 C   s    t |  d | _d | _d| _d S r   )r  r   ZTextr  markupr   r   r   r   r     r  zTextEvent.__init__c                 C   r   )a]   This is problematic: the lilypond-markup ^"text"
        requires wait_for_note to be true. Otherwise the
        compilation will fail.  So we are forced to set return to True.
        But in some cases this might lead to a wrong placement of the text.
        In case of words like Allegro the text should be put in a '\tempo'-command.
        In this case we don't want to wait for the next note.
        In some other cases the text is supposed to be used in a r'\mark\markup' construct.
        We would not want to wait for the next note either.
        There might be other problematic situations.
        In the long run we should differentiate between various contexts in MusicXML, e.g.
        the following markup should be interpreted as '\tempo "Allegretto"':
                <direction placement="above">
                    <direction-type>
                        <words>Allegretto</words>
                    </direction-type>
                    <sound tempo="120"/>
                </direction>
        In the mean time arising problems have to be corrected manually after the conversion.
        Tr   r   r   r   r   r    s   zTextEvent.wait_for_notec                 C   r  )z 1: placement="above"; -1: placement="below"; 0: no placement attribute.
        see musicxml_direction_to_indicator in musicxml2ly_conversion.py r  r   r  r  r  r   r   r   r   r     s   zTextEvent.direction_modc                 C   s*   d}| j rd| j  d }||  | jf S )Nz%s "%s"z%s\markup{ z {%s} })r  r   r  )r   Zbase_stringr   r   r   rh     s   zTextEvent.ly_expressionNr   r   r   r   r  r   rh   r   r   r   r   r    s
    r  c                   @   rU  )
ArticulationEventc                 C   s   t |  d | _d | _d S r   r  r   r   r   r   r     r  zArticulationEvent.__init__c                 C   r   rO   r   r   r   r   r   r    r   zArticulationEvent.wait_for_notec                 C   r  )Nr  r   r  r  r   r  r   r   r   r   r      r  zArticulationEvent.direction_modc                 C   s   d|   | jf S r  )r   r  r   r   r   r   rh   #  r>   zArticulationEvent.ly_expressionNr  r   r   r   r   r    s
    r  c                   @   r   )ShortArticulationEventc                 C   r  r  r  r   r   r   r   r   (  s   z$ShortArticulationEvent.direction_modc                 C      | j rd|  | j f S dS )Nr  r   )r  r   r   r   r   r   rh   ,     z$ShortArticulationEvent.ly_expressionN)r   r   r   r   rh   r   r   r   r   r  '  r  r  c                   @   r  )NoDirectionArticulationEventc                 C   r  Nr  r   r  r   r   r   r   rh   4  r  z*NoDirectionArticulationEvent.ly_expressionNr  r   r   r   r   r  3  r  r  c                   @   r   )MarkupEventc                 C   r  r   )r  r   contentsr   r   r   r   r   ;  r  zMarkupEvent.__init__c                 C   r  )Nz%s\markup { %s }r   )r  r   r   r   r   r   rh   ?  r  zMarkupEvent.ly_expressionNr   r   r   r   rh   r   r   r   r   r  :  r  r  c                   @   r   )	FretEventc                 C   s,   t |  d| _d| _d| _d | _g | _d S )Nr      r   )r  r   r  r   fretsbarrer  r   r   r   r   r   G     

zFretEvent.__init__c              	   C   s  d}| j dkr|d| j  7 }| jdkr|d| j 7 }| jr:t| jdkr:|d| jd | jd	 | jd
 td f 7 }d}| jD ]5}t|d	kr`|d|d |d	 tddft|d	 t  f 7 }t|d
krpd}|d|d
  7 }|d7 }q?|r{d| }|rd|  |f S dS )Nr   r   zw:%s;r   zh:%s;r   zc:%s-%s-%s;r   r   r   r   Fz%s-%sT-%sr  zf:1;z!%s\markup { \fret-diagram #"%s" })	r   r!  r"  rK   r   r  rO  strr   )r   r  Zhave_fingeringir   r   r   rh   O  s4   



zFretEvent.ly_expressionNr  r   r   r   r   r  F  s    r  c                   @   r   )FretBoardNotec                 C   r  r   )r   r   r   r   	fingeringr   r   r   r   r   j  r  zFretBoardNote.__init__c                 C   s6   | j  }| jr|d| j 7 }| jr|d| j 7 }|S )Nr$  r  )r   rh   r(  r   r=   r   r   r   rh   p  s   
zFretBoardNote.ly_expressionNr  r   r   r   r   r'  i  s    r'  c                   @   r   )FretBoardEventc                 C   r  r   )r0  r   r  r   r   r   r   r   z  r  zFretBoardEvent.__init__c                 C   sT   dd | j D }|r(g }|D ]	}||  qd|}|d|| jf  d S d S )Nc                 S   r  r   )rO  r'  )r=  nr   r   r   r?    s
    
z+FretBoardEvent.print_ly.<locals>.<listcomp>rJ   z<%s>%s)r  r7   rh   rA  r  )r   r  Zfretboard_notesnotesr*  r  r   r   r   rj   ~  s   
zFretBoardEvent.print_lyNr  r   r   r   r   r)  y  r  r)  c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )FunctionWrapperEventNc                 C   r  r   )r  r   function_name)r   r-  r   r   r   r     r  zFunctionWrapperEvent.__init__c                 C   r  r  r-  r   is_chord_elementr   r   r   pre_note_ly  r  z FunctionWrapperEvent.pre_note_lyc                 C   r   r   r   r   r   r   r   pre_chord_ly  r   z!FunctionWrapperEvent.pre_chord_lyc                 C   r  r  r.  r   r   r   r   rh     r  z"FunctionWrapperEvent.ly_expressionr   )r   r   r   r   r1  r2  rh   r   r   r   r   r,    s
    
r,  c                   @   r  )ParenthesizeEventc                 C   s   t | d d S )NZparenthesize)r,  r   r   r   r   r   r     r   zParenthesizeEvent.__init__Nr   r   r   r   r   r   r   r   r3    r  r3  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )r  zG"
    A class to take care of stem values (up, down, double, none)
    c                 C   r  r   )r  r   rR  r   r   r   r   r     r  zStemEvent.__init__c                 C   r  r  )rR  r   r   r   r   r2    r  zStemEvent.pre_chord_lyc                 C   r   r   r   r/  r   r   r   r1    r   zStemEvent.pre_note_lyc                 C   rk   r   r2  r   r   r   r   rh     rn   zStemEvent.ly_expressionN)r   r   r   rX   r   r2  r1  rh   r   r   r   r   r    s    r  c                   @   rU  )
NotestyleEventc                 C   r  r   )r  r   r  Zfilledcolorr   r   r   r   r     r  zNotestyleEvent.__init__c                 C   sF   d}| j r|d| j  7 }| jr!|d| jd | jd | jd f 7 }|S )Nr   z% \once \override NoteHead.style = #%sz7 \once \override NoteHead.color = #(rgb-color %s %s %s)r   r   r   )r  r7  )r   Zreturn_stringr   r   r   r2    s   zNotestyleEvent.pre_chord_lyc                 C   s   | j r
|r
d| j  S dS )Nz\tweak style #%sr   )r  r/  r   r   r   r1       

zNotestyleEvent.pre_note_lyc                 C   rk   r   r5  r   r   r   r   rh     rn   zNotestyleEvent.ly_expressionNr   r   r   r   r2  r1  rh   r   r   r   r   r6    s
    	r6  c                   @   rU  )
StemstyleEventc                 C   r  r   )r  r   r7  r   r   r   r   r     r  zStemstyleEvent.__init__c                 C   s*   | j rd| j d | j d | j d f S dS )Nz2\once \override Stem.color = #(rgb-color %s %s %s)r   r   r   r   )r7  r   r   r   r   r2    s    zStemstyleEvent.pre_chord_lyc                 C   r   r   r   r/  r   r   r   r1    r   zStemstyleEvent.pre_note_lyc                 C   rk   r   r5  r   r   r   r   rh     rn   zStemstyleEvent.ly_expressionNr9  r   r   r   r   r:    s
    r:  c                   @   r_  )
ChordPitchc                 C   s   d| _ d| _d S r   )r   r   r   r   r   r   r     s   
zChordPitch.__init__c                 C   rk   r   rl   r   r   r   r   rm     rn   zChordPitch.__repr__c                 C   r   r   r   r   r   r   r   rh     rn   zChordPitch.ly_expressionN)r   r   r   r   rm   rh   r   r   r   r   r;        r;  c                   @   r   )ChordModificationc                 C   s   d| _ d| _d| _d S r   )r   r   r  r   r   r   r   r     s   
zChordModification.__init__c                 C   sH   | j r"ddd| j d}|d| j 7 }|ddd| jd7 }|S dS )Nrb   r  r   r   r  +r  )r  rc   r   r   )r   r  r   r   r   rh     s   zChordModification.ly_expressionNr  r   r   r   r   r=        r=  c                   @   r_  )ChordNameEventc                 C   s,   t |  d | _d | _d | _g | _d | _d S r   )r  r   rootkindr  modificationsbassr   r   r   r   r     r#  zChordNameEvent.__init__c                 C   r  r   )rC  r7   )r   modr   r   r   add_modification
  r   zChordNameEvent.add_modificationc                 C   s   | j sdS | j  }| jr|| j 7 }| jr|| j }| jD ]}|jdkr,|| 7 }q| jD ]}|jdkr=|| 7 }q0| jrJ|d| j  7 }|S )Nr   r   r6   z/+%s)rA  rh   r  rB  rC  r  rD  )r   rR  mr   r   r   rh     s$   





zChordNameEvent.ly_expressionN)r   r   r   r   rF  rh   r   r   r   r   r@    s    r@  c                   @   r   )TremoloEventc                 C   r   r   )r  r   strokesr   r   r   r   r   #  r  zTremoloEvent.__init__c                 C   sh   d}| j r2t| j dkr2tdk r|dddt| j    7 }|S |ddtttdt| j    7 }|S )Nr   r   r  z:%sr   )rI  re   rf   mathrr   )r   Zly_strr   r   r   rh   '  s   zTremoloEvent.ly_expressionNr  r   r   r   r   rH  "  r  rH  c                   @   r   )	BendEventc                 C   r  r   )r  r   alterr   r   r   r   r   E  r  zBendEvent.__init__c                 C   s   | j d ur
d| j  S dS )Nz-\bendAfter #%sr   )rL  r   r   r   r   rh   I  r8  zBendEvent.ly_expressionNr  r   r   r   r   rK  D  r  rK  c                   @   r  )r  c                 C   s   t |  t | _g | _d S r   )r  r   rY   r  r  r   r   r   r   r   Q  s   

zRhythmicEvent.__init__c                 C   r1  r   )r  r7   )r   evr   r   r   add_associated_eventV  r2  z"RhythmicEvent.add_associated_eventc                 C   s   dd | j D S )Nc                 S   r:  r   r5  r=  rM  r   r   r   r?  [  r@  z.RhythmicEvent.pre_chord_ly.<locals>.<listcomp>r  r   r   r   r   r2  Z  r   zRhythmicEvent.pre_chord_lyc                    s    fdd| j D S )Nc                    s   g | ]}|  qS r   )r1  rO  r0  r   r   r?  ^      z-RhythmicEvent.pre_note_ly.<locals>.<listcomp>rP  r/  r   rQ  r   r1  ]  r  zRhythmicEvent.pre_note_lyc                 C   s$   d | |}|dkr|d }|S )NrJ   r   )rA  r1  )r   r0  resr   r   r   ly_expression_pre_note`  s   z$RhythmicEvent.ly_expression_pre_notec                 C   s
   | j  S r   )r  ru   r   r   r   r   ru   f  r.   zRhythmicEvent.get_lengthc                 C      d| j   S )Nz'duration %sr  r_   r   r   r   r   r   i  s   zRhythmicEvent.get_propertiesN)
r   r   r   r   rN  r2  r1  rT  ru   r   r   r   r   r   r  P  s    r  c                   @   r_  )r  c                 C   r  r   )r  r   r   r   r   r   r   r   o  r  zRestEvent.__init__c                 C   s:   |  d}| jr|d| j | j f  S d| j  S )NFz	%s%s\restzr%s)rT  r   rh   r  r   rS  r   r   r   rh   s  s   
zRestEvent.ly_expressionc                 C   sX   | j D ]}|| q| jr | j| | j| |d d S |d | j| d S )Nz\restrM  )r  rj   r   r  r   r  rM  r   r   r   rj   z  s   
zRestEvent.print_lyN)r   r   r   r   rh   rj   r   r   r   r   r  n  s    r  c                   @   r  )	SkipEventc                 C   rU  )Nzs%sr  rh   r   r   r   r   rh     r   zSkipEvent.ly_expressionNr  r   r   r   r   rY    r  rY  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S )r  c                 C   s"   t |  t | _d| _d| _d S rT   )r  r   r   r   
cautionaryforced_accidentalr   r   r   r   r     s   

zNoteEvent.__init__c                 C   s"   t | }| jr|| j 7 }|S r   )r  r   r   r_   r=   r   r   r   r     s   
zNoteEvent.get_propertiesc                 C   s$   d}| j r	|d7 }| jr|d7 }|S )Nr   ?r  )r[  r\  )r   Zexcl_questionr   r   r   
pitch_mods  s   zNoteEvent.pitch_modsc                 C   s6   |  d}| jr|d| j |  | j f  S d S )NTz%s%s%s)rT  r   rh   r^  r  rW  r   r   r   rh     s   
zNoteEvent.ly_expressionc                 C   s.   |  d}| jr|d| j |  f  S d S )NTr  )rT  r   rh   r^  rW  r   r   r   r    s   
zNoteEvent.chord_element_lyc                 C   s|   | j D ]}|| qt| dr%|d| j |d| j |d| j t| dr6| j| ||   | j| d S )Nr7  ZNoteHeadZStemZBeamr   )r  rj   r  Zprint_note_colorr7  r   r^  r  rX  r   r   r   rj     s   


zNoteEvent.print_lyN)	r   r   r   r   r   r^  rh   r  rj   r   r   r   r   r    s    	r  c                   @   r_  )KeySignatureChangec                 C   s    t |  d | _d| _d | _d S )Nmajor)r   r   tonicr!  non_standard_alterationsr   r   r   r   r     r  zKeySignatureChange.__init__c              
   C   s   ddddddddd	d
	}z||d  }W n t y)   ttd|d   Y dS w t|dkr8d|d |f S t|dkrId|d |d |f S dS )Nz,DOUBLE-FLATz,THREE-Q-FLATz,FLATz
,SEMI-FLATz,NATURALz,SEMI-SHARPz,SHARPz,THREE-Q-SHARPz,DOUBLE-SHARP)	r`   g      r6   r   r   r   r   g      ?r   r   z8Unable to convert alteration %s to a lilypond expressionr   r   z( %s . %s )r   r   z(( %s . %s ) . %s ))r   r   r   r   rK   )r   r   Z
alter_dictZ
accidentalr   r   r   format_non_standard_alteration  s.   	z1KeySignatureChange.format_non_standard_alterationc                    sF    j rd j   jf S  jr! fdd jD }dd| S dS )Nz\key %s \%sc                       g | ]}  |qS r   )rc  )r=  r   r   r   r   r?    s    z4KeySignatureChange.ly_expression.<locals>.<listcomp>z"\set Staff.keyAlterations = #`(%s)rJ   r   )ra  r   r!  rb  rA  )r   Zalterationsr   r   r   rh     s   

z KeySignatureChange.ly_expressionN)r   r   r   r   rc  rh   r   r   r   r   r_    s    r_  c                   @   r_  )ShiftDurationsc                 C   s   t |  ddg| _d S r   )r  r   paramsr   r   r   r   r     s   
zShiftDurations.__init__c                 C   s   |  | _d S r   )get_shift_durations_parametersrf  )r   ZtimeSigChanger   r   r   set_shift_durations_parameters  r   z-ShiftDurations.set_shift_durations_parametersc                 C   s"   |dt | j  t| | d S )Nz \shiftDurations #%d #%d )tuplerf  r  rj   r  r   r   r   rj     s   zShiftDurations.print_lyN)r   r   r   r   rh  rj   r   r   r   r   re    r<  re  c                   @   r  )TimeSignatureChangec                 C   s.   t |  ddg| _d | _ddg| _d| _d S )Nr   T)r   r   	fractionsr  originalFractionsvisibler   r   r   r   r     s
   



zTimeSignatureChange.__init__c                 C   s0   t | jd | jd  t | jd | jd   S )z
        Calculate the ratio between the original time fraction and the new one.
        Used for the "--time-signature" option.

        @return: The ratio between the two time fractions.
        @rtype: float
        r   r   )floatrl  rk  r   r   r   r   get_fractions_ratio
  s   0z'TimeSignatureChange.get_fractions_ratioc                 C   sL   t t |  d}d|   t d|  }tt d| d}||gS )Nr   r   r   )rJ  Zceilrr   ro  powre   )r   rs   r\   r   r   r   rg    s   z2TimeSignatureChange.get_shift_durations_parametersc                    s6   t |tr fdd|D }dd| d S d| S )Nc                    rd  r   )format_fraction)r=  r   r   r   r   r?    rR  z7TimeSignatureChange.format_fraction.<locals>.<listcomp>r  rJ   r  r  )rO  rB  rA  )r   Zfracr  r   r   r   rq    s   
z#TimeSignatureChange.format_fractionc                 C   s   d}| j ddgddgddgfv }| jr2| jr2| jdkrd}n| jdkr)d| j }n	| jdks0|r2d}| jr8d}nd	}t| j dkrTt| j d
 trT|dt| j   | S | j rc|d| | j   | S |d S )Nr   r   r   commonz\defaultTimeSignaturez'()z0\once \override Staff.TimeSignature.style = #%s z\numericTimeSignaturez\omit Staff.TimeSignaturer   z\time %d/%d z\compoundMeter #'%s)rk  r  rm  rK   rO  re   ri  rq  )r   stZis_common_signatureZomitr   r   r   rh   !  s"   

z!TimeSignatureChange.ly_expressionN)r   r   r   r   ro  rg  rq  rh   r   r   r   r   rj    s    
rj  c                   @   s@   e Zd Zdd Zdd Zdd Zdd Zd	d
ddZdd ZdS )
ClefChangec                 C   s    t |  d| _d| _d| _d S )NGr   r   )r   r   r  positionr   r   r   r   r   r   >  r  zClefChange.__init__c                 C   s   ddddd | jdS )Nz^8z^15Z_8Z_15)r   r   r6   r`   r   )rc   r   r   r   r   r   octave_modifierD  r  zClefChange.octave_modifierc                 C   s2   ddddddddd	d
ddt  d| j| jfd S )NtrebleZfrenchZsopranoZmezzosopranoZaltoZtenorZbaritoneZvarbaritonerD  Zsubbass
percussion))ru  r   )ru  r   )Cr   )rz  r   )rz  r   )rz  r   )rz  r   )Fr   )r{  r   )r{  r   )ry  r   )ZPERCr   )ZTABr   )r   rc   r  rv  r   r   r   r   	clef_nameG  s    zClefChange.clef_namec                 C   s   d|   |  f S )Nz\clef "%s%s")r|  rw  r   r   r   r   rh   W  r  zClefChange.ly_expression)zclefs.Gr`   i)zclefs.Cr   r   )zclefs.Fr   r   )ru  rz  r{  c                 C   s>   z| j | j \}}}W n
 ty   Y dS w d|||f }|S )Nr   a  
        (make-music 'SequentialMusic
        'elements (list
   (context-spec-music
   (make-property-set 'clefGlyph "%s") 'Staff)
   (context-spec-music
   (make-property-set 'clefPosition %d) 'Staff)
   (context-spec-music
   (make-property-set 'middleCPosition %d) 'Staff)))
)	clef_dictr  r   )r   ZglyphposZc0Zclefsettingr   r   r   r_   `  s   	
zClefChange.lisp_expressionN)	r   r   r   r   rw  r|  rh   r}  r_   r   r   r   r   rt  =  s    rt  c                   @   r   )Transpositionc                 C   r  r   )r   r   r   r   r   r   r   r   s  r  zTransposition.__init__c                 C   s   d| j _d| j   S )NTz\transposition %s)r   r   rh   r   r   r   r   rh   w  s   zTransposition.ly_expressionNr  r   r   r   r   r  r  r  r  c                   @   r   )StaffChangec                 C   r  r   )r   r   staffr   r  r   r   r   r   }  r  zStaffChange.__init__c                 C   r  )Nz\change Staff="%s"r   )r  r   r   r   r   rh     r  zStaffChange.ly_expressionNr  r   r   r   r   r  |  r  r  c                   @   r   )SetEventc                 C   s   t |  || _|| _d S r   )r   r   context_proprR  )r   ZcontextproprR  r   r   r   r     r  zSetEvent.__init__c                 C   s   | j rd| j| j f S dS )Nz\set %s = %sr   )rR  r  r   r   r   r   rh     s   zSetEvent.ly_expressionNr  r   r   r   r   r    r?  r  c                   @   r   )StaffLinesEventc                 C   r  r   )r   r   r  )r   r  r   r   r   r     r  zStaffLinesEvent.__init__c                 C   s   | j dkr
d| j  S dS )Nr   zC\stopStaff \override Staff.StaffSymbol.line-count = #%s \startStaffz;\stopStaff \revert Staff.StaffSymbol.line-count \startStaff)r  r   r   r   r   rh     r8  zStaffLinesEvent.ly_expressionNr  r   r   r   r   r    r  r  c                   @   r/  )	TempoMarkc                 C   s,   t |  d | _d | _d | _d| _d | _d S rT   )r   r   basedurationnewdurationbeatsparenthesesr  r   r   r   r   r     r#  zTempoMark.__init__c                 C   r+   r   )r  r   rs   r   r   r   set_base_duration  r.   zTempoMark.set_base_durationc                 C   r+   r   )r  r  r   r   r   set_new_duration  r.   zTempoMark.set_new_durationc                 C   r+   r   )r  )r   r  r   r   r   set_beats_per_minute  r.   zTempoMark.set_beats_per_minutec                 C   r+   r   r  )r   r  r   r   r   set_parentheses  r.   zTempoMark.set_parenthesesc                 C   r+   r   )r  r  r   r   r   set_text  r.   zTempoMark.set_textc                 C   r   rT   r   r   r   r   r   r    r   zTempoMark.wait_for_notec                 C   s   |rd|   S dS )Nz/\general-align #Y #DOWN \smaller \note {%s} #UPr   rl   r  r   r   r   duration_to_markup  s   zTempoMark.duration_to_markupc                 C   r   )Nz+\mark\markup { \fontsize #-2 \line { %s } }r   r   r   r   r   tempo_markup_template  r   zTempoMark.tempo_markup_templatec                 C   s   d}| j s|S | jr0| js| jr"|d| jpd| j  | jf 7 }|S |d| j  | jf 7 }|S | jrY| | j }| | j}| jrId||f }nd||f }||  | 7 }|S dS )Nr   z\tempo "%s" %s=%sz\tempo %s=%sz"(" %s = %s ")"z	 %s = %s )r  r  r  r  rh   r  r  r  )r   rS  ZdmZndmr  r   r   r   rh     s,   zTempoMark.ly_expressionN)r   r   r   r   r  r  r  r  r  r  r  r  rh   r   r   r   r   r    s    r  c                   @   r  )FiguredBassNotec                 C   s    t |  d| _d| _d| _d S r   )r   r   r   prefixsuffixr   r   r   r   r     r  zFiguredBassNote.__init__c                 C   r+   r   r  )r   r  r   r   r   
set_prefix  r.   zFiguredBassNote.set_prefixc                 C   r+   r   r  )r   r  r   r   r   
set_suffix  r.   zFiguredBassNote.set_suffixc                 C   r+   r   )r   )r   r   r   r   r   
set_number  r.   zFiguredBassNote.set_numberc                 C   sB   d}| j r|| j 7 }n|d7 }| jr|| j7 }| jr|| j7 }|S )Nr   r   )r   r  r  rW  r   r   r   rh     s   

zFiguredBassNote.ly_expressionN)r   r   r   r   r  r  r  rh   r   r   r   r   r    s    r  c                   @   r  )FiguredBassEventc                 C   s    t |  d | _d| _d| _d S r   )r0  r   r  real_durationr  r   r   r   r   r     s
   
zFiguredBassEvent.__init__c                 C   r+   r   )r  r  r   r   r   set_duration	  r.   zFiguredBassEvent.set_durationc                 C   r+   r   r  )r   Zparr   r   r   r  	  r.   z FiguredBassEvent.set_parenthesesc                 C   r+   r   )r  r  r   r   r   set_real_duration		  r.   z"FiguredBassEvent.set_real_durationc                 C   sh   dd | j D }|r2g }|D ]	}||  qd|}| jr$d| }|d|  | j| d S d S )Nc                 S   r  r   )rO  r  r  r   r   r   r?  	  r  z-FiguredBassEvent.print_ly.<locals>.<listcomp>rJ   z[%s]r  )r  r7   rh   rA  r  r  rj   )r   r  Zfigured_bass_eventsr+  r>  r  r   r   r   rj   	  s   
zFiguredBassEvent.print_lyN)r   r   r   r   r  r  r  rj   r   r   r   r   r    s    r  c                   @   r   )MultiMeasureRestc                 C   rU  )Na<  
(make-music
  'MultiMeasureRestMusicGroup
  'elements
  (list (make-music (quote BarCheck))
        (make-music
          'ChordEvent
          'elements
          (list (make-music
                  'MultiMeasureRestEvent
                  'duration
                  %s)))
        (make-music (quote BarCheck))))
rV  r   r   r   r   r_   	  s   z MultiMeasureRest.lisp_expressionc                 C   rU  )NzR%srZ  r   r   r   r   rh   ,	  r   zMultiMeasureRest.ly_expressionN)r   r   r   r_   rh   r   r   r   r   r  	  s    r  c                   @   s   e Zd ZdddZdd ZdS )Breakbreakc                 C   r  r   )r   r   r  )r   tpr   r   r   r   1	  r  zBreak.__init__c                 C   s   | j r|d| j   d S d S r  )r  rQ   r  r   r   r   rj   5	  s   zBreak.print_lyN)r  r  r   r   r   r   r  0	  s    
r  c                   @   sf   e Z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d ZdS )
StaffGroupc                 C   sF   || _ d | _d | _d | _d | _d | _d | _g | _d| _g | _	d | _
d S rO   )	stafftypeidinstrument_namesoundshort_instrument_namesymbolspanbarchildrenis_groupcontext_modificationspart_informationr   r  r   r   r   r   ;	  s   
zStaffGroup.__init__c                 C   r  r   )r  r7   r  r   r   r   append_staffL	  r   zStaffGroup.append_staffc                 C   s:   || j kr
|| _d S | jD ]}t|dr||| qd S )Nset_part_information)r  r  r  r  r  )r   Z	part_namestaves_infor   r   r   r   r  O	  s   



zStaffGroup.set_part_informationc                 C   r  r   )r  r7   )r   Zmodificationr   r   r   add_context_modificationW	  r   z#StaffGroup.add_context_modificationc                 C   s   | j D ]	}|r|| qd S r   )r  rj   )r   r  r   r   r   r   print_ly_contentsZ	  s
   

zStaffGroup.print_ly_contentsc                 C   sJ   d}|| j dkO }|| jd uO }|| jd uO }|| jd uo!| jdkO }|S )NFnor&  )r  r  r  r  )r   
needs_withr   r   r   r  b	  s   zStaffGroup.needs_withc                 C   sZ   | j s| jr|d | jdkr|d dddd| jd }|r+|d|  d S d S )	Nz$\consists "Instrument_name_engraver"r  z\hide SpanBarZSystemStartBraceZSystemStartBarZSystemStartSquare)Zbracer  r|  zsystemStartDelimiter = #'%s)r  r  rQ   r  rc   r  )r   r  Zbrackr   r   r   print_ly_context_modsj	  s   



z StaffGroup.print_ly_context_modsc                 C   s^   |   t| jdkB }|r-|d | | | jD ]}|| q|d |  d S d S )Nr   \with {rF   )r  rK   r  rQ   r  r0   )r   r  r  rG  r   r   r   print_ly_overridesu	  s   



zStaffGroup.print_ly_overridesc           	      C   sb   z&| j D ]\}}|D ]\}}}}}|r"|d|td|f  |  q
qW d S  ty0   Y d S w )Nz#\context ChordNames = "%s" {%s \%s}r   r  r   r0   	TypeError	r   r  staff_idvoicesrl  lyricsfiguredbass
chordnames
fretboardsr   r   r   print_chords	     
zStaffGroup.print_chordsc           	      C   sb   z&| j D ]\}}|D ]\}}}}}|r"|d|td|f  |  q
qW d S  ty0   Y d S w )Nz#\context FretBoards = "%s" {%s \%s}r   r  r  r   r   r   print_fretboards	  r  zStaffGroup.print_fretboardsc                 C   s  |  | | | | jr|d| j  | | |  | jr*|d |  | jrA| jrA|d| jt| jf  |  | jrX| jrX|d| jt| jf  |  | j	rj|d| j| j	f  |  | 
| |  | jr|d |  d S d S )Nz\new %srA   z\set %s.instrumentName = %sz \set %s.shortInstrumentName = %sz\set %s.midiInstrument = "%s"rE   )r  r  r  rQ   r  r0   r  r   r  r  r  r  r   r   r   rj   	  s<   








zStaffGroup.print_lyN)r  )r   r   r   r   r  r  r  r  r  r  r  r  r  rj   r   r   r   r   r  :	  s    
r  c                   @   s6   e Zd ZdddZdd Zdd Zdd Zd	d
 ZdS )Staffc                 C   s.   t | | d| _d | _d| _d | _d | _d S )NFZVoice)r  r   r  partvoice_commandsubstafftyper  r  r   r   r   r   	  s   
zStaff.__init__c                 C   r   rT   r   r   r   r   r   r  	  r   zStaff.needs_withc                 C   r  r   r   r  r   r   r   r  	  s   zStaff.print_ly_context_modsc              	   C   s2  | j r| jsd S | j}|s| j}|  | jD ]\}}|r&|d||f  n|d|  |  |d |  d}t|}|D ]P\}}}	}
}|d7 }d}|dkr]	 ddd	d
|d}|d| j|t	d||f  |  d}|D ]}|d|||f  |d7 }|  qs|	r|d|	|	f  qA|d qd S )Nz\context %s = "%s" << z\context %s << z2\mergeDifferentlyDottedOn\mergeDifferentlyHeadedOnr   r   r   z
 \voiceOnez
 \voiceTwoz \voiceThree)r   r   r   z \voiceFourz\context %s = "%s" {%s %s \%s }r   z6\new Lyrics \lyricsto "%s" { \set stanza = "%s." \%s }z\context FiguredBass = "%s" \%srE   )
r  r  r  r  r0   rQ   rK   rc   r  r   )r   r  Zsub_staff_typer  r  r*  Z	nr_voicesrl  r  r  r  r  Zvoice_count_textZ	lyrics_idr  r   r   r   r  	  sT   


zStaff.print_ly_contentsc                 C   s0   | j rt| j dkrd| _d| _t| | d S )Nr   Z
PianoStaffr  )r  rK   r  r  r  rj   r  r   r   r   rj   	  s   zStaff.print_lyN)r  )r   r   r   r   r  r  r  rj   r   r   r   r   r  	  s    
.r  c                   @      e Zd ZdddZdd ZdS )TabStaffc                 C   s"   t | | g | _d | _d| _d S )NZTabVoice)r  r   string_tuningstablature_formatr  r  r   r   r   r    
  s   
zTabStaff.__init__c                 C   sv   | j s| jr9|d | j r'|d | j D ]}|d|   q|d | jr2|d| j  |d d S d S )Nr  zstringTunings = #`(z,%sr  ztablatureFormat = #%srF   )r  r  rQ   r_   )r   r  r&  r   r   r   r  
  s   



zTabStaff.print_ly_overridesN)r  r   r   r   r   r  r   r   r   r   r  	  s    
r  c                   @   r  )	DrumStaffc                 C   s   t | | d | _d| _d S )NZ	DrumVoice)r  r   drum_style_tabler  r  r   r   r   r   
  s   
zDrumStaff.__init__c                 C   s2   | j r|d |d| j   |d d S d S )Nr  zdrumStyleTable = #%srF   )r  rQ   r  r   r   r   r  
  s
   
zDrumStaff.print_ly_overridesN)r  r  r   r   r   r   r  
  s    
r  c                   @   s   e Zd ZdddZdS )RhythmicStaffc                 C   s   t | | d S r   )r  r   r  r   r   r   r   !
  r   zRhythmicStaff.__init__N)r  r4  r   r   r   r   r   
  s    r  c                   @   r  )Scorec                 C   s   d| _ d| _dS )z0
        Constructs a new Score object.
        NF)r  create_midir   r   r   r   r   *
  s   
zScore.__init__c                 C   r+   r   )r  )r   r  r   r   r   set_contents1
  r.   zScore.set_contentsc                 C   s   | j r| j || d S d S r   )r  r  )r   Zpart_idr  r   r   r   r  4
  s   zScore.set_part_informationc                 C   s
   || _ dS )z
        Set the tempo attribute of the Score.
        This attribute can be used in L{print_ly} for the midi output (see L{musicxml.Sound}).

        @param tempo: The value of the tempo, in beats per minute.
        @type tempo: String
        N)tempo)r   r  r   r   r   	set_tempo8
  s   
zScore.set_tempoc                 C   s  t  | _|d |  |d |  | jr| j| |d |  |d |  | jr_|d |  |d |  |d |  | j| |d |  n|d |  |d |d	| j d
  |  |d |  dS )z
        Print the content of the score to the printer, in lilypond format.

        @param printer: A printer given to display correctly the output.
        @type printer: L{Output_printer<musicexp.Output_printer>}
        z\score {rA   rE   z
\layout {}rF   z\unfoldRepeats \articulate {z6% To create MIDI output, uncomment the following line:r  z\midi {\tempo 4 = z }N)rz   r  rQ   r0   r  rj   r  r  r   r   r   rj   E
  s<   










zScore.print_lyN)r   r   r   r   r  r  r  rj   r   r   r   r   r  )
  s    r  c                  C   s   t  } d| _d| _d| _t  }d|_t  }d|_|  t|   t| || || t| ||| t|  d t| | t| || t| ||| d S )Nr6   r   r   r  )r   r   r   r   r   printr   r   )ZbflatZfifthr  r   r   r   
test_pitchs
  s    r  c                     sZ   dd   fdd} t  }||   ||   ||   t }|| |  d S )Nc                  S   s   t  } t }| | |S r   )rP  r  r7   )evcr*  r   r   r   	make_note
  s   
ztest_printer.<locals>.make_notec                     sF   t  } |    |    |    t }d|_d|_| |_|S )Nr   r   )rN  r7   r$  r]   r^   r  )rG  r   r  r   r   make_tup
  s   ztest_printer.<locals>.make_tup)rN  r7   r   rj   r0   )r  rG  r  r   r  r   test_printer
  s   
r  c                  C   s  t  } d}t }t }||j_d|j_|d |d | d |d t }t }||j_d|j_|d |d | d |d t }t }||j_d|j_|d |d | d |d t }d|_	| d |d t }t
 }d|_d|_t }| |_g d|_|d |d | d |d | S )Nr   r   r   r   rx  r`   )r   r   r`   r   r   r`   r`   )rN  rP  r  r  r[   r   r   r8  rt  r  r   r   r_  r   ra  Zscale)rG  r  r  r*  ra  r   r   r   	test_expr
  sB   

r  __main__r   r   c                 C   s    | j |ko| j |   |k}|S r   )r   ru   )r>  r   r  okr   r   r   sub
  s   r  )rk  r   inspectrJ  r   r$   rU   warningsZlilylibr   r   r   r  rf   r   r   objectr   rY   rx   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r$  r0  rN  rV  r`  rc  rm  r  rP  r  rQ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r'  r)  r,  r3  r  r6  r:  r;  r=  r@  rH  rK  r  r  rY  r  r_  re  rj  rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   exprr  rj   r   r  r  r  rT  r   r   r   r   <module>   s  
mC	
lC	
SF("(Ev
"		.#!";*<5
=
F	J
*

