B
    _U                @   sH  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|eJZKG d}d~ d~e<ZLG dd de<ZMG dd deMZNG dd deMZOG dd deNZPG dd dePZQG dd de-ZRG dd de2ZSG dd de<ZTG dd deTZUG dd de<ZVG dd de<ZWG dd de<ZXG dd dZYG dd dZZG dd de<Z[G dd deMZ\G dd deMZ]G dd de<Z^G dd de^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 de2ZlG dd de-ZmG dd de-ZnG ddĄ dăZoG ddƄ deoZpG ddȄ depZqG ddʄ depZrG dd̄ depZsG dd΄ d΃ZtddЄ Zudd҄ ZvddԄ ZwexdkrDev  eu  ew Zyeyzed  e{ey|  ed dփZ}edd׃Z~e}e~fddلZe{eye dS )    )FractionNF c             C   sh   |  dd}td|rXtd}||}d}x|D ]}|d| d 7 }q6W |d7 }n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   j/home/gub/NewGub/gub/target/mingw/src/lilypond-git.sv.gnu.org--lilypond.git-stable-2.22/python/musicexp.pyescape_instrument_string(   s    



r   c               @   s   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   s    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_duration)r   r   r   r   r   F   s    
zOutput_printer.__init__c             C   s
   || _ d S )N)r!   )r   filer   r   r   set_fileP   s    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 )N)r   r   )r   r   r   r   
get_indentW   s    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 )Nr-   )r/   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 )Nr-   zempty stack)r#   RuntimeError)r   r   r   r   revertb   s    zOutput_printer.revertc             C   s   | j d jS )Nr-   )r#   r   )r   r   r   r   duration_factorg   s    zOutput_printer.duration_factorc             C   s   |  j |7  _ d S )N)r   )r   r   r   r   r   r(   j   s    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\>z>>z->z_>z^>})r   countr(   )r   r   r   r   r   unformatted_outputm   s
    ,Jz!Output_printer.unformatted_outputc             C   s   | j |krd S | | d S )N)r%   r9   )r   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"   r)   r$   r9   )r   r   r   r   r   add_word   s    
zOutput_printer.add_wordc             C   s.   | j | jd  d| j | j | _d| _d S )N
r;   T)r!   writer   r   r   r$   )r   r   r   r   r)      s    zOutput_printer.newlinec             C   s
   d| _ d S )NT)r$   )r   r   r   r   	skipspace   s    zOutput_printer.skipspacec             C   s   |  | d S )N)dump)r   argr   r   r   __call__   s    zOutput_printer.__call__c             C   s>   | j rd| _ | | n"t|}x|D ]}| | q(W d S )NF)r$   r9   	utilitiesZ1split_string_and_preserve_doublequoted_substringsr=   )r   r   Zwordswr   r   r   rA      s    
zOutput_printer.dumpc             C   s   |    | j  d | _d S )N)r)   r!   close)r   r   r   r   rF      s    
zOutput_printer.closeN)r   r   r   __doc__r   r'   r+   r,   r/   r0   r2   r3   r(   r9   r:   r=   r)   r@   rC   rA   rF   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))rI   rJ   r   	numeratordenominator)r   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r|jd	kr|d|j|jf 7 }n|d|j 7 }| rt|a	|S )Nr   ZbreveZlonga)r-   z\brevez\longa1z%dr   .z*%d/%dz*%d)
r   rI   getrJ   r   rL   rK   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 )N)rV   r   r3   r:   )r   	outputterrU   r   r   r   print_ly   s    zDuration.print_lyc             C   s   |   S )N)rV   )r   r   r   r   __repr__   s    zDuration.__repr__c             C   s"   t  }| j|_| j|_| j|_|S )N)rH   rJ   rI   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 rDt |}n
t d|}|| | j S )Nr   r   )r   rJ   absrI   r   )r   Zdot_factlogdurbaser   r   r   
get_length   s    



zDuration.get_length)NF)
r   r   r   r   rM   rV   rX   rY   r   r_   r   r   r   r   rH      s   
rH   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)optionr   r   r   set_create_midi   s    	rb   c               C   s   yt S  tk
r   dS X dS )zy
    Return, if exists the state of the midi-option.

    @return: The state of the midi-option.
    @rtype: boolean
    FN)r`   	NameErrorr   r   r   r   get_create_midi   s    rd   c             C   s   | a d S )N)transpose_option)ra   r   r   r   set_transpose  s    rf   c             C   s^   y,| dkrdt  S | dkr*tt }| S W n, tk
rX   | dkrHdS | dkrTdS Y nX d S )Nstringz\transpose c %sintegerr   r   )re   generic_tone_to_pitch	semitones	Exception)ZoptTypepr   r   r   get_transpose  s    rm   c             C   s   | a d S )N)tab_clef_option)ra   r   r   r   set_tab_clef   s    ro   c               C   s2   ydt ft dkpt dk S  tk
r,   dS X d S )NZtabZ	moderntab)rn   rc   r   r   r   r   get_tab_clef%  s    rp   c             C   s   | a d S )N)string_numbers_option)ra   r   r   r   set_string_numbers.  s    rr   c               C   s2   ydt ft dkpt dk S  tk
r,   dS X d S )Ntf)rq   rc   r   r   r   r   get_string_numbers3  s    ru   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   r-   rN   r      )r   esr   ZesesZsesisZisis',r   a      )
Pitchstriplowerr8   octaver   ordsteprQ   
alteration)ZtoneZaccidentals_dictrl   Ztone_r   r   r   ri   :  s    ri   c             C   s   || j  }t| j}|dk r0||d |  7 }n| jdkrJ||d | 7 }|| jkrd |dd krtttd nHy$||d |d d| j|  7 }W n" tk
r   ttd Y nX |S )Nr      r   z;Language does not support microtones contained in the piecerv   )g      g      ?)r   rS   r   lywarning_KeyError)pitchZ	notenamesZaccidentalsr   Z	halftonesr   r   r   pitch_genericO  s"    



r   c          	   C   sB   t | dddddddgdd	d
dg}d|kr.|S |ddddS )NcrZ   ert   gr{   brw   ehihrx   haesasees)r   r   )r   r   r   r   r   pitch_generale  s
    r   c             C   s   t | S )N)r   )r   r   r   r   pitch_nederlandsm  s    r   c          	   C   sF   t | dddddddgdd	d
dg}|ddddddddS )Ndor   mifasollasir   ZqbZqdrZ   ZbqtqZdqZbtr   Zdt)r   r   )r   r   r   r   r   pitch_catalanq  s    r   c          	   C   sZ   t | dddddddgdd	d
dg}|dkr.dS |d dkrN|ddddS |ddS )Nr   rZ   r   rt   r   r{   r   rw   r   r   rx   hesr   r   ZaaZee)r   r   )r   r   r   r   r   pitch_deutschw  s    r   c          	   C   sF   t | dddddddgddd	d
g}|d |dd  dddd S )Nr   rZ   r   rt   r   r{   r   ZqfZqsr   r   r   Zfqr   Zsq)r   r   )r   r   r   r   r   pitch_english  s    r   c          	   C   s6   t | dddddddgdd	d
dg}|ddddS )Nr   r   r   r   r   r   r   r   cbZcsr   ZbcZtcZsc)r   r   )r   r   r   r   r   pitch_espanol  s    r   c          	   C   s&   t | dddddddgdd	d
dg}|S )Nr   u   rér   r   r   r   r   r   sbsdrZ   )r   )r   r   r   r   r   pitch_francais  s    r   c          	   C   s&   t | dddddddgdd	d
dg}|S )Nr   r   r   r   r   r   r   r   r   r   rZ   )r   )r   r   r   r   r   pitch_italiano  s    r   c          	   C   s.   t | dddddddgdd	d
dg}|ddS )Nr   rZ   r   rt   r   r{   r   essr   r   isshessr   )r   r   )r   r   r   r   r   pitch_norsk  s    r   c          	   C   s6   t | dddddddgdd	d
dg}|ddddS )Nr   r   r   r   r   r   r   r   ZbqtZsqtr   ZbbqZbtqZssqZstq)r   r   )r   r   r   r   r   pitch_portugues  s    r   c          	   C   sB   t | dddddddgdd	d
dg}|dkr.dS |ddddS )Nr   rZ   r   rt   r   r{   r   rw   r   r   rx   r   r   r   r   r   )r   r   )r   r   r   r   r   pitch_suomi  s
    r   c          	   C   sB   t | dddddddgdd	d
dg}|dkr.dS |ddddS )Nr   rZ   r   rt   r   r{   r   r   r   r   r   r   r   r   r   r   rw   )r   r   )r   r   r   r   r   pitch_svenska  s
    r   c          	   C   s&   t | dddddddgdd	d
dg}|S )Nr   r   r   r   r   r   r   r   ZhbZhkk)r   )r   r   r   r   r   pitch_vlaams  s    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   rQ   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_pitch)r   r   r   r   r     s    zPitch.__init__c             C   s   |   S )N)rV   )r   r   r   r   rY     s    zPitch.__repr__c             C   sj   |   }| j|j7  _| j|j7  _| j|j7  _|  |  |  }| j||  7  _|S )N)r   r   r   r   	normalizerj   )r   Zintervalr   Z	target_str   r   r   
transposed  s    zPitch.transposedc             C   sP   x*| j dk r*|  j d7  _ |  jd8  _qW |  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   rM     s    zPitch.lisp_expressionc             C   s*   t  }| j|_| j|_| j|_| j|_|S )N)r~   r   r   r   r   )r   rl   r   r   r   r     s    z
Pitch.copyc             C   s   | j | jd  S )Nr}   )r   r   )r   r   r   r   steps  s    zPitch.stepsc             C   s(   | j d dddddddg| j  | j S )	N   r   rv   r   r|   r}   	      )r   r   r   )r   r   r   r   rj     s    zPitch.semitonesc             C   s   | j dk r@dddddddg| j r@|  j d7  _ |  jd8  _n>| j dkr~dddddddg| j r~|  j d8  _ |  jd7  _|   d S )Nr   TFr   )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  }|  }x2t|| |   dkrb|  j|7  _|   q2W |  j || |   7  _ |   d S )Nr   )r   r-   r   )r   rj   r[   r   r   r   )r   numberZsemiZsignprevr   r   r   add_semitones	  s    
zPitch.add_semitonesc             C   s   t | S )N)r   )r   r   r   r   ly_step_expression  s    zPitch.ly_step_expressionc             C   s:   | j dkrd| j d  S | j dk r2d| j  d  S dS d S )Nr   ry   r   r-   rz   r   )r   )r   r   r   r   absolute_pitch  s
    

zPitch.absolute_pitchc             C   sv   t s| a |  S t jd t j }| jd | j }|| }| a |dkrTd|d d  S |dk rnd| d d  S dS d S )Nr}   r   ry   rz   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   s0   |   }tr | js ||  7 }n||  7 }|S )N)r   relative_pitchesr   r   r   )r   r   r   r   r   rV   1  s
    
zPitch.ly_expressionc             C   s   ||    d S )N)rV   )r   rW   r   r   r   rX   9  s    zPitch.print_lyN)r   r   r   r   rY   r   r   rM   r   r   rj   r   r   r   r   r   rV   rX   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
identifier)r   r   r   r   r   >  s    
zMusic.__init__c             C   s   t dS )Nr   )r   )r   r   r   r   r_   D  s    zMusic.get_lengthc             C   s   dS )Nr   r   )r   r   r   r   get_propertiesG  s    zMusic.get_propertiesc             C   s   dS )NFr   )r   r   r   r   has_childrenJ  s    zMusic.has_childrenc             C   s   | j r| j j| S d S d S )N)r   elementsindex)r   r   r   r   	get_indexM  s    zMusic.get_indexc             C   s   | j jS )N)	__class__r   )r   r   r   r   nameS  s    z
Music.namec             C   s   |   }|  }d||f S )Nz(make-music '%s %s))r   r   )r   r   propsr   r   r   rM   V  s    zMusic.lisp_expressionc             C   s
   || _ d S )N)r   )r   r   r   r   r   	set_start]  s    zMusic.set_startc             C   s   || r| S d S )Nr   )r   	predicater   r   r   
find_first`  s    zMusic.find_firstNc             C   s\   |s
| j }|sd S |dkr&|  d S |d}x&|D ]}|rL|d|  |  q6W d S )Nr>   z% )r   r)   r	   r9   )r   printertextlineslr   r   r   print_commente  s    

zMusic.print_commentc             C   s$   | j r|d| j   n
| | d S )Nz\%s)r   rX   )r   r   r   r   r   print_with_identifierv  s    zMusic.print_with_identifierc             C   s   ||    d S )N)rV   )r   r   r   r   r   rX   |  s    zMusic.print_ly)N)r   r   r   r   r_   r   r   r   r   rM   r   r   r   r   rX   r   r   r   r   r   =  s   
r   c               @   s   e Zd Zdd Zdd ZdS )MusicWrapperc             C   s   t |  d | _d S )N)r   r   element)r   r   r   r   r     s    
zMusicWrapper.__init__c             C   s   | j | d S )N)r   rX   )r   funcr   r   r   rX     s    zMusicWrapper.print_lyN)r   r   r   r   rX   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )ModeChangingMusicWrapperc             C   s   t |  d| _d S )NZnotemode)r   r   mode)r   r   r   r   r     s    
z!ModeChangingMusicWrapper.__init__c             C   s   |d| j   t| | d S )Nz\%s)r   r   rX   )r   r   r   r   r   rX     s    z!ModeChangingMusicWrapper.print_lyN)r   r   r   r   rX   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )RelativeMusicc             C   s   t |  d | _d S )N)r   r   	basepitch)r   r   r   r   r     s    
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   rX   )r   r   Zprev_relative_pitchesr   r   r   rX     s    
zRelativeMusic.print_lyN)r   r   r   r   rX   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )TimeScaledMusicc             C   sD   t |  d| _d| _d| _d | _d| _d | _d | _d | _	d | _
d S )Nr   actualbracket)r   r   rK   rL   display_numberdisplay_typedisplay_bracketactual_typenormal_typedisplay_numeratordisplay_denominator)r   r   r   r   r     s    
zTimeScaledMusic.__init__c             C   s  | j d kr|d |  n(| j dkrDttd |d |  dddd| jd }| jd	krv| jrvd
| j }nF| jdkr| js| jr| jr| j}nd}| jr| j}nd}d||f }| j	d	kr| j
r| j
 }|d||f  |  n| j	dkr| jd kr|d |  nx| jdkr| j
 }| jrD| j }n|}| jsX| jrz|d| j|| j|f  |  n|d||f  |  n>| jd k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   r)   r   r   r   rQ   r   r   r   r   r   rM   r   rK   rL   r0   r   r   rX   r2   )r   r   Zbase_number_functionZnumZdenZbase_durationZden_durationZnum_durationr   r   r   rX     sp    











zTimeScaledMusic.print_lyN)r   r   r   r   rX   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S )NestedMusicc             C   s   t |  g | _d S )N)r   r   r   )r   r   r   r   r     s    
zNestedMusic.__init__c             C   s   |r| j | d S )N)r   r.   )r   Zwhatr   r   r   r.     s    zNestedMusic.appendc             C   s   | j S )N)r   )r   r   r   r   r     s    zNestedMusic.has_childrenc             C   s   |j d kst|d ks$|| jks$td}|rJ| j|}|dkrj|d7 }n |dk rXd}n|dkrjt| j}| j|| | |_ d S )Nr   r   )r   AssertionErrorr   r   r<   insert)r   ZsuccZeltdiridxr   r   r   insert_around  s    

zNestedMusic.insert_aroundc             C   s   dd dd | jD  S )Nz'elements (list %s)r;   c             S   s   g | ]}|  qS r   )rM   ).0xr   r   r   
<listcomp>  s    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 )Nz'elements (list %s)r;   c             S   s   g | ]}|  qS r   )rM   )r   r   r   r   r   r     s    z5NestedMusic.get_subset_properties.<locals>.<listcomp>)r   listfilterr   )r   r   r   r   r   get_subset_properties  s    z!NestedMusic.get_subset_propertiesc             C   sJ   |j | kst| j|}||7 }t|t| jd }t|d}| j| S )Nr   r   )r   r   r   r   minr<   max)r   musicr   r   r   r   r   get_neighbor  s    
zNestedMusic.get_neighborc             C   s$   || j kst| j | d |_d S )N)r   r   remover   )r   r   r   r   r   delete_element(  s    zNestedMusic.delete_elementc             C   s$   || _ x| jD ]}|| qW d S )N)r   r   r   )r   r   r   r   r   r   r   .  s    zNestedMusic.set_startc             C   s:   t | |}|r|S x | jD ]}||}|r|S qW d S )N)r   r   r   )r   r   rr   r   r   r   r   3  s    
zNestedMusic.find_firstN)r   r   r   r   r.   r   r   r   r   r   r   r   r   r   r   r   r   r     s   	r   c               @   s.   e Zd Zdd ZdddZdd Zdd	 Zd
S )SequentialMusicc             C   sn   d }t | jd }x4|dkrFt| j| tsFt| j| tsF|d8 }qW |dkrjt| j| trj| j| }|S )Nr   r   )r<   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$|  x| jD ]}|| q,W |d |rR|  d S )Nr5   r7   )r   r   r)   r   rX   )r   r   r)   r   r   r   r   rX   L  s    
zSequentialMusic.print_lyc             C   s   |   }| |}d||f S )Nz(make-music '%s %s))r   r   )r   Zpredr   r   r   r   r   lisp_sub_expressionZ  s    
z#SequentialMusic.lisp_sub_expressionc             C   s*   x$| j D ]}|| || 7 }qW d S )N)r   r   r_   )r   r   r   r   r   r   r   a  s    
zSequentialMusic.set_startN)T)r   r   r   r  rX   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	S )
RepeatedMusicc             C   s   d| _ d| _g | _d | _d S )NZvoltarv   )repeat_typerepeat_countendingsr   )r   r   r   r   r   h  s    zRepeatedMusic.__init__c             C   sJ   t |tr|| _n4t |tr.t | _|| j_nttd|| d  d S )Nz;unable to set the music %(music)s for the repeat %(repeat)s)r   repeat)	r  r   r   r   r  r   r   r   r   )r   r   r   r   r   	set_musicn  s    



zRepeatedMusic.set_musicc             C   s   | j | d S )N)r  r.   )r   r   r   r   r   
add_endingx  s    zRepeatedMusic.add_endingc             C   sz   | d| j| jf  | jr*| j| nttd | d | jrv| d x| jD ]}|| qZW | d d S )Nz\repeat %s %szencountered repeat without bodyz{}z\alternative {r7   )	rA   r	  r
  r   rX   r   r   r   r  )r   r   r   r   r   r   rX   {  s    

zRepeatedMusic.print_lyN)r   r   r   r   r  r  rX   r   r   r   r   r  g  s   
r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )Lyricsc             C   s
   g | _ d S )N)lyrics_syllables)r   r   r   r   r     s    zLyrics.__init__c             C   s,   | |   |  | d |  d S )Nr7   )rA   rV   r)   )r   r   r   r   r   rX     s    
zLyrics.print_lyc             C   s    d}x| j D ]}||7 }qW |S )Nz&\lyricmode {\set ignoreMelismata = ##t)r  )r   Zlstrr   r   r   r   rV     s    zLyrics.ly_expressionN)r   r   r   r   rX   rV   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	S )
Headerc             C   s
   i | _ d S )N)header_fields)r   r   r   r   r     s    zHeader.__init__c             C   s   || j |< d S )N)r  )r   fieldr  r   r   r   	set_field  s    zHeader.set_fieldc             C   s   | |d  |dkrzd|krz|dd}| d |d}x&|D ]}|  | d| d  qDW | d	 |  n
| | |  d S )
Nz = Ztexidocr>   r   r   z\markup \column {z	\line { "z"}r7   )rA   r   r	   r)   )r   keyr  r   Z
substringsr   r   r   r   format_header_strings  s    





zHeader.format_header_stringsc             C   s^   | d |  x,t| j D ]\}}|r"| ||| q"W | d |  |  d S )Nz	\header {r7   )rA   r)   r   r  itemsr  )r   r   r   vr   r   r   rX     s    

zHeader.print_lyN)r   r   r   r   r  r  rX   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	S )
Paperc             C   sX   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _g | _d S )Nr-   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_names)r   r   r   r   r     s    zPaper.__init__c             C   s&   |dkr"| d||f  |  d S )Nr   z
%s = %s\cm)rA   r)   )r   r   r  r  r   r   r   print_length_field  s    zPaper.print_length_fieldc             C   sD   d}x:| j D ]0}|d}x |D ]}t|t|kr |}q W qW |S )Nr   r>   )r%  r	   r<   )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r| |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   r#  zshort-indentr7   )r  rA   r)   r&  r  r  r  r  r  r   r!  r"  r<   r)  r#  r$  )r   r   Zchar_per_cmr   r   r   rX     s4    





zPaper.print_lyN)r   r   r   r   r&  r)  rX   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	S )
Layoutc             C   s
   i | _ d S )N)context_dict)r   r   r   r   r   	  s    zLayout.__init__c             C   s   || j krg | j |< d S )N)r,  )r   contextr   r   r   add_context  s    
zLayout.add_contextc             C   s,   |  | || j| kr(| j| | d S )N)r.  r,  r.   )r   r-  itemr   r   r   set_context_item  s    
zLayout.set_context_itemc             C   s   t | j r|d |  xbt | j D ]P\}}|d|  |  x|D ]}|| |  qTW |d |  q0W |d |  d S )Nz	\layout {z\context { \%sr7   )r   r,  r  rA   r)   )r   r   r-  ZdefsrZ   r   r   r   rX     s    




zLayout.print_lyN)r   r   r   r   r.  r0  rX   r   r   r   r   r+    s   r+  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S )r  c             C   s    t |  d | _d | _d | _d S )N)r   r   after_grace_elementsgrace_elements
grace_type)r   r   r   r   r   &  s    
zChordEvent.__init__c             C   s"   |r| j st | _ | j | d S )N)r2  r  r.   )r   r   r   r   r   append_grace,  s    zChordEvent.append_gracec             C   s"   |r| j st | _ | j | d S )N)r1  r  r.   )r   r   r   r   r   append_after_grace2  s    zChordEvent.append_after_gracec             C   s   dd | j D g kS )Nc             S   s$   g | ]}t |tst |tr|qS r   )r  	NoteEvent	RestEvent)r   r   r   r   r   r   9  s    z+ChordEvent.has_elements.<locals>.<listcomp>)r   )r   r   r   r   has_elements8  s    zChordEvent.has_elementsc             C   s*   t d}x| jD ]}t|| }qW |S )Nr   )r   r   r   r_   )r   r   r   r   r   r   r_   <  s    zChordEvent.get_lengthc             C   s&   dd | j D }|r|d jS d S d S )Nc             S   s$   g | ]}t |tst |tr|qS r   )r  r6  r7  )r   r   r   r   r   r   C  s    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rx| j rx| jr`|d| j  n|d | j|d nN| jrttd	| j  | jr|d| j  n|d | j|d |d
 x|D ]}|| qW |r|d | nt	|dkr|d | n|rg }d }d }xX|D ]P}	|	j
r^x(|	j
D ]}
t|
tr<|
jr<|
}q<W ||	  |s(t}q(W |r||  |dd|  |a|  }|r|| n x|D ]}|| qW x|D ]}|| qW | jr|d | j|d | | d S )Nc             S   s   g | ]}t |tr|qS r   )r  r6  )r   r   r   r   r   r   K  s    z'ChordEvent.print_ly.<locals>.<listcomp>c             S   s$   g | ]}t |trt |ts|qS r   )r  RhythmicEventr6  )r   r   r   r   r   r   N  s    
c             S   s   g | ]}t |ts|qS r   )r  r<  )r   r   r   r   r   r   R  s    z\afterGrace {z\%sz\graceFz&Grace note with no following music: %sz{}r   r   z<%s>r;   r7   )r   r1  r2  r3  rX   r   r   r   print_before_noter<   associated_eventsr  	StemEventr  r.   chord_element_lyr   rV   r   r;  print_after_noter   )r   r   r:  Zrest_eventsZother_eventsr   Zpitchesr   Zstemr   Zaevr9  r   r   r   rX   J  sf    







zChordEvent.print_lyN)
r   r   r   r   r4  r5  r8  r_   r;  rX   r   r   r   r   r  %  s   r  c               @   s   e Zd Zdd Zdd ZdS )Partialc             C   s   t |  d | _d S )N)r   r   partial)r   r   r   r   r     s    
zPartial.__init__c             C   s   | j r|d| j    d S )Nz\partial %s)rC  rA   rV   )r   r   r   r   r   rX     s    zPartial.print_lyN)r   r   r   r   rX   r   r   r   r   rB    s   rB  c               @   s$   e Zd Zdd Zdd Zdd ZdS )r  c             C   s   t |  d| _d | _d S )Nr   )r   r   
bar_numbertype)r   r   r   r   r     s    
zBarLine.__init__c             C   s   ddddddddddd	d
 | jd }|d k	r>|d|  n
|d | jdkrr| jd dkrr|d| j  n| jdkr|d| j  |  d S )N|:dashedz||z|.z.|z.|.ry   r   )ZregulardottedrH  Zheavyzlight-lightzlight-heavyzheavy-lightzheavy-heavyZtickZshortnonez	\bar "%s"r   
   z\barNumberCheck #%d z %% %d)rQ   rE  rA   rD  r(   r)   )r   r   Z
bar_symbolr   r   r   rX     s    

zBarLine.print_lyc             C   s   dS )Nz | r   )r   r   r   r   rV     s    zBarLine.ly_expressionN)r   r   r   r   rX   rV   r   r   r   r   r    s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )Eventc             C   s   d | _ d | _d S )N)before_note
after_note)r   r   r   r   r     s    zEvent.__init__c             C   s   | j r|| j  d S )N)rM  rA   )r   r   r   r   r   r=    s    zEvent.print_before_notec             C   s   | j r|| j  d S )N)rN  rA   )r   r   r   r   r   rA    s    zEvent.print_after_noteN)r   r   r   r   r=  rA  r   r   r   r   rL    s   rL  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	SpanEventc             C   s&   t |  d| _d| _d| _d| _d S )Nr   Zsolid)rL  r   span_direction	line_type	span_typesize)r   r   r   r   r     s
    
zSpanEvent.__init__c             C   s   dS )NTr   )r   r   r   r   wait_for_note  s    zSpanEvent.wait_for_notec             C   s
   d| j  S )Nz'span-direction  %d)rP  )r   r   r   r   r     s    zSpanEvent.get_propertiesc             C   s
   || _ d S )N)rR  )r   rE  r   r   r   set_span_type  s    zSpanEvent.set_span_typeN)r   r   r   r   rT  r   rU  r   r   r   r   rO    s   rO  c               @   s$   e Zd Zdd Zdd Zdd ZdS )	SlurEventc             C   s0   ddd | jd}|r,| jdkr,|| d S )Nz\slurDottedz\slurDashed)rI  rH  r   r-   )rQ   rQ  rP  rA   )r   r   commandr   r   r   r=    s    zSlurEvent.print_before_notec             C   s0   ddd | jd}|r,| jdkr,|| d S )Nz
\slurSolid)rI  rH  r   r-   )rQ   rQ  rP  rA   )r   r   rW  r   r   r   rA    s    zSlurEvent.print_after_notec             C   s   ddd | jdS )N())r-   r   r   )rQ   rP  )r   r   r   r   rV     s    zSlurEvent.ly_expressionN)r   r   r   r=  rA  rV   r   r   r   r   rV    s   rV  c               @   s   e Zd Zdd ZdS )	BeamEventc             C   s   ddd | jdS )N[])r-   r   r   )rQ   rP  )r   r   r   r   rV     s    zBeamEvent.ly_expressionN)r   r   r   rV   r   r   r   r   rZ    s   rZ  c               @   s   e Zd Zdd ZdS )
PedalEventc             C   s   dddd | jdS )Nz
\sustainOnz\sustainOff\sustainOnz\sustainOff)r-   r   r   r   )rQ   rP  )r   r   r   r   rV     s    zPedalEvent.ly_expressionN)r   r   r   rV   r   r   r   r   r]    s   r]  c               @   s$   e Zd Zdd Zdd Zdd ZdS )TextSpannerEventc             C   sL   t | dr| jdkr|d t | drHdddd| jd	}|| d S )
Nstylewavez+\once \override TextSpanner.style = #'trillforce_directionz\textSpannerDownz\textSpannerNeutralz\textSpannerUp)r-   r   r   r   )hasattrr_  rA   rQ   ra  )r   r   r   r   r   r   r=    s    

z"TextSpannerEvent.print_before_notec             C   s   d S )Nr   )r   r   r   r   r   rA    s    z!TextSpannerEvent.print_after_notec             C   sl   t | dr| jdkrdS tdkr4ddd| jdS t | drT| jdkrTtd	krTdS d
dd| jdS d S )Nr_  ignorer   r`  z\startTextSpanz\stopTextSpan)r-   r   stopZtrillz\startTrillSpanz\stopTrillSpan)rb  r_  whatOrnamentrQ   rP  )r   r   r   r   rV   	  s    zTextSpannerEvent.ly_expressionN)r   r   r   r=  rA  rV   r   r   r   r   r^    s   r^  c               @   s$   e Zd Zdd Zdd Zdd ZdS )BracketSpannerEventc             C   sB   | j dkr>| jdkr |d n| jdkr4|d |d d S )Nr-   r   z/\once \override LigatureBracket.direction = #UPz1\once \override LigatureBracket.direction = #DOWNz\[)rP  ra  rA   )r   r   r   r   r   r=    s    


z%BracketSpannerEvent.print_before_notec             C   s   | j dkr|d d S )Nr   z\])rP  rA   )r   r   r   r   r   rA  $  s    
z$BracketSpannerEvent.print_after_notec             C   s   dS )Nr   r   )r   r   r   r   rV   )  s    z!BracketSpannerEvent.ly_expressionN)r   r   r   r=  rA  rV   r   r   r   r   rf    s   
rf  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
OctaveShiftEventc             C   s   dS )NFr   )r   r   r   r   rT  .  s    zOctaveShiftEvent.wait_for_notec             C   s   ddd |d| _d S )Nr   r-   )Zupdownr   )rQ   rR  )r   rE  r   r   r   rU  1  s    zOctaveShiftEvent.set_span_typec             C   sT   yddd| j  }W n, tk
r@   ttd| j   d}Y nX |d| j 9 }|S )Nr   rv   )      z4Invalid octave shift size found: %s. Using no shift.r   r-   )rS  r   r   r   r   rR  )r   r  r   r   r   ly_octave_shift_indicator4  s    
z*OctaveShiftEvent.ly_octave_shift_indicatorc             C   s,   |   }d}|rd| }|dd| jdS )Nr   z\ottava #%sz
\ottava #0)r-   r   )rk  rQ   rP  )r   r   r  r   r   r   rV   @  s    zOctaveShiftEvent.ly_expressionN)r   r   r   rT  rU  rk  rV   r   r   r   r   rg  -  s   rg  c               @   s   e Zd Zdd ZdS )TrillSpanEventc             C   s   dddd | jdS )Nz\startTrillSpanr   z\stopTrillSpan)r-   r   r   )rQ   rP  )r   r   r   r   rV   K  s    zTrillSpanEvent.ly_expressionN)r   r   r   rV   r   r   r   r   rl  J  s   rl  c               @   s   e Zd Zdd Zdd ZdS )GlissandoEventc             C   s6   | j dkr2dddd| jd }|r2|d|  d S )Nr-   zdashed-linezdotted-lineZzigzag)rH  rI  Zwavyz&\once \override Glissando.style = #'%s)rP  rQ   rQ  rA   )r   r   r_  r   r   r   r=  R  s    

z GlissandoEvent.print_before_notec             C   s   ddd | jdS )Nz
\glissandor   )r-   r   )rQ   rP  )r   r   r   r   rV   ]  s    zGlissandoEvent.ly_expressionN)r   r   r   r=  rV   r   r   r   r   rm  Q  s   rm  c               @   s4   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 )Nr   F)rL  r   	directionnon_arpeggiate)r   r   r   r   r   c  s    
zArpeggioEvent.__init__c             C   s   dS )NTr   )r   r   r   r   rT  h  s    zArpeggioEvent.wait_for_notec             C   s8   | j r|d n"ddd| jd}|r4|| d S )Nz\arpeggioBracketz\arpeggioArrowDownz\arpeggioArrowUp)r-   r   r   )rp  rA   rQ   ro  )r   r   r   r   r   r   r=  k  s    zArpeggioEvent.print_before_notec             C   s   | j s| jr|d d S )Nz\arpeggioNormal)rp  ro  rA   )r   r   r   r   r   rA  t  s    zArpeggioEvent.print_after_notec             C   s   dS )Nz	\arpeggior   )r   r   r   r   rV   x  s    zArpeggioEvent.ly_expressionN)r   r   r   r   rT  r=  rA  rV   r   r   r   r   rn  b  s
   	rn  c               @   s   e Zd Zdd ZdS )TieEventc             C   s   dS )N~r   )r   r   r   r   rV   }  s    zTieEvent.ly_expressionN)r   r   r   rV   r   r   r   r   rq  |  s   rq  c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )HairpinEventc             C   s   dddd |d| _d S )Nr   r-   )Z	crescendoZdecrescendoZ
diminuendor   )rQ   rR  )r   rE  r   r   r   rU    s    zHairpinEvent.set_span_typec             C   s&   | j dkrdS ddd| jdS d S )Nr   z\!z\<z\>)r   r-   r   )rP  rQ   rR  )r   r   r   r   hairpin_to_ly  s    
zHairpinEvent.hairpin_to_lyc             C   s   dddd | jdS )N^r   -)r   r-   r   )rQ   ra  )r   r   r   r   direction_mod  s    zHairpinEvent.direction_modc             C   s   |   S )N)rt  )r   r   r   r   rV     s    zHairpinEvent.ly_expressionc             C   s&   |   }|r"|d|  |f  d S )Nz%s%s)rt  rA   rw  )r   r   valr   r   r   rX     s    zHairpinEvent.print_lyN)r   r   r   rU  rt  rw  rV   rX   r   r   r   r   rs    s
   rs  c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )DynamicsEventc             C   s   t |  d | _d| _d S )Nr   )rL  r   rE  ra  )r   r   r   r   r     s    
zDynamicsEvent.__init__c             C   s   dS )NTr   )r   r   r   r   rT    s    zDynamicsEvent.wait_for_notec             C   s   | j rd| j  S d S d S )Nz\%s)rE  )r   r   r   r   rV     s    
zDynamicsEvent.ly_expressionc             C   s   dddd | jdS )Nru  r   rv  )r   r-   r   )rQ   ra  )r   r   r   r   rw    s    zDynamicsEvent.direction_modc             C   s"   | j r|d|  | j f  d S )Nz%s\%s)rE  rA   rw  )r   r   r   r   r   rX     s    zDynamicsEvent.print_lyN)r   r   r   r   rT  rV   rw  rX   r   r   r   r   ry    s
   ry  c               @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )	MarkEvent\defaultc             C   s   t |  || _d S )N)rL  r   mark)r   r   r   r   r   r     s    
zMarkEvent.__init__c             C   s   dS )NFr   )r   r   r   r   rT    s    zMarkEvent.wait_for_notec             C   s   | j rd| j  S dS d S )Nz%sz"ERROR")r|  )r   r   r   r   ly_contents  s    
zMarkEvent.ly_contentsc             C   s   d|    S )Nz\mark %s)r}  )r   r   r   r   rV     s    zMarkEvent.ly_expressionN)r{  )r   r   r   r   rT  r}  rV   r   r   r   r   rz    s   
rz  c               @   s   e Zd Zdd ZdS )MusicGlyphMarkEventc             C   s   | j rd| j  S dS d S )Nz$\markup { \musicglyph "scripts.%s" }r   )r|  )r   r   r   r   r}    s    
zMusicGlyphMarkEvent.ly_contentsN)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	S )
	TextEventc             C   s    t |  d | _d | _d| _d S )Nr   )rL  r   ZTextra  markup)r   r   r   r   r     s    
zTextEvent.__init__c             C   s   dS )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   rT    s    zTextEvent.wait_for_notec             C   s   dddd | jdS )z 1: placement="above"; -1: placement="below"; 0: no placement attribute.
        see musicxml_direction_to_indicator in musicxml2ly_conversion.py ru  r   rv  )r   r-   r   )rQ   ra  )r   r   r   r   rw    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  rw  r   )r   Zbase_stringr   r   r   rV     s    zTextEvent.ly_expressionN)r   r   r   r   rT  rw  rV   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	S )
ArticulationEventc             C   s   t |  d | _d | _d S )N)rL  r   rE  ra  )r   r   r   r   r     s    
zArticulationEvent.__init__c             C   s   dS )NTr   )r   r   r   r   rT    s    zArticulationEvent.wait_for_notec             C   s   dddd | jdS )Nru  r   rv  )r   r-   r   r   )rQ   ra  )r   r   r   r   rw    s    zArticulationEvent.direction_modc             C   s   d|   | jf S )Nz%s\%s)rw  rE  )r   r   r   r   rV     s    zArticulationEvent.ly_expressionN)r   r   r   r   rT  rw  rV   r   r   r   r   r    s   r  c               @   s   e Zd Zdd Zdd ZdS )ShortArticulationEventc             C   s   dddd | jdS )Nru  r   rv  )r   r-   r   )rQ   ra  )r   r   r   r   rw  	  s    z$ShortArticulationEvent.direction_modc             C   s    | j rd|  | j f S dS d S )Nz%s%sr   )rE  rw  )r   r   r   r   rV     s    z$ShortArticulationEvent.ly_expressionN)r   r   r   rw  rV   r   r   r   r   r    s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )NoDirectionArticulationEventc             C   s
   | j dkS )NZbreathe)rE  )r   r   r   r   is_breathing_sign  s    z.NoDirectionArticulationEvent.is_breathing_signc             C   s   |   r|d d S )Nz\breathe)r  rA   )r   r   r   r   r   rA    s    z-NoDirectionArticulationEvent.print_after_notec             C   s    | j r|  sd| j  S dS d S )Nz\%sr   )rE  r  )r   r   r   r   rV   !  s    
z*NoDirectionArticulationEvent.ly_expressionN)r   r   r   r  rA  rV   r   r   r   r   r    s   r  c               @   s   e Zd Zdd Zdd ZdS )MarkupEventc             C   s   t |  d | _d S )N)r  r   contents)r   r   r   r   r   )  s    
zMarkupEvent.__init__c             C   s    | j rd|  | j f S dS d S )Nz%s\markup { %s }r   )r  rw  )r   r   r   r   rV   -  s    zMarkupEvent.ly_expressionN)r   r   r   r   rV   r   r   r   r   r  (  s   r  c               @   s   e Zd Zdd Zdd ZdS )	FretEventc             C   s,   t |  d| _d| _d| _d | _g | _d S )Nr      r   )r  r   ra  r
   fretsbarrer   )r   r   r   r   r   5  s    
zFretEvent.__init__c          	   C   s  d}| j dkr|d| j  7 }| jdkr4|d| j 7 }| jrtt| jdkrt|d| jd | jd	 | jd
 td f 7 }d}xt| jD ]j}t|d	kr|d|d |d	 tddft|d	 t  f 7 }t|d
krd}|d|d
  7 }|d7 }qW |rd| }|rd|  |f S dS d S )Nr   r  zw:%s;r   zh:%s;r   zc:%s-%s-%s;r   r   rv   rh   Fz%s-%sTz-%s;zf:1;z!%s\markup { \fret-diagram #"%s" })	r
   r  r  r<   rm   r   r  strrw  )r   rx  Zhave_fingeringir   r   r   rV   =  s,    

zFretEvent.ly_expressionN)r   r   r   r   rV   r   r   r   r   r  4  s   r  c               @   s   e Zd Zdd Zdd ZdS )FretBoardNotec             C   s    t |  d | _d | _d | _d S )N)r   r   r   rg   	fingering)r   r   r   r   r   X  s    
zFretBoardNote.__init__c             C   s6   | j  }| jr|d| j 7 }| jr2|d| j 7 }|S )Nz-%sz\%s)r   rV   r  rg   )r   r   r   r   r   rV   ^  s    
zFretBoardNote.ly_expressionN)r   r   r   r   rV   r   r   r   r   r  W  s   r  c               @   s   e Zd Zdd Zdd ZdS )FretBoardEventc             C   s   t |  d | _d S )N)r   r   r9  )r   r   r   r   r   h  s    
zFretBoardEvent.__init__c             C   sT   dd | j D }|rPg }x|D ]}||  qW d|}|d|| jf  d S )Nc             S   s   g | ]}t |tr|qS r   )r  r  )r   nr   r   r   r   n  s    z+FretBoardEvent.print_ly.<locals>.<listcomp>r;   z<%s>%s)r   r.   rV   r   r9  )r   r   Zfretboard_notesnotesr  r  r   r   r   rX   l  s    

zFretBoardEvent.print_lyN)r   r   r   r   rX   r   r   r   r   r  g  s   r  c               @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )FunctionWrapperEventNc             C   s   t |  || _d S )N)rL  r   function_name)r   r  r   r   r   r   x  s    
zFunctionWrapperEvent.__init__c             C   s   | j rd| j  S dS d S )Nz\%sr   )r  )r   is_chord_elementr   r   r   pre_note_ly|  s    
z FunctionWrapperEvent.pre_note_lyc             C   s   dS )Nr   r   )r   r   r   r   pre_chord_ly  s    z!FunctionWrapperEvent.pre_chord_lyc             C   s   | j rd| j  S dS d S )Nz\%sr   )r  )r   r   r   r   rV     s    
z"FunctionWrapperEvent.ly_expression)N)r   r   r   r   r  r  rV   r   r   r   r   r  w  s   
r  c               @   s   e Zd Zdd ZdS )ParenthesizeEventc             C   s   t | d d S )NZparenthesize)r  r   )r   r   r   r   r     s    zParenthesizeEvent.__init__N)r   r   r   r   r   r   r   r   r    s   r  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   s   t |  d | _d S )N)rL  r   r  )r   r   r   r   r     s    
zStemEvent.__init__c             C   s   | j rd| j  S dS d S )Nz\%sr   )r  )r   r   r   r   r    s    
zStemEvent.pre_chord_lyc             C   s   dS )Nr   r   )r   r  r   r   r   r    s    zStemEvent.pre_note_lyc             C   s   |   S )N)r  )r   r   r   r   rV     s    zStemEvent.ly_expressionN)r   r   r   rG   r   r  r  rV   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	S )
NotestyleEventc             C   s    t |  d | _d | _d | _d S )N)rL  r   r_  Zfilledcolor)r   r   r   r   r     s    
zNotestyleEvent.__init__c             C   sF   d}| j r|d| j  7 }| jrB|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   rv   )r_  r  )r   Zreturn_stringr   r   r   r    s     zNotestyleEvent.pre_chord_lyc             C   s   | j r|rd| j  S dS d S )Nz\tweak style #%sr   )r_  )r   r  r   r   r   r    s    

zNotestyleEvent.pre_note_lyc             C   s   |   S )N)r  )r   r   r   r   rV     s    zNotestyleEvent.ly_expressionN)r   r   r   r   r  r  rV   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	S )
StemstyleEventc             C   s   t |  d | _d S )N)rL  r   r  )r   r   r   r   r     s    
zStemstyleEvent.__init__c             C   s.   | j r&d| j d | j d | j d f S dS d S )Nz2\once \override Stem.color = #(rgb-color %s %s %s)r   r   rv   r   )r  )r   r   r   r   r    s     zStemstyleEvent.pre_chord_lyc             C   s   dS )Nr   r   )r   r  r   r   r   r    s    zStemstyleEvent.pre_note_lyc             C   s   |   S )N)r  )r   r   r   r   rV     s    zStemstyleEvent.ly_expressionN)r   r   r   r   r  r  rV   r   r   r   r   r    s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )
ChordPitchc             C   s   d| _ d| _d S )Nr   )r   r   )r   r   r   r   r     s    zChordPitch.__init__c             C   s   |   S )N)rV   )r   r   r   r   rY     s    zChordPitch.__repr__c             C   s   t | S )N)r   )r   r   r   r   rV     s    zChordPitch.ly_expressionN)r   r   r   r   rY   rV   r   r   r   r   r    s   r  c               @   s   e Zd Zdd Zdd ZdS )ChordModificationc             C   s   d| _ d| _d| _d S )Nr   )r   r   rE  )r   r   r   r   r     s    zChordModification.__init__c             C   sL   | j rDddd| j d}|d| j 7 }|ddd| jd7 }|S dS d S )NrP   ru  )r   r-   r   z%s+rv  )rE  rQ   r   r   )r   rx  r   r   r   rV     s    zChordModification.ly_expressionN)r   r   r   r   rV   r   r   r   r   r    s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )ChordNameEventc             C   s,   t |  d | _d | _d | _g | _d | _d S )N)rL  r   rootkindr9  modificationsbass)r   r   r   r   r     s    
zChordNameEvent.__init__c             C   s   | j | d S )N)r  r.   )r   modr   r   r   add_modification  s    zChordNameEvent.add_modificationc             C   s   | j s
dS | j  }| jr(|| j 7 }| jr8|| j }x$| jD ]}|jdkr@|| 7 }q@W x$| jD ]}|jdkrf|| 7 }qfW | jr|d| j  7 }|S )Nr   r   r-   z/+%s)r  rV   r9  r  r  rE  r  )r   r  mr   r   r   rV     s     



zChordNameEvent.ly_expressionN)r   r   r   r   r  rV   r   r   r   r   r    s   r  c               @   s   e Zd Zdd Zdd ZdS )TremoloEventc             C   s   t |  d| _d S )Nr   )rL  r   strokes)r   r   r   r   r     s    
zTremoloEvent.__init__c             C   sf   d}| j rbt| j dkrbtdk r<|dddt| j    7 }n&|ddtttdt| j    7 }|S )Nr   r   ri  z:%srv   )r  rS   rT   mathr\   )r   Zly_strr   r   r   rV     s     zTremoloEvent.ly_expressionN)r   r   r   r   rV   r   r   r   r   r    s   r  c               @   s   e Zd Zdd Zdd ZdS )	BendEventc             C   s   t |  d | _d S )N)rL  r   alter)r   r   r   r   r   3  s    
zBendEvent.__init__c             C   s   | j d k	rd| j  S dS d S )Nz-\bendAfter #%sr   )r  )r   r   r   r   rV   7  s    

zBendEvent.ly_expressionN)r   r   r   r   rV   r   r   r   r   r  2  s   r  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S )r<  c             C   s   t |  t | _g | _d S )N)rL  r   rH   r9  r>  )r   r   r   r   r   ?  s    
zRhythmicEvent.__init__c             C   s   |r| j | d S )N)r>  r.   )r   evr   r   r   add_associated_eventD  s    z"RhythmicEvent.add_associated_eventc             C   s   dd | j D S )Nc             S   s   g | ]}|  qS r   )r  )r   r  r   r   r   r   I  s    z.RhythmicEvent.pre_chord_ly.<locals>.<listcomp>)r>  )r   r   r   r   r  H  s    zRhythmicEvent.pre_chord_lyc                s    fdd| j D S )Nc                s   g | ]}|  qS r   )r  )r   r  )r  r   r   r   L  s    z-RhythmicEvent.pre_note_ly.<locals>.<listcomp>)r>  )r   r  r   )r  r   r  K  s    zRhythmicEvent.pre_note_lyc             C   s$   d | |}|dkr |d }|S )Nr;   r   )r   r  )r   r  resr   r   r   ly_expression_pre_noteN  s    z$RhythmicEvent.ly_expression_pre_notec             C   s
   | j  S )N)r9  r_   )r   r   r   r   r_   T  s    zRhythmicEvent.get_lengthc             C   s   d| j   S )Nz'duration %s)r9  rM   )r   r   r   r   r   W  s    zRhythmicEvent.get_propertiesN)
r   r   r   r   r  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S )r7  c             C   s   t |  d | _d S )N)r<  r   r   )r   r   r   r   r   ]  s    
zRestEvent.__init__c             C   s>   |  d}| jr,|d| j | j f  S d| j  S d S )NFz	%s%s\restzr%s)r  r   rV   r9  )r   r  r   r   r   rV   a  s    
zRestEvent.ly_expressionc             C   sZ   x| j D ]}|| qW | jrB| j| | j| |d n|d | j| d S )Nz\restr   )r>  rX   r   r9  )r   r   r  r   r   r   rX   h  s    
zRestEvent.print_lyN)r   r   r   r   rV   rX   r   r   r   r   r7  \  s   r7  c               @   s   e Zd Zdd ZdS )	SkipEventc             C   s   d| j   S )Nzs%s)r9  rV   )r   r   r   r   rV   y  s    zSkipEvent.ly_expressionN)r   r   r   rV   r   r   r   r   r  x  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S )r6  c             C   s   t |  d| _d| _d S )NF)r<  r   
cautionaryforced_accidental)r   r   r   r   r   ~  s    
zNoteEvent.__init__c             C   s"   t | }| jr|| j 7 }|S )N)r<  r   r   rM   )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   Zexcl_questionr   r   r   
pitch_mods  s    zNoteEvent.pitch_modsc             C   s6   |  d}| jr2|d| j |  | j f  S d S )NTz%s%s%s)r  r   rV   r  r9  )r   r  r   r   r   rV     s
    
zNoteEvent.ly_expressionc             C   s.   |  d}| jr*|d| j |  f  S d S )NTz%s%s)r  r   rV   r  )r   r  r   r   r   r@    s    
zNoteEvent.chord_element_lyc             C   s|   x| j D ]}|| qW t| drN|d| j |d| j |d| j | jrl| j| ||   | j| d S )Nr  ZNoteHeadZStemZBeam)r>  rX   rb  Zprint_note_colorr  r   r  r9  )r   r   r  r   r   r   rX     s    
zNoteEvent.print_lyN)	r   r   r   r   r   r  rV   r@  rX   r   r   r   r   r6  }  s   	r6  c               @   s$   e Zd Zdd Zdd Zdd ZdS )KeySignatureChangec             C   s    t |  d | _d| _d | _d S )Nmajor)r   r   tonicr   non_standard_alterations)r   r   r   r   r     s    
zKeySignatureChange.__init__c          
   C   s   ddddddddd	d
	}y||d  }W n* t k
rR   ttd|d   dS X t|dkrpd|d |f S t|dkrd|d |d |f S dS d S )Nz,DOUBLE-FLATz,THREE-Q-FLATz,FLATz
,SEMI-FLATz,NATURALz,SEMI-SHARPz,SHARPz,THREE-Q-SHARPz,DOUBLE-SHARP)	rN   g      r-   g      r   g      ?r   g      ?rv   r   z8Unable to convert alteration %s to a lilypond expressionr   rv   z( %s . %s )r   r   z(( %s . %s ) . %s ))r   r   r   r   r<   )r   r{   Z
alter_dictZ
accidentalr   r   r   format_non_standard_alteration  s(    z1KeySignatureChange.format_non_standard_alterationc                sJ    j rd j   jf S  jrB fdd jD }dd| S dS d S )Nz\key %s \%sc                s   g | ]}  |qS r   )r  )r   r{   )r   r   r   r     s   z4KeySignatureChange.ly_expression.<locals>.<listcomp>z"\set Staff.keyAlterations = #`(%s)r;   r   )r  r   r   r  r   )r   Zalterationsr   )r   r   rV     s    



z KeySignatureChange.ly_expressionN)r   r   r   r   r  rV   r   r   r   r   r    s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )ShiftDurationsc             C   s   t |  ddg| _d S )Nr   )r   r   params)r   r   r   r   r     s    
zShiftDurations.__init__c             C   s   |  | _d S )N)get_shift_durations_parametersr  )r   ZtimeSigChanger   r   r   set_shift_durations_parameters  s    z-ShiftDurations.set_shift_durations_parametersc             C   s"   |dt | j  t| | d S )Nz \shiftDurations #%d #%d )tupler  r   rX   )r   r   r   r   r   rX     s    zShiftDurations.print_lyN)r   r   r   r   r  rX   r   r   r   r   r    s   r  c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TimeSignatureChangec             C   s.   t |  ddg| _d | _ddg| _d| _d S )Nr   T)r   r   	fractionsr_  originalFractionsvisible)r   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   )floatr  r  )r   r   r   r   get_fractions_ratio  s    z'TimeSignatureChange.get_fractions_ratioc             C   sL   t t |  d}d|   t d|  }tt d| d}||gS )Nrv   r   g      ?)r  Zceilr\   r  powrS   )r   r]   rJ   r   r   r   r    s    z2TimeSignatureChange.get_shift_durations_parametersc                s:   t |tr. fdd|D }dd| d S d| S d S )Nc                s   g | ]}  |qS r   )format_fraction)r   rt   )r   r   r   r   
  s    z7TimeSignatureChange.format_fraction.<locals>.<listcomp>rX  r;   rY  z%s)r  r   r   )r   Zfracr   r   )r   r   r    s    
z#TimeSignatureChange.format_fractionc             C   s   d}| j ddgddgddgfk}| jrd| jrd| jdkr<d}n(| jdkrRd| j }n| jdks`|rdd}| jrpd}nd	}t| j dkrt| j d
 tr|dt| j   | S | j r|d| | j   | S |d S d S )Nr   rv   r   commonz\defaultTimeSignaturez'()z0\once \override Staff.TimeSignature.style = #%s z\numericTimeSignaturez\omit Staff.TimeSignaturer   z\time %d/%d z\compoundMeter #'%s)r  r_  r  r<   r  rS   r  r  )r   stZis_common_signatureZomitr   r   r   rV     s"    

z!TimeSignatureChange.ly_expressionN)r   r   r   r   r  r  r  rV   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
ddZdd ZdS )
ClefChangec             C   s    t |  d| _d| _d| _d S )NGrv   r   )r   r   rE  positionr   )r   r   r   r   r   ,  s    
zClefChange.__init__c             C   s   ddddd | jdS )Nz^8z^15Z_8Z_15)r   rv   r-   rN   r   )rQ   r   )r   r   r   r   octave_modifier2  s    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varbaritoner  Zsubbass
percussion))r  rv   )r  r   )Cr   )r  rv   )r  r   )r  r   )r  r|   )Fr   )r  r   )r  r|   )r  rv   )ZPERCrv   )ZTABr|   )rp   rQ   rE  r  )r   r   r   r   	clef_name5  s    zClefChange.clef_namec             C   s   d|   |  f S )Nz\clef "%s%s")r  r  )r   r   r   r   rV   E  s    zClefChange.ly_expression)zclefs.GrN   i)zclefs.Cr   r   )zclefs.Frv   r  )r  r  r  c             C   s>   y| j | j \}}}W n tk
r*   dS X 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_dictrE  r   )r   ZglyphposZc0Zclefsettingr   r   r   rM   N  s    
zClefChange.lisp_expressionN)	r   r   r   r   r  r  rV   r  rM   r   r   r   r   r  +  s   r  c               @   s   e Zd Zdd Zdd ZdS )Transpositionc             C   s   t |  d | _d S )N)r   r   r   )r   r   r   r   r   a  s    
zTransposition.__init__c             C   s   d| j _d| j   S )NTz\transposition %s)r   r   rV   )r   r   r   r   rV   e  s    zTransposition.ly_expressionN)r   r   r   r   rV   r   r   r   r   r  `  s   r  c               @   s   e Zd Zdd Zdd ZdS )StaffChangec             C   s   t |  || _d S )N)r   r   staff)r   r  r   r   r   r   k  s    
zStaffChange.__init__c             C   s   | j rd| j  S dS d S )Nz\change Staff="%s"r   )r  )r   r   r   r   rV   o  s    
zStaffChange.ly_expressionN)r   r   r   r   rV   r   r   r   r   r  j  s   r  c               @   s   e Zd Zdd Zdd ZdS )SetEventc             C   s   t |  || _|| _d S )N)r   r   context_propr  )r   Zcontextpropr  r   r   r   r   w  s    
zSetEvent.__init__c             C   s   | j rd| j| j f S dS d S )Nz\set %s = %sr   )r  r  )r   r   r   r   rV   |  s    zSetEvent.ly_expressionN)r   r   r   r   rV   r   r   r   r   r  v  s   r  c               @   s   e Zd Zdd Zdd ZdS )StaffLinesEventc             C   s   t |  || _d S )N)r   r   r   )r   r   r   r   r   r     s    
zStaffLinesEvent.__init__c             C   s   | j dkrd| j  S d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   rV     s    

zStaffLinesEvent.ly_expressionN)r   r   r   r   rV   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S )	TempoMarkc             C   s,   t |  d | _d | _d | _d| _d | _d S )NF)r   r   basedurationnewdurationbeatsparenthesesr   )r   r   r   r   r     s    
zTempoMark.__init__c             C   s
   || _ d S )N)r  )r   r]   r   r   r   set_base_duration  s    zTempoMark.set_base_durationc             C   s
   || _ d S )N)r  )r   r]   r   r   r   set_new_duration  s    zTempoMark.set_new_durationc             C   s
   || _ d S )N)r  )r   r  r   r   r   set_beats_per_minute  s    zTempoMark.set_beats_per_minutec             C   s
   || _ d S )N)r  )r   r  r   r   r   set_parentheses  s    zTempoMark.set_parenthesesc             C   s
   || _ d S )N)r   )r   r   r   r   r   set_text  s    zTempoMark.set_textc             C   s   dS )NFr   )r   r   r   r   rT    s    zTempoMark.wait_for_notec             C   s   |rd|   S dS d S )Nz/\general-align #Y #DOWN \smaller \note {%s} #UPr   )rV   )r   r]   r   r   r   duration_to_markup  s    zTempoMark.duration_to_markupc             C   s   dS )Nz+\mark\markup { \fontsize #-2 \line { %s } }r   )r   r   r   r   tempo_markup_template  s    zTempoMark.tempo_markup_templatec             C   s   d}| j s|S | jr\| js | jrB|d| jp,d| j  | jf 7 }q|d| j  | jf 7 }nT| jr| | j }| | j}| jrd||f }nd||f }||  | 7 }ndS |S )Nr   z\tempo "%s" %s=%sz\tempo %s=%sz"(" %s = %s ")"z	 %s = %s )r  r  r  r   rV   r  r  r  )r   r  ZdmZndmr  r   r   r   rV     s$    zTempoMark.ly_expressionN)r   r   r   r   r  r  r  r  r  rT  r  r  rV   r   r   r   r   r    s   r  c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )FiguredBassNotec             C   s    t |  d| _d| _d| _d S )Nr   )r   r   r   prefixsuffix)r   r   r   r   r     s    
zFiguredBassNote.__init__c             C   s
   || _ d S )N)r  )r   r  r   r   r   
set_prefix  s    zFiguredBassNote.set_prefixc             C   s
   || _ d S )N)r  )r   r  r   r   r   
set_suffix  s    zFiguredBassNote.set_suffixc             C   s
   || _ d S )N)r   )r   r   r   r   r   
set_number  s    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  )r   r  r   r   r   rV     s    

zFiguredBassNote.ly_expressionN)r   r   r   r   r  r  r  rV   r   r   r   r   r    s
   r  c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )FiguredBassEventc             C   s    t |  d | _d| _d| _d S )Nr   F)r   r   r9  real_durationr  )r   r   r   r   r     s
    
zFiguredBassEvent.__init__c             C   s
   || _ d S )N)r9  )r   r]   r   r   r   set_duration  s    zFiguredBassEvent.set_durationc             C   s
   || _ d S )N)r  )r   Zparr   r   r   r    s    z FiguredBassEvent.set_parenthesesc             C   s
   || _ d S )N)r  )r   r]   r   r   r   set_real_duration  s    z"FiguredBassEvent.set_real_durationc             C   sh   dd | j D }|rdg }x|D ]}||  qW d|}| jrLd| }|d|  | j| d S )Nc             S   s   g | ]}t |tr|qS r   )r  r  )r   r   r   r   r   r     s    z-FiguredBassEvent.print_ly.<locals>.<listcomp>r;   z[%s]z<%s>)r   r.   rV   r   r  r9  rX   )r   r   Zfigured_bass_eventsr  r   r  r   r   r   rX     s    

zFiguredBassEvent.print_lyN)r   r   r   r   r  r  r  rX   r   r   r   r   r    s
   r  c               @   s   e Zd Zdd Zdd ZdS )MultiMeasureRestc             C   s   d| j   S )Na<  
(make-music
  'MultiMeasureRestMusicGroup
  'elements
  (list (make-music (quote BarCheck))
        (make-music
          'ChordEvent
          'elements
          (list (make-music
                  'MultiMeasureRestEvent
                  'duration
                  %s)))
        (make-music (quote BarCheck))))
)r9  rM   )r   r   r   r   rM   
	  s    z MultiMeasureRest.lisp_expressionc             C   s   d| j   S )NzR%s)r9  rV   )r   r   r   r   rV   	  s    zMultiMeasureRest.ly_expressionN)r   r   r   rM   rV   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   s   t |  || _d S )N)r   r   rE  )r   tpr   r   r   r   	  s    
zBreak.__init__c             C   s   | j r|d| j   d S )Nz\%s)rE  rA   )r   r   r   r   r   rX   #	  s    zBreak.print_lyN)r  )r   r   r   r   rX   r   r   r   r   r  	  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 )NT)	stafftypeidinstrument_namesoundshort_instrument_namesymbolspanbarchildrenis_groupcontext_modificationspart_information)r   rW  r   r   r   r   )	  s    zStaffGroup.__init__c             C   s   | j | d S )N)r  r.   )r   r  r   r   r   append_staff:	  s    zStaffGroup.append_staffc             C   s<   || j kr|| _n&x$| jD ]}t|dr||| qW d S )Nset_part_information)r  r   r  rb  r  )r   Z	part_namestaves_infor   r   r   r   r  =	  s
    

zStaffGroup.set_part_informationc             C   s   | j | d S )N)r  r.   )r   Zmodificationr   r   r   add_context_modificationE	  s    z#StaffGroup.add_context_modificationc             C   s"   x| j D ]}|r|| qW d S )N)r  rX   )r   r   r   r   r   r   print_ly_contentsH	  s    zStaffGroup.print_ly_contentsc             C   sJ   d}|| j dkO }|| jd k	O }|| jd k	O }|| jd k	oB| jdkO }|S )NFnor   )r  r  r  r  )r   
needs_withr   r   r   r  P	  s    zStaffGroup.needs_withc             C   sV   | j s| jr|d | jdkr*|d dddd| jd }|rR|d|  d S )	Nz$\consists "Instrument_name_engraver"r  z\hide SpanBarZSystemStartBraceZSystemStartBarZSystemStartSquare)ZbracerJ  r(  zsystemStartDelimiter = #'%s)r  r  rA   r  rQ   r  )r   r   Zbrackr   r   r   print_ly_context_modsX	  s    


z StaffGroup.print_ly_context_modsc             C   s^   |   t| jdkB }|rZ|d | | x| jD ]}|| q6W |d |  d S )Nr   z\with {r7   )r  r<   r  rA   r  r)   )r   r   r  r  r   r   r   print_ly_overridesc	  s    


zStaffGroup.print_ly_overridesc       	      C   sl   yRxL| j D ]B\}}x8|D ]0\}}}}}|r|d|td|f  |  qW q
W W n tk
rf   d S X d S )Nz#\context ChordNames = "%s" {%s \%s}rg   )r   rm   r)   	TypeError)	r   r   staff_idvoicesr  lyricsfiguredbass
chordnames
fretboardsr   r   r   print_chordst	  s    zStaffGroup.print_chordsc       	      C   sl   yRxL| j D ]B\}}x8|D ]0\}}}}}|r|d|td|f  |  qW q
W W n tk
rf   d S X d S )Nz#\context FretBoards = "%s" {%s \%s}rg   )r   rm   r)   r
  )	r   r   r  r  r  r  r  r  r  r   r   r   print_fretboards	  s    zStaffGroup.print_fretboardsc             C   s  |  | | | | jr*|d| j  | | |  | jrT|d |  | jr| jr|d| jt| jf  |  | jr| jr|d| jt| jf  |  | j	r|d| j| j	f  |  | 
| |  | jr|d |  d S )Nz\new %sz<<z\set %s.instrumentName = %sz \set %s.shortInstrumentName = %sz\set %s.midiInstrument = "%s"z>>)r  r  r  rA   r	  r)   r  r   r  r  r  )r   r   r   r   r   rX   	  s4    







zStaffGroup.print_lyN)r  )r   r   r   r   r  r  r  r  r  r  r	  r  r  rX   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   rW  r   r   r   r   	  s    zStaff.__init__c             C   s   dS )NFr   )r   r   r   r   r  	  s    zStaff.needs_withc             C   s   d S )Nr   )r   r   r   r   r   r  	  s    zStaff.print_ly_context_modsc          	   C   s@  | j r| jsd S | j}|s | j}|  x| jD ]\}}|rR|d||f  n|d|  |  |d |  d}t|}x|D ]\}}}	}
}|d7 }d}|dkrddd	d
|d}|d| j|t	d||f  |  d}x.|D ]&}|d|||f  |d7 }|  qW |	r|d|	|	f  qW |d q2W d S )Nz\context %s = "%s" << z\context %s << z2\mergeDifferentlyDottedOn\mergeDifferentlyHeadedOnr   r   r   z
 \voiceOnez
 \voiceTwoz \voiceThree)r   rv   r   z \voiceFourz\context %s = "%s" {%s %s \%s }rg   z6\new Lyrics \lyricsto "%s" { \set stanza = "%s." \%s }z\context FiguredBass = "%s" \%sz>>)
r  r   r  r  r)   rA   r<   rQ   r  rm   )r   r   Zsub_staff_typer  r  r  Z	nr_voicesr  r  r  r  r  Zvoice_count_textZ	lyrics_idr   r   r   r   r  	  sB    

zStaff.print_ly_contentsc             C   s0   | j r t| j dkr d| _d| _t| | d S )Nr   Z
PianoStaffr  )r   r<   r  r  r  rX   )r   r   r   r   r   rX   	  s    zStaff.print_lyN)r  )r   r   r   r   r  r  r  rX   r   r   r   r   r  	  s
   
.r  c               @   s   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   rW  r   r   r   r   	  s    zTabStaff.__init__c             C   sv   | j s| jrr|d | j rR|d x | j D ]}|d|   q.W |d | jrh|d| j  |d d S )Nz\with {zstringTunings = #`(z,%srY  ztablatureFormat = #%sr7   )r  r  rA   rM   )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               @   s   e Zd ZdddZdd ZdS )	DrumStaffc             C   s   t | | d | _d| _d S )NZ	DrumVoice)r  r   drum_style_tabler  )r   rW  r   r   r   r   
  s    zDrumStaff.__init__c             C   s.   | j r*|d |d| j   |d d S )Nz\with {zdrumStyleTable = #%sr7   )r  rA   )r   r   r   r   r   r	  
  s    
zDrumStaff.print_ly_overridesN)r  )r   r   r   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 )N)r  r   )r   rW  r   r   r   r   
  s    zRhythmicStaff.__init__N)r  )r   r   r   r   r   r   r   r   r  
  s   r  c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )Scorec             C   s   d| _ d| _dS )z0
        Constructs a new Score object.
        NF)r  create_midi)r   r   r   r   r   
  s    zScore.__init__c             C   s
   || _ d S )N)r  )r   r  r   r   r   set_contents
  s    zScore.set_contentsc             C   s   | j r| j || d S )N)r  r  )r   Zpart_idr  r   r   r   r  "
  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_tempo&
  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 {z<<z>>z
\layout {}r7   z\unfoldRepeats \articulate {z6% To create MIDI output, uncomment the following line:z% z\midi {\tempo 4 = z }N)rd   r  rA   r)   r  rX   r   )r   r   r   r   r   rX   3
  s:    










zScore.print_lyN)r   r   r   r   r  r  r!  rX   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 )Nr-   r  r   rh  )r~   r   r   r   r   printrj   r   )ZbflatZfifthrh  r   r   r   
test_pitcha
  s     r$  c                 sZ   dd   fdd} t  }||   ||   ||   t }|| |  d S )Nc              S   s   t  } t }| | |S )N)r  r6  r.   )evcr  r   r   r   	make_notew
  s    
ztest_printer.<locals>.make_notec                 sF   t  } |    |    |    t }d|_d|_| |_|S )Nrv   r   )r  r.   r   rK   rL   r   )r  rs   )r&  r   r   make_tup}
  s    ztest_printer.<locals>.make_tup)r  r.   r   rX   r)   )r'  r  r   r   )r&  r   test_printerv
  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 }| |_dddddddg|_|d |d | d |d | S )Nrv   r   r   r   r  rN   )r  r  r6  r9  rI   r   r   r   r  rE  r~   r   r  r   r  Zscale)r  r   r%  r  r  r   r   r   	test_expr
  sB    
r)  __main__r   rv   c             C   s    | j |ko| j |   |k}|S )N)r   r_   )r   r   rd  okr   r   r   sub
  s    r,  )r  r   inspectr  r   r   rD   warningsZlilylibr   r   r   re  rT   r   r   objectr   rH   rb   rd   rf   rm   ro   rp   rr   ru   ri   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+  r  rB  r  rL  rO  rV  rZ  r]  r^  rf  rg  rl  rm  rn  rq  rs  ry  rz  r~  r  r  r  r  r  r  r  r  r  r  r?  r  r  r  r  r  r  r  r<  r7  r  r6  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$  r(  r)  r   exprr   r#  rV   r   rd  r,  r  r   r   r   r   <module>   s   
mC	
lC	
SF("(Er
.#!";*<5
=
F	J*


