
    Cc                         d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	  G d de      Z
ddZd	 Zd
 Z G d de      Z G d de      ZeZe
ZdgZy)zStandard MIDI File (SMF)    N)
StreamInfoMutagenError)FileType)loadfileendswithc                       e Zd Zy)SMFErrorN)__name__
__module____qualname__     -/usr/lib/python3/dist-packages/mutagen/smf.pyr	   r	      s    r   r	   c                 x    d}	 	 | |   }|dz  }|dz  |dz  z   }|dz  s||fS  # t         $ r t        d      w xY w)Nr      zNot enough data         )
IndexErrorr	   )dataoffsetvalxs       r   _var_intr      sh    
C
	.VA 	!axAH%D;   	.,--	.s   $ 9c                    t        d      \  }}g }g }t        |       } d}d}d}|t        |       k  r
t        | |      \  }}||z  }| |   }	|dz  }|	dk(  ry| |   }
|dz  }t        | |      \  }}|
dk(  rU| |||z    }t        |      dk7  rt        t        j                  ddt        |      z         d   }|j                  |||f       ||z  }n^|	d	v rt        | |      \  }}||z  }nE|	d
k  r|dz  }|}	n|	dk  r|dz  }|	}nt	        d      |	dz	  dv r|dz  }|j                  |||f       |t        |       k  r
||fS )z4Retuns a list of midi events and tempo change events   r   r      Q      >I    )      r   r"   zinvalid event   )      )	range	bytearraylenr   r	   structunpackbytesappend)chunkTEMPOMIDItemposeventsdeltasumstatusoffdelta
event_type	meta_typenumr   tempor   s                  r   _read_trackr;   "   s    (KE4 FFeEHF
C
E

eS)
sE3Z
qc
I1HCs+HCD Ss+t9>"NdGeDk,AB1Ex673JC<'s+HC3JCD q#
d"q#//Q*,qMM8T512E E

H 6>r   c                    t        d      \  }}d } ||       \  }}|dk7  rt        d      t        |      dk7  rt        d      t        j                  d|      \  }}}|dkD  rt        d	|z        |d
z	  rt        d      g }	d}
t        |      D ]]  } ||       \  }}|dk7  rt        |      \  }}|
xs |}
|dk(  rt        |
      }||z  }|j                          |	j                  |       _ g }|	D ]  }d}g }d}|D ](  \  }}}||k(  r|j                  ||f       |}d}$||z  }* |j                  ||f       d}|D ]  \  }}|t        |      z  |}}|||z  z  } |dz  }|j                  |        t        |      S )z@Returns the duration in seconds. Can raise all kind of errors...r   c                     | j                  d      }t        |      dk7  rt        d      t        j                  d|dd        d   }| j                  |      }t        |      |k7  rt        d      |d d |fS )N   	truncatedr    r$   r   )readr)   r	   r*   r+   )fileobjinfochunklenr   s       r   
read_chunkz%_read_midi_length.<locals>.read_chunk^   su    ||At9>;''==tABx03||H%t9 ;''BQx~r      MThdzNot a MIDI file   r?   z>HHHr   zNot supported format %d   zNot supported timing intervalNs   MTrki  r   i@B )r'   r	   r)   r*   r+   r;   listsortr-   floatmax)rA   r/   r0   rD   
identifierr.   format_ntrackstickdivtracksfirst_tempostracknumr2   r1   	durationsr:   partsr3   dummytype_r   durationquartertpqs                           r   _read_midi_lengthrZ   Y   s    (KE4 #7+JW())
5zQ{## &fe <GWg{07:;;"} 677 FL'N &w/
E $U+ $-va<,'F&f I #$* 	! UE4~h./D 	! 	h&'!& 	(Xu#eGn4eSG3'H	( 	G"'#, y>r   c                       e Zd ZdZd Zd Zy)SMFInfozLSMFInfo()

    Attributes:
        length (`float`): Length in seconds

    c                 $    t        |      | _        y)zRaises SMFErrorN)rZ   length)selfrA   s     r   __init__zSMFInfo.__init__   s     (0r   c                      d| j                   z  S )NzSMF, %.2f seconds)r^   r_   s    r   pprintzSMFInfo.pprint   s    #dkk11r   N)r
   r   r   __doc__r`   rc   r   r   r   r\   r\      s    1
2r   r\   c                   H    e Zd ZdZddgZ e       d        Zd Zed        Z	y)SMFzpSMF(filething)

    Standard MIDI File (SMF)

    Attributes:
        info (`SMFInfo`)
        tags: `None`
    z
audio/midizaudio/x-midic                 r    	 t        |j                        | _        y # t        $ r}t	        |      d }~ww xY w)N)r\   rA   rB   IOErrorr	   )r_   	filethinges      r   loadzSMF.load   s3    		 1 12DI 	1+	s    	616c                     t        d      )Nzdoesn't support tags)r	   rb   s    r   add_tagszSMF.add_tags   s    -..r   c                 |    | j                         } |j                  d      xr t        | d      xs t        | d      S )NrE   z.midz.midi)lower
startswithr   )filenamerA   headers      r   scorez	SMF.score   s>    >>#  ) GXv&E(8W*E	Gr   N)
r
   r   r   rd   _mimesr   rk   rm   staticmethodrs   r   r   r   rf   rf      sB     N+FZ / G Gr   rf   )r   )rd   r*   mutagenr   r   mutagen._filer   mutagen._utilr   r   r	   r   r;   rZ   r\   rf   Openerror__all__r   r   r   <module>r|      sa      , " ,	| 	
4nIX2j 2"G( G: 'r   