§
    ƒØjŒU ã                  óÞ  — U d Z ddlmZ ddlmZ ddlmZ ddlZ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dlZddlZddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ej"        rddlm#Z# g d¢Z$ ej%        d¦  «        Z& ej'        de(e)z  ¬¦  «        Z* G d„ dej+        ¦  «        Z, G d„ dej+        ¦  «        Z- G d„ dej+        ¦  «        Z. G d„ dej+        ¦  «        Z/ G d„ d¦  «        Z0 G d „ d!¦  «        Z1 e¦   «         Z2d"e3d#<    e¦   «         Z4d$e3d%<   d&„ Z5dVd+„Z6dWd.„Z7 G d/„ d0¦  «        Z8	 	 	 dXdYd3„Z9	 	 dZdYd4„Z:ddd1d5œdYd6„Z;d1ddd7œd[d@„Z<d\dF„Z=d]d^dI„Z>d_dJ„Z?d`dK„Z@dL„ ZAdadN„ZB G dO„ dPejC        ¦  «        ZD G dQ„ dRejC        ¦  «        ZE G dS„ dTejC        ¦  «        ZFe<e9e:e;e>e?e@eAe8e6e7gZGeHdUk    rddlZ ejI        eF¦  «         dS dS )baÙ  
music21.converter contains tools for loading music from various file formats,
whether from disk, from the web, or from text, into
music21.stream.:class:`~music21.stream.Score` objects (or
other similar stream objects).

The most powerful and easy to use tool is the :func:`~music21.converter.parse`
function. Simply provide a filename, URL, or text string and, if the format
is supported, a :class:`~music21.stream.Score` will be returned.

This is the most general, public interface for all formats.  Programmers
adding their own formats to the system should provide an interface here to
their own parsers (such as humdrum, musicxml, etc.)

The second and subsequent times that a file is loaded it will likely be much
faster since we store a parsed version of each file as a "pickle" object in
the temp folder on the disk.

>>> #_DOCS_SHOW s = converter.parse('D:/myDocs/schubert.krn')
>>> s = converter.parse(humdrum.testFiles.schubert) #_DOCS_HIDE
>>> s
<music21.stream.Score ...>
é    )Úannotations)Údeque)Ú	responsesN)Úisclose)ÚsubConverters)Ú	museScore)Ú_version)Úcommon)Úenvironment)Úexceptions21)Úmetadata)Úmusedata)Ústream)Úbundles)Úbase)ÚArchiveManagerÚArchiveManagerExceptionÚ	ConverterÚConverterExceptionÚConverterFileExceptionÚPickleFilterÚPickleFilterExceptionÚfreezeÚ	freezeStrr   ÚparseÚ	parseDataÚ	parseFileÚparseURLÚregisterSubConverterÚresetSubConvertersr   ÚthawÚthawStrÚunregisterSubConverterÚ	converterÚ_StrOrBytes)Úboundc                  ó   — e Zd ZdS )r   N©Ú__name__Ú
__module__Ú__qualname__© ó    ú�/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/converter/__init__.pyr   r   a   ó   € € € € € Ø€Dr-   r   c                  ó   — e Zd ZdS )r   Nr(   r,   r-   r.   r   r   e   r/   r-   r   c                  ó   — e Zd ZdS )r   Nr(   r,   r-   r.   r   r   i   r/   r-   r   c                  ó   — e Zd ZdS )r   Nr(   r,   r-   r.   r   r   m   r/   r-   r   c                  óB   — e Zd ZdZddd„Zdd„Zdd
„Zddd„Z	 ddd„ZdS )r   aR  
    Before opening a file path, this class can check if this is an
    archived file collection, such as a .zip or .mxl file. This will return the
    data from the archive.

    >>> fnCorpus = corpus.getWork('bwv66.6', fileExtensions=('.xml',))

    This is likely a unicode string

    >>> #_DOCS_SHOW fnCorpus
    >>> '/Users/cuthbert/git/music21base/music21/corpus/bach/bwv66.6.mxl' #_DOCS_HIDE
    '/Users/cuthbert/git/music21base/music21/corpus/bach/bwv66.6.mxl'
    >>> am = converter.ArchiveManager(fnCorpus)
    >>> am.isArchive()
    True
    >>> am.getNames()
    ['bwv66.6.xml', 'META-INF/container.xml']
    >>> data = am.getData()
    >>> data[0:70]
    '<?xml version="1.0" encoding="UTF-8"?>\r<!DOCTYPE score-partwise PUBLIC'

    The only archive type supported now is zip. But .mxl is zip so that covers almost
    everything.
    ÚzipÚfpústr | pathlib.Pathc                óJ   — t          j        |d¬¦  «        | _        || _        d S ©NT©ÚreturnPathlib)r
   Ú	cleanpathr5   ÚarchiveType)Úselfr5   r<   s      r.   Ú__init__zArchiveManager.__init__Ž   s'   € Ý &Ô 0°À4Ð HÑ HÔ HˆŒØ +ˆÔÐÐr-   ÚreturnÚboolc                ó&  — | j         dk    rn| j        j        dv rM	 t          j        | j        d¦  «        5 }	 ddd¦  «         n# 1 swxY w Y   n# t          j        $ r Y dS w xY wdS | j        j        dk    rdS nt          d| j         › �¦  «        ‚dS )	zi
        Return True or False if the filepath is an
        archive of the supplied archiveType.
        r4   )ú.mxlz.mdÚrNFTz.zipzno support for archiveType: )r<   r5   ÚsuffixÚzipfileÚZipFileÚ
BadZipfiler   )r=   Úunuseds     r.   Ú	isArchivezArchiveManager.isArchive’   sô   € ð
 Ô˜uÒ$Ð$àŒwŒ~ Ð0Ð0ð!Ý œ¨¬°#Ñ6Ô6ð ¸&Øðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøåÔ)ð !ð !ð !Ø ˜5˜5ð!øøøà�tØ”” 6Ò)Ð)Ø�tð *õ *Ð*[ÈÔIYÐ*[Ð*[Ñ\Ô\Ð\Øˆus3   ›A µA·A ÁAÁA Á
AÁA ÁA"Á!A"ú	list[str]c                óÞ   — g }| j         dk    r_t          j        | j        d¦  «        5 }|                     ¦   «         D ]}|                     |¦  «         Œ	 ddd¦  «         n# 1 swxY w Y   |S )zG
        Return a list of all names contained in this archive.
        r4   rC   N)r<   rE   rF   r5   ÚnamelistÚappend)r=   ÚpostÚfÚsubFps       r.   ÚgetNameszArchiveManager.getNames§   sµ   € ð ˆØÔ˜uÒ$Ð$Ý” ¤¨#Ñ.Ô.ð '°!ØŸZšZ™\œ\ð 'ð '�EØ—K’K Ñ&Ô&Ð&Ð&ð'ð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'ð ˆs   ¨-A"Á"A&Á)A&Úmusicxmlút.Anyc                óÞ   — d}| j         dk    rt          d| j         › �¦  «        ‚t          j        | j        d¦  «        5 }|                      ||¦  «        }ddd¦  «         n# 1 swxY w Y   |S )zÏ
        Return data from the archive.

        For 'musedata' format this will be a list of strings.
        For 'musicxml' this will be a single string.

        * Changed in v8: name is not used.
        Nr4   zno support for extension: rC   )r<   r   rE   rF   r5   Ú_extractContents)r=   Ú
dataFormatrN   rO   s       r.   ÚgetDatazArchiveManager.getData²   s³   € ð ˆØÔ˜uÒ$Ð$Ý)Ð*YÀtÔGWÐ*YÐ*YÑZÔZÐZåŒ_˜TœW cÑ*Ô*ð 	8¨aØ×(Ò(¨¨JÑ7Ô7ˆDð	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð ˆs   ¿A"Á"A&Á)A&rO   úzipfile.ZipFilerV   Ústrc           
     ón  — d }|dk    �r|                      ¦   «         D ]ñ}d|v rŒt          j        |¦  «        j        dvr|dk    rŒ)|                     |¦  «        }t          |t          ¦  «        ržt          j        d|d d…         ¦  «        }|r)| 	                    d¦  «         
                    d¦  «        }nd	}	 | 
                    |¬
¦  «        }n<# t          $ r/ | 
                    d¬
¦  «        }t          j        dd|¦  «        }Y nw xY w �n#|dk    �rt          j        |                      ¦   «         ¦  «        }g }|                     ¦   «         D ]ß}	 |                     |d¦  «        5 }t#          t%          j        |d ¬¦  «        ¦  «        }	d d d ¦  «         n# 1 swxY w Y   nb# t          $ rU |                     |d¦  «        5 }t#          t%          j        |d d¬¦  «        ¦  «        }	d d d ¦  «         n# 1 swxY w Y   Y nw xY w|                     d                     |	¦  «        ¦  «         Œà|S )NrR   zMETA-INF)z	.musicxmlú.xmlrB   r[   s   encoding=[\'\"](\S*?)[\'\"]iè  é   ÚasciizUTF-8©Úencodingz	utf-16-lezencoding=([\'\"]\S*?[\'\"])zencoding='UTF-8'r   rC   )Únewlinez
ISO-8859-1)r`   r_   Ú )rL   ÚpathlibÚPathrD   ÚreadÚ
isinstanceÚbytesÚreÚmatchÚgroupÚdecodeÚUnicodeDecodeErrorÚsubÚmusedataModuleÚMuseDataDirectoryÚgetPathsÚopenÚlistÚioÚTextIOWrapperrM   Újoin)
r=   rO   rV   rN   rP   ÚfoundEncodingÚdefaultEncodingÚmddÚzipOpenÚliness
             r.   rU   zArchiveManager._extractContentsÄ   s  € ð ˆØ˜Ò#Ñ#ð Ÿš™œð ð �ð  Ð&Ð&Øå”< Ñ&Ô&Ô-ð 6>ð >ð >àBGÈ6Â/À/àà—v’v˜e‘}”}�Ý˜d¥EÑ*Ô*ð @Ý$&¤HÐ-LÈdÐSXÐTXÐSXÌkÑ$ZÔ$Z�MØ$ð 2Ø*7×*=Ò*=¸aÑ*@Ô*@×*GÒ*GÈÑ*PÔ*P˜˜ð +2˜ð@Ø#Ÿ{š{°O˜{ÑDÔD˜˜øÝ-ð @ð @ð @Ø#Ÿ{š{°K˜{Ñ@Ô@˜Ý!œvÐ&DØ&8¸$ñ @ô  @˜˜˜ð@øøøð
 ùà˜:Ò%Ñ%õ !Ô2°1·:²:±<´<Ñ@Ô@ˆCð ˆDØŸš™œð ,ð ,�ð
NØŸš  sÑ+Ô+ð N¨wÝ $¥RÔ%5°gÀtÐ%LÑ%LÔ%LÑ MÔ M˜ðNð Nð Nñ Nô Nð Nð Nð Nð Nð Nð Nøøøð Nð Nð Nð Nøøå)ð Nð Nð NàŸš  sÑ+Ô+ð N¨wÝ $¥RÔ%5°gÀtØ?Kð&Mñ &Mô &Mñ !Nô !N˜ðNð Nð Nñ Nô Nð Nð Nð Nð Nð Nð Nøøøð Nð Nð Nð NøøðNøøøð —’˜BŸGšG E™NœNÑ+Ô+Ð+Ð+ð ˆsl   Â<CÃ6DÄDÅF*Å.$FÆF*ÆF"	Æ"F*Æ%F"	Æ&F*Æ* H	Ç
%G;Ç/H	Ç;G?Ç?H	ÈG?ÈH	ÈH	N)r4   )r5   r6   )r?   r@   )r?   rJ   )rR   )r?   rS   )rO   rX   rV   rY   r?   rS   )	r)   r*   r+   Ú__doc__r>   rI   rQ   rW   rU   r,   r-   r.   r   r   r   s�   € € € € € ðð ð6,ð ,ð ,ð ,ð ,ðð ð ð ð*	ð 	ð 	ð 	ðð ð ð ð ð( ,6ðFð Fð Fð Fð Fð Fð Fr-   r   c                  ó>   — e Zd ZdZ	 	 ddd
„Z	 	 ddd„Zdd„Zdd„ZdS )r   au  
    Before opening a file path, this class checks to see if there is an up-to-date
    version of the file pickled and stored in the scratch directory.

    If forceSource is True, then a pickle path will not be created.

    Provide a file path to check if there is pickled version.

    If forceSource is True, pickled files, if available, will not be
    returned.
    FNr5   r6   ÚforceSourcer@   Únumberú
int | Nonec                óf   — t          j        |d¬¦  «        | _        || _        || _        || _        d S r8   )r
   r;   r5   r|   r}   Úkeywords)r=   r5   r|   r}   r€   s        r.   r>   zPickleFilter.__init__  s5   € õ !'Ô 0°À4Ð HÑ HÔ HˆŒØ!,ˆÔØ &ˆŒØ*2ˆŒˆˆr-   Ú	directoryúpathlib.Path | str | NoneÚzipTypeú
str | Noner?   úpathlib.Pathc                óð  — |€t                                ¦   «         }n,t          |t          ¦  «        rt	          j        |¦  «        }n|}|€d}nd}dt          t          j        j        ¦  «        z   dz   t          t          j        j	        ¦  «        z   }t          | j
        ¦  «        }g }d| j        v r%| j        d         du r|                     d¦  «         n>d	| j        v r5| j        d	         D ]'}|                     d
t          |¦  «        z   ¦  «         Œ(d                     dt          j        |g|¢t!          j        |¦  «        ‘¦  «        }	| j        �|	dt          | j        ¦  «        z   z  }	|	|z  }	||	z  S )zi
        Returns the file path of the pickle file for this file.

        Returns a pathlib.Path
        Nz.pz.p.gzÚpyú.ÚquantizePostFÚnoQtzÚquarterLengthDivisorsÚqldú-Úm21)ÚenvironLocalÚgetRootTempDirre   rY   rb   rc   ÚsysÚversion_infoÚmajorÚminorr5   r€   rM   rt   r	   Ú__version__r
   ÚgetMd5r}   )
r=   r�   rƒ   ÚpathLibDirectoryÚ	extensionÚpythonVersionÚpathNameToParseÚquantizationÚdivisorÚbaseNames
             r.   ÚgetPickleFpzPickleFilter.getPickleFp(  s‹  € ð ÐÝ+×:Ò:Ñ<Ô<ÐÐÝ˜	¥3Ñ'Ô'ð 	)Ý&œ|¨IÑ6Ô6ÐÐà(Ðàˆ?ØˆIˆIàˆIà�s¥3Ô#3Ô#9Ñ:Ô:Ñ:¸SÑ@Å3ÅsÔGWÔG]ÑC^ÔC^Ñ^ˆå˜dœg™,œ,ˆà"$ˆØ˜Tœ]Ð*Ð*¨t¬}¸^Ô/LÐPUÐ/UÐ/UØ×Ò Ñ(Ô(Ð(Ð(Ø$¨¬Ð5Ð5Øœ=Ð)@ÔAð :ð :�Ø×#Ò# E­C°©L¬LÑ$8Ñ9Ô9Ð9Ð9à—8’8˜U¥HÔ$8¸-ð =È,ð =Ý#œ]¨?Ñ;Ô;ð=ñ >ô >ˆð Œ;Ð"Ø˜�c $¤+Ñ.Ô.Ñ.Ñ.ˆHØ�IÑˆà (Ñ*Ð*r-   ÚNonec                ó†   — |                       d¬¦  «        }|                     ¦   «         rt          j        |¦  «         dS dS )zÁ
        If a compressed pickled file exists, remove it from disk.

        Generally not necessary to call, since we can just overwrite obsolete pickles,
        but useful elsewhere.
        Úgz©rƒ   N)rž   ÚexistsÚosÚremove)r=   ÚpickleFps     r.   ÚremovePicklezPickleFilter.removePickleQ  sL   € ð ×#Ò#¨DÐ#Ñ1Ô1ˆØ�?Š?ÑÔð 	 ÝŒI�hÑÔÐÐÐð	 ð 	 r-   ú.tuple[pathlib.Path, bool, pathlib.Path | None]c                óâ  — t                                ¦   «         }t          j        | j        ¦  «        }|dk    r"| j        rt          d¦  «        ‚d}| j        }d}n‘|�| j        rd}| j        }d}n||                      |d¬¦  «        }|                     ¦   «         s
d}| j        }nG| j         	                    ¦   «         j
        | 	                    ¦   «         j
        k     rd}|}n	d}| j        }|||fS )aý  
        Given a file path specified with __init__, look for an up-to-date pickled
        version of this file path. If it exists, return its fp, otherwise return the
        original file path.

        Return arguments are file path to load, boolean whether to write a pickle, and
        the file path of the pickle.  All file paths can be pathlib.Path objects or None

        Does not check that fp exists or create the pickle file.

        >>> fp = '/Users/Cuthbert/Desktop/musicFile.mxl'
        >>> pickFilter = converter.PickleFilter(fp)
        >>> #_DOCS_SHOW pickFilter.status()
        (PosixPath('/Users/Cuthbert/Desktop/musicFile.mxl'), True,
              PosixPath('/tmp/music21/m21-10.0.0-py3.13-18b8c5a5f07826bd67ea0f20462f0b8d.p.gz'))
        ÚpicklezHcannot access source file when only given a file path to a pickled file.FNr¡   r¢   T)r�   r�   r
   ÚfindFormatFiler5   r|   r   rž   r£   ÚstatÚst_mtime)r=   Ú	fpScratchÚ	m21FormatÚwritePickleÚfpLoadÚfpPickles         r.   ÚstatuszPickleFilter.status\  s
  € õ" !×/Ò/Ñ1Ô1ˆ	ÝÔ)¨$¬'Ñ2Ô2ˆ	à˜Ò Ð ØÔð `Ý+Ø^ñ`ô `ð `àˆKØ”WˆFØˆHˆHØÐ $Ô"2ÐØˆKØ”WˆFØˆHˆHà×'Ò'¨	¸4Ð'Ñ@Ô@ˆHØ—?’?Ñ$Ô$ð 
%Ø"�Øœ��à”7—<’<‘>”>Ô*¨X¯]ª]©_¬_Ô-EÒEÐEà"'�KØ%�F�Fà"&�KØ!œW�FØ�{ HÐ,Ð,r-   )FN)r5   r6   r|   r@   r}   r~   ©NN)r�   r‚   rƒ   r„   r?   r…   ©r?   rŸ   )r?   r¨   )r)   r*   r+   rz   r>   rž   r§   r³   r,   r-   r.   r   r     s‰   € € € € € ð
ð 
ð &+Ø$(ð
3ð 
3ð 
3ð 
3ð 
3ð 8<Ø(,ð'+ð '+ð '+ð '+ð '+ðR	 ð 	 ð 	 ð 	 ð,-ð ,-ð ,-ð ,-ð ,-ð ,-r-   r   z'deque[type[subConverters.SubConverter]]Ú_registeredSubConvertersz:deque[type[subConverters.SubConverter] | t.Literal['all']]Ú_deregisteredSubConvertersc                 ój   — t                                ¦   «          t                               ¦   «          dS )zZ
    Reset state to default (removing all registered and deregistered subConverters).
    N)r¶   Úclearr·   r,   r-   r.   r    r    •  s.   € õ ×"Ò"Ñ$Ô$Ð$Ý×$Ò$Ñ&Ô&Ð&Ð&Ð&r-   ÚnewSubConverterú type[subConverters.SubConverter]r?   rŸ   c                ó:   — t                                | ¦  «         dS )a@  
    Add a SubConverter to the list of registered subConverters.

    Example, register a converter for the obsolete Amiga composition software Sonix (so fun!)

    >>> class ConverterSonix(converter.subConverters.SubConverter):
    ...    registerFormats = ('sonix',)
    ...    registerInputExtensions = ('mus',)

    >>> converter.registerSubConverter(ConverterSonix)
    >>> scf = converter.Converter().getSubConverterFormats()
    >>> for x in sorted(scf):
    ...     x, scf[x]
    ('abc', <class 'music21.converter.subConverters.ConverterABC'>)
    ...
    ('sonix', <class '...ConverterSonix'>)
    ...

    See `converter.qmConverter` for an example of an extended subConverter.

    >>> converter.resetSubConverters() #_DOCS_HIDE

    Changed in v.9 -- custom subConverters are registered above default subConverters.
    N)r¶   Ú
appendleft)rº   s    r.   r   r   �  s   € õ2 ×'Ò'¨Ñ8Ô8Ð8Ð8Ð8r-   ÚremoveSubConverterú3t.Literal['all'] | type[subConverters.SubConverter]c                ó¬  — | dk    rNt                                ¦   «          t                               ¦   «          t                               d¦  «         dS 	 t                                | ¦  «         dS # t
          $ rW t          ¦   «         }|                     ¦   «         }| |v rt                               | ¦  «         Y dS t          d| ›d�¦  «        ‚w xY w)aN  
    Remove a SubConverter from the list of registered subConverters.

    (Note that the list is a shared list across all Converters currently --
    that has long been considered a feature, but with multiprocessing, this
    could change in the future.)

    >>> converter.resetSubConverters() #_DOCS_HIDE
    >>> mxlConverter = converter.subConverters.ConverterMusicXML

    >>> c = converter.Converter()
    >>> mxlConverter in c.subConvertersList()
    True
    >>> #_DOCS_SHOW converter.unregisterSubConverter(mxlConverter)
    >>> #_DOCS_SHOW mxlConverter in c.subConvertersList()
    >>> False  #_DOCS_HIDE -- this breaks on parallel runs
    False

    If there is no such subConverter registered, and it is not a default subConverter,
    then a converter.ConverterException is raised:

    >>> class ConverterSonix(converter.subConverters.SubConverter):
    ...    registerFormats = ('sonix',)
    ...    registerInputExtensions = ('mus',)

    >>> converter.unregisterSubConverter(ConverterSonix)
    Traceback (most recent call last):
    music21.converter.ConverterException: Could not remove <class '...ConverterSonix'> from
                registered subConverters

    The special command "all" removes everything including the default converters:

    >>> #_DOCS_SHOW converter.unregisterSubConverter('all')
    >>> #_DOCS_SHOW c.subConvertersList()
    >>> []  #_DOCS_HIDE
    []

    Housekeeping: let's reset our subconverters and check things are okay again.

    >>> converter.resetSubConverters()
    >>> c = converter.Converter()
    >>> mxlConverter in c.subConvertersList()
    True
    ÚallNzCould not remove z from registered subConverters)	r¶   r¹   r·   rM   r¥   Ú
ValueErrorr   ÚdefaultSubConvertersr   )r¾   ÚcÚdscs      r.   r#   r#   ¸  sô   € ð` ˜UÒ"Ð"Ý ×&Ò&Ñ(Ô(Ð(Ý"×(Ò(Ñ*Ô*Ð*Ý"×)Ò)¨%Ñ0Ô0Ð0Øˆð	ZÝ ×'Ò'Ð(:Ñ;Ô;Ð;Ð;Ð;øÝð Zð Zð ZÝ‰KŒKˆØ×$Ò$Ñ&Ô&ˆØ Ð$Ð$Ý&×-Ò-Ð.@ÑAÔAÐAÐAÐAÐAå$ØXÐ$6ÐXÐXÐXñZô Zð ZðZøøøs   ÁA2 Á2A
CÂ?Cc                  ó  — e Zd ZU dZddiZded<   d4d„Zd5d„Z	 	 	 d6d7d„Zd„ Z		 	 d8d„Z
	 	 	 d6d9d„Zddddœd:d „Ze	 d;d<d%„¦   «         Zed=d&„¦   «         Zed>d(„¦   «         Zed?d+„¦   «         Zd@d,„ZdAd/„ZdBd1„ZedCd3„¦   «         ZdS )Dr   zª
    A class used for converting all supported data formats into music21 objects.

    Not a subclass, but a wrapper for different converter objects based on format.
    ÚsubConverterz‰
            a :class:`~music21.converter.subConverters.SubConverter` object
            that will do the actual converting.
            zdict[str, str]Ú	_DOC_ATTRr?   rŸ   c                ó"   — d | _         d | _        d S ©N)rÇ   Ú_thawedStream©r=   s    r.   r>   zConverter.__init__	  s   € Ø=AˆÔàHLˆÔÐÐr-   r�   úpathlib.Path | strÚextrY   Úurlc                ó¸   — t          |t          ¦  «        rt          j        |¦  «        }n|}dt          j        z   dz   t          j        |¦  «        z   |z   }||z  S )Nzm21-r�   )re   rY   rb   rc   r	   r•   r
   r–   )r=   r�   rÎ   rÏ   ÚdirectoryPathlibÚfilenames         r.   Ú_getDownloadFpzConverter._getDownloadFp  s`   € õ �i¥Ñ%Ô%ð 	)Ý&œ|¨IÑ6Ô6ÐÐà(Ðà�HÔ0Ñ0°3Ñ6½¼ÀsÑ9KÔ9KÑKÈcÑQˆØ (Ñ*Ð*r-   NFr5   r}   r~   Úformatr„   r|   r@   c                óæ  — t          j        |d¬¦  «        }|                     ¦   «         st          d|› �¦  «        ‚|}|€|                      |¦  «        }|                      |¦  «         t          j        r!t          | j	        t          j        ¦  «        sJ ‚|| j	        _        	  | j	        j        |fd|i|¤Ž n # t          $ r t          d|› �¦  «        ‚w xY wt          j        r!t          | j        t          j        ¦  «        sJ ‚| j        j        st#          j        ¦   «         | j        _        t'          |¦  «        | j        j        _        || j        j        _        || j        j        _        dS )zô
        Given a file path, parse and store a music21 Stream.

        If format is None then look up the format from the file
        extension using `common.findFormatFile`.

        Does not use or store pickles in any circumstance.
        Tr9   úno such file exists: Nr}   z!File is not in a correct format: )r
   r;   r£   r   ÚgetFormatFromFileExtensionÚsetSubConverterFromFormatÚtÚTYPE_CHECKINGre   rÇ   r   ÚSubConverterr€   r   ÚNotImplementedErrorr   ÚStreamr   ÚMetadatarY   ÚfilePathÚ
fileNumberÚ
fileFormat)r=   r5   r}   rÔ   r|   r€   Ú	fpPathlibÚ	useFormats           r.   ÚparseFileNoPicklezConverter.parseFileNoPickle  s™  € õ  #)Ô"2°2ÀTÐ"JÑ"JÔ"Jˆ	à×ÒÑ!Ô!ð 	GÝ(Ð)EÀÐ)EÐ)EÑFÔFÐFØˆ	àÐØ×7Ò7¸	ÑBÔBˆIØ×&Ò& yÑ1Ô1Ð1ÝŒ?ð 	MÝ˜dÔ/µÔ1KÑLÔLÐLÐLÐLà%-ˆÔÔ"ð	SØ'ˆDÔÔ'Øðð àðð ðð ð ð øõ
 #ð 	Sð 	Sð 	SÝ(Ð)QÈRÐ)QÐ)QÑRÔRÐRð	Søøøõ Œ?ð 	:Ý˜dœk­6¬=Ñ9Ô9Ð9Ð9Ð9àŒ{Ô#ð 	7Ý#+Ô#4Ñ#6Ô#6ˆDŒKÔ Ý(+¨I©¬ˆŒÔÔ%Ø*0ˆŒÔÔ'Ø*3ˆŒÔÔ'Ð'Ð's   Â%B; Â;Cc                ó´   — t          j        |d¬¦  «        }d}|                     ¦   «         rd}n(t          j        |¦  «        }|€t	          d|› �¦  «        ‚|S )zè
        gets the format from a file extension.

        >>> fp = common.getSourceFilePath() / 'musedata' / 'testZip.zip'
        >>> c = converter.Converter()
        >>> c.getFormatFromFileExtension(fp)
        'musedata'
        Tr9   Nr   z-cannot find format from file extensions for: )r
   r;   Úis_dirr«   r   )r=   r5   rã   s      r.   r×   z$Converter.getFormatFromFileExtensionN  sl   € õ Ô˜b°Ð5Ñ5Ô5ˆð ˆ	Ø�9Š9‰;Œ;ð 	cØ"ˆIˆIåÔ-¨bÑ1Ô1ˆIØÐ Ý,Ð-aÐ]_Ð-aÐ-aÑbÔbÐbØÐr-   Tc                ó  — ddl m} t          j        |d¬¦  «        }|                     ¦   «         st          d|› �¦  «        ‚|}|€|                      |¦  «        }t          |||fi |¤Ž}	|	                     ¦   «         \  }
}}|du ré|�ç|du rãt           
                    d¦  «         	 t          |d	¬
¦  «        | _        nS# |j        $ rF t                               d|› d�¦  «         t          j        |¦  «          | j        ||||fi |¤Ž Y nw xY w| j        j        st'          j        ¦   «         | j        _        || j        j        _        || j        j        _        || j        j        _        dS t           
                    d¦  «          | j        ||||fi |¤Ž |du rã|�ã|du rát           
                    d¦  «         | j        }|                     |d¬¦  «        }|                     |d	¬¦  «         t           
                    d¦  «         t          |d	¬
¦  «        | _        | j        j        st'          j        ¦   «         | j        _        || j        j        _        || j        j        _        || j        j        _        dS dS dS dS )aC  
        Given a file path, parse and store a music21 Stream, set as self.stream.

        If format is None then look up the format from the file
        extension using `common.findFormatFile`.

        Will load from a pickle unless forceSource is True
        Will store as a pickle unless storePickle is False
        r   ©Ú
freezeThawTr9   rÖ   NFzLoading Pickled versionÚzlibr¢   zCould not parse pickle, z.  RewritingzLoading original versionzFreezing Pickle©ÚfastButUnsafe)r5   rƒ   zReplacing self.stream)Úmusic21ré   r
   r;   r£   r   r×   r   r³   r�   Ú
printDebugr!   rË   ÚFreezeThawExceptionÚwarnr¤   r¥   rä   r   r   rÞ   rß   rà   rá   ÚStreamFreezerÚwrite)r=   r5   r}   rÔ   r|   ÚstorePickler€   ré   rã   ÚpfObjÚunused_fpDstr°   r²   ÚsÚsfs                  r.   r   zConverter.parseFilee  sØ  € ð 	'Ð&Ð&Ð&Ð&Ð&ÝÔ˜b°Ð5Ñ5Ô5ˆØ�yŠy‰{Œ{ð 	GÝ(Ð)EÀÐ)EÐ)EÑFÔFÐFØˆ	àÐØ×7Ò7¸Ñ;Ô;ˆIå˜R ¨fÐAÐA¸ÐAÐAˆØ.3¯lªl©n¬nÑ+ˆ�k 8Ø˜%ÐÐ HÐ$8¸[ÈEÐ=QÐ=QÝ×#Ò#Ð$=Ñ>Ô>Ð>ðTÝ%)¨(¸FÐ%CÑ%CÔ%C�Ô"Ð"øØÔ1ð Tð Tð TÝ×!Ò!Ð"S¸XÐ"SÐ"SÐ"SÑTÔTÐTÝ”	˜(Ñ#Ô#Ð#Ø&�Ô& r¨6°6¸;ÐSÐSÈ(ÐSÐSÐSÐSÐSðTøøøð
 ”;Ô'ð ;Ý'/Ô'8Ñ':Ô':�”Ô$Ø,.ˆDŒKÔ Ô)Ø.4ˆDŒKÔ Ô+Ø.7ˆDŒKÔ Ô+Ð+Ð+å×#Ò#Ð$>Ñ?Ô?Ð?Ø"ˆDÔ" 2 v¨v°{ÐOÐOÀhÐOÐOÐOØ˜dÐ"Ð" xÐ';ÀÈtÐ@SÐ@Så×'Ò'Ð(9Ñ:Ô:Ð:Ø”K�Ø×-Ò-¨a¸tÐ-ÑDÔD�Ø—’˜H¨f�Ñ5Ô5Ð5å×'Ò'Ð(?Ñ@Ô@Ð@å%)¨(¸FÐ%CÑ%CÔ%C�Ô"à”{Ô+ð ?Ý+3Ô+<Ñ+>Ô+>�D”KÔ(Ø02�”Ô$Ô-Ø28�”Ô$Ô/Ø2;�”Ô$Ô/Ð/Ð/ð #Ð"Ð';Ð';Ð@SÐ@Ss   Â(B? Â?ADÄDÚdataStrústr | bytesc                ó–  — |}|�€Ù|                      ¦   «         }|                      |¦  «        \  }}t          |t          ¦  «        r|                     dd¦  «        }n|}|��n{|                     d¦  «        rd|v rd}�n^d}�nZ|                     d¦  «        s'|                     ¦   «                              d¦  «        rd}�n|                     ¦   «                              d	¦  «        rd}nð|                     d
¦  «        s'|                     ¦   «                              d¦  «        rd}n±|                     d¦  «        s<|                     d¦  «        s'|                     ¦   «                              d¦  «        rd}n]|                     ¦   «                              d¦  «        rd}n3d|v rd|v rd}n(d|v rd|v rd}nd|v rd|v rd}nt          d|› �¦  «        ‚|                      |¦  «         t          j
        r!t          | j        t          j        ¦  «        sJ ‚|| j        _        | j                             ||¬¦  «         dS )zo
        Given raw data, determine format and parse into a music21 Stream,
        set as self.stream.
        Núutf-8Úignorez<?xmlz<meiÚmeirR   zmei:z	musicxml:ÚMThdzmidi:Úmidiz!!!z**zhumdrum:Úhumdrumztinynotation:ÚtinyNotationzWK#:Úmeasurer   zM:zK:ÚabczTime Signature:Úm1Ú	romanTextz,File not found or no such format found for: ©r}   )ÚlstripÚformatFromHeaderre   rf   rj   Ú
startswithÚlowerr   rØ   rÙ   rÚ   rÇ   r   rÛ   r€   r   )r=   rø   r}   rÔ   r|   r€   rã   ÚdataStrMakeStrs           r.   r   zConverter.parseData�  sž  € ð ˆ	àÑØ—n’nÑ&Ô&ˆGØ!%×!6Ò!6°wÑ!?Ô!?ÑˆI�wå˜'¥5Ñ)Ô)ð )Ø!(§¢°¸Ñ!BÔ!B��à!(�àÐ$ÙØ×*Ò*¨7Ñ3Ô3ð à˜^Ð+Ð+Ø %�I‘Ià *�I‘IØ×*Ò*¨6Ñ2Ô2ð °n×6JÒ6JÑ6LÔ6L×6WÒ6WÐX^Ñ6_Ô6_ð Ø!�	‘	Ø×%Ò%Ñ'Ô'×2Ò2°;Ñ?Ô?ð Ø&�	�	Ø×*Ò*¨6Ñ2Ô2ð °n×6JÒ6JÑ6LÔ6L×6WÒ6WÐX_Ñ6`Ô6`ð Ø"�	�	Ø ×+Ò+¨EÑ2Ô2ð Ø%×0Ò0°Ñ6Ô6ðà%×+Ò+Ñ-Ô-×8Ò8¸ÑDÔDðð &�	�	Ø×%Ò%Ñ'Ô'×2Ò2°?ÑCÔCð Ø*�	�	ð ˜>Ð)Ð)¨i¸>Ð.IÐ.IØ&�	�	Ø˜Ð'Ð'¨D°NÐ,BÐ,BØ!�	�	Ø" nÐ4Ð4¸ÀÐ9OÐ9OØ'�	�	å(ØSÀ>ÐSÐSñô ð ð 	×&Ò& yÑ1Ô1Ð1ÝŒ?ð 	MÝ˜dÔ/µÔ1KÑLÔLÐLÐLÐLØ%-ˆÔÔ"ØÔ×#Ò# G°FÐ#Ñ;Ô;Ð;Ð;Ð;r-   ©rÔ   r}   r|   c          	     óœ  — t           d         }|dv r$d|›d�}|dz  }|dz  }|dz  }t          |¦  «        ‚|€,t          j        |¦  «        \  }}	|€t          d	|› �¦  «        ‚nt          j        |¦  «        \  }
}	|	€d
}	t                                ¦   «         }|                      ||	|¦  «        }|du s|                     ¦   «         sˆt                                d|› �g¦  «         t          j
        |dd¬¦  «        }|j        dk    r-t          d|› d|j        › dt          |j                 › �¦  «        ‚|                     |j        ¦  «         nt                                d|› �g¦  «         |€t          j        |¦  «        }n|}|€t          d|›�¦  «        ‚|                      |¦  «         t#          j        t&          j        | j        ¦  «        }||_        |                     ||¬¦  «         | j        }|€t          d¦  «        ‚|j        st3          j        ¦   «         |_        ||j        _        ||j        _        ||j        _        dS )aÎ  
        Given a url, download and parse the file
        into a music21 Stream stored in the `stream`
        property of the converter object.

        Note that this checks the user Environment
        `autoDownload` setting before downloading.

        Use `forceSource=True` to download every time rather than
        re-reading from a cached file.

        >>> joplinURL = ('https://github.com/cuthbertLab/music21/raw/master'
        ...              '/music21/corpus/joplin/maple_leaf_rag.mxl')
        >>> c = converter.Converter()
        >>> #_DOCS_SHOW c.parseURL(joplinURL)
        >>> #_DOCS_SHOW joplinStream = c.stream

        * Changed in v7: made keyword-only and added `forceSource` option.
        ÚautoDownload)ÚdenyÚaskz2Automatic downloading of URLs is presently set to z; z5configure your Environment "autoDownload" setting to z)"allow" to permit automatic downloading: z(environment.set('autoDownload', 'allow')Nz%cannot determine file format of url: z.txtTzdownloading to: é   )Úallow_redirectsÚtimeoutéÈ   zCould not download z	, error: ú zusing already downloaded file: z'Cannot automatically find a format for r  z-Could not create a Stream via a subConverter.)r�   r   r
   ÚfindFormatExtURLÚ
findFormatr�   rÓ   r£   rî   ÚrequestsÚgetÚstatus_coder   Úwrite_bytesÚcontentr«   rØ   rÙ   Úcastr   rÛ   rÇ   r€   r   r   r   rÞ   rß   rà   rá   )r=   rÏ   rÔ   r}   r|   r€   r  ÚmessageÚformatFromURLrÎ   Úunused_formatTyper�   r5   rC   rã   rÇ   rö   s                    r.   r   zConverter.parseURLÛ  sŽ  € õ8 $ NÔ3ˆØ˜?Ð*Ð*Ø]È<Ð]Ð]Ð]ˆGØÐNÑNˆGØÐBÑBˆGØÐAÑAˆGÝ$ WÑ-Ô-Ð-ð
 ˆ>Ý!'Ô!8¸Ñ!=Ô!=ÑˆM˜3ØÐ$Ý(Ð)VÐQTÐ)VÐ)VÑWÔWÐWð %õ &,Ô%6°vÑ%>Ô%>Ñ"Ð˜sØˆ{Ø�å ×/Ò/Ñ1Ô1ˆ	Ø× Ò  ¨C°Ñ5Ô5ˆà˜$ÐÐ b§i¢i¡k¤kÐÝ×#Ò#Ð%<¸Ð%<Ð%<Ð$=Ñ>Ô>Ð>Ý”˜S°$ÀÐCÑCÔCˆAØŒ} Ò#Ð#Ý(Øb¨#ÐbÐb¸¼ÐbÐbÍ	ÐRSÔR_ÔH`ÐbÐbñdô dð dà�NŠN˜1œ9Ñ%Ô%Ð%Ð%å×#Ò#Ð%KÀrÐ%KÐ%KÐ$LÑMÔMÐMð ˆ>ÝÔ-¨bÑ1Ô1ˆIˆIàˆIØÐÝ$Ð%UÈrÐ%UÐ%UÑVÔVÐVà×&Ò& yÑ1Ô1Ð1å”v�mÔ8¸$Ô:KÑLÔLˆØ (ˆÔØ×Ò˜r¨&ÐÑ1Ô1Ð1àŒKˆØˆ9Ý$Ð%TÑUÔUÐUàŒzð 	-Ý!Ô*Ñ,Ô,ˆAŒJà ˆŒ
ÔØ &ˆŒ
ÔØ )ˆŒ
ÔÐÐr-   ÚanyÚconverterTypeú#t.Literal['any', 'input', 'output']ú&list[type[subConverters.SubConverter]]c                óÀ  — g }t           D ]}|                     |¦  «         Œt          rt          d         dk    rnc|                     t                               ¦   «         ¦  «         t          D ]/}|dk    rŒ		 |                     |¦  «         Œ # t          $ r Y Œ,w xY w| dk    r|S g }|D ]3}| dk    r|j        sŒ| dk    r|j	        sŒ|                     |¦  «         Œ4|S )a–  
        Gives a list of all the subConverter classes that are registered.

        If converterType is 'any' (true), then input or output
        subConverters are listed.

        Otherwise, 'input', or 'output' can be used to filter.

        >>> converter.resetSubConverters() #_DOCS_HIDE
        >>> c = converter.Converter()
        >>> scl = c.subConvertersList()
        >>> defaultScl = c.defaultSubConverters()
        >>> tuple(scl) == tuple(defaultScl)
        True

        >>> sclInput = c.subConvertersList('input')
        >>> sclInput
        [<class 'music21.converter.subConverters.ConverterABC'>,
         <class 'music21.converter.subConverters.ConverterCapella'>,
         <class 'music21.converter.subConverters.ConverterClercqTemperley'>,
         <class 'music21.converter.subConverters.ConverterHumdrum'>,
         <class 'music21.converter.subConverters.ConverterMEI'>,
         <class 'music21.converter.subConverters.ConverterMidi'>,
         <class 'music21.converter.subConverters.ConverterMuseData'>,
         <class 'music21.converter.subConverters.ConverterMusicXML'>,
         <class 'music21.converter.subConverters.ConverterNoteworthy'>,
         <class 'music21.converter.subConverters.ConverterNoteworthyBinary'>,
         <class 'music21.converter.subConverters.ConverterRomanText'>,
         <class 'music21.converter.subConverters.ConverterScala'>,
         <class 'music21.converter.subConverters.ConverterTinyNotation'>,
         <class 'music21.converter.subConverters.ConverterVolpiano'>]

        Get those that can output (note that this is also a static method
        on converter)

        >>> sclOutput = converter.Converter.subConvertersList('output')
        >>> sclOutput
        [<class 'music21.converter.subConverters.ConverterBraille'>,
         <class 'music21.converter.subConverters.ConverterLilypond'>,
         <class 'music21.converter.subConverters.ConverterMidi'>,
         <class 'music21.converter.subConverters.ConverterMusicXML'>,
         <class 'music21.converter.subConverters.ConverterRomanText'>,
         <class 'music21.converter.subConverters.ConverterScala'>,
         <class 'music21.converter.subConverters.ConverterText'>,
         <class 'music21.converter.subConverters.ConverterTextLine'>,
         <class 'music21.converter.subConverters.ConverterVexflow'>,
         <class 'music21.converter.subConverters.ConverterVolpiano'>]

        >>> class ConverterSonix(converter.subConverters.SubConverter):
        ...    registerFormats = ('sonix',)
        ...    registerInputExtensions = ('mus',)
        >>> converter.registerSubConverter(ConverterSonix)
        >>> ConverterSonix in c.subConvertersList()
        True

        Newly registered subConverters appear first, so they will be used instead
        of any default subConverters that work on the same format or extension.

        >>> class BadMusicXMLConverter(converter.subConverters.SubConverter):
        ...    registerFormats = ('musicxml',)
        ...    registerInputExtensions = ('xml', 'mxl', 'musicxml')
        ...    def parseData(self, strData, number=None):
        ...        self.stream = stream.Score(id='empty')

        >>> converter.registerSubConverter(BadMusicXMLConverter)
        >>> c.subConvertersList()
        [<class '...BadMusicXMLConverter'>,
         ...
         <class 'music21.converter.subConverters.ConverterMusicXML'>,
         ...]

        Show that this musicxml file by Amy Beach is now parsed by BadMusicXMLConverter:

        >>> #_DOCS_SHOW s = corpus.parse('beach/prayer_of_a_tired_child')
        >>> #_DOCS_HIDE -- we cannot know if the piece is already parsed or not.
        >>> s = corpus.parse('beach/prayer_of_a_tired_child', forceSource=True)  #_DOCS_HIDE
        >>> s.id
        'empty'
        >>> len(s.parts)
        0

        Note that if the file has already been parsed by another subConverter format
        the parameter `forceSource` is required to force the file to be parsed by the
        newly registered subConverter:

        >>> converter.unregisterSubConverter(BadMusicXMLConverter)
        >>> #_DOCS_HIDE -- the forceSource will not have created a pickle.
        >>> #_DOCS_SHOW s = corpus.parse('beach/prayer_of_a_tired_child')
        >>> s.id
        'empty'
        >>> len(s.parts)
        0
        >>> s = corpus.parse('beach/prayer_of_a_tired_child', forceSource=True)
        >>> len(s.parts)
        6

        >>> converter.resetSubConverters() #_DOCS_HIDE
        r   rÁ   r!  ÚinputÚoutput)
r¶   rM   r·   Úextendr   rÃ   r¥   rÂ   ÚregisterInputExtensionsÚregisterOutputExtensions)r"  ÚsubConverterListÚregÚunregisteredÚfilteredSubConvertersListÚscs         r.   ÚsubConvertersListzConverter.subConvertersList4  s6  € ðN ÐÝ+ð 	)ð 	)ˆCà×#Ò# CÑ(Ô(Ð(Ð(å%ð 
	Õ*DÀQÔ*GÈ5Ò*PÐ*PØà×#Ò#¥I×$BÒ$BÑ$DÔ$DÑEÔEÐEÝ :ð ð �Ø 5Ò(Ð(ØðØ$×+Ò+¨LÑ9Ô9Ð9Ð9øÝ!ð ð ð Ø�Dðøøøð ˜EÒ!Ð!Ø#Ð#à$&Ð!Ø"ð 	1ð 	1ˆBØ Ò'Ð'°Ô0JÐ'ØØ Ò(Ð(°Ô1LÐ(ØØ%×,Ò,¨RÑ0Ô0Ð0Ð0à(Ð(s   Á8BÂ
BÂBc                 ó<  — g } t          t          j        ¦  «        D ]}t          t          |¦  «        }t	          |¦  «        rYt          |t          j        ¦  «        s?t          |d¦  «        r/t          |t          j
        ¦  «        r|                      |¦  «         Œ€| S )aÏ  
        return an alphabetical list of the default subConverters: those in converter.subConverters
        with the class SubConverter.

        Do not use generally.  Use Converter.subConvertersList()

        >>> c = converter.Converter()
        >>> for sc in c.defaultSubConverters():
        ...     print(sc)
        <class 'music21.converter.subConverters.ConverterABC'>
        <class 'music21.converter.subConverters.ConverterBraille'>
        <class 'music21.converter.subConverters.ConverterCapella'>
        <class 'music21.converter.subConverters.ConverterClercqTemperley'>
        <class 'music21.converter.subConverters.ConverterHumdrum'>
        <class 'music21.converter.subConverters.ConverterIPython'>
        <class 'music21.converter.subConverters.ConverterLilypond'>
        <class 'music21.converter.subConverters.ConverterMEI'>
        <class 'music21.converter.subConverters.ConverterMidi'>
        <class 'music21.converter.subConverters.ConverterMuseData'>
        <class 'music21.converter.subConverters.ConverterMusicXML'>
        <class 'music21.converter.subConverters.ConverterNoteworthy'>
        <class 'music21.converter.subConverters.ConverterNoteworthyBinary'>
        <class 'music21.converter.subConverters.ConverterRomanText'>
        <class 'music21.converter.subConverters.ConverterScala'>
        <class 'music21.converter.subConverters.ConverterText'>
        <class 'music21.converter.subConverters.ConverterTextLine'>
        <class 'music21.converter.subConverters.ConverterTinyNotation'>
        <class 'music21.converter.subConverters.ConverterVexflow'>
        <class 'music21.converter.subConverters.ConverterVolpiano'>
        <class 'music21.converter.subConverters.SubConverter'>
        Ú__mro__)Úsortedr   Ú__dict__ÚgetattrÚcallablere   ÚtypesÚFunctionTypeÚhasattrÚ
issubclassrÛ   rM   )rÃ   ÚiÚpossibleSubConverters      r.   rÃ   zConverter.defaultSubConverters¹  s­   € ðB HJÐÝ�Ô.Ñ/Ô/ð 	Bð 	BˆAÝ#*­=¸!Ñ#<Ô#<Ð åÐ-Ñ.Ô.ð BÝ&Ð';½UÔ=OÑPÔPðBåÐ 4°iÑ@Ô@ðBõ #Ð#7½Ô9SÑTÔTðBð %×+Ò+Ð,@ÑAÔAÐAøØ#Ð#r-   ú+dict[str, type[subConverters.SubConverter]]c                 ó´   — i } t                                ¦   «         D ];}t          |d¦  «        r)|j        }|D ]}|                     ¦   «         }|| vr|| |<   Œ Œ<| S )a/
  
        Get a dictionary of subConverters for various formats.

        (staticmethod: call on an instance or the class itself)

        >>> scf = converter.Converter.getSubConverterFormats()
        >>> scf['abc']
        <class 'music21.converter.subConverters.ConverterABC'>
        >>> for x in sorted(scf):
        ...     x, scf[x]
        ('abc', <class 'music21.converter.subConverters.ConverterABC'>)
        ('braille', <class 'music21.converter.subConverters.ConverterBraille'>)
        ('capella', <class 'music21.converter.subConverters.ConverterCapella'>)
        ('clercqtemperley', <class 'music21.converter.subConverters.ConverterClercqTemperley'>)
        ('cttxt', <class 'music21.converter.subConverters.ConverterClercqTemperley'>)
        ('har', <class 'music21.converter.subConverters.ConverterClercqTemperley'>)
        ('humdrum', <class 'music21.converter.subConverters.ConverterHumdrum'>)
        ('ipython', <class 'music21.converter.subConverters.ConverterIPython'>)
        ('jupyter', <class 'music21.converter.subConverters.ConverterIPython'>)
        ('lily', <class 'music21.converter.subConverters.ConverterLilypond'>)
        ('lilypond', <class 'music21.converter.subConverters.ConverterLilypond'>)
        ('mei', <class 'music21.converter.subConverters.ConverterMEI'>)
        ('midi', <class 'music21.converter.subConverters.ConverterMidi'>)
        ('musedata', <class 'music21.converter.subConverters.ConverterMuseData'>)
        ('musicxml', <class 'music21.converter.subConverters.ConverterMusicXML'>)
        ('noteworthy', <class 'music21.converter.subConverters.ConverterNoteworthyBinary'>)
        ('noteworthytext', <class 'music21.converter.subConverters.ConverterNoteworthy'>)
        ('rntext', <class 'music21.converter.subConverters.ConverterRomanText'>)
        ('romantext', <class 'music21.converter.subConverters.ConverterRomanText'>)
        ('scala', <class 'music21.converter.subConverters.ConverterScala'>)
        ('t', <class 'music21.converter.subConverters.ConverterText'>)
        ('text', <class 'music21.converter.subConverters.ConverterText'>)
        ('textline', <class 'music21.converter.subConverters.ConverterTextLine'>)
        ('tinynotation', <class 'music21.converter.subConverters.ConverterTinyNotation'>)
        ('txt', <class 'music21.converter.subConverters.ConverterText'>)
        ('vexflow', <class 'music21.converter.subConverters.ConverterVexflow'>)
        ('volpiano', <class 'music21.converter.subConverters.ConverterVolpiano'>)
        ('xml', <class 'music21.converter.subConverters.ConverterMusicXML'>)
        ÚregisterFormats)r   r0  r9  r?  r
  )ÚconverterFormatsÚnameÚformatsTuplerO   s       r.   ÚgetSubConverterFormatsz Converter.getSubConverterFormatså  s|   € ðR ÐÝ×/Ò/Ñ1Ô1ð 	3ð 	3ˆDÝ�tÐ.Ñ/Ô/ð 3Ø#Ô3�Ø%ð 3ð 3�AØŸš™	œ	�AØÐ 0Ð0Ð0Ø.2Ð(¨Ñ+øøØÐr-   ÚconverterFormatúsubConverters.SubConverterc                óÎ   — | €t          d¦  «        ‚|                      ¦   «         } t                               ¦   «         }| |vrt          d| › �¦  «        ‚||          } |¦   «         S )aG  
        Return a particular subConverter class based on the format
        of the converterFormat string.

        Static method: call on the class itself or an instance:

        >>> converter.Converter.getSubConverterFromFormat('musicxml')
        <music21.converter.subConverters.ConverterMusicXML object at 0x...>
        Nz*Did not find a format from the source filez#no converter available for format: )r   r
  r   rC  )rD  ÚscfÚsubConverterClasss      r.   ÚgetSubConverterFromFormatz#Converter.getSubConverterFromFormat  sw   € ð Ð"Ý$Ð%QÑRÔRÐRØ)×/Ò/Ñ1Ô1ˆÝ×.Ò.Ñ0Ô0ˆØ #Ð%Ð%Ý$Ð%\È?Ð%\Ð%\Ñ]Ô]Ð]Ø Ô0ÐØ Ð Ñ"Ô"Ð"r-   c                óD   — t                                |¦  «        | _        dS )a(  
        sets the .subConverter according to the format of `converterFormat`:

        >>> convObj = converter.Converter()
        >>> convObj.setSubConverterFromFormat('humdrum')
        >>> convObj.subConverter
        <music21.converter.subConverters.ConverterHumdrum object at 0x...>
        N)r   rI  rÇ   )r=   rD  s     r.   rØ   z#Converter.setSubConverterFromFormat.  s    € õ &×?Ò?ÀÑPÔPˆÔÐÐr-   r%   útuple[str | None, _StrOrBytes]c           	     óh  — t          |t          ¦  «        r1|dd…                              dd¦  «                             ¦   «         }nRt          |t          ¦  «        r|dd…                              ¦   «         }n t          dt          |¦  «        › d�¦  «        ‚d}|                      ¦   «         }|D ]~}|j        D ]t}| 	                    |                     ¦   «         dz   ¦  «        rH|}t          j        t          |t          |¦  «        dz   d…                              ¦   «         ¦  «        } nŒuŒ||fS )	a–  
        if dataStr begins with a text header such as  "tinyNotation:" then
        return that format plus the dataStr with the head removed.

        Else, return (None, dataStr) where dataStr is the original untouched.

        The header is not detected case-sensitive.

        >>> c = converter.Converter()
        >>> c.formatFromHeader('tinynotation: C4 E2')
        ('tinynotation', 'C4 E2')

        Note that the format is always returned in lower case:

        >>> c.formatFromHeader('romanText: m1: a: I b2 V')
        ('romantext', 'm1: a: I b2 V')

        If there is no header then the format is None and the original is
        returned unchanged:

        >>> c.formatFromHeader('C4 E2')
        (None, 'C4 E2')
        >>> c.formatFromHeader(b'binary-data')
        (None, b'binary-data')

        New formats can register new headers, like this old Amiga format:

        >>> class ConverterSonix(converter.subConverters.SubConverter):
        ...    registerFormats = ('sonix',)
        ...    registerInputExtensions = ('mus',)
        >>> converter.registerSubConverter(ConverterSonix)
        >>> c.formatFromHeader('sonix: AIFF data')
        ('sonix', 'AIFF data')
        >>> converter.resetSubConverters() #_DOCS_HIDE

        If bytes are passed in, the data is returned as bytes, but the
        header format is still converted to a string:

        >>> c.formatFromHeader(b'romanText: m1: a: I b2 V')
        ('romantext', b'm1: a: I b2 V')

        Anything except string or bytes raises a ValueError:

        >>> c.formatFromHeader(23)
        Traceback (most recent call last):
        ValueError: Cannot parse a format from <class 'int'>.
        Nr  rû   rü   zCannot parse a format from rˆ   ú:r\   )re   rf   rj   r
  rY   rÂ   Útyper0  r?  r	  rÙ   r  r%   Úlenr  )r=   rø   ÚdataStrStartLowerÚfoundFormatr+  r/  ÚpossibleFormats          r.   r  zConverter.formatFromHeader9  sM  € õh �g�uÑ%Ô%ð 	MØ '¨¨¨¤× 3Ò 3°G¸XÑ FÔ F× LÒ LÑ NÔ NÐÐÝ˜¥Ñ%Ô%ð 	MØ '¨¨¨¤× 2Ò 2Ñ 4Ô 4ÐÐåÐK½4À¹=¼=ÐKÐKÐKÑLÔLÐLàˆØ×1Ò1Ñ3Ô3ÐØ"ð 	ð 	ˆBØ"$Ô"4ð ð �Ø$×/Ò/°×0DÒ0DÑ0FÔ0FÈÑ0LÑMÔMð Ø"0�KÝœf¥[Ø%,­S°Ñ-=Ô-=ÀÑ-AÐ-BÐ-BÔ%C×%JÒ%JÑ%LÔ%Lñ'ô '�Gð �Eðøð ˜WÐ%Ð%r-   Úfmtc                ó$  — |                      ¦   «                              ¦   «         }|                     d¦  «        r
|dd…         }d}|                     d¦  «        }|d         }t	          |¦  «        dk    r|dd…         }ng }|                      ¦   «         }|D ]}|j        }|D ]}||k    r|} nŒ|� nŒ|€|D ]}|j        }	|	D ]}
||
k    r|} nŒ|� nŒ|€|D ]}|j        }	|	D ]}
||
k    r|} nŒ|� nŒ|r|j        r|j        d         S dS )aÄ  
        Take in a string representing a format, a file extension (w/ or without leading dot)
        etc. and find the format string that best represents the format that should be used.

        Searches SubConverter.registerFormats first, then SubConverter.registerInputExtensions,
        then SubConverter.registerOutputExtensions

        Returns None if no format applies:

        >>> c = converter.Converter()
        >>> c.regularizeFormat('mxl')
        'musicxml'
        >>> c.regularizeFormat('t')
        'text'
        >>> c.regularizeFormat('abc')
        'abc'
        >>> c.regularizeFormat('lily.png')
        'lilypond'
        >>> c.regularizeFormat('blah') is None
        True
        rˆ   r\   Nr   )r
  Ústripr	  ÚsplitrO  r0  r?  r)  )r=   rS  ÚfoundScÚ
formatListÚunused_subformatsÚsclr/  ÚformatsÚscFormatÚ
extensionsrÎ   s              r.   ÚregularizeFormatzConverter.regularizeFormat€  s·  € ð. �iŠi‰kŒk×ÒÑ!Ô!ˆØ�>Š>˜#ÑÔð 	Ø�a�b�b”'ˆCØˆà—Y’Y˜s‘^”^ˆ
Ø˜ŒmˆÝˆz‰?Œ?˜QÒÐØ *¨1¨2¨2¤ÐÐà "ÐØ×$Ò$Ñ&Ô&ˆàð 	ð 	ˆBØÔ(ˆGØ#ð ð �Ø˜(’?�?Ø �GØ�Eð #ð Ð"Ø�ð #ð ˆ?Øð ð �ØÔ7�
Ø%ð ð �CØ˜c’z�zØ"$˜Ø˜ð "ð Ð&Ø�Eð 'àˆ?Øð ð �ØÔ7�
Ø%ð ð �CØ˜c’z�zØ"$˜Ø˜ð "ð Ð&Ø�Eð 'ð ð 	�wÔ.ð 	ØÔ*¨1Ô-Ð-à�4r-   ú/stream.Score | stream.Part | stream.Opus | Nonec                óH   — | j         �| j         S | j        �| j        j        S dS )z:
        Returns the .subConverter.stream object.
        N)rË   rÇ   r   rÌ   s    r.   r   zConverter.streamÇ  s0   € ð
 ÔÐ)ØÔ%Ð%ØÔÐ*ØÔ$Ô+Ð+à�4r-   rµ   )r�   rÍ   rÎ   rY   rÏ   rY   ©NNF)r5   rÍ   r}   r~   rÔ   r„   r|   r@   )NNFT)rø   rù   r?   rŸ   )
rÏ   rY   rÔ   r„   r}   r~   r|   r@   r?   rŸ   )r!  )r"  r#  r?   r$  )r?   r$  )r?   r=  )rD  rY   r?   rE  )rD  rY   )rø   r%   r?   rK  )rS  rY   r?   r„   )r?   r_  )r)   r*   r+   rz   rÈ   Ú__annotations__r>   rÓ   rä   r×   r   r   r   Ústaticmethodr0  rÃ   rC  rI  rØ   r  r^  Úpropertyr   r,   r-   r.   r   r   û  s  € € € € € € ðð ð 	ðð!€Ið ð ð ñ ðMð Mð Mð Mð
+ð +ð +ð +ð(  ØØ!ð-4ð -4ð -4ð -4ð -4ð^ð ð ð. $(Ø>Bð6<ð 6<ð 6<ð 6<ðv ØØð<<ð <<ð <<ð <<ð <<ðD  ØØ!ðT*ð T*ð T*ð T*ð T*ð T*ðr à=BðB)ð B)ð B)ð B)ñ „\ðB)ðH ð)$ð )$ð )$ñ „\ð)$ðV ð0 ð 0 ð 0 ñ „\ð0 ðd ð#ð #ð #ñ „\ð#ð*	Qð 	Qð 	Qð 	QðE&ð E&ð E&ð E&ðNCð Cð Cð CðN ð	ð 	ð 	ñ „Xð	ð 	ð 	r-   r   Fú(stream.Score | stream.Part | stream.Opusc                ó  — t          ¦   «         }t          j        | d¬¦  «        }  |j        | f|||dœ|¤Ž t          j        r8t          |j        t          j        t          j	        t          j
        f¦  «        sJ ‚|j        S )zE
    Given a file path, attempt to parse the file into a Stream.
    Tr9   ©r}   rÔ   r|   )r   r
   r;   r   rÙ   rÚ   re   r   ÚScoreÚPartÚOpus)r5   r}   rÔ   r|   r€   Úvs         r.   r   r   Û  s|   € õ 	‰Œ€AÝ	Ô	˜"¨DÐ	1Ñ	1Ô	1€BØ€A„K�ÐV˜6¨&¸kÐVÐVÈXÐVÐVÐVÝ„ð NÝ˜!œ(¥V¤\µ6´;ÅÄÐ$LÑMÔMÐMÐMÐMØŒ8€Or-   c                óÖ   — t          ¦   «         } |j        | f||dœ|¤Ž t          j        r8t	          |j        t
          j        t
          j        t
          j        f¦  «        sJ ‚|j        S )zm
    Given musical data represented within a Python string, attempt to parse the
    data into a Stream.
    ©r}   rÔ   )	r   r   rÙ   rÚ   re   r   rh  ri  rj  )rø   r}   rÔ   r€   rk  s        r.   r   r   ì  se   € õ 	‰Œ€AØ€A„K�ÐB ¨vÐBÐB¸ÐBÐBÐBÝ„ð NÝ˜!œ(¥V¤\µ6´;ÅÄÐ$LÑMÔMÐMÐMÐMØŒ8€Or-   r  c               óÖ   — t          ¦   «         } |j        | f||dœ|¤Ž t          j        r8t	          |j        t
          j        t
          j        t
          j        f¦  «        sJ ‚|j        S )a  
    Given a URL, attempt to download and parse the file into a Stream. Note:
    URL downloading will not happen automatically unless the user has set their
    Environment "autoDownload" preference to "allow".

    * Changed in v7: made keyword-only.
    )rÔ   r|   )	r   r   rÙ   rÚ   re   r   rh  ri  rj  )rÏ   rÔ   r}   r|   r€   rk  s         r.   r   r   ü  se   € õ 	‰Œ€AØ€A„JˆsÐG˜6¨{ÐGÐG¸hÐGÐGÐGÝ„ð NÝ˜!œ(¥V¤\µ6´;ÅÄÐ$LÑMÔMÐMÐMÐMØŒ8€Or-   )r|   r}   rÔ   ÚvalueúAbundles.MetadataEntry | bytes | str | pathlib.Path | list | tupler|   r@   r}   r~   rÔ   r„   c               óÖ  — t          | t          ¦  «        r|                      dd¦  «        }t          | t          j        ¦  «        rt          | ¦  «        }n‹t          | t          j        ¦  «        rW| j         	                    ¦   «         rt          | j        ¦  «        }nCt          t          j        ¦   «         | j        z  ¦  «        }nt          | t
          ¦  «        r| }nd}t          j        | ¦  «        rRt          | ¦  «        dk    r?| d         €7t          t          | d         ¦  «        ¦  «        rt          | d         fd|i|¤ŽS t          j        | ¦  «        rçt          | ¦  «        dk    rÔt          t          | d         ¦  «        ¦  «        r²t          | d         t
          ¦  «        st!          d	| d         ›�¦  «        ‚t          | d         t"          ¦  «        st!          d
| d         ›�¦  «        ‚t          | d         fd|i|¤Ž}t          |t$          j        ¦  «        r|                     | d         ¦  «        S |S t          | t          ¦  «        s%|                     d¦  «        rt-          | f||dœ|¤ŽS t          | t          ¦  «        s t          |¦  «        rt          |f|||dœ|¤ŽS t          | t          ¦  «        sDt          t          j        |¦  «        ¦  «        r#t          t          j        |¦  «        f|||dœ|¤ŽS t          |t          ¦  «        s;|                     d¦  «        s|                     d¦  «        rt1          | f|||dœ|¤ŽS t          | t          j        ¦  «        rt3          dt          | ¦  «        › �¦  «        ‚t          | t
          ¦  «        r3t          j        | ¦  «        �t3          dt          | ¦  «        › �¦  «        ‚t-          | f||dœ|¤ŽS )a·  
    Given a file path, encoded data in a Python string, or a URL, attempt to
    parse the item into a Stream.  Note: URL downloading will not happen
    automatically unless the user has set their Environment "autoDownload"
    preference to "allow".

    Keywords can include `number` which specifies a piece number in a file of
    multi-piece file. (Otherwise, a particular score from an
    :class:`~music21.stream.Opus` can also be extracted by providing a
    two-element list or tuple of the form (path, number) to the `value` argument.)

    `format` specifies the format to parse the line of text or the file as.

    `quantizePost` specifies whether to quantize a stream resulting from MIDI conversion.
    By default, MIDI streams are quantized to the nearest sixteenth or triplet-eighth
    (i.e. smaller durations will not be preserved).
    `quarterLengthDivisors` sets the quantization units explicitly.

    A string of text is first checked to see if it is a filename that exists on
    disk.  If not it is searched to see if it looks like a URL.  If not it is
    processed as data.

    PC File:

    >>> #_DOCS_SHOW s = converter.parse(r'c:\users\myke\desktop\myFile.xml')

    Mac File:

    >>> #_DOCS_SHOW s = converter.parse('/Users/cuthbert/Desktop/myFile.xml')

    URL:

    >>> #_DOCS_SHOW s = converter.parse('https://midirepository.org/file220/file.mid')

    Data is preceded by an identifier such as "tinynotation:"

    >>> s = converter.parse("tinyNotation: 3/4 E4 r f# g=lastG trip{b-8 a g} c", makeNotation=False)
    >>> s[meter.TimeSignature].first()
    <music21.meter.TimeSignature 3/4>

    or the format can be passed directly:

    >>> s = converter.parse("2/16 E4 r f# g=lastG trip{b-8 a g} c", format='tinyNotation')
    >>> s[meter.TimeSignature].first()
    <music21.meter.TimeSignature 2/16>

    * Changed in v8: passing a list of tinyNotation strings was never documented as a
        possibility and has been removed.
    rû   rü   ra   é   r\   Nr   rÔ   zCIf using a two-element list, the first value must be a string, not zMIf using a two-element list, the second value must be an integer number, not rþ   rm  rg  zhttp://zhttps://zCannot find file in )re   rf   rj   rb   rc   rY   r   ÚMetadataEntryÚ
sourcePathÚis_absoluter
   ÚgetCorpusFilePathÚ
isListLikerO  Ú
_osCanLoadr   r   Úintr   rj  ÚgetScoreByNumberr	  r   r;   r   ÚFileNotFoundErrorr«   )ro  r|   r}   rÔ   r€   ÚvalueStrr/  s          r.   r   r     s8  € õt �%�ÑÔð 3Ø—<’< ¨Ñ2Ô2ˆÝ�%�œÑ&Ô&ð 
Ý�u‘:”:ˆˆÝ	�E�7Ô0Ñ	1Ô	1ð ØÔ×'Ò'Ñ)Ô)ð 	JÝ˜5Ô+Ñ,Ô,ˆHˆHå�6Ô3Ñ5Ô5¸Ô8HÑHÑIÔIˆHˆHÝ	�E�3Ñ	Ô	ð ØˆˆàˆåÔ˜%Ñ Ô ð /JÝ�E‘
”
˜a’�Ø�a”Ð Ý�3˜u Qœx™=œ=Ñ)Ô)ð !õ ˜˜qœÐ=Ð=¨&Ð=°HÐ=Ð=Ð=Ý
Ô
˜EÑ
"Ô
"ð )JÝ�%‰jŒj˜AŠoˆoÝ�˜U 1œX™œÑ'Ô'ð õ ˜% œ(¥CÑ(Ô(ð 	Ý$ØbÐV[Ð\]ÔV^ÐbÐbñô ð õ ˜% œ(¥CÑ(Ô(ð 	Ý$ð$Ø˜Q”xð$ð $ñô ð õ �u˜Q”xÐ;Ð;¨Ð;°(Ð;Ð;ˆÝ�b�&œ+Ñ&Ô&ð 	Ø×&Ò& u¨Q¤xÑ0Ô0Ð0àˆIå˜�uÑ%Ô%ð J¨(×*=Ò*=¸fÑ*EÔ*Eð JÝ˜ÐI v°fÐIÐIÀÐIÐIÐIÝ˜¥Ñ&Ô&ð JÝ˜Ñ"Ô"ðJå˜ð >¨&¸Ø%0ð>ð >Ø4<ð>ð >ð 	>å˜¥Ñ&Ô&ð JÝ�Ô)¨(Ñ3Ô3Ñ4Ô4ðJå�Ô)¨(Ñ3Ô3ð >¸FÈ6Ø%0ð>ð >Ø4<ð>ð >ð 	>å˜¥%Ñ(Ô(ð J¨h×.AÒ.AÀ)Ñ.LÔ.Lð JØ19×1DÒ1DÀZÑ1PÔ1PðJõ ˜ð = f°VØ$/ð=ð =Ø3;ð=ð =ð 	=å	�E�7œ<Ñ	(Ô	(ð JÝÐ Cµs¸5±z´zÐ CÐ CÑDÔDÐDÝ	�E�3Ñ	Ô	ð J¥FÔ$9¸%Ñ$@Ô$@Ð$LåÐ Cµs¸5±z´zÐ CÐ CÑDÔDÐDõ ˜ÐI v°fÐIÐIÀÐIÐIÐIr-   Úobjúbase.Music21ObjectrS  rY   rù   c                ój  — |                      d¦  «        r
|dd…         }t          j        |¦  «        \  }}|€t          d|› �¦  «        ‚|                     d¦  «        }|d         }|dd…         }t          j        |¦  «        }|€t          d|› �¦  «        ‚ |¦   «         } |j        | f||dœ|¤ŽS )a¾  
    Convert `obj` to the given format `fmt` and return the information retrieved.

    Currently, this is somewhat inefficient: it calls SubConverter.toData which
    calls `write()` on the object and reads back the value of the file.

    >>> tiny = converter.parse('tinyNotation: 4/4 C4 D E F G1')
    >>> data = converter.toData(tiny, 'braille.ascii')
    >>> type(data)
    <class 'str'>
    >>> print(data)
        #D4
    #A _?:$] (<K
    rˆ   r\   Nz*cannot support output in this format yet: r   )rS  Ú
subformats)r	  r
   r  r   rV  ÚfindSubConverterForFormatÚtoData)	r}  rS  r€   ÚregularizedConverterFormatÚ
unused_extÚ
formatSubsr€  ÚscClassÚformatWriters	            r.   r‚  r‚  ‰  sé   € ð ‡~‚~�cÑÔð Ø�!�"�"ŒgˆÝ-3Ô->¸sÑ-CÔ-CÑ*Ð 
Ø!Ð)Ý Ð!SÈcÐ!SÐ!SÑTÔTÐTà—’˜3‘”€JØ
�QŒ-€CØ˜A˜B˜B”€JåÔ.Ð/IÑJÔJ€GØ€Ý Ð!SÈcÐ!SÐ!SÑTÔTÐTØ�7‘9”9€LØˆ<ÔØðà&Øðð ð ð	ð ð r-   rê   r…   c                ól   — ddl m} |                     | |¬¦  «        }|                     |||¬¦  «        S )aø  
    Given a StreamObject and a file path, serialize and store the Stream to a file.

    This function is based on the :class:`~music21.converter.StreamFreezer` object.

    The serialization format is defined by the `fmt` argument; 'pickle' (the default) is only one
    presently supported.  'json' or 'jsonnative' will be used once jsonpickle is good enough.

    If no file path is given, a temporary file is used.

    The file path is returned.

    >>> c = converter.parse('tinynotation: 4/4 c4 d e f')
    >>> c.show('text')
    {0.0} <music21.stream.Measure 1 offset=0.0>
        {0.0} <music21.clef.TrebleClef>
        {0.0} <music21.meter.TimeSignature 4/4>
        {0.0} <music21.note.Note C>
        {1.0} <music21.note.Note D>
        {2.0} <music21.note.Note E>
        {3.0} <music21.note.Note F>
        {4.0} <music21.bar.Barline type=final>
    >>> fp = converter.freeze(c, fmt='pickle')
    >>> #_DOCS_SHOW fp
    PosixPath('/tmp/music21/sjiwoe.p.gz')

    The file can then be "thawed" back into a Stream using the
    :func:`~music21.converter.thaw` method.

    >>> d = converter.thaw(fp)
    >>> d.show('text')
    {0.0} <music21.stream.Measure 1 offset=0.0>
        {0.0} <music21.clef.TrebleClef>
        {0.0} <music21.meter.TimeSignature 4/4>
        {0.0} <music21.note.Note C>
        {1.0} <music21.note.Note D>
        {2.0} <music21.note.Note E>
        {3.0} <music21.note.Note F>
        {4.0} <music21.bar.Barline type=final>

    OMIT_FROM_DOCS

    >>> import os
    >>> os.remove(fp)
    r   rè   rë   )rS  r5   rƒ   )rí   ré   rñ   rò   )Ú	streamObjrS  r5   rì   rƒ   ré   rk  s          r.   r   r   ­  sG   € ð^ #Ð"Ð"Ð"Ð"Ð"Ø× Ò  ¸-Ð ÑHÔH€AØ�7Š7�s˜r¨7ˆ7Ñ3Ô3Ð3r-   c                ór   — ddl m} |                     ¦   «         }|                     | |¬¦  «         |j        S )zô
    Given a file path of a serialized Stream, defrost the file into a Stream.

    This function is based on the :class:`~music21.converter.StreamFreezer` object.

    See the documentation for :meth:`~music21.converter.freeze` for demos.
    r   rè   r¢   )rí   ré   ÚStreamThawerrp   r   )r5   rƒ   ré   rk  s       r.   r!   r!   á  sD   € ð #Ð"Ð"Ð"Ð"Ð"Ø×ÒÑ!Ô!€AØ‡F‚Fˆ2�w€FÑÔÐØŒ8€Or-   c                ód   — ddl m} |                     | ¦  «        }|                     |¬¦  «        S )a�  
    Given a StreamObject
    serialize and return a serialization string.

    This function is based on the
    :class:`~music21.converter.StreamFreezer` object.

    The serialization format is defined by
    the `fmt` argument; 'pickle' (the default),
    is the only one presently supported.

    >>> c = converter.parse('tinyNotation: 4/4 c4 d e f', makeNotation=False)
    >>> c.show('text')
    {0.0} <music21.meter.TimeSignature 4/4>
    {0.0} <music21.note.Note C>
    {1.0} <music21.note.Note D>
    {2.0} <music21.note.Note E>
    {3.0} <music21.note.Note F>
    >>> data = converter.freezeStr(c, fmt='pickle')
    >>> len(data) > 20  # pickle implementation dependent
    True
    >>> d = converter.thawStr(data)
    >>> d.show('text')
    {0.0} <music21.meter.TimeSignature 4/4>
    {0.0} <music21.note.Note C>
    {1.0} <music21.note.Note D>
    {2.0} <music21.note.Note E>
    {3.0} <music21.note.Note F>
    r   rè   )rS  )rí   ré   rñ   ÚwriteStr)r‰  rS  ré   rk  s       r.   r   r   ï  s=   € ð< #Ð"Ð"Ð"Ð"Ð"Ø× Ò  Ñ+Ô+€AØ�:Š:˜#ˆ:ÑÔÐr-   c                ón   — ddl m} |                     ¦   «         }|                     | ¦  «         |j        S )z“
    Given a serialization string, defrost into a Stream.

    This function is based on the :class:`~music21.converter.StreamFreezer` object.
    r   rè   )rí   ré   r‹  ÚopenStrr   )ÚstrDataré   rk  s      r.   r"   r"     s@   € ð #Ð"Ð"Ð"Ð"Ð"Ø×ÒÑ!Ô!€AØ‡I‚IˆgÑÔÐØŒ8€Or-   r5   c                ód   — 	 t           j                             | ¦  «        S # t          $ r Y dS w xY w)a  
    Return os.path.exists, but catch `ValueError` and return False.

    os.path.exists raises ValueError for paths over 260 chars
    on all versions of Windows lacking the `LongPathsEnabled` setting,
    which is absent below Windows 10.1607 and opt-in on higher versions.
    F)r¤   Úpathr£   rÂ   )r5   s    r.   rx  rx    s=   € ðÝŒw�~Š~˜bÑ!Ô!Ð!øÝð ð ð Øˆuˆuðøøøs   ‚! ¡
/®/c                  ó   — e Zd Zd„ ZdS )ÚTestSlowc                óž   — ddl m} |j        D ]>}t          j        ¦   «         }|                     |                     ¦   «         ¦  «          d S d S )Nr   ©Ú	testFiles)Úmusic21.musicxmlr—  ÚALLr   ÚConverterMusicXMLr   rU  )r=   r—  ÚmxStringÚas       r.   ÚtestMusicXMLConversionzTestSlow.testMusicXMLConversion/  s`   € Ø.Ð.Ð.Ð.Ð.Ð.Ø!œð 	ð 	ˆHÝÔ/Ñ1Ô1ˆAØ�KŠK˜ŸšÑ(Ô(Ñ)Ô)Ð)ØˆEˆEð	ð 	r-   N)r)   r*   r+   r�  r,   r-   r.   r”  r”  -  s#   € € € € € ðð ð ð ð r-   r”  c                  ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestExternalTc                ó6  — t          j        ¦   «         }ddlm} |j        }t          |¦  «        }|j        }t          |¦  «        }|                     |d         ¦  «         |                     |d         ¦  «         | j        r|                     ¦   «          d S d S )Nr   ©ÚtestPrimitive)	r   rh  r˜  r¢  ÚchordsThreeNotesDuration21cr   Úbeams01rM   Úshow)r=   rÄ   r¢  r›  rœ  Úbs         r.   ÚtestConversionMusicXmlz#TestExternal.testConversionMusicXml:  s–   € ÝŒL‰NŒNˆà2Ð2Ð2Ð2Ð2Ð2Ø Ô<ˆÝ�hÑÔˆà Ô(ˆÝ�hÑÔˆð 	
�Š��1”‰ŒˆØ	�Š��1”‰ŒˆØŒ9ð 	Ø�FŠF‰HŒHˆHˆHˆHð	ð 	r-   c                óÖ   — ddl m} |                     d¦  «        }t          |¦  «        }t	          |¦  «        }| j        r|                     ¦   «          t          j        |¦  «         d S )Nr   ©Úcorpuszbach/bwv66.6.xml)rí   rª  r   r   r!   r¥  r¤   r¥   )r=   rª  rö   r5   Ús2s        r.   ÚtestFreezerzTestExternal.testFreezerK  sd   € Ø"Ð"Ð"Ð"Ð"Ð"Ø�LŠLÐ+Ñ,Ô,ˆÝ�A‰YŒYˆÝ�"‰XŒXˆØŒ9ð 	Ø�GŠG‰IŒIˆIÝ
Œ	�"‰Œˆˆˆr-   c                óþ   — ddl m} |j        d         }t          j        ¦   «         }|                     |¦  «         t          |¦  «        }| j        r+|                     d¦  «         |                     ¦   «          d S d S )Nr   r–  é   Útext)r˜  r—  r™  r   rš  r   r¥  )r=   r—  r›  rœ  r¦  s        r.   ÚtestMusicXMLTabConversionz&TestExternal.testMusicXMLTabConversionT  s�   € Ø.Ð.Ð.Ð.Ð.Ð.à”= Ô#ˆÝÔ+Ñ-Ô-ˆØ	�Š�HÑÔÐå�hÑÔˆØŒ9ð 	Ø�FŠF�6‰NŒNˆNØ�FŠF‰HŒHˆHˆHˆHð	ð 	r-   N)r)   r*   r+   r¥  r§  r¬  r°  r,   r-   r.   rŸ  rŸ  7  sF   € € € € € Ø€Dðð ð ð"ð ð ð
ð 
ð 
ð 
ð 
r-   rŸ  c                  ó¸   — e Zd Zd„ Zd„ Zd„ Zd 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„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )!ÚTestc                óB   — ddl m}  || t          ¦   «         ¦  «         d S )Nr   )ÚtestCopyAll)Úmusic21.test.commonTestr´  Úglobals)r=   r´  s     r.   ÚtestCopyAndDeepcopyzTest.testCopyAndDeepcopyo  s0   € Ø7Ð7Ð7Ð7Ð7Ð7Øˆ�D�'™)œ)Ñ$Ô$Ð$Ð$Ð$r-   c                ó  — ddl m} ddlm} ddlm} |j        }t          |¦  «        }|                     ¦   «         }|                     |j	        ¦  «        }|  
                    t          |¦  «        d¦  «         |j        }t          |¦  «        }|                     ¦   «         }|                     |j        ¦  «        }|  
                    t          |¦  «        d¦  «         |                     |j	        ¦  «        }|  
                    t          |¦  «        d¦  «         |                     |j        ¦  «        }|  
                    t          |¦  «        d¦  «         |j        }t          |¦  «        }|                     ¦   «         }|                     |j	        ¦  «        }g }	|D ]!}
|
j        D ]}|	                     |¦  «         ŒŒ"|  
                    t          |	¦  «        d	¦  «         |j        }t          |¦  «        }|                     ¦   «         }|                     |j        ¦  «        }|  
                    t          |¦  «        d
¦  «         |j        }t          |¦  «        }|                     ¦   «         }|                     |j	        ¦  «        }|j        }t          |¦  «        }|  
                    t          |¦  «        d¦  «         |                     t,          j        ¦  «        D ] }|  
                    t          |¦  «        d¦  «         |                     t,          j        ¦  «        }|  
                    t3          |d         j        ¦  «        d¦  «         |  
                    t3          |d         j        ¦  «        d¦  «         Œ¡d S )Nr   r¡  )Údynamics©Únoteéf   é   é5   rr  é   é   é   r\   éÿÿÿÿ)r˜  r¢  rí   r¹  r»  Ú
pitches01ar   ÚflattenÚgetElementsByClassÚNoteÚassertEqualrO  Údirections31aÚDynamicÚDynamicWedgeÚlyricsMelisma61dÚlyricsrM   ÚrestsDurations02aÚRestÚnotations32aÚrhythmDurations03ar   ri  ÚMeasurery  r}   )r=   r¢  r¹  r»  r›  rœ  r¦  rÄ   ÚdÚfoundÚnoteObjr}  ÚpartÚmeasuress                 r.   ÚtestConversionMXzTest.testConversionMXs  s4  € Ø2Ð2Ð2Ð2Ð2Ð2Ø$Ð$Ð$Ð$Ð$Ð$Ø Ð Ð Ð Ð Ð à Ô+ˆÝ�(‰OŒOˆØ�IŠI‰KŒKˆØ× Ò  ¤Ñ+Ô+ˆà×Ò�˜Q™œ Ñ%Ô%Ð%ð !Ô.ˆÝ�(‰OŒOˆØ�IŠI‰KŒKˆØ× Ò  Ô!1Ñ2Ô2ˆà×Ò�˜Q™œ Ñ$Ô$Ð$Ø× Ò  ¤Ñ+Ô+ˆØ×Ò�˜Q™œ Ñ$Ô$Ð$ð × Ò  Ô!6Ñ7Ô7ˆØ×Ò�˜Q™œ Ñ#Ô#Ð#ð !Ô1ˆÝ�(‰OŒOˆØ�IŠI‰KŒKˆØ× Ò  ¤Ñ+Ô+ˆØˆØð 	"ð 	"ˆGØ”~ð "ð "�Ø—’˜SÑ!Ô!Ð!Ð!ð"à×Ò�˜U™œ QÑ'Ô'Ð'ð !Ô2ˆÝ�(‰OŒOˆØ�IŠI‰KŒKˆØ× Ò  ¤Ñ+Ô+ˆØ×Ò�˜Q™œ Ñ$Ô$Ð$ð !Ô-ˆÝ�(‰OŒOˆØ�IŠI‰KŒKˆØ× Ò  ¤Ñ+Ô+ˆà Ô3ˆÝ�(‰OŒOˆà×Ò�˜Q™œ Ñ#Ô#Ð#Ø×(Ò(­¬Ñ5Ô5ð 	:ð 	:ˆDØ×Ò�S ™YœY¨Ñ*Ô*Ð*Ø×.Ò.­v¬~Ñ>Ô>ˆHØ×Ò�S ¨!¤Ô!3Ñ4Ô4°aÑ8Ô8Ð8Ø×Ò�S ¨"¤Ô!4Ñ5Ô5°qÑ9Ô9Ð9Ð9ð		:ð 	:r-   c           	     óœ  — ddl m} ddlm} |j        }t          |¦  «        }|                     t          j        ¦  «        D ]‰}||j	                 }|  
                    t          |¦  «        d¦  «         g d¢}t          t          |¦  «        ¦  «        D ]6}|  
                    ||         t          ||         j        ¦  «        ¦  «         Œ7ŒŠd S )Nr   ©Úchordr¡  rÁ  )r¿  rr  r¿  r¿  r¿  r¿  r¿  )rí   rÚ  r˜  r¢  r£  r   rÅ  r   ri  ÚChordrÇ  rO  ÚrangeÚpitches)	r=   rÚ  r¢  r›  rœ  rÕ  ÚchordsÚ	knownSizer;  s	            r.   ÚtestConversionMXChordszTest.testConversionMXChords¿  sê   € Ø!Ð!Ð!Ð!Ð!Ð!Ø2Ð2Ð2Ð2Ð2Ð2à Ô<ˆÝ�(‰OŒOˆØ×(Ò(­¬Ñ5Ô5ð 	Gð 	GˆDØ˜%œ+Ô&ˆFØ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø-Ð-Ð-ˆIÝ�3˜y™>œ>Ñ*Ô*ð Gð G�à× Ò  ¨1¤­s°6¸!´9Ô3DÑ/EÔ/EÑFÔFÐFÐFðGð		Gð 	Gr-   r?   rŸ   c                óx  — ddl m} ddl m} ddlm} |j        }t          j        t          j	        t          |¦  «        ¦  «        }|j        d         }|                     ¦   «         j        }g }|D ]&}	t          |	|j        ¦  «        r||	j        j        z  }Œ'|                      t'          |¦  «        d¦  «         d S )Nr   )Úbeamrº  r¡  é˜   )rí   râ  r»  r˜  r¢  r¤  rÙ   r  r   rh  r   ÚpartsÚrecurseÚnotesAndRestsre   rÆ  ÚbeamsÚ	beamsListrÇ  rO  )
r=   râ  r»  r¢  r›  rœ  rÕ  ÚnotesÚ
theseBeamsÚns
             r.   ÚtestConversionMXBeamszTest.testConversionMXBeamsÍ  sÎ   € Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø2Ð2Ð2Ð2Ð2Ð2à Ô(ˆÝŒF•6”<¥ x¡¤Ñ1Ô1ˆØŒw�qŒzˆØ—’‘”Ô,ˆØ&(ˆ
Øð 	0ð 	0ˆAÝ˜!˜TœYÑ'Ô'ð 0Ø˜aœgÔ/Ñ/�
øØ×Ò�˜Z™œ¨#Ñ.Ô.Ð.Ð.Ð.r-   c                ó  — ddl m} |j        }t          |¦  «        }|j        d         }|j        }t          |¦  «        }|j        d         }|                     ¦   «         j        }|                      t          |¦  «        d¦  «         d S )Nr   r¡  é   )
r˜  r¢  ÚtimeSignatures11cr   rä  ÚtimeSignatures11drå  ræ  rÇ  rO  )r=   r¢  r›  rœ  Úunused_partrÕ  ré  s          r.   ÚtestConversionMXTimezTest.testConversionMXTimeÜ  s‚   € à2Ð2Ð2Ð2Ð2Ð2à Ô2ˆÝ�(‰OŒOˆØ”g˜a”jˆà Ô2ˆÝ�(‰OŒOˆØŒw�qŒzˆà—’‘”Ô,ˆØ×Ò�˜U™œ RÑ(Ô(Ð(Ð(Ð(r-   c                óÄ   — ddl m} ddlm} |j        }t          |¦  «        }|j        d         }||j                 }|                      t          |¦  «        d¦  «         d S )Nr   ©Úclefr¡  é   )
rí   rõ  r˜  r¢  Úclefs12ar   rä  ÚClefrÇ  rO  )r=   rõ  r¢  r›  rœ  rÕ  Úclefss          r.   ÚtestConversionMXClefPrimitivez"Test.testConversionMXClefPrimitiveë  sq   € Ø Ð Ð Ð Ð Ð Ø2Ð2Ð2Ð2Ð2Ð2Ø Ô)ˆÝ�(‰OŒOˆØŒw�qŒzˆà�T”Y”ˆØ×Ò�˜U™œ RÑ(Ô(Ð(Ð(Ð(r-   c                ó  — ddl m} ddl m} ddl m} |                     d¦  «        }|j        d         |j                 }|                      t          |¦  «        d¦  «         |                      |d         j	        d¦  «         |j        d         |j                 }|                      t          |¦  «        d¦  «         |                      |d         j
        d¦  «         |                      t          |d         ¦  «        j        d	¦  «         |j        d
         |j                 }|                      t          |¦  «        d¦  «         |j        d         |j                 }|                      t          |¦  «        d¦  «         d S )Nr   r©  rô  ©ÚmeterÚlucar\   ÚGrÂ  ÚTreble8vbClefrr  é   )rí   rª  rõ  rý  r   rä  rø  rÇ  rO  ÚsignÚoctaveChangerN  r)   ÚTimeSignature)r=   rª  rõ  rý  rœ  rù  Útss          r.   ÚtestConversionMXClefTimeCorpusz#Test.testConversionMXClefTimeCorpusõ  sl  € Ø"Ð"Ð"Ð"Ð"Ð"Ø Ð Ð Ð Ð Ð Ø!Ð!Ð!Ð!Ð!Ð!Ø�LŠL˜Ñ Ô ˆð ”˜”
˜4œ9Ô%ˆØ×Ò�˜U™œ QÑ'Ô'Ð'Ø×Ò˜˜qœœ¨Ñ,Ô,Ð,ð ”˜”
˜4œ9Ô%ˆØ×Ò�˜U™œ QÑ'Ô'Ð'Ø×Ò˜˜qœÔ.°Ñ3Ô3Ð3Ø×Ò�˜e Aœh™œÔ0°/ÑBÔBÐBð ”˜”
˜4œ9Ô%ˆØ×Ò�˜U™œ QÑ'Ô'Ð'ð ŒW�QŒZ˜Ô+Ô,ˆØ×Ò�˜R™œ !Ñ$Ô$Ð$Ð$Ð$r-   c                óè  — ddl m} ddlm} |j        }t          |¦  «        }|j        d         }|                     ¦   «                              |j	        ¦  «        }|  
                    t          |¦  «        d¦  «         g }g d¢}t          t          |¦  «        ¦  «        D ]:}	|                     t          ||	         j        d         j        ¦  «        ¦  «         Œ;|  
                    ||¦  «         d S )Nr   rº  r¡  r  )z-<class 'music21.articulations.Staccatissimo'>z&<class 'music21.articulations.Accent'>z(<class 'music21.articulations.Staccato'>z&<class 'music21.articulations.Tenuto'>)rí   r»  r˜  r¢  Úarticulations01r   rä  rÄ  rÅ  rÆ  rÇ  rO  rÜ  rM   rY   ÚarticulationsÚ	__class__)
r=   r»  r¢  r›  rœ  rÕ  ré  rN   rh   r;  s
             r.   ÚtestConversionMXArticulationsz"Test.testConversionMXArticulations  sü   € Ø Ð Ð Ð Ð Ð Ø2Ð2Ð2Ð2Ð2Ð2à Ô0ˆÝ�(‰OŒOˆØŒw�qŒzˆà—’‘”×1Ò1°$´)Ñ<Ô<ˆØ×Ò�˜U™œ QÑ'Ô'Ð'Øˆð;ð ;ð ;ˆõ •s˜5‘z”zÑ"Ô"ð 	Bð 	BˆAØ�KŠK�˜E !œHÔ2°1Ô5Ô?Ñ@Ô@ÑAÔAÐAÐAØ×Ò˜˜uÑ%Ô%Ð%Ð%Ð%r-   c                óÄ   — ddl m} ddlm} |j        }t          |¦  «        }|j        d         }||j                 }|                      t          |¦  «        d¦  «         d S )Nr   ©Úkeyr¡  é.   )
rí   r  r˜  r¢  ÚkeySignatures13ar   rä  ÚKeySignaturerÇ  rO  )r=   r  r¢  r›  rœ  rÕ  ÚkeyLists          r.   ÚtestConversionMXKeyzTest.testConversionMXKey"  ss   € ØÐÐÐÐÐØ2Ð2Ð2Ð2Ð2Ð2Ø Ô1ˆÝ�(‰OŒOˆØŒw�qŒzˆà�sÔ'Ô(ˆØ×Ò�˜W™œ rÑ*Ô*Ð*Ð*Ð*r-   c                ó¢  — ddl m} t          |j        ¦  «        }|                      |j        j        d¦  «         |                      |j        j        d¦  «         |                      |j        j        d¦  «         t          |j	        ¦  «        }|                      |j        j        d¦  «         |                      |j        j
        d¦  «         d S )Nr   r–  zWolfgang Amadeus Mozartz Quintet for Clarinet and Stringsz#Menuetto (Excerpt from Second Trio)zGilles Binchoisz$Excerpt from Magnificat secundi toni)r˜  r—  r   ÚmozartTrioK581ExcerptrÇ  r   ÚcomposerÚtitleÚmovementNameÚbinchoisMagnificatÚ	bestTitle)r=   r—  rœ  s      r.   ÚtestConversionMXMetadatazTest.testConversionMXMetadata,  sÆ   € Ø.Ð.Ð.Ð.Ð.Ð.å�)Ô1Ñ2Ô2ˆØ×Ò˜œÔ,Ð.GÑHÔHÐHØ×Ò˜œÔ)Ð+MÑNÔNÐNØ×Ò˜œÔ0Ð2WÑXÔXÐXå�)Ô.Ñ/Ô/ˆØ×Ò˜œÔ,Ð.?Ñ@Ô@Ð@à×Ò˜œÔ-Ð/UÑVÔVÐVÐVÐVr-   c                óÀ   — ddl m} ddlm} t	          |j        ¦  «        }|j        d         }||j                 }|                      t          |¦  «        d¦  «         d S )Nr   ©Úbarr¡  rî  )
rí   r  r˜  r¢  r   Úbarlines46arä  ÚBarlinerÇ  rO  )r=   r  r¢  rœ  rÕ  ÚbarlineLists         r.   ÚtestConversionMXBarlineszTest.testConversionMXBarlines9  sq   € ØÐÐÐÐÐØ2Ð2Ð2Ð2Ð2Ð2Ý�-Ô+Ñ,Ô,ˆØŒw�qŒzˆØ˜3œ;Ô'ˆØ×Ò�˜[Ñ)Ô)¨2Ñ.Ô.Ð.Ð.Ð.r-   c                óz  — ddl m} ddlm} t	          |j        ¦  «        }|                     t          j        ¦  «         	                    ¦   «         }||j
                 }g }|D ]}|                     |j        ¦  «         Œ|                      |g d¢¦  «         |                      t          |¦  «        d¦  «         d S )Nr   r¡  )Úlayout)r\   r¿  r  r®  rÁ  é   é   )r˜  r¢  rí   r$  r   ÚsystemLayoutTwoPartrÅ  r   ri  ÚfirstÚSystemLayoutrM   ÚmeasureNumberrÇ  rO  )r=   r¢  r$  rœ  rÕ  ÚsystemLayoutListÚmeasuresWithSLÚes           r.   ÚtestConversionXMLayoutzTest.testConversionXMLayoutA  sÖ   € à2Ð2Ð2Ð2Ð2Ð2Ø"Ð"Ð"Ð"Ð"Ð"å�-Ô3Ñ4Ô4ˆð ×#Ò#¥F¤KÑ0Ô0×6Ò6Ñ8Ô8ˆØ Ô 3Ô4ÐØˆØ!ð 	3ð 	3ˆAØ×!Ò! !¤/Ñ2Ô2Ð2Ð2Ø×Ò˜Ð);Ð);Ð);Ñ<Ô<Ð<Ø×Ò�Ð-Ñ.Ô.°Ñ2Ô2Ð2Ð2Ð2r-   c                óÔ  — ddl m} ddlm} t	          |j        ¦  «        }d}d}|j        D ]�}|                     ¦   «         j        d          	                    |j
        ¦  «        }|                      ||j        ¦  «         |                     ¦   «         j        D ]!}|j        �|dz  }|j        j        dv r|dz  }Œ"Œ�|                      |d¦  «         |                      |d¦  «         d S )Nr   r¡  rô  r\   )ÚstartÚcontinueé9   é(   )r˜  r¢  rí   rõ  r   ÚmultiMeasureTiesrä  rå  ré  ÚgetContextByClassrø  ÚassertIsInstanceÚ	TenorClefÚtierN  rÇ  )	r=   r¢  rõ  rœ  Ú	countTiesÚcountStartTiesÚprN   rë  s	            r.   ÚtestConversionMXTieszTest.testConversionMXTiesQ  s  € à2Ð2Ð2Ð2Ð2Ð2Ø Ð Ð Ð Ð Ð å�-Ô0Ñ1Ô1ˆð ˆ	ØˆØ”ð 	,ð 	,ˆAØ—9’9‘;”;Ô$ QÔ'×9Ò9¸$¼)ÑDÔDˆDØ×!Ò! $¨¬Ñ7Ô7Ð7Ø—Y’Y‘[”[Ô&ð ,ð ,�Ø”5Ð$Ø ‘N�IØ”u”zÐ%:Ð:Ð:Ø&¨!Ñ+˜øð	,ð 	×Ò˜ BÑ'Ô'Ð'Ø×Ò˜¨Ñ,Ô,Ð,Ð,Ð,r-   c                ó¬  — ddl m} ddl m} |                     dd¦  «        }|j        d         |j                 }|                      t          |¦  «        d¦  «         |j        d         |j                 }|                      t          |¦  «        d¦  «         |j        d         |j                 }|                      t          |¦  «        d¦  «         d S )Nr   r©  )Ú
instrumentzschumann_clara/opus17r¿  r\   rr  )rí   rª  r>  r   rä  Ú
InstrumentrÇ  rO  )r=   rª  r>  rö   Úis1Úis2Úis3s          r.   ÚtestConversionMXInstrumentzTest.testConversionMXInstrumentg  sÍ   € Ø"Ð"Ð"Ð"Ð"Ð"Ø&Ð&Ð&Ð&Ð&Ð&Ø�LŠLÐ0°!Ñ4Ô4ˆàŒg�aŒj˜Ô.Ô/ˆØ×Ò�˜S™œ 1Ñ%Ô%Ð%àŒg�aŒj˜Ô.Ô/ˆØ×Ò�˜S™œ 1Ñ%Ô%Ð%àŒg�aŒj˜Ô.Ô/ˆØ×Ò�˜S™œ 1Ñ%Ô%Ð%Ð%Ð%r-   c                ó¶  — t          j        ¦   «         dz  dz  }|dz  }t          |¦  «        }t          |¦  «        }t	          j        ¦   «         }|                     |¦  «         |                     d¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   |                     |¦  «         t          |¦  «         t          |¦  «         d S )Nrÿ   r¢  ú
test01.midÚrb)	r
   ÚgetSourceFilePathr   r   r   ÚConverterMidirp   rd   r   )r=   ÚdirLibr5   Úunused_srÄ   rO   Údatas          r.   ÚtestConversionMidiBasiczTest.testConversionMidiBasicv  sú   € ÝÔ)Ñ+Ô+¨fÑ4°ÑFˆØ�lÑ"ˆõ ˜R‘=”=ˆÝ˜‘9”9ˆåÔ'Ñ)Ô)ˆØ	�Š�B‰Œˆð �WŠW�T‰]Œ]ð 	˜aØ—6’6‘8”8ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	
�Š�DÑÔÐõ 	�$‰ŒˆÝˆd‰Œˆˆˆs   Á:BÂBÂ"Bc                ó¬  — ddl m} ddl m} ddl m} ddl m} t          j        ¦   «         dz  dz  dz  }t          |¦  «        }|                      t          ||j
                 ¦  «        d	¦  «         t          j        ¦   «         dz  dz  d
z  }t          |¦  «        }|                      t          ||j
                 ¦  «        d¦  «         |                      t          ||j                 ¦  «        d¦  «         |                      t          ||j                 ¦  «        d¦  «         |                      t          ||j                 ¦  «        d¦  «         t          j        ¦   «         dz  dz  dz  }t          |¦  «        }ddlm} d„ |                     ¦   «         j        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g}	|                      ||	¦  «         |                      t          ||j                 ¦  «        d¦  «         |                      t          ||j                 ¦  «        d¦  «         t          j        ¦   «         dz  dz  dz  }t          |¦  «        }|                      t          ||j                 ¦  «        d¦  «         |                      t          ||j                 ¦  «        d¦  «         t          j        ¦   «         dz  dz  dz  }t          |¦  «        }|                      t          ||j                 ¦  «        d¦  «         ||j                 }
|                      t          |
¦  «        d¦  «         |                      |
d         j        d¦  «         |                      |
d         j        d¦  «         |                      |
d         j        d¦  «         d S )Nr   rü  r  rÙ  rº  rÿ   r¢  rE  rö  z
test05.midrr  r®  r\   z
test06.mid)ÚFractionc                ó   — g | ]	}|j         ‘Œ
S r,   )ÚquarterLength)Ú.0rë  s     r.   ú
<listcomp>z0Test.testConversionMidiNotes.<locals>.<listcomp>¯  s   € ÐIÐIÐI Q�”ÐIÐIÐIr-   é   ç      à?g      ð?r¿  z
test07.midz
test08.midéýÿÿÿrÂ  )rí   rý  r  rÚ  r»  r
   rG  r   rÇ  rO  rÆ  rÛ  r  r  Ú	fractionsrN  rÄ  ræ  Úsharps)r=   rý  r  rÚ  r»  r5   rö   ÚFÚdListrh   rÓ  s              r.   ÚtestConversionMidiNoteszTest.testConversionMidiNotesŒ  sÑ  € Ø!Ð!Ð!Ð!Ð!Ð!ØÐÐÐÐÐØ!Ð!Ð!Ð!Ð!Ð!Ø Ð Ð Ð Ð Ð åÔ%Ñ'Ô'¨&Ñ0°?ÑBÀ\ÑQˆõ �b‰MŒMˆà×Ò�˜Q˜tœyœ\Ñ*Ô*¨BÑ/Ô/Ð/õ Ô%Ñ'Ô'¨&Ñ0°?ÑBÀ\ÑQˆÝ�b‰MŒMˆð 	×Ò�˜Q˜tœyœ\Ñ*Ô*¨AÑ.Ô.Ð.Ø×Ò�˜Q˜uœ{œ^Ñ,Ô,¨aÑ0Ô0Ð0ð 	×Ò�˜Q˜uÔ2Ô3Ñ4Ô4°aÑ8Ô8Ð8Ø×Ò�˜Q˜sÔ/Ô0Ñ1Ô1°1Ñ5Ô5Ð5õ Ô%Ñ'Ô'¨&Ñ0°?ÑBÀ\ÑQˆÝ�b‰MŒMˆð 	,Ð+Ð+Ð+Ð+Ð+ØIÐI¨!¯)ª)©+¬+Ô*CÀCÀRÀCÔ*HÐIÑIÔIˆØ�c˜3  S¨#¨s°C¸¸cØ�c˜3  S¨#¨s°C¸¸cØ�c˜3  Q Q q¨!¡W¤W¨a¨a°°1©g¬g°q°q¸¸A±w´wÀÀSÈ#ðOˆð 	×Ò˜ Ñ&Ô&Ð&à×Ò�˜Q˜uÔ2Ô3Ñ4Ô4°aÑ8Ô8Ð8Ø×Ò�˜Q˜sÔ/Ô0Ñ1Ô1°1Ñ5Ô5Ð5õ
 Ô%Ñ'Ô'¨&Ñ0°?ÑBÀ\ÑQˆå�b‰MŒMˆà×Ò�˜Q˜uÔ2Ô3Ñ4Ô4°aÑ8Ô8Ð8Ø×Ò�˜Q˜sÔ/Ô0Ñ1Ô1°1Ñ5Ô5Ð5õ Ô%Ñ'Ô'¨&Ñ0°?ÑBÀ\ÑQˆå�b‰MŒMˆà×Ò�˜Q˜uÔ2Ô3Ñ4Ô4°aÑ8Ô8Ð8Ø�#Ô"Ô#ˆØ×Ò�˜U™œ QÑ'Ô'Ð'à×Ò˜˜qœœ¨"Ñ-Ô-Ð-Ø×Ò˜˜qœœ¨!Ñ,Ô,Ð,Ø×Ò˜˜qœœ¨"Ñ-Ô-Ð-Ð-Ð-r-   c                óž  — ddl m} ddlm} |j        }t          |¦  «        }|j        d         }|                     t          j	        ¦  «        }|  
                    |d         j        d ¦  «         |  
                    |d         j        j        d¦  «         |  
                    |d         j        d ¦  «         |  
                    |d         j        j        d¦  «         |j        }t          |¦  «        }|  
                    t          ||j                 ¦  «        d¦  «         |j        d         }|                     t          j	        ¦  «        }d S )Nr   r  r¡  Úfinalr\   r  )rí   r  r˜  r¢  ÚsimpleRepeat45ar   rä  rÅ  r   rÑ  rÇ  ÚleftBarlineÚrightBarlinerN  ÚrepeatMultipleTimes45crO  r   )r=   r  r¢  r›  rö   rÕ  rÖ  s          r.   ÚtestConversionMXRepeatszTest.testConversionMXRepeatsÏ  s.  € ØÐÐÐÐÐØ2Ð2Ð2Ð2Ð2Ð2à Ô0ˆÝ�(‰OŒOˆàŒw�qŒzˆØ×*Ò*­6¬>Ñ:Ô:ˆØ×Ò˜ !œÔ0°$Ñ7Ô7Ð7Ø×Ò˜ !œÔ1Ô6¸Ñ@Ô@Ð@à×Ò˜ !œÔ0°$Ñ7Ô7Ð7Ø×Ò˜ !œÔ1Ô6¸Ñ@Ô@Ð@à Ô7ˆÝ�(‰OŒOˆà×Ò�˜Q˜sœ{œ^Ñ,Ô,¨aÑ0Ô0Ð0ØŒw�qŒzˆØ×*Ò*­6¬>Ñ:Ô:ˆˆˆr-   c                óà  — ddl m} ddlm} t	          |j        ¦  «        }|                      |t          j        ¦  «         |  	                    |t          j
        ¦  «         |                      t          |                     ¦   «         j        ¦  «        d¦  «         |                     d¦  «        }|                      |t          j
        ¦  «         |                      d„ |j        D ¦   «         g d¢¦  «         |                     dd¬	¦  «        }|                      |t          j        ¦  «         |  	                    |t          j
        ¦  «         |                      |j        j        d
¦  «         d S )Nr   r–  r©  éB   zessenFolksong/testec                óZ   — g | ](}t          |                     ¦   «         j        ¦  «        ‘Œ)S r,   )rO  rå  ræ  )rQ  rö   s     r.   rR  z.Test.testConversionABCOpus.<locals>.<listcomp>ö  s+   € ÐLÐLÐL¸Q�#˜aŸiši™kœkÔ7Ñ8Ô8ÐLÐLÐLr-   )é!   é3   é;   re  é   é®   éC   éX   r&  r  zMoli hua)Úmusic21.abcFormatr—  rí   rª  r   ÚtheAleWifesDaughterr6  r   rh  ÚassertNotIsInstancerj  rÇ  rO  rå  ræ  Úscoresr   r  )r=   r—  rª  rö   Úops        r.   ÚtestConversionABCOpuszTest.testConversionABCOpusç  sZ  € Ø/Ð/Ð/Ð/Ð/Ð/Ø"Ð"Ð"Ð"Ð"Ð"å�)Ô/Ñ0Ô0ˆà×Ò˜a¥¤Ñ.Ô.Ð.Ø× Ò  ¥F¤KÑ0Ô0Ð0Ø×Ò�˜QŸYšY™[œ[Ô6Ñ7Ô7¸Ñ<Ô<Ð<ð �\Š\Ð/Ñ0Ô0ˆð 	×Ò˜b¥&¤+Ñ.Ô.Ð.Ø×ÒÐLÐLÀ"Ä)ÐLÑLÔLØ:Ð:Ð:ñ	<ô 	<ð 	<ð
 �LŠLÐ.°qˆLÑ9Ô9ˆØ×Ò˜a¥¤Ñ.Ô.Ð.Ø× Ò  ¥F¤KÑ0Ô0Ð0Ø×Ò˜œÔ)¨:Ñ6Ô6Ð6Ð6Ð6r-   c                ó`  — ddl m} |                     dd¬¦  «        }|                      |t          j        ¦  «         |                      |j        j        d¦  «         |                      t          |j
        d                              ¦   «         j        d         j        ¦  «        d¦  «         d S )	Nr   r©  zessenFolksong/han1r&  r  zYi gan hongqi kongzhong piaor  zL<music21.beam.Beams <music21.beam.Beam 1/start>/<music21.beam.Beam 2/start>>)rí   rª  r   r6  r   rh  rÇ  r   r  rY   rä  rå  ræ  rç  )r=   rª  rö   s      r.   ÚtestConversionABCWorkFromOpusz"Test.testConversionABCWorkFromOpus  s°   € à"Ð"Ð"Ð"Ð"Ð"Ø�LŠLÐ-°aˆLÑ8Ô8ˆØ×Ò˜a¥¤Ñ.Ô.Ð.à×Ò˜œÔ)Ð+IÑJÔJÐJà×ÒÝ�”˜”
×"Ò"Ñ$Ô$Ô2°1Ô5Ô;Ñ<Ô<ØZñ	\ô 	\ð 	\ð 	\ð 	\r-   c                ó\  — t          j        ¦   «         dz  dz  dz  }t          t          |¦  «        d f¦  «        }|                      |t
          j        ¦  «         |                      t          ¦  «        5  t          |df¦  «         d d d ¦  «         n# 1 swxY w Y   |                      t          ¦  «        5  t          t          |¦  «        df¦  «         d d d ¦  «         n# 1 swxY w Y   t          t          |¦  «        df¦  «        }|                      |t
          j	        ¦  «         d S )Nrª  ÚessenFolksongz	testd.abcr%  )r%  )
r
   rG  r   rY   r6  r   rj  ÚassertRaisesr   rh  ©r=   r5   rö   s      r.   Ú+testConversionABCWorkFromOpusWithoutKeywordz0Test.testConversionABCWorkFromOpusWithoutKeyword  s‚  € ÝÔ%Ñ'Ô'¨(Ñ2°_ÑDÀ{ÑRˆå•3�r‘7”7˜D�/Ñ"Ô"ˆØ×Ò˜a¥¤Ñ-Ô-Ð-à×ÒÕ1Ñ2Ô2ð 	ð 	Ý�2�q�'‰NŒNˆNð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ×ÒÕ1Ñ2Ô2ð 	#ð 	#Ý•3�r‘7”7˜D�/Ñ"Ô"Ð"ð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#õ •3�r‘7”7˜A�,ÑÔˆØ×Ò˜a¥¤Ñ.Ô.Ð.Ð.Ð.s$   Á5BÂBÂBÂ8C#Ã#C'Ã*C'c                ó¬   — t          j        ¦   «         dz  dz  dz  }t          |¦  «        }|                      t	          |j        ¦  «        d¦  «         d S )Nr   r¢  Útest01r®  )r
   rG  r   rÇ  rO  rä  rw  s      r.   ÚtestConversionMusedatazTest.testConversionMusedata  sN   € ÝÔ%Ñ'Ô'¨*Ñ4°ÑFÈÑQˆÝ�"‰IŒIˆØ×Ò�˜QœW™œ qÑ)Ô)Ð)Ð)Ð)r-   c                ó  — t          j        ¦   «         dz  dz  }t          |¦  «        }|                      |j        d¦  «         |                      |                     ¦   «         ¦  «         |                     ¦   «         }|                      |dd…         d¦  «         |                      |                     ¦   «         g d¢¦  «         t          j        ¦   «         dz  d	z  d
z  }t          j
        ¦   «         }|                     |¦  «         dS )zJ
        Test getting data out of musedata or musicxml zip files.
        rR   ztestMxl.mxlr4   Né&   z&<?xml version="1.0" encoding="UTF-8"?>)zmusicXML.xmlz	META-INF/zMETA-INF/container.xmlr   r¢  rz  )r
   rG  r   rÇ  r<   Ú
assertTruerI   rW   rQ   r   ÚConverterMuseDatar   )r=   r5   ÚafrN   Úcmds        r.   ÚtestMixedArchiveHandlingzTest.testMixedArchiveHandling$  só   € õ Ô%Ñ'Ô'¨*Ñ4°}ÑDˆÝ˜BÑÔˆà×Ò˜œ¨Ñ/Ô/Ð/Ø�Š˜Ÿš™œÑ'Ô'Ð'ð �zŠz‰|Œ|ˆØ×Ò˜˜c˜r˜cœÐ$LÑMÔMÐMØ×Ò˜Ÿš™œÐ(_Ð(_Ð(_Ñ`Ô`Ð`õ6 Ô%Ñ'Ô'¨*Ñ4°ÑFÈÑQˆÝÔ-Ñ/Ô/ˆØ�Š�bÑÔÐÐÐr-   c                ój   — d}ddl m} t          ¦   «         }|                      ||j        |¦  «         dS )a  
        Ensure Converter.parseData() distinguishes between a string with MEI data and a string with
        MusicXML data. The "subConverter" module is mocked out because we don't actually need to
        test the conversion process in this unit test.
        z8<?xml version="1.0" encoding="UTF-8"?><mei><note/></mei>r   )ÚMeiElementErrorN)Úmusic21.mei.baser„  r   rv  r   )r=   Ú	meiStringr„  ÚtestConvs       r.   ÚtestMEIvsMXzTest.testMEIvsMXP  sH   € ð Oˆ	ð 	5Ð4Ð4Ð4Ð4Ð4Ý‘;”;ˆØ×Ò˜/¨8Ô+=¸yÑIÔIÐIÐIÐIr-   c                óö   — ddl m} ddl m} |j        j        t
          j        z   dz   }t          |ddd¬¦  «        }||j                 D ]/}|  	                    t          |j        d	z  d
d¬¦  «        ¦  «         Œ0dS )zc
        Checks quantization when parsing a stream. Here everything snaps to the 8th note.
        r   rº  )Úomrzk525short.midTF©rr  )r|   ró   r‹   rT  g        gH¯¼šò×z>)Úabs_tolN)rí   r»  rŠ  Ú
correctorsÚpathNamer¤   Úsepr   rÆ  r~  r   rP  )r=   r»  rŠ  ÚmidiFpÚ
midiStreamrë  s         r.   ÚtestParseMidiQuantizezTest.testParseMidiQuantizei  s¤   € ð 	!Ð Ð Ð Ð Ð ØÐÐÐÐÐà”Ô(­2¬6Ñ1°OÑCˆÝ˜6¨tÀÐ^bÐcÑcÔcˆ
à˜DœIÔ&ð 	Oð 	OˆAØ�OŠO�G A¤O°cÑ$9¸3ÈÐMÑMÔMÑNÔNÐNÐNð	Oð 	Or-   c                ó$  — t          j        ¦   «         dz  dz  dz  }t          |¦  «        }|                      d|                     ¦   «                              ¦   «         ¦  «         t          |d¬¦  «        }|                      d|                     ¦   «                              ¦   «         ¦  «         t          |d¬¦  «        }|                      d	|                     ¦   «                              ¦   «         ¦  «         |                     d
¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |  	                    |t          ¦  «         t          |d¬¦  «        }|                      d|                     ¦   «                              ¦   «         ¦  «         t          |¦  «        }|                     ¦   «          t          |d¬¦  «        }	|	                     ¦   «          t          |d¬¦  «        }
|
                     ¦   «          dS )z–
        Checks that quantization is not performed if quantizePost=False.
        Source MIDI file contains only: 3 16th notes, 2 32nd notes.
        rÿ   r¢  z
test15.midg      ì?F)r‰   r‹  )r‹   g      è?rF  N)r
   rG  r   ÚassertNotInrÄ  Ú_uniqueOffsetsAndEndTimesÚassertInrp   rd   r6  rf   r   r§   )r=   r5   ÚstreamFpQuantizedÚstreamFpNotQuantizedÚstreamFpCustomQuantizedrO   rK  ÚstreamDataNotQuantizedÚpf1Úpf2Úpf3s              r.   ÚtestParseMidiNoQuantizezTest.testParseMidiNoQuantizev  s  € õ
 Ô%Ñ'Ô'¨&Ñ0°?ÑBÀ\ÑQˆõ " "™IœIÐØ×Ò˜Ð 1× 9Ò 9Ñ ;Ô ;× UÒ UÑ WÔ WÑXÔXÐXå$ R°eÐ<Ñ<Ô<ÐØ�Š�eÐ1×9Ò9Ñ;Ô;×UÒUÑWÔWÑXÔXÐXå"'¨À$Ð"GÑ"GÔ"GÐØ×Ò˜Ð6×>Ò>Ñ@Ô@×ZÒZÑ\Ô\Ñ]Ô]Ð]ð �WŠW�T‰]Œ]ð 	˜aØ—6’6‘8”8ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	à×Ò˜d¥EÑ*Ô*Ð*Ý!& t¸%Ð!@Ñ!@Ô!@ÐØ�Š�eÐ3×;Ò;Ñ=Ô=×WÒWÑYÔYÑZÔZÐZõ ˜2ÑÔˆØ×ÒÑÔÐÝ˜2¨EÐ2Ñ2Ô2ˆØ×ÒÑÔÐÝ˜2°TÐ:Ñ:Ô:ˆØ×ÒÑÔÐÐÐs   ÄD2Ä2D6Ä9D6c                óŠ  — ddl m} t          j        ¦   «         dz  dz  }t	          |¦  «        }|                     ¦   «          |                      t          ¦  «        5  t          |¦  «         ddd¦  «         n# 1 swxY w Y   t          |d¬¦  «        }|  	                    t          ||j                 ¦  «        d¦  «         dS )	zŽ
        Here is a filename with an incorrect extension (.txt for .rnText).  Make sure that
        it is not cached the second time.
        r   )Úharmonyr$   zincorrectExtension.txtNÚ	romantext)rÔ   r\   )rí   r   r
   rG  r   r§   rv  r   r   rÇ  rO  ÚHarmony)r=   r   r5   ÚpfrÄ   s        r.   ÚtestIncorrectNotCachedzTest.testIncorrectNotCached–  s   € ð
 	$Ð#Ð#Ð#Ð#Ð#åÔ%Ñ'Ô'¨+Ñ5Ð8PÑPˆÝ˜"ÑÔˆØ
�ŠÑÔÐà×ÒÕ5Ñ6Ô6ð 	ð 	Ý�"‰IŒIˆIð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ �"˜[Ð)Ñ)Ô)ˆØ×Ò�˜Q˜wœÔ/Ñ0Ô0°!Ñ4Ô4Ð4Ð4Ð4s   ÁA9Á9A=Â A=c                ól  — t          j        ¦   «         dz  dz  dz  }t          |¦  «        }|                      d|j        ¦  «         t          j        ¦   «         dz  dz  dz  }|                      t          ¦  «        5  t          |¦  «         d d d ¦  «         n# 1 swxY w Y   |                      t          ¦  «        5  t          t          |¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   |                      t          ¦  «        5  t          d¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nrª  Úbachzbwv66.6.mxlrÝ   zbwv66.6z5nonexistent_path_ending_in_correct_extension.musicxml)	r
   rG  r   r–  Úclassesrv  r{  r   rY   rw  s      r.   ÚtestConverterFromPathzTest.testConverterFromPath§  sí  € ÝÔ%Ñ'Ô'¨(Ñ2°VÑ;¸mÑKˆÝ�"‰IŒIˆØ�Š�h ¤	Ñ*Ô*Ð*åÔ%Ñ'Ô'¨(Ñ2°VÑ;¸iÑGˆà×ÒÕ0Ñ1Ô1ð 	ð 	Ý�"‰IŒIˆIð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	à×ÒÕ1Ñ2Ô2ð 	ð 	õ •#�b‘'”'‰NŒNˆNð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ×ÒÕ0Ñ1Ô1ð 	Kð 	KÝÐIÑJÔJÐJð	Kð 	Kð 	Kñ 	Kô 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Køøøð 	Kð 	Kð 	Kð 	Kð 	Kð 	Ks6   Á=BÂBÂ BÂ>C'Ã'C+Ã.C+ÄD)Ä)D-Ä0D-c                ó*  — ddl m} d}|dz   }t          j        ¦   «         }d|d<   t	          |¦  «        }|                      t          |j        ¦  «        d¦  «         t          ¦   «          	                    | 
                    ¦   «         d|¦  «        }t          |d	d
¬¦  «        5 }|                     d¦  «         ddd¦  «         n# 1 swxY w Y   |                      |¦  «        5  t	          |d¬¦  «        }ddd¦  «         n# 1 swxY w Y   t	          |d¬¦  «        }|                      t          |j        ¦  «        d¦  «         t          |¦  «        }|                      t          |j        ¦  «        d¦  «         t          j        |¦  «         dS )zT
        This should be the only test that requires an internet connection.
        r   )ÚHumdrumExceptionz<https://raw.githubusercontent.com/craigsapp/chopin-preludes/z>f8fb01f09d717e84929fb8b2950f96dd6bc05686/kern/prelude28-20.krnÚallowr  rr  z.krnrœ  rû   r^   z.all sorts of garbage that Humdrum cannot parseNF)r|   T)Úmusic21.humdrum.spineParserrª  r   ÚEnvironmentr   rÇ  rO  rä  r   rÓ   r�   rp   rò   rv  r   r¤   r¥   )r=   rª  ÚurlBaserÏ   r-  rö   ÚdestFpr5   s           r.   ÚtestParseURLzTest.testParseURL·  s  € ð 	AÐ@Ð@Ð@Ð@Ð@àPˆØÐXÑXˆåÔ#Ñ%Ô%ˆØ#ˆˆ.ÑÝ�S‰MŒMˆØ×Ò�˜QœW™œ qÑ)Ô)Ð)õ ‘”×+Ò+¨A×,<Ò,<Ñ,>Ô,>ÀÈÑLÔLˆå�&˜#¨Ð0Ñ0Ô0ð 	G°BØ�HŠHÐEÑFÔFÐFð	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð ×ÒÐ/Ñ0Ô0ð 	1ð 	1Ý˜¨%Ð0Ñ0Ô0ˆAð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1õ �S dÐ+Ñ+Ô+ˆØ×Ò�˜QœW™œ qÑ)Ô)Ð)õ �#‰JŒJˆØ×Ò�˜QœW™œ qÑ)Ô)Ð)å
Œ	�&ÑÔÐÐÐs$   Â$CÃC
ÃC
Ã&DÄDÄDNrµ   )r)   r*   r+   r·  r×  rà  rì  rò  rú  r  r  r  r  r"  r.  r<  rC  rL  rZ  ra  rq  rs  rx  r{  r‚  rˆ  r’  rž  r¤  r¨  r°  r,   r-   r.   r²  r²  m  sÖ  € € € € € ð%ð %ð %ð::ð ::ð ::ðXGð Gð Gð/ð /ð /ð /ð)ð )ð )ð)ð )ð )ð%ð %ð %ð2&ð &ð &ð(+ð +ð +ðWð Wð Wð/ð /ð /ð3ð 3ð 3ð -ð -ð -ð,&ð &ð &ðð ð ð,A.ð A.ð A.ðF;ð ;ð ;ð07ð 7ð 7ð6
\ð 
\ð 
\ð/ð /ð /ð*ð *ð *ð*ð *ð *ðXJð Jð Jð2Oð Oð Oðð ð ð@5ð 5ð 5ð"Kð Kð Kð ð ð ð ð r-   r²  Ú__main__)rº   r»   r?   rŸ   )r¾   r¿   r?   rŸ   ra  )r?   re  r´   )
ro  rp  r|   r@   r}   r~   rÔ   r„   r?   re  )r}  r~  rS  rY   r?   rù   )NNFrê   )r?   r…   )rê   rÊ   )r5   rY   r?   r@   )Jrz   Ú
__future__r   Úcollectionsr   Úhttp.clientr   rr   Úmathr   r¤   rg   rb   r‘   r7  ÚtypingrÙ   ÚunittestrE   r  Úmusic21.converterr   r   rí   r	   r
   r   r   r   r   rm   r   Úmusic21.metadatar   rÚ   r   Ú__all__r­  r�   ÚTypeVarrY   rf   r%   ÚMusic21Exceptionr   r   r   r   r   r   r¶   rb  r·   r    r   r#   r   r   r   r   r   r‚  r   r!   r   r"   rx  ÚTestCaser”  rŸ  r²  Ú
_DOC_ORDERr)   ÚmainTestr,   r-   r.   ú<module>rÀ     sš  ððð ð ð. #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€à €€€à +Ð +Ð +Ð +Ð +Ð +Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $ð „?ð ØÐÐÐÐÐðð ð €ð. 'ˆ{Ô& {Ñ3Ô3€àˆaŒi˜¨S°©YÐ7Ñ7Ô7€ð	ð 	ð 	ð 	ð 	˜lÔ;ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	˜LÔ9ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	˜Ô6ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	˜\Ô:ñ 	ô 	ð 	ð
Xð Xð Xð Xð Xñ Xô Xð Xðxz-ð z-ð z-ð z-ð z-ñ z-ô z-ð z-ð~ EJÀEÁGÄGÐ Ð KÐ KÐ KÑ Kð
 
€E�G„Gð ð ð ð ñ ð
'ð 'ð 'ð9ð 9ð 9ð 9ð6?Zð ?Zð ?Zð ?ZðFVð Vð Vð Vð Vñ Vô Vð VðB ØØðð ð ð ð ð$ Øðð ð ð ð ð$ ØØð	ð ð ð ð ð ð, $Ø!Ø!ð	wJð wJð wJð wJð wJð wJðr!ð !ð !ð !ðH14ð 14ð 14ð 14ð 14ðhð ð ð ð ð  ð  ð  ðF	ð 	ð 	ðð ð ð ðð ð ð ð ˆxÔ ñ ô ð ð'ð 'ð 'ð 'ð '�8Ô$ñ 'ô 'ð 'ðli	ð i	ð i	ð i	ð i	ˆ8Ôñ i	ô i	ð i	ð\ �Y 	¨8°V¸TÀ9ÈgØÐ-Ð/EðG€
ð ˆzÒÐà€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr-   