B
    _X                 @   s   d dl Z d dlZG dd deZdd Ze  dd Zdd	 Zd
d Zdd Zdd Z	dd Z
edddddddeeeeeeee
fZdd Zdd Zdd ZdddZdddZdS )    Nc               @   s   e Zd ZdS )errorN)__name__
__module____qualname__ r   r   f/home/gub/NewGub/gub/target/mingw/src/lilypond-git.sv.gnu.org--lilypond.git-stable-2.22/python/midi.pyr   -   s   r   c              C   s.   d} d}d}t  dd | | | D  d S )N))   ZNOTE_OFF)   ZNOTE_ON)   ZPOLYPHONIC_KEY_PRESSURE)   ZCONTROLLER_CHANGE)   ZPROGRAM_CHANGE)   ZCHANNEL_KEY_PRESSURE)   Z
PITCH_BEND))x   ZALL_SOUND_OFF)y   ZRESET_ALL_CONTROLLERS)z   ZLOCAL_CONTROL){   ZALL_NOTES_OFF)|   ZOMNI_MODE_OFF)}   ZOMNI_MODE_ON)~   ZMONO_MODE_ON)   ZPOLY_MODE_ON))r   ZSEQUENCE_NUMBER)   Z
TEXT_EVENT)   ZCOPYRIGHT_NOTICE)   ZSEQUENCE_TRACK_NAME)   ZINSTRUMENT_NAME)   ZLYRIC)   ZMARKER)   Z	CUE_POINT)   ZPROGRAM_NAME)	   ZDEVICE_NAME)    ZMIDI_CHANNEL_PREFIX)!   Z	MIDI_PORT)/   ZEND_OF_TRACK)Q   Z	SET_TEMPO)T   ZSMTPE_OFFSET)X   ZTIME_SIGNATURE)Y   ZKEY_SIGNATURE)`   ZXMF_PATCH_TYPE_PREFIX)r   ZSEQUENCER_SPECIFIC_META_EVENT)   Z
META_EVENTc             s   s   | ]\}}||fV  qd S )Nr   ).0msgZdescr   r   r   	<genexpr>]   s    z!_add_constants.<locals>.<genexpr>)globalsupdate)ZchannelVoiceMessagesZchannelModeMessagesZ
metaEventsr   r   r   _add_constants3   s
    	
r.   c             C   s0   d}x"| dkr&|| d@  d> }| } qW ||  S )Nr   r   r   r   r   )nextbytegetbytesumr   r   r   _get_variable_length_numberd   s
    

r2   c             C   s   t dd S )Nz/the first midi command in the track is a repeat)r   )statusr/   r0   r   r   r   _first_command_is_repeatl   s    r4   c             C   s   | |fS )Nr   )r3   r/   r0   r   r   r   _read_two_bytesp   s    r5   c             C   s   | || fS )Nr   )r3   r/   r0   r   r   r   _read_three_bytest   s    r6   c                s&   t |  }d fddt|D S )N c             3   s   | ]}t   V  qd S )N)chr)r)   i)r0   r   r   r+   z   s    z_read_string.<locals>.<genexpr>)r2   joinrange)r/   r0   lengthr   )r0   r   _read_stringx   s    
r=   c             C   s(   | dkr| |t | |fS | t ||fS )Nr(   )r=   )r3   r/   r0   r   r   r   _read_f0_byte}   s    r>   c             c   s   t td| }|j}d}d}y`xZ|D ]R}|t||7 }|rF||krFP | }|dkr^|}| }|t|d?  |||fV  q&W W n, tk
r   ttt| t	dY nX d S )NBr   r   r   z-a track ended in the middle of a MIDI command)
iterarray__next__r2   _read_midi_eventStopIterationprintlenlistr   )data
clocks_maxZdataiterr0   Ztimer3   r/   r   r   r   _parse_track_body   s"    
"rJ   c             C   s   | ||d  |kr0t d|| ||d  f y"td| |d |d  \}W n" tj k
rt   t d| Y nX |d | }| |d | } t| |krt d| | |fS )Nr   zexpected %r, got %rz>Ir   z:the %s header is truncated (may be an incomplete download)z3the %s is truncated (may be an incomplete download))r   structunpackrF   )rH   postypemagicr<   endposr   r   r   _parse_hunk   s    "
rQ   c             c   sL   |dkrt d| x2t|D ]&}t| |dd\}}tt||V  qW d S )N   ztoo many tracks: %dtracks   MTrk)r   r;   rQ   rG   rJ   )midirM   
num_tracksrI   r9   Z	trackdatar   r   r   _parse_tracks   s
    rV   c             C   s    t | ddd\}}tt||S )Nr   rS   s   MTrk)rQ   rG   rJ   )rS   rI   Z
track_bodyendr   r   r   parse_track   s    rX   c             C   sr   t | ddd\}}ytd|d d \}}}W n tjk
rN   tdY nX tt| |||}||d f|fS )Nr   files   MThdz>3Hr   zthe file header is too shortr   )rQ   rK   rL   r   rG   rV   )rT   rI   headerZfirst_track_posformatrU   ZdivisionZtracksr   r   r   parse   s    r\   )N)N)rA   rK   	Exceptionr   r.   r2   r4   r5   r6   r=   r>   rC   rJ   rQ   rV   rX   r\   r   r   r   r   <module>)   s>   .

