mò
0ŽˆBc           @   s›  d  Z  y/ d k Z d k Z d k Z d k Z d k TWn$ e i i d ƒ e i d ƒ n Xy e	 Wn d Z	 d Z
 n Xe
 Z d Z d Z d Z d	 d a d
 Z d Z e d ƒ Z e d Z e d Z e d Z e d Z d Z d Z d Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d „  Z% d „  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' „ Z0 d d( „ Z1 d d) „ Z2 d d* „ Z3 d d+ „ Z4 d, „  Z5 d- „  Z6 d. „  Z7 d/ „  Z8 d0 d1 d2 „ Z9 d0 d3 „ Z: d4 „  Z; d5 „  Z< d6 „  Z= d7 „  Z> d8 „  Z? d9 „  Z@ d: „  ZA d; „  ZB d< „  ZC d= „  ZD d> „  ZE d? „  ZF d@ „  ZG dA „  ZH dB „  ZI dC „  ZJ dD „  ZK dE „  ZL dF „  ZM dG „  ZN dH „  ZO dI „  ZP dJ „  ZQ dK „  ZR dL „  ZS dM „  ZT d dN „ ZU dO „  ZV dP „  ZW dQ „  ZX dR „  ZY dS „  ZZ dT „  Z[ dU „  ZB dV „  Z\ dW „  Z] dX „  Z^ e_ dY j o e^ ƒ  n d S(Z   s  
 midi.py - library of routines to manipulate Standard MIDI files
 Copyright (C) 2003 John Comeau <jc@jcomeau.com>

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 N(   t   *s3   Needs os and re; upgrade preferably to version 2.3
i   i    i   i   i   f1.0i@   l   ÿ s   ÿ/ s   ÿs   ÿs   ÿs5   $Id: midi.py,v 1.74 2005/01/31 02:38:49 jcomeau Exp $t   MThdt   MTrkc      €   C   sÕ  d d d d d d d d d	 d
 d d d d d d d d d d d d d d d d d d d d d d  d! d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz d{ d| d} d~ d d€ g€ } t d� |  ƒ |  d‚ j o | Sn* y | t |  ƒ SWn | i |  ƒ Sn Xd  S(ƒ   Ns   Acoustic Grand Pianos   Bright Acoustic Pianos   Electric Grand Pianos   Honky-Tonk Pianos   Electric Piano 1s   Electric Piano 2t   Harpsichordt
   Clavichordt   Celestat   Glockenspiels	   Music Boxt
   Vibraphonet   Marimbat	   Xylophones   Tubular bellst   Santurs   Drawbar Organs   Percussive Organs
   Rock Organs   Church Organs
   Reed Organt	   Accordiont	   Harmonicas   Tango Accordions   Nylon String Guitars   Steel String Guitars   Electric Guitar (Jazz)s   Electric Guitar (Clean)s   Electric Guitar (Muted)s   Overdriven Guitars   Distortion Guitars   Guitar Harmonicss   Acoustic Basss   Fingered Electric Basss   Picked Electric Basss   Fretless Basss   Slap Bass 1s   Slap Bass 2s   Synth Bass 1s   Synth Bass 2t   Violint   Violat   Cellot
   Contrabasss   Tremolo Stringss   Pizzicato Stringst   Harpt   Timpanis   String Ensemble 1s   String Ensemble 2s   Synth Strings 1s   Synth Strings 2s
   Choir Aahss
   Voice Oohss   Synth Voices   Orchestra Hitt   Trumpett   Trombonet   Tubas   Muted Trumpets   French Horns   Brass Sections   Synth Brass 1s   Synth Brass 2s   Soprano Saxs   Alto Saxs	   Tenor Saxs   Baritone Saxt   Oboes   English Hornt   Bassoont   Clarinett   Piccolot   Flutet   Recorders	   Pan Flutes   Blown Bottlet
   Skakuhachit   Whistlet   Ocarinas   Square Waves   Sawtooth Waves   Synth Calliopes
   Chiff Leadt   Charangs
   Solo Voices   5th Sawtooth Waves   Bass & Leads   New Ages   Warm Padt	   PolySynths   Space Choirs   Bowed Glasss   Metallic Pads   Halo Pads	   Sweep Padt   Raint
   Soundtrackt   Crystalt
   Atmospheret
   Brightnesst   Goblinst   Echoess   Science Fictiont   Sitart   Banjot   Shamisent   Kotot   Kalimbas   Bag Pipet   Fiddlet   Shannais   Tinkle Bellt   Agogos   Steel Drumst	   Woodblocks
   Taiko Drums   Melodic Toms
   Synth Drums   Reverse Cymbals   Guitar Fret Noises
   Bird Tweett   Applauses   Breath Noises   Telephone Rings   Gun Shott   Seashoret
   Helicoptert
   Instrumentt   all(   t   instrumentst
   DebugPrintR4   t   intt   index(   R4   R6   (    (    t	   ./midi.pyt   MidiInstrument4   s    ÿ ‡’c          G   s   d S(   s#   stub routine, real one in pytest.pyN(    (   t   args(    (    R:   R7   Ð   s    c         C   sÉ   d \ } } y t |  ƒ } Wn t d |  ƒ ‚  n XxO | d j oA | | d @} | d ?} | d j o | d >} | d B} q9 q9 Wx: t o2 | t | t @ƒ } | d @o | d ?} q‹ Pq‹ W| S(	   Ni    t    s   bad "long" valuei   i   i   i€   (   i    R=   (	   t   Buffert   ReturnStringt   longt	   LongValuet	   longvalueR7   t   Truet   chrt   ByteMask(   RA   R>   RB   R?   (    (    R:   t   VarLenÔ   s(      

 c         C   sJ   |  i | ƒ } t | ƒ | j  o  t d | t | ƒ f ƒ ‚ n | Sd  S(   Ns-   Unexpected EOF, requested length %d, found %s(   t   Streamt   readt   Lengtht   bytest   lent	   Exceptiont   repr(   RG   RI   RJ   (    (    R:   t	   NextBytesè   s     c         C   s¶   t  } t |  ƒ t j o" t } d  k } | i |  ƒ }  n d \ } } } xJ | d j o< t
 t |  d ƒ ƒ } | | @} | | @} | d >| } qM W| t j o |  i ƒ  n | S(   Nl    i    i€   i   i   (   l    i    i€   (   t   Falset   testingt   typeRG   t
   StringTypeRC   t   StringIOt   valuet   bytet   signalt   ordRN   t   close(   RG   RS   RV   RP   RT   RU   (    (    R:   t
   ReadVarLenð   s    	 
c         C   sf   t  d } } xR t | d d ƒ D]> } t | d d >} |  | @| d d ?} | t	 | ƒ } q  W| S(   NR=   i    iÿÿÿÿi   i   (
   t
   LongLengtht   BytesR?   t   ranget   IndexRE   t   MaskRA   t   ByteRD   (   RA   R]   R[   R?   R^   R_   (    (    R:   t	   FixedLong   s     c         C   sX   d \ } } t |  t ƒ } x6 t d t ƒ D]% } | d >t | | | d !ƒ } q+ W| S(   Ni    R=   i   i   (   i    R=   (   t   Valuet   LongRN   RG   RZ   R\   R]   RW   (   RG   R]   Rb   Ra   (    (    R:   t   ReadFixedLong  s     #c         C   sf   t  d } } xR t | d d ƒ D]> } t | d d >} |  | @| d d ?} | t	 | ƒ } q  W| S(   NR=   i    iÿÿÿÿi   i   (
   t   ShortLengthR[   R?   R\   R]   RE   R^   t
   ShortValueR_   RD   (   Re   R]   R[   R?   R^   R_   (    (    R:   t
   FixedShort  s     c         C   sX   d \ } } t |  t ƒ } x6 t d t ƒ D]% } | d >t | | | d !ƒ } q+ W| S(   Ni    R=   i   i   (   i    R=   (   Ra   t   ShortRN   RG   Rd   R\   R]   RW   (   RG   R]   Rg   Ra   (    (    R:   t   ReadFixedShort  s     #c         C   s    t  |  d ƒ t  |  d ƒ d >BS(   Ni    i   i   (   RW   t   array(   Ri   (    (    R:   t   Join14BitValue  s    c         C   s,   t  |  ƒ }  t |  d @ƒ t |  d ?d @ƒ S(   Ni   i   (   R8   t   numberRD   (   Rk   (    (    R:   t   Split14BitValue!  s    c         C   s"   t  | ƒ } |  | t | | ƒ g S(   N(   RY   RG   t   lengtht   EventRN   (   Rn   RG   Rm   (    (    R:   t   ReadVarLengthEvent%  s    c         C   s   t  t | d ƒ ƒ } |  | g S(   Ni   (   RW   RN   RG   t	   parameterRn   (   Rn   RG   Rp   (    (    R:   t   ReadSingleParameterEvent)  s    c         C   s0   t  | d ƒ } |  t | d ƒ t | d ƒ g S(   Ni   i    i   (   RN   RG   Rp   Rn   RW   (   Rn   RG   Rp   (    (    R:   t   ReadDualParameterEvent-  s    c         C   s4   t  | ƒ } d |  | | t t | | ƒ ƒ f GHd  S(   Ns   [%d, 0x%x, %d, %s],(   RY   RG   RI   t	   DeltaTimeRn   RM   RN   (   Rs   Rn   RG   RI   (    (    R:   t	   DumpEvent1  s    c         C   s   t  |  | | ƒ d  S(   N(   Rt   Rs   Rn   RG   (   Rs   Rn   RG   (    (    R:   t   DumpSysexEvent6  s    c         C   s+   t  t | d ƒ ƒ } d |  | | f GHd  S(   Ni   s   [%d, 0x%x, 0x%x],(   RW   RN   RG   t   wtfRs   Rn   (   Rs   Rn   RG   Rv   (    (    R:   t   DumpRealtimeEvent9  s    c         C   sH   | d } t t | d ƒ ƒ } d | | f } d |  | | | f GHd  S(   Ni   i   s    change channel %d pressure to %ds   [%d, 0x%x, 0x%x], # %s(   Rn   t   channelRW   RN   RG   t   pressuret   commentRs   (   Rs   Rn   RG   Rz   Ry   Rx   (    (    R:   t   DumpChannelPressure=  s    
c         C   sR   t  | d ƒ } t | ƒ } d |  | t | d ƒ t | d ƒ | d | f GHd  S(   Ni   s=   [%d, 0x%x, 0x%x, 0x%x], # change pitch for channel %d to 0x%xi    i   i   (   RN   RG   t
   pitchbytesRj   t   pitchRs   Rn   RW   (   Rs   Rn   RG   R|   R}   (    (    R:   t   DumpPitchWheelEventC  s    c         C   si   t  t | d ƒ ƒ } | d } t  t | d ƒ ƒ } d | t | ƒ | f } d |  | | | | f GHd  S(   Ni   i   s$   set channel %d "%s" controller to %ds   [%d, 0x%x, 0x%x, 0x%x], # %s(
   RW   RN   RG   t
   controllerRn   Rx   t   settingt   ControllerMappingRz   Rs   (   Rs   Rn   RG   Rz   R   R€   Rx   (    (    R:   t   DumpControllerEventJ  s
    
c         C   si   | d } t t | d ƒ ƒ } t t | d ƒ ƒ } d t | ƒ | | f } d |  | | | | f GHd  S(   Ni   i   s&   Note On, "%s", channel %d, velocity %ds   [%d, 0x%x, 0x%x, 0x%x], # %s(
   Rn   Rx   RW   RN   RG   t   notet   velocityt   NoteMappingRz   Rs   (   Rs   Rn   RG   Rz   Rƒ   R„   Rx   (    (    R:   t
   DumpNoteOnS  s
    
c         C   si   | d } t t | d ƒ ƒ } t t | d ƒ ƒ } d t | ƒ | | f } d |  | | | | f GHd  S(   Ni   i   s'   Note Off, "%s", channel %d, velocity %ds   [%d, 0x%x, 0x%x, 0x%x], # %s(
   Rn   Rx   RW   RN   RG   Rƒ   R„   R…   Rz   Rs   (   Rs   Rn   RG   Rz   Rƒ   R„   Rx   (    (    R:   t   DumpNoteOff\  s
    
c         C   si   | d } t t | d ƒ ƒ } t t | d ƒ ƒ } d t | ƒ | | f } d |  | | | | f GHd  S(   Ni   i   s)   AfterTouch, "%s", channel %d, velocity %ds   [%d, 0x%x, 0x%x, 0x%x], # %s(
   Rn   Rx   RW   RN   RG   Rƒ   R„   R…   Rz   Rs   (   Rs   Rn   RG   Rz   Rƒ   R„   Rx   (    (    R:   t   DumpAftertouchEvente  s
    
c         C   s;   t  t | d ƒ ƒ } d |  | | | d t | ƒ f GHd  S(   Ni   s8   [%d, 0x%x, %d], # change instrument for channel %d to %si   (   RW   RN   RG   t
   NewProgramRs   Rn   R;   (   Rs   Rn   RG   R‰   (    (    R:   t   DumpChangeEventn  s    c      	   C   sL   t  t | d ƒ ƒ } t | ƒ } d |  | | | t t | | ƒ ƒ f GHd  S(   Ni   s   [%d, 0x%x, 0x%x, %d, %s],(	   RW   RN   RG   t	   QualifierRY   RI   Rs   Rn   RM   (   Rs   Rn   RG   R‹   RI   (    (    R:   t   DumpMetaEvents  s    c         C   s@   t  t | d ƒ ƒ } t | ƒ } t | | ƒ } |  | | | g S(   Ni   (   RW   RN   RG   t	   qualifierRY   Rm   RJ   Rn   (   Rn   RG   R�   RJ   Rm   (    (    R:   t   ReadMetaEventy  s    c         C   s,   t  |  ƒ t d | ƒ t | ƒ t | ƒ S(   Ni�   (   RF   t   DelayRD   t   Channelt   Notet   Velocity(   R�   R�   R‘   R’   (    (    R:   t   NoteOn  s    c         C   s,   t  |  ƒ t d | ƒ t | ƒ t | ƒ S(   Ni€   (   RF   R�   RD   R�   R‘   R’   (   R�   R�   R‘   R’   (    (    R:   t   NoteOff‚  s    c         C   s,   d } t d | |  | ƒ t | | |  t ƒ S(   Ni    (   R�   R“   Ra   R’   R”   t   Durationt   NormalVelocity(   Ra   R’   R•   R�   (    (    R:   t   NoteDef…  s    R5   t   lilypondc         C   s²  t  ƒ  } | d j o„ d | d <x: t d d d ƒ D]& } | | d t d t ƒ | | <q3 Wx+t d d	 ƒ D]% } | | d t d t ƒ | | <qm Wnò | d
 j oU d d d d d d d d d d d d g } d d d d d d d d d d  d! g } nR d" d# d$ d% d& d' d( d) d* d+ d, d- g } d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 g } x; t d9 d	 ƒ D]* } | | d: | t	 | d: ƒ | | <q]W|  d; j o | t	 |  ƒ Sn | Sd< S(=   s{  map standard MIDI numeric note values to string representation

    use mapping of middle C is MIDI note 60
    is MIDI representation C6 (C0 is MIDI note 0)
    is lilypond representation c' (http://lilypond.org/)
    (as it goes to 0: "c", "c,", "c,,", etc.)
    which has a frequency of about 261.625 Hz
    which is drawn on the first descending line below the staff (G clef)t	   frequencyi¸  iE   iD   iÿÿÿÿi   i   iF   i€   R˜   t   ct   dft   dt   eft   et   ft   gft   gt   aft   at   bft   bs   ,,,,s   ,,,s   ,,t   ,R=   t   's   ''s   '''s   ''''s   '''''s   ''''''t   Cs   C#t   Ds   D#t   Et   Fs   F#t   Gs   G#t   As   A#t   Bt   0t   1t   2t   3t   4t   5t   6t   7t   8t   9t   10i    i   R5   N(   t   dictt   notest   styleR\   Rk   t   powt   Twelftht   notenamet   octaveR8   Rƒ   (   Rƒ   R¼   R»   Rk   R¿   RÀ   (    (    R:   R…   Š  s,     	 
 $ '*+*' (c         C   s”  h  d d <d d <d d <d d <d	 d
 <d d <d d <d d <d d <d d <d d <d d <d d <d d <d d <d d  <d! d" <d# d$ <d% d& <d' d( <d) d* <d+ d, <d- d. <d/ d0 <d1 d2 <d3 d4 <d5 d6 <d7 d8 <d9 d: <d; d< <d= d> <d? d@ <dA dB <dC dD <dE dF <dG dH <dI dJ <dK dL <dM dN <dO dP <dQ dR <dS dT <dU dV <dW dX <dY dZ <d[ d\ <d] d^ <d_ d` <da db <dc dd <de df <dg dh <di dj <dk dl <dm dn <do dp <dq dr <ds dt <du dv <dw dx <dy dz <d{ d| <d} d~ <d d€ <d� d‚ <dƒ d„ <d… d† <} |  d‡ j o y | |  SWn dˆ Sn Xn | Sd‰ S(Š   s!   Map controller numbers with namesi    s   Bank Select (coarse)i   s   Modulation Wheel (coarse)i   s   Breath Controller (coarse)i   s   Foot Pedal (coarse)i   s   Portamento Time (coarse)i   s   Data Entry (coarse)i   s   Volume (coarse)i   s   Balance (coarse)i
   s   Pan Position (coarse)i   s   Expression (coarse)i   s   Effect Control 1 (coarse)i   s   Effect Control 2 (coarse)i   s   General Purpose Slider 1i   s   General Purpose Slider 2i   s   General Purpose Slider 3i   s   General Purpose Slider 4i    s   Bank Select (fine)i!   s   Modulation Wheel (fine)i"   s   Breath Controller (fine)i$   s   Foot Pedal (fine)i%   s   Portamento Time (fine)i&   s   Data Entry (fine)i'   s   Volume (fine)i(   s   Balance (fine)i*   s   Pan Position (fine)i+   s   Expression (fine)i,   s   Effect Control 1 (fine)i-   s   Effect Control 2 (fine)i@   s   Hold Pedal (on/off)iA   s   Portamento (on/off)iB   s   Sostenuto Pedal (on/off)iC   s   Soft Pedal (on/off)iD   s   Legato Pedal (on/off)iE   s   Hold 2 Pedal (on/off)iF   s   Sound VariationiG   s   Sound TimbreiH   s   Sound Release TimeiI   s   Sound Attack TimeiJ   s   Sound BrightnessiK   s   Sound Control 6iL   s   Sound Control 7iM   s   Sound Control 8iN   s   Sound Control 9iO   s   Sound Control 10iP   s!   General Purpose Button 1 (on/off)iQ   s!   General Purpose Button 2 (on/off)iR   s!   General Purpose Button 3 (on/off)iS   s!   General Purpose Button 4 (on/off)i[   s   Effects Leveli\   s   Tremolo Leveli]   s   Chorus Leveli^   s   Celeste Leveli_   s   Phaser Leveli`   s   Data Button incrementia   s   Data Button decrementib   s   Non-registered Parameter (fine)ic   s!   Non-registered Parameter (coarse)id   s   Registered Parameter (fine)ie   s   Registered Parameter (coarse)ix   s   All Sound Offiy   s   All Controllers Offiz   s   Local Keyboard (on/off)i{   s   All Notes Offi|   s   Omni Mode Offi}   s   Omni Mode Oni~   s   Mono Operationi   s   Poly OperationR5   s   undefined controllerN(   t   controllersR   (   R   RÁ   (    (    R:   R�   °  s     ÿ ÿ cEc         C   s1   t  |  ƒ o t t t  |  ƒ ƒ |  Sn d Sd  S(   NR=   (   RK   t   textt
   LyricEventRF   (   RÂ   (    (    R:   t   Lyricþ  s    c         C   s1   t  |  ƒ o t t t  |  ƒ ƒ |  Sn d Sd  S(   NR=   (   RK   RÂ   t	   TextEventRF   (   RÂ   (    (    R:   t	   EmbedText  s    c         C   s1   t  |  ƒ o t t t  |  ƒ ƒ |  Sn d Sd  S(   NR=   (   RK   RÂ   t   CopyrightNoticeRF   (   RÂ   (    (    R:   t   EmbedCopyright
  s    c         C   s¾   d t  f d t f d t f d t f d t f d t f d t f d t f d	 t f d
 t f d t	 f d t
 f d f } xB t d t | ƒ ƒ D]+ } |  | | d j o | | d Sq‹ q‹ Wd  S(   Niÿ   iø   i÷   iñ   ið   ià   iÐ   iÀ   i°   i    i�   i€   i    i   (   i    N(   RŒ   Rw   Ru   Rt   R~   R{   RŠ   R‚   Rˆ   R†   R‡   t   Nonet   eventsR\   RK   t	   testeventt   event(   RÌ   RË   RÊ   (    (    R:   t   DumpEventHandler  s
    u c         C   sˆ   d t  f d t f d t f d t f d t f d t f d	 f } xB t d t | ƒ ƒ D]+ } |  | | d j o | | d SqU qU Wd  S(
   Niÿ   iø   ið   ià   iÀ   i€   i    i   (   i    N(
   RŽ   Rq   Ro   Rr   RÉ   RÊ   R\   RK   RË   RÌ   (   RÌ   RË   RÊ   (    (    R:   t   MidiEventReader"  s
    ? c         C   s  d  k  } d d d d g } t |  d ƒ } g  } | i t | ƒ ƒ xÂt d | d d ƒ D]©}
 d } d } | i t | ƒ ƒ |
 d } | | d } | i | ƒ } | } | i  | ƒ } t } x2| p*yE t | ƒ } t t | d ƒ ƒ }	 | i ƒ  | j o t d ‚ n Wn t } ‚  n Xt |	 ƒ } | d  j o& | }	 t |	 ƒ } | i d	 d ƒ n/ |	 d
 j  o! |	 d j  o
 |	 } q‘d } n | | } | |	 | ƒ } | | j o
 t } n | i! d | ƒ t" | | ƒ } | | i | ƒ qÅ W| i$ | } q[ W| i$ | S(   Niÿ   i/   i    R=   t   rbi   i   t   EODiÿÿÿÿiø   ið   (%   RS   t   end_of_trackt   opent   FileNamet
   midistreamt   listt   appendt   ReadMidiHeaderR\   t   trackt   timert   running_statust   ReadTrackHeadert   current_trackt
   datalengthRH   t   datat
   filestreamRO   t   eofRY   t	   deltatimeRW   RN   t   statust   tellRL   RC   RÎ   t   handlerRÉ   t   seekRÌ   t   insertRK   t   current_eventRX   (   RÓ   Rß   RÌ   RÑ   RÚ   RÔ   RÜ   Rä   RÝ   Râ   RØ   Rá   Rç   RÞ   Rà   RS   RÕ   RÙ   (    (    R:   t   ReadMidiFile.  s\    	 
  




c   	      C   s2  t  |  ƒ t j o t |  ƒ }  n |  d d } |  d d } d } g  } x™ t d | ƒ D]ˆ } |  | d } xH t d t | ƒ ƒ D]1 } | | d | | | d <| i | | ƒ q… W| d j o | t | ƒ d d } q[ q[ W| i d „  ƒ d } x. | D]& } | d | | d <| | d } qW| S(   s:   flattens MIDI track data already read in by ReadMidiFile()i    i   i   i   c         C   s   t  |  d | d ƒ S(   Ni    (   t   cmpR£   R¥   (   R£   R¥   (    (    R:   t   <lambda>i  s    N(   RQ   t   midifileRR   Rè   t   formatt   trackst   fixtimet	   flattenedR\   RØ   t	   trackdataRK   R9   RÖ   t   sortRÌ   (	   Rë   Rì   RØ   R9   Rð   Rî   Rí   Rï   RÌ   (    (    R:   t   FlattenMidiFile\  s.           c         G   s„   t  \ } } d | d t | ƒ d t | ƒ d t | ƒ } | | j  p | | j o t | ƒ ‚ n t | i
 |  i | ƒ d  S(   Ns	   value of s    (s   ) must be between s    and (   t
   argumentspt   mint   maxt   optiont   strRT   t   errormessaget   OptionValueErrort   setattrt   parsert   valuest   optionInstancet   dest(   Rý   Rö   RT   Rû   t	   argumentsRø   Rô   Rõ   (    (    R:   t   CheckMinMaxq  s
    4c          C   sA  y d k  l } l }  Wn8 t i i d ƒ t i i d ƒ d  t i d f Sn X| d d ƒ } | i	 d d d	 d
 d d d t
 d d d d d d d d ƒ| i	 d d d	 d
 d d d t
 d d  d d d d  d d ƒ| i	 d d d d d t d d ƒ| i ƒ  \ } } t | ƒ d j  o | i ƒ  t i d ƒ n | | f S(!   N(   s   OptionParsers   OptionValueErrors*   Needs optparse, upgrade preferably to 2.3
s1   Any options on your command-line will be ignored
i   t   usages   %prog [options] INFILE[...]s   -ts   --transposeRQ   R8   t   actiont   callbackt   callback_argsiøÿÿÿi   Rþ   t	   transposet   defaulti    t   helps=   raise or lower all notes except MIDI drums up to 8 half-stepss   -ds   --dropi   t   drops(   channel whose notes should not be playeds   -vs	   --verboset
   store_trues-   output debugging information while processing(   iøÿÿÿi   (   i    i   (   t   optparset   OptionParserRù   t   syst   stderrt   writeRÉ   t   argvRû   t
   add_optionR   RO   t
   parse_argst   optionsRÿ   RK   t
   print_helpt   exit(   Rù   Rû   Rÿ   R  R  (    (    R:   t   midiplay_optionsz  s,    


c         C   s$   y |  | Wn | |  | <n X|  S(   N(   Rº   R9   R  (   Rº   R9   R  (    (    R:   t
   SetDefault’  s
    c    	      O   sy  d k  } d k } | i d d ƒ } d } t |  ƒ p t i d }  n t	 |  d ƒ t
 j o3 t	 |  d ƒ t j o |  d } n |  d }  n t d |  d	 | ƒ t | d
 d ƒ } t | d d ƒ } t | d t ƒ } t | d d ƒ } t d	 | ƒ d } | i | d | d
 | d f ƒ x"|  D]} | d } t	 | ƒ t j o | i } | i } n t | ƒ } | d ou | | j oW | d j	 o% | i | d | d
 | d f ƒ n | i | d | d
 | | f ƒ n | i | ƒ nP | i | d | d
 | | f ƒ | i | ƒ | i | d | d
 | d f ƒ | } q)W| i | d | d
 | d f ƒ | i | ƒ d S(   sB   play notes by MIDI number

    see NoteMapping() for documentationNs	   /dev/midit   wbi@   i   i    iÿÿÿÿs   midinote argsR  Rx   t   delayf0.25t   legatot
   instrumentiÀ   i�   (   t   pymidit   timeRÒ   t   midioutR„   RK   R<   R  R  RQ   t   ListTypet   DictTypeR  t   dbgprintR  RO   RÉ   t   lastnoteR  Rƒ   R  t   ComplexTypet   imagt   realR8   t   sleepRX   (	   R<   R  R  Rƒ   R  R!  R  R  R„   (    (    R:   t   midinote™  sJ      " 
	%%!!
!c          G   s   t  i i d t |  ƒ ƒ d  S(   Ns   %s
(   R  R  R  RM   t   whatever(   R'  (    (    R:   R   Ä  s    c          O   sc   t  |  ƒ p t i d }  n t d |  ƒ y d | d <Wn h  d d <} n Xt |  | ƒ d  S(   Ni   s   mididrum argsi	   Rx   (   RK   R<   R  R  R   R  R&  (   R<   R  (    (    R:   t   mididrumÇ  s     c          C   s£  d  k  }  t ƒ  \ } } t d t | ƒ | ƒ t i d ƒ x`| D]X} t	 | ƒ } t | ƒ }	 |  i d d ƒ } d } | d d } | d @d j o d	 | d	 | d
 @} n t d | | ƒ t | ƒ | d } x´|	 D]¬} | d }
 t d |
 ƒ t i |
 | ƒ | d d j  o­ | d d } y | i | j o wÞ n Wn n Xy; | d d j  o& | d j o | d | i | d <n Wn n Xt d t | ƒ | ƒ |  i | t | d ƒ ƒ qÞ | d d
 j o— | d d j o† t d t | ƒ | ƒ d } x= t d t | d ƒ ƒ D]" } | d	 t | d | ƒ } q$Wt | ƒ | d } t d | | ƒ qÞ t d t | ƒ | ƒ qÞ W|  i  | ƒ qC Wd  S(   Ns   options: %siûÿÿÿs	   /dev/midiR  i ¡ i    i   i €  i   iÿ   s   division: %di@B s   sleeping %di   ið   i   i    i	   i   s   playing: %siQ   s   extracting new timebase from %ss   new timebase: %ds   skipping event: %s(!   R  R  R  Rÿ   t
   debugprintRM   t   ost   nicet   filenameRè   t   fileRò   Rï   RÒ   R  t   timebaset   divisiont   floatt   ticktimeRÌ   t   deltaR  R%  Rx   R  R  R  t   tupleR\   RK   RU   RW   RX   (   R  R  R-  RÌ   R.  R,  Rÿ   Rx   R/  Rï   R2  RU   R1  R  (    (    R:   t   midiplayÐ  s^    	  
    "   c          C   s³  d  k  } x£t i d D]”} t | d ƒ } d GHt | ƒ } x\t d | ƒ D]K} d }	 d } d | d GHt | ƒ } | i | ƒ }
 | }  | i  |
 ƒ } t } xÐ | pÈ y% t | ƒ } t t | d ƒ ƒ } Wn t } Pn X| i ƒ  | j o t } Pn t | ƒ } | d  j o& | } t | ƒ } | i d d ƒ n | d j  o
 | } n |	 | }	 | | | | ƒ q¥ W| i ƒ  t d |	 ƒ d	 GH|  } qM W| i ƒ  d
 GHq Wd  S(   Ni   RÏ   s   [ # midi file dumpi    s   [ # midi track %diÿÿÿÿiø   s	   delta: %ds   ], # end midi tracks   ] # end midi file(    RS   R  R  R-  RÒ   t
   MidiStreamt   DumpMidiHeaderRí   R\   RØ   R2  t	   LastEventt   DumpTrackHeaderRÝ   RH   RÞ   t
   FileStreamRO   Rà   RY   Rá   RW   RN   RÌ   RC   Rã   RÍ   Rä   RÉ   Rå   RX   R)  (   R9  R-  RÌ   R7  Rä   RÝ   RØ   Rá   Rí   R2  RÞ   Rà   RS   R5  (    (    R:   t   mididumpü  sV    	    




c    	      G   s§   x  t  i d D]‘ } d | } t | d ƒ } t | d ƒ } d i | i ƒ  ƒ } t
 | ƒ } t | | d ƒ } x, t d | ƒ D] } t | | d | ƒ q€ Wq Wd  S(   Ni   s   %s.midt   rR  R=   i    (   R  R  R-  t   outfilenameRÒ   t   infilet   outfilet   joint	   readlinesRë   t   evalt   mididatat   UndumpMidiHeaderRí   R\   RØ   t   UndumpMidiTrack(	   R<   R<  Rë   R>  Rí   RØ   R-  RB  R=  (    (    R:   t
   midiundump&  s     
 c         C   sQ   |  i | d t | d ƒ t | d ƒ t | d ƒ t | d ƒ ƒ | d S(   Ni    i   i   i   i   (   R>  R  t   headerR`   Rf   (   R>  RF  (    (    R:   RC  3  s    Ic         C   sÜ  d } d } | d } xi| d D]]} | t | i d ƒ ƒ } | i d ƒ } | d j  o+ | | j o | t | ƒ } n | } n¶ | d j  oQ d } | t | ƒ } | d j p | d j o | t | i d ƒ ƒ } q<nX | d j o: | t | ƒ t | i d ƒ ƒ t | i d ƒ ƒ } n | t | ƒ } x? | D]7 } t
 | ƒ t j o | | } qC| t | ƒ } qCWq! W| t | ƒ j o t d	 | t | ƒ f ƒ n |  i | d t t | ƒ ƒ | ƒ d  S(
   Ni    R=   i   i   ið   iø   i÷   iÿ   s#   track length modified from %d to %d(   R7  t
   trackbytesRð   t   reference_bytesRÌ   RF   t   popRâ   RD   RÞ   RQ   RR   RK   R)  R>  R  R`   (   R>  Rð   RH  Râ   R7  RG  RÞ   RÌ   (    (    R:   RD  :  s6    
 
!: c           C   sE   t  t i ƒ d j o t i i d ƒ n t i i d ƒ t ƒ  d S(   s2   Default program action, should really be help texti   s   Usage: midi COMMAND [ARG...]
i    N(   RK   R  R  R  R  RI  t   main(    (    (    R:   t   midiZ  s
     c          C   sD   t  d ƒ }  t d ƒ } t d ƒ } t d ƒ } t |  | | | S(   Ni   i    i   i`   (   R`   t   ChunkLengthRf   t   MidiFileFormatt   NumberOfTrackst   TimeDivisionR   (   RL  RN  RM  RO  (    (    R:   t
   MidiHeaderb  s
    c          G   s$  t  |  d ƒ t j o¦ |  d }  d GH|  i d ƒ } | t j o d t GHn t d t | ƒ ‚ d t |  ƒ GHt	 |  ƒ } t	 |  ƒ } t	 |  ƒ } d | GHd | GHd	 | GHd
 GH| Snd d GHd |  d GHd t |  d ƒ GHd t |  d ƒ GHd t |  d ƒ GHd	 t |  d ƒ GHd
 GHd  S(   Ni    s   [ # dump midi headeri   s   '%s',s   Wrong chunk type %ss   %d, # chunk lengths   %d, # MIDI file formats   %d, # Trackss   0x%x, # Time Divisions   ], # end of midi header dumpi   i   i   (   RQ   R5  t   FileTypeRH   t	   ChunkTypeR   RL   RM   Rc   Rh   RM  RN  RO  R8   (   R5  RM  RN  RO  RR  (    (    R:   R6  i  s.    
			c         C   sp   |  i d ƒ } | t j o t d | ‚ n t |  ƒ } t |  ƒ } t |  ƒ } t |  ƒ } | | | | | g S(   Ni   s   Invalid MIDI header %s(   R5  RH   t	   chunktypeR   RL   Rc   Rm   Rh   Rì   Rí   t   timedivision(   R5  RT  Rì   Rí   Rm   RS  (    (    R:   R×   „  s    c          G   s‘   t  |  d ƒ t j oV |  d }  |  i d ƒ } | t j o d t GHn t ‚ t |  ƒ } d | GH| Sn! d |  d GHd t	 |  d ƒ GHd  S(   Ni    i   s   '%s',s   %d, # chunk lengthi   (
   RQ   R5  RQ  RH   RR  R   RL   Rc   RL  R8   (   R5  RL  RR  (    (    R:   R8  Ž  s    
	c         C   sC   |  i d ƒ } | t j o t d | ‚ n t |  ƒ } | | g S(   Ni   s   Invalid track header %s(   R5  RH   RS  R   RL   Rc   Rm   (   R5  Rm   RS  (    (    R:   RÛ   �  s
    c         C   sb   t  |  d ƒ } d t  |  d ƒ } t  |  d ƒ } t  |  d ƒ } d | | f d | d | S(   Ni    i   i   i   s   time signature %d/%d,s#    %d MIDI clocks per metronome tick,s!    %d 32nd notes per 24 MIDI clocks(   RW   t   Stringt	   numeratort   denominatort   clockst   quarternote(   RU  RY  RW  RV  RX  (    (    R:   t   DumpTimeSignature¤  s
    c         C   s  t  d } t d ƒ } t d ƒ } t d ƒ } t d ƒ } t d ƒ } | | | | | | }
 t  d } t d ƒ } t d ƒ d	 d !} | | | } t |  i ƒ }	 t  d
 t |  i d	 ƒ t  d t |  i d	 ƒ t  d t |  i d	 ƒ t  d t |  i d	 ƒ } |
 | |	 | S(   Ns   ÿXi   i   i   i   s   ÿQi   i ¡ i   s   Às   Ás   Âs   Ã(   t	   DeltaZerot   TimeSignaturePrefixRD   t   TimeSignatureLengtht   TimeSignatureNumeratort   TimeSignatureDenominatort   TimeSignatureClockst   TimeSignatureQuarterNotet   TimeSignaturet   TempoPrefixt   TempoLengthR`   t   TempoSpecificationt   TempoRÈ   t   Optionst	   copyrightt   CopyrightEventR  t   instrument1t   instrument2t   instrument3t   ProgramChange(   Rg  R`  Rc  R\  R_  Ra  Rf  R^  R]  Ri  Rb  Rm  Rd  Re  (    (    R:   t   MidiTrackCommon­  s    

fc         C   sN   y@ t  p
 | i o+ t |  ƒ d j o t i i |  d ƒ n Wn n Xd  S(   Ni    s   
(   t	   DebuggingR  t   verboseRK   RÂ   R  R  R  (   RÂ   R  (    (    R:   R)  Ã  s
    $ c         C   sS   d k  } y t | ƒ } Wn t | ƒ } n X| i |  d t | ƒ | f ƒ d S(   s\   Change instrument (program) for channel

    instrument can be specified as a number or nameNiÀ   (   R  R8   R4   R;   R  t   HandleR�   (   Rq  R�   R4   R  (    (    R:   t   SetChannelProgramÉ  s     	c         C   s   t  S(   s   Send end-of-track meta-eventN(   t
   EndOfTrack(   Rg  (    (    R:   t   EndDataTrackÔ  s     c         C   s>   d k  } t d | | f ƒ | i |  d | d | f ƒ d S(   sž   Set coarse Pan Position on a channel (left-right stereo balance)

    0 is hard left, 127 is hard right.
    This routine sends to an already-open MIDI deviceNs)   Setting pan position for channel %s to %si°   i
   (   R  R7   R�   t   PositionR  Rq  (   Rq  R�   Ru  R  (    (    R:   t   SetChannelPanØ  s     	c         C   sd   d k  } t d | | f ƒ t | ƒ } | i |  d t | ƒ t	 | d ƒ t	 | d ƒ f ƒ d S(   s  Set pitch wheel position for channel

    14-bit value from 0 to 0x2000 (center) to 0x3fff modifies pitch
    from -2 full notes to (just shy of?) +2 notes
    This is not universal though recommended by GM standard,
    and can be changed by a Registered Parameter Number (RPN) messageNs*   setting pitch wheel for channel %s to 0x%xià   i    i   (
   R  R7   R�   Ru  Rl   RT   R  Rq  R8   RW   (   Rq  R�   Ru  R  RT   (    (    R:   t   SetChannelPitchá  s
     	c         C   s$  d k  l } t | d ƒ t | ƒ } } t d | | ƒ g  } xC t d d ƒ D]2 } | i
 | t d t | ƒ d d t ƒ ƒ qO Wt d	 | d | d
 | d | d | d ƒ | | | | ƒ } | | | | } t | ƒ d j o& t i i d | | | | f ƒ n t |  | | ƒ d S(   sú   Set pitch wheel after calculating setting from Note and Frequency

    See notes under SetChannelPitch()
    This can take a while, don't use in a time-critical part of program
    I'm sure this can be written better but can't think how at the moment(   s   NearestValueIndexR™   s   Note, Frequency:i    i @  i   i    i   s   samples:i   i 0  iÿ?  f0.10000000000000001s   Closest I can get to %s is %s
N(   t   arcanet   NearestValueIndexR…   R‘   R0  t	   FrequencyR7   t   frequenciesR\   t   positionRÖ   R½   R¾   t
   differencet   absR  R  R  Rw  Rq  R�   (   Rq  R�   R‘   Rz  R{  R|  Ry  R}  (    (    R:   t   SetChannelPitchFrequencyí  s"       !&c          G   sh   d k  l } x) t |  d ƒ t i j o |  d }  q W|  \ } } | | t ƒ } t
 t t | ƒ d S(   s/   play specified frequency for specified duration(   s   NearestValueIndexi   N(   Rx  Ry  RQ   R<   t   typest	   TupleTypeR™   t   durationR{  R|  Rw  Rq  R�   (   R<   R™   R‚  R|  Ry  (    (    R:   t   playfrequency  s       c         G   s„   | \ } } d | d t | ƒ d t | ƒ d t | ƒ } | | j  p | | j o t | ƒ ‚ n t | i
 |  i | ƒ d  S(   Ns	   value of s    (s   ) must be between s    and (   Rÿ   Rô   Rõ   Rö   R÷   RT   t   errorMessageRù   Rú   Rû   Rü   Rý   Rþ   (   Rý   Rö   RT   Rû   Rÿ   R„  Rô   Rõ   (    (    R:   R     s
    4c         C   s   t  i d |  ƒ S(   sA   find out how this program was invoked, removing any .py extensions   ([A-Za-z0-9]+)(.py)?$N(   t   ret   searcht   program_path(   R‡  (    (    R:   t   program_name  s     c         C   sA   |  d j p t |  ƒ d j o d Sn d d i |  ƒ d Sd S(   s&   return string form of array for eval()i    s   ()s   ('s   ', 's   ')N(   Ri   RÉ   RK   R?  (   Ri   (    (    R:   t	   argstring  s      c          C   s„   ys t  t i d ƒ } | i d ƒ }  t i d |  ƒ o t |  t f  ƒ ƒ n# t	 t |  t t i d ƒ ƒ ƒ GHWn
 ‚  n Xd  S(   Ni    i   s   ^[a-z0-9]+$(
   Rˆ  R  R  t   matcht   groupt   programR…  RA  R‰  RM   (   RŒ  RŠ  (    (    R:   RJ     s     &t   __main__(`   t	   CopyrightR  R*  R…  R  R€  R  R  R  RC   RO   Ro  RZ   Rd   t   OctaveR¾   R–   RE   RD   R[  Rs  RÃ   RÅ   RÇ   t   RCSidR   R   R;   R7   RF   RN   RY   R`   Rc   Rf   Rh   Rj   Rl   Ro   Rq   Rr   RÉ   Rt   Ru   Rw   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(  R4  R:  RE  RC  RD  RK  RP  R6  R×   R8  RÛ   RZ  Rn  R)  Rr  Rt  Rv  Rw  R  Rƒ  Rˆ  R‰  RJ  t   __name__(X   R—   R  R7   RZ   Ro   RÎ   RÃ   R[  R�  RJ  RŒ   R{   R   RŠ   R×   Rn  R4  RC   R‰  RO   RÇ   RÅ   Rt   R“   Rr   RŽ   RF   R;   R‡   R`   R  Rè   R~   RÛ   Rh   R…  R�   RÆ   Rò   RY   Rc   R�  R)  Rv  Rˆ  Ru   R†   RK  R   R*  RE  R‚   RŽ  Rl   R:  R8  R–   Rj   Rf   RD  Rt  R”   Ro  R   R&  R  Rd   Rr  RÈ   RN   R…   RÍ   R6  RC  RE   Rs  Rw  R   Rw   Rq   R  Rƒ  Rˆ   RP  RZ  RÄ   R  R(  (    (    R:   t   ?   sÀ   $





	œ																					&N						.						+				,	*			 				
																	