§
    ƒØjQä  ã                  óŽ  — d Z ddlm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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  ej        d¦  «        Z G d„ d¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z  G d „ d!e¦  «        Z! G d"„ d#e¦  «        Z" G d$„ d%e¦  «        Z# G d&„ d'e¦  «        Z$ G d(„ d)e¦  «        Z% G d*„ d+e¦  «        Z& G d,„ d-e¦  «        Z' G d.„ d/e¦  «        Z( G d0„ d1e¦  «        Z) G d2„ d3e¦  «        Z* G d4„ d5e¦  «        Z+ G d6„ d7e
j,        ¦  «        Z- G d8„ d9e
j,        ¦  «        Z.e/d:k    rddlZ ej0        e-¦  «         dS dS );z±
SubConverters parse or display a single format.

Each subConverter should inherit from the base SubConverter object and have at least a
parseData method that sets self.stream.
é    )Úannotations)ÚIOBaseN)Úcommon)Údefaults)Úenvironment)ÚSubConverterException)Ústream)ÚIterablezconverter.subConvertersc                  óD  — e Zd ZU dZdZded<   dZded<   dZded	<   dZded
<   dZ	ded<   dZ
ded<   i Zded<   dZded<   dZded<   dZded<   d:d„Zd;d<d„Z	 d;d=d„Zd„ Zd „ Z eeed!¬"¦  «        Zd>d#„Z	 	 	 	 d?d@d)„Z	 	 dAdBd,„ZdCdDd/„ZdCdEd0„Z	 	 dAdFd5„ZdGd8„Z	 dCdHd9„ZdS )IÚSubConverteraÓ  
    Class wrapper for parsing data or outputting data.

    All other Converter types should inherit from this and
    have ways of dealing with various data formats.

    Attributes that should be set::

        readBinary = True or False (default False)
        registerFormats = tuple of formats that can be handled; eg: ('musicxml',)
        registerShowFormats = tuple of format calls that can be handled in .show() and .write()
        registerInputExtensions = tuple of input extensions that should be handled in converter
        registerOutputExtensions = tuple of output extensions that can be written. Order matters:
            the first will be used in calls to .write()
        canBePickled = True or False (default True; does not do anything yet)
        codecWrite = True or False (default False) if encodings need to be used to write
        stringEncoding = string (default 'utf-8'). If codecWrite is True, this specifies what
            encoding to use

    FÚboolÚ
readBinaryTÚcanBePickled© ztuple[str, ...]ÚregisterFormatsÚregisterShowFormatsÚregisterInputExtensionsÚregisterOutputExtensionszdict[str, str]Ú!registerOutputSubformatExtensionsNzstr | pathlib.Path | NoneÚ	launchKeyÚ
codecWriteúutf-8ÚstrÚstringEncodingÚreturnÚNonec                óD   — t          j        ¦   «         | _        || _        d S ©N)r	   ÚScoreÚ_streamÚkeywords©Úselfr!   s     ú”/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/converter/subConverters.pyÚ__init__zSubConverter.__init__N   s   € Ý=C¼\¹^¼^ˆŒà*2ˆŒˆˆó    Únumberú
int | Nonec                ó   — t           ‚)z²
        Called when a string (or binary) data is encountered.

        This method MUST be implemented to do anything in parsing.

        Return self.stream in the end
        ©ÚNotImplementedError)r#   Ú
dataStringr'   s      r$   Ú	parseDatazSubConverter.parseDataS   s
   € õ "Ð!r&   ÚfilePathústr | pathlib.Pathc                ón  — | j         du rTddl}t          ||                     ¦   «         ¬¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   n<t          |d¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |                      ||¦  «         | j        S )zô
        Called when a file is encountered. If all that needs to be done is
        loading the file and putting the data into parseData then there is no need
        to implement this method.  Just set self.readBinary to True | False.
        Fr   N©ÚencodingÚrb)r   ÚlocaleÚopenÚgetpreferredencodingÚreadr-   r	   )r#   r.   r'   r!   r4   ÚfÚ
dataStreams          r$   Ú	parseFilezSubConverter.parseFile^   s(  € ð Œ?˜eÐ#Ð#ØˆMˆMˆMÝ�h¨×)DÒ)DÑ)FÔ)FÐGÑGÔGð &È1ØŸVšV™XœX�
ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &øõ �h Ñ%Ô%ð &¨ØŸVšV™XœX�
ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð 	�Š�z 6Ñ*Ô*Ð*àŒ{Ðs#   ±AÁAÁAÁ.BÂBÂBc                ó   — | j         S r   ©r    ©r#   s    r$   Ú
_getStreamzSubConverter._getStreamt   s
   € ØŒ|Ðr&   c                ó   — || _         d S r   r<   )r#   Ú	newStreams     r$   Ú
_setStreamzSubConverter._setStreamw   s   € Ø ˆŒˆˆr&   zi
        Returns or sets the stream in the converter.  Must be defined for subConverter to work.
        )Údocc                ó   — dS )zÛ
        return bool on whether the *system* is
        equipped to show in this format.

        Default True. Might be False if, say
        a Lilypond converter is used and Lilypond
        is not installed.
        Tr   r"   s     r$   ÚcheckShowAbilityzSubConverter.checkShowAbility~   s	   € ð ˆtr&   Ú úpathlib.PathÚoptionsÚappú
str | Nonec                ó”  — |€| j         r| j         d         }n|€t          d¦  «        ‚|€`|�t          |         }nP| j        �| j        }t          |         }n4t                               |¦  «        }t                               |¦  «        }t          j        ¦   «         }d}|€d|dk    rdt          |¦  «        f}d}nÒ|dk    r'|rd	|t          |¦  «        f}n·d	t          |¦  «        f}n¥t          d
|› d�dz   d|›d�z   ¦  «        ‚|dv r'|r||t          |¦  «        f}no|t          |¦  «        f}n]|dk    rE|r"d	dt          |¦  «        |t          |¦  «        f}n3d	dt          |¦  «        t          |¦  «        f}nt          d|› �¦  «        ‚	 t          j        |d|¬¦  «         dS # t          $ r}	t          d¦  «        |	‚d}	~	ww xY w)a'  
        Opens the appropriate viewer for the file generated by .write()

        app is the path to an application to launch.  Specify it and/or a launchKey.
        launchKey is the specific key in .music21rc (such as graphicsPath), etc.
        to search for the application.  If it's not specified then there might be
        a default one for the converter in self.launchKey.  If it can't find it
        there then environLocal.formatToApp(fmt) will be used.

        Not needed for formats for which .show() just prints to the console.
        Nr   zBlaunch: fmt can only be None if there is a registered show format.FÚwinÚstartTÚdarwinr5   z0Cannot find a valid application path for format z. z,Specify this in your Environment by calling zenvironment.set(z, '/path/to/application'))rK   Únixz-azCannot launch files on )ÚcheckÚshellzBMost issues with show() can be resolved by calling configure.run())r   Ú
ValueErrorÚenvironLocalr   ÚformatToKeyÚformatToAppr   ÚgetPlatformr   r   Ú
subprocessÚrunÚFileNotFoundError)
r#   r.   ÚfmtrG   rH   r   ÚplatformrP   ÚcmdÚes
             r$   ÚlaunchzSubConverter.launch‰   s7  € ð" ˆ;˜4Ô3ˆ;ØÔ*¨1Ô-ˆCˆCØˆ[ÝÐaÑbÔbÐbàˆ;ØÐ$Ý" 9Ô-��Ø”Ð+Ø œN�	Ý" 9Ô-��å(×4Ò4°SÑ9Ô9�	Ý"×.Ò.¨sÑ3Ô3�õ Ô*Ñ,Ô,ˆØˆàˆ;Ø˜5Ò Ð ð ¥ H¡¤Ð.�Ø��Ø˜XÒ%Ð%Øð 2Ø! 7­C°©M¬MÐ:�C�Cà!¥3 x¡=¤=Ð1�C�Cå+ØNÀsÐNÐNÐNØDñEàO¨ÐOÐOÐOñPñô ð ð
 ˜Ð'Ð'Øð +Ø˜G¥S¨¡]¤]Ð3��à�C ™MœMÐ*��Ø˜Ò!Ð!Øð >Ø˜t¥S¨¡X¤X¨w½¸H¹¼ÐF��à˜t¥S¨¡X¤X­s°8©}¬}Ð=��å'Ð(LÀ(Ð(LÐ(LÑMÔMÐMð	ÝŒN˜3 e°5Ð9Ñ9Ô9Ð9Ð9Ð9øÝ ð 	ð 	ð 	å'ØTñô àðøøøøð	øøøs   ÆF( Æ(
GÆ2GÇGrY   út.Any | Nonec                óX   —  | j         ||fd|i|¤Ž}|                      |||¬¦  «         dS )zå
        Write the data, then show the generated data, using `.launch()` or printing
        to a console.

        Some simple formats that do not need launching, may skip .launch() and
        simply return the output.
        Ú
subformats©rY   rH   N©Úwriter]   ©r#   ÚobjrY   rH   r`   r!   ÚreturnedFilePaths          r$   ÚshowzSubConverter.showÓ   sD   € ð &˜4œ: c¨3ÐRÐR¸:ÐRÈÐRÐRÐØ�ŠÐ$¨#°3ˆÑ7Ô7Ð7Ð7Ð7r&   r`   úIterable[str]c                ó´   — | j         }|st          d¦  «        ‚|d         }| j        r-|r+d                     |¦  «        }|| j        v r| j        |         }d|z   S )zÑ
        Given a default format or subformats, give the file extension it should have:

        >>> c = converter.subConverters.ConverterMidi()
        >>> c.getExtensionForSubformats()
        '.mid'
        zRThis subConverter cannot show or write: no output extensions are registered for itr   ú.)r   r   r   Újoin)r#   r`   Ú
extensionsÚextÚjoinedSubformatss        r$   ÚgetExtensionForSubformatsz&SubConverter.getExtensionForSubformatså   s†   € ð Ô2ˆ
Øð 	@Ý'ð?ñ@ô @ð @ð ˜ŒmˆØÔ1ð 	O°jð 	OØ"Ÿxšx¨
Ñ3Ô3ÐØ 4Ô#IÐIÐIØÔ<Ð=MÔN�Ø�S‰yÐr&   c                óh   — |                       |¦  «        }t                               |d¬¦  «        }|S )a´  
        Return a temporary file with an extension appropriate for the format.

        >>> c = corpus.parse('bwv66.6')
        >>> lpConverter = converter.subConverters.ConverterLilypond()
        >>> tf = str(lpConverter.getTemporaryFile(subformats=['png']))
        >>> tf.endswith('.png')
        True
        >>> import os  #_DOCS_HIDE
        >>> os.remove(tf)  #_DOCS_HIDE

        * Changed in v6: returns pathlib.Path.
        T©ÚreturnPathlib)ro   rR   ÚgetTempFile)r#   r`   rm   Úfps       r$   ÚgetTemporaryFilezSubConverter.getTemporaryFileú   s4   € ð ×,Ò,¨ZÑ8Ô8ˆÝ×%Ò% c¸Ð%Ñ>Ô>ˆØˆ	r&   re   úmusic21.base.Music21Objectrt   ú"str | pathlib.Path | IOBase | Nonec                óB   — t          |¦  «        } | j        ||fi |¤Ž}|S )z_
        Calls .writeDataStream on the repr of obj, and returns the fp returned by it.
        )ÚreprÚwriteDataStream©r#   re   rY   rt   r`   r!   ÚdataStrs          r$   rc   zSubConverter.write  s0   € õ �s‘)”)ˆØ!ˆTÔ! " gÐ:Ð:°Ð:Ð:ˆØˆ	r&   r|   ústr | bytesc                óº  — |€|                       ¦   «         }| j        du rd}nd}| j        du rlt          |t          ¦  «        rW	 |                     d¦  «        }n@# t          $ r3 d| _        t          |t          ¦  «        r|                     ¦   «          Y nw xY wt          |t          t          j        f¦  «        ret          j        |d¬¦  «        }t          ||| j        r| j        nd¬¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   |S |                     |¦  «         |                     ¦   «          t          j        d	¦  «        S )
z„
        Writes the data stream to `fp` or to a temporary file and returns the
        Path object of the filename written.
        NFÚwÚwbr   Trq   ©Úmoder2   rE   )ru   r   r   Ú
isinstanceÚbytesÚdecodeÚUnicodeDecodeErrorr   Úcloser   ÚpathlibÚPathr   Ú	cleanpathr5   r   rc   )r#   rt   r|   r!   Ú
writeFlagsr8   s         r$   rz   zSubConverter.writeDataStream  s¥  € ð ˆ:Ø×&Ò&Ñ(Ô(ˆBàŒ?˜eÐ#Ð#ØˆJˆJàˆJàŒ?˜eÐ#Ð#­
°7½EÑ(BÔ(BÐ#ðØ!Ÿ.š.¨Ñ1Ô1��øÝ%ð ð ð à"&�”å˜b¥&Ñ)Ô)ð Ø—H’H‘J”J�Jøøðøøøõ �b�3¥¤Ð-Ñ.Ô.ð 	$ÝÔ! "°DÐ9Ñ9Ô9ˆBÝ�bØ%Ø6:´oÐO˜tÔ2Ð2È4ðñ ô ð !ð Ø—’˜Ñ Ô Ð ð	!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð
 ˆIð �HŠH�WÑÔÐØ�HŠH‰JŒJˆJÝ”< Ñ#Ô#Ð#s$   ÁA Á:BÂBÃ1DÄDÄDc                ó  —  | j         |f||dœ|¤Ž}| j        du rd}nd}t          ||| j        r| j        nd¬¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |                     d¬¦  «         |S )	zŠ
        Write the object out in the given format and then read it back in
        and return the object (str or bytes) returned.
        )rY   r`   FÚrr3   Nr�   T)Ú
missing_ok)rc   r   r5   r   r   r7   Úunlink)	r#   re   rY   r`   r!   rt   Ú	readFlagsr8   Úouts	            r$   ÚtoDatazSubConverter.toDataA  sæ   € ð ˆTŒZ˜ÐH °ÐHÐH¸xÐHÐHˆØŒ?˜eÐ#Ð#ØˆIˆIàˆIÝ�"Ø Ø26´/ÐK˜4Ô.Ð.Àtðñ ô ð 	ð Ø—&’&‘(”(ˆCð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 	�	Š	˜Tˆ	Ñ"Ô"Ð"Øˆ
s   Á A!Á!A%Á(A%)r   r   r   )r'   r(   ©r.   r/   r'   r(   )r   r   )NrE   NN)r.   rF   rG   r   rH   rI   ©Nr   )rY   rI   r   r^   )r   )r`   rh   r   r   )r`   rh   r   rF   )re   rv   rY   rI   rt   rw   r`   rh   )rt   rw   r|   r}   r   rF   )rY   rI   r`   rh   r   r}   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r   r   r   r   r   r   r   r%   r-   r:   r>   rA   Úpropertyr	   rD   r]   rg   ro   ru   rc   rz   r’   r   r&   r$   r   r   -   sB  € € € € € € ðð ð( €JÐÐÐÑØ€LÐÐÐÑØ')€OÐ)Ð)Ð)Ñ)Ø+-ÐÐ-Ð-Ð-Ñ-Ø/1ÐÐ1Ð1Ð1Ñ1Ø02ÐÐ2Ð2Ð2Ñ2Ø8:Ð%Ð:Ð:Ð:Ñ:Ø'+€IÐ+Ð+Ð+Ñ+à€JÐÐÐÑØ!€NÐ!Ð!Ð!Ñ!ð3ð 3ð 3ð 3ð
"ð "ð "ð "ð "ð &*ðð ð ð ð ð,ð ð ð!ð !ð !ð ˆX�j *ð 3ð ñ ô €Fð	ð 	ð 	ð 	ð Ø Ø#ØðHð Hð Hð Hð Hð\ Øð8ð 8ð 8ð 8ð 8ð$ð ð ð ð ð*ð ð ð ð ð* 26Ø*,ð	ð ð ð ð ð&$ð &$ð &$ð &$ðX %'ð	ð ð ð ð ð ð r&   r   c                  ó,   — e Zd ZdZdZdZddiZd
dd	„ZdS )ÚConverterIPythonz²
    Meta-subConverter for displaying image data in a Notebook
    using either png (via MuseScore or LilyPond) or directly via
    Vexflow/music21j, or MIDI using music21j.
    )ÚipythonÚjupyterr   ÚlilypondÚlyNr   út.Anyc                ó*  — ddl m} ddlm} |r|d         }|dd…         }	nd}g }	|	sdg}	|                     |¦  «        }
|dv r |j        |f|
||	d	œ|¤Ž dS |d
k    r5t          j        rt          |
t          ¦  «        sJ ‚ |j
        |f|
||	d	œ|¤ŽS dS )a?  
        show a specialized for Jupyter Notebook using the appropriate subformat.

        For MusicXML runs it through MuseScore and returns the PNG data.
        (use multipageWidget to get an experimental interactive page display).

        For MIDI: loads a music21j-powered MIDI player in to the Notebook.
        r   )Ú	Converter)Ú
convertersé   NÚmusicxmlÚpng)r¦   ÚxmlrŸ   Úlily)ÚsubConverterrY   r`   Úmidi)Úmusic21.converterr£   Úmusic21.ipython21r¤   ÚgetSubConverterFromFormatÚshowImageThroughMuseScoreÚtÚTYPE_CHECKINGrƒ   ÚConverterMidiÚdisplayMusic21jMIDI)r#   re   rY   rH   r`   r!   r£   Úip21_convertersÚhelperFormatÚhelperSubformatsÚhelperSubConverters              r$   rg   zConverterIPython.showd  s/  € ð 	0Ð/Ð/Ð/Ð/Ð/ØCÐCÐCÐCÐCÐCàð 	"Ø% aœ=ˆLØ)¨!¨"¨"œ~ÐÐà%ˆLØ!Ðàð 	'Ø %˜wÐà&×@Ò@ÀÑNÔNÐàÐBÐBÐBØ5ˆOÔ5Øðà/Ø Ø+ð	ð ð
 ðð ð ð �4Ø˜VÒ#Ð#ÝŒð EÝ!Ð"4µmÑDÔDÐDÐDÐDØ6�?Ô6Øðà/Ø Ø+ð	ð ð
 ðð ð ð $Ð#r&   r”   )r   r¡   )r•   r–   r—   r˜   r   r   r   rg   r   r&   r$   rœ   rœ   Z  sO   € € € € € ðð ð
 -€OØ!ÐØ)3°TÐ(:Ð%ð+ð +ð +ð +ð +ð +ð +r&   rœ   c                  óF   — e Zd ZdZdZdZddddœZdZ	 	 dddœdd„Zdd„Z	d	S )ÚConverterLilypondzÎ
    Convert to Lilypond and from there usually to png, pdf, or svg.

    Note: that the proper format for displaying Lilypond in Jupyter
    notebook in v9 is ipython.lily.png and not lily.ipython.png
    )rŸ   r©   )r    r§   ÚpdfÚsvgr§   rº   rE   )r§   rº   r»   TNr   F)ÚcoloredVariantsr¼   r   c               óF  — ddl m} |j                             ¦   «         }||_        |                     |¦  «         d|v r|                     |¦  «        }	nKd|v r|                     |¦  «        }	n1d|v r|                     |¦  «        }	n| 	                    d|¬¦  «        }	|	S )Nr   )r©   rº   r§   r»   z.ly)rm   rt   )
Úmusic21r©   Ú	translateÚLilypondConverterr¼   ÚloadFromMusic21ObjectÚ	createPDFÚ	createPNGÚ	createSVGÚwriteLyFile)
r#   re   rY   rt   r`   r¼   r!   r©   ÚconvÚconvertedFilePaths
             r$   rc   zConverterLilypond.write   sÄ   € ð 	!Ð Ð Ð Ð Ð ØŒ~×/Ò/Ñ1Ô1ˆØ.ˆÔØ×"Ò" 3Ñ'Ô'Ð'à�JÐÐØ $§¢¨rÑ 2Ô 2ÐÐØ�jÐ Ð Ø $§¢¨rÑ 2Ô 2ÐÐØ�jÐ Ð Ø $§¢¨rÑ 2Ô 2ÐÐà $× 0Ò 0°U¸rÐ 0Ñ BÔ BÐØ Ð r&   c                ó¶   — |sdg} | j         ||fd|i|¤Ž}|�|r	|d         }nd}t                               |¦  «        }|                      ||||¬¦  «         dS )zÂ
        Call .write (write out the lilypond (.ly) file; convert to .png/.pdf, etc.)
        then launch the appropriate viewer for .png/.pdf (graphicsPath) or .svg
        (vectorPath)
        r§   r`   Nr   )rY   rH   r   )rc   rR   rS   r]   )	r#   re   rY   rH   r`   r!   rf   Ú	outFormatr   s	            r$   rg   zConverterLilypond.show·  s…   € ð ð 	!Ø˜ˆJØ%˜4œ: c¨3ÐRÐR¸:ÐRÈÐRÐRÐØÐ! jÐ!Ø" 1œˆIˆIàˆIõ !×,Ò,¨YÑ7Ô7ˆ	Ø�ŠÐ$¨)¸È	ˆÑRÔRÐRÐRÐRr&   r”   )r¼   r   )
r•   r–   r—   r˜   r   r   r   r   rc   rg   r   r&   r$   r¹   r¹   ’  s’   € € € € € ðð ð +€OØ:ÐØ05Ø05Ø02ð)4ð )4Ð%ð €Jð
 Øð	!ð ',ð!ð !ð !ð !ð !ð !ð.Sð Sð Sð Sð Sð Sr&   r¹   c                  ó<   ‡ — e Zd ZdZdZdZ	 	 dˆ fd„	Z	 	 dd„Zˆ xZS )	ÚConverterBraille©Úbraille©ÚtxtTNr   c                óÌ   •— t          j        ¦   «         s  t          ¦   «         j        ||fd |dœ|¤Ž d S ddlm} |j                             |¦  «        }t          |¦  «         d S )N)rH   r`   r   rÌ   )	r   ÚrunningInNotebookÚsuperrg   r¾   rÍ   r¿   ÚobjectToBrailleÚprint)	r#   re   rY   rH   r`   r!   rÍ   r|   Ú	__class__s	           €r$   rg   zConverterBraille.showÏ  sz   ø€ õ Ô'Ñ)Ô)ð 	Ø�E‰GŒGŒL˜˜cÐO t¸
ÐOÐOÀhÐOÐOÐOÐOÐOà'Ð'Ð'Ð'Ð'Ð'ØÔ'×7Ò7¸Ñ<Ô<ˆGÝ�'‰NŒNˆNˆNˆNr&   c                ó    — ddl m}  |j        j        |fi |¤Ž}d|v r|j                             |¦  «        }|                      ||¦  «        }|S )Nr   rÌ   Úascii)r¾   rÍ   r¿   rÓ   ÚbasicÚbrailleUnicodeToBrailleAsciirz   )r#   re   rY   rt   r`   r!   rÍ   r|   s           r$   rc   zConverterBraille.writeÞ  sm   € ð 	$Ð#Ð#Ð#Ð#Ð#Ø3�'Ô#Ô3°CÐDÐD¸8ÐDÐDˆØ�jÐ Ð Ø”m×@Ò@ÀÑIÔIˆGØ×!Ò! " gÑ.Ô.ˆØˆ	r&   r”   )	r•   r–   r—   r   r   r   rg   rc   Ú__classcell__©rÕ   s   @r$   rË   rË   Ê  sq   ø€ € € € € Ø"€OØ'ÐØ€Jð Øðð ð ð ð ð ð& Øðð ð ð ð ð ð ð r&   rË   c                  ó*   — e Zd ZdZdZ	 	 d
ddœdd	„ZdS )ÚConverterVexflow)Úvexflow)ÚhtmlNr   F)Úlocalrà   r   c               ón   — ddl m} |                     |d|¬¦  «        }|                      ||¦  «        }|S )Nr   )Ú
toMusic21jrß   )r‚   rà   )Úmusic21.vexflowrâ   Ú
fromObjectrz   )	r#   re   rY   rt   r`   rà   r!   rÞ   r|   s	            r$   rc   zConverterVexflow.writeò  sJ   € ð 	:Ð9Ð9Ð9Ð9Ð9Ø×$Ò$ S¨v¸UÐ$ÑCÔCˆØ×!Ò! " gÑ.Ô.ˆØˆ	r&   r”   )rà   r   )r•   r–   r—   r   r   rc   r   r&   r$   rÝ   rÝ   î  sO   € € € € € Ø"€OØ(Ðð
 Øð	ð "ðð ð ð ð ð ð ð r&   rÝ   c                  ó*   — e Zd ZdZdZdZdd„Zdd„ZdS )	ÚConverterTextz˜
    standard text presentation has line breaks, is printed.

    Two keyword options are allowed: addEndTimes=Boolean and useMixedNumerals=Boolean
    )ÚtextrÏ   r°   rÎ   Nr   c                óL   —  |j         di |¤Ž}|                      ||¦  «         |S r”   )Ú	_reprTextrz   r{   s          r$   rc   zConverterText.write  s4   € Ø�#”-Ð+Ð+ (Ð+Ð+ˆØ×Ò˜R Ñ)Ô)Ð)Øˆ	r&   c                ó:   — t           |j        di |¤Ž¦  «         d S r”   )rÔ   ré   ©r#   re   rY   rH   r`   r!   s         r$   rg   zConverterText.show  s(   € ÝˆmˆcŒmÐ'Ð'˜hÐ'Ð'Ñ(Ô(Ð(Ð(Ð(r&   r”   ©r•   r–   r—   r˜   r   r   rc   rg   r   r&   r$   ræ   ræ     sS   € € € € € ðð ð +€OØ'Ððð ð ð ð
)ð )ð )ð )ð )ð )r&   ræ   c                  ó*   — e Zd ZdZdZdZdd„Zdd„ZdS )	ÚConverterTextLinea:  
    a text line compacts the complete recursive representation into a
    single line of text; most for debugging. returned, not printed

    >>> s = corpus.parse('bwv66.6')
    >>> s.measures(1, 4).show('textline')
    "{0.0} <music21.stream.Part Soprano> / {0.0} <music21.instrument.Instrument '... 1'>..."
    )ÚtextlinerÎ   Nr   c                óZ   — |                      ¦   «         }|                      ||¦  «         |S r   )Ú_reprTextLinerz   r{   s          r$   rc   zConverterTextLine.write   s.   € Ø×#Ò#Ñ%Ô%ˆØ×Ò˜R Ñ)Ô)Ð)Øˆ	r&   c                ó*   — |                      ¦   «         S r   )rñ   rë   s         r$   rg   zConverterTextLine.show%  s   € Ø× Ò Ñ"Ô"Ð"r&   r”   rì   r   r&   r$   rî   rî     sS   € € € € € ðð ð $€OØ'Ððð ð ð ð
#ð #ð #ð #ð #ð #r&   rî   c                  óF   — e Zd ZdZdZdZdZ	 dddœdd„Zd„ Zdd„Z	dd„Z
dS )ÚConverterVolpianoaW  
    Reads or writes volpiano (Chant encoding).

    Normally, just use 'converter' and .show()/.write()

    >>> p = converter.parse('volpiano: 1---c-d-ef----4')
    >>> p.show('text')
    {0.0} <music21.stream.Measure 0 offset=0.0>
        {0.0} <music21.clef.TrebleClef>
        {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.volpiano.Neume <music21.note.Note E><music21.note.Note F>>
        {4.0} <music21.bar.Barline type=double>
    >>> p.show('volpiano')
    1---c-d-ef----4
    ©Úvolpiano)rö   Úvp)rÏ   r÷   NF©ÚbreaksToLayoutr'   r(   rù   r   c               óJ   — ddl m} |                     ||¬¦  «        | _        d S )Nr   rõ   rø   )r¾   rö   ÚtoPartr	   )r#   r,   r'   rù   r!   rö   s         r$   r-   zConverterVolpiano.parseData@  s1   € ð 	%Ð$Ð$Ð$Ð$Ð$Ø—o’o jÀ�oÑPÔPˆŒˆˆr&   c                óœ   — ddl m} |j        r|}n(t          j        ¦   «         }|                     |¦  «         |                     |¦  «        S )z>
        Get the raw data, for storing as a variable.
        r   rõ   )r¾   rö   ÚisStreamr	   ÚStreamÚappendÚ
fromStream)r#   re   r!   rö   Úss        r$   Ú
getDataStrzConverterVolpiano.getDataStrK  sU   € ð 	%Ð$Ð$Ð$Ð$Ð$ØŒ<ð 	ØˆAˆAå”‘”ˆAØ�HŠH�S‰MŒMˆMà×"Ò" 1Ñ%Ô%Ð%r&   r   c                óN   —  | j         |fi |¤Ž}|                      ||¦  «         |S r   )r  rz   r{   s          r$   rc   zConverterVolpiano.writeX  s6   € Ø!�$”/ #Ð2Ð2¨Ð2Ð2ˆØ×Ò˜R Ñ)Ô)Ð)Øˆ	r&   c                ó<   — t           | j        |fi |¤Ž¦  «         d S r   )rÔ   r  rë   s         r$   rg   zConverterVolpiano.show]  s*   € ÝˆoˆdŒo˜cÐ.Ð. XÐ.Ð.Ñ/Ô/Ð/Ð/Ð/r&   r   )r'   r(   rù   r   r”   )r•   r–   r—   r˜   r   r   r   r-   r  rc   rg   r   r&   r$   rô   rô   )  sœ   € € € € € ðð ð$ $€OØ0ÐØ,Ðð
  ð	Qð
  %ð	Qð 	Qð 	Qð 	Qð 	Qð 	Qð&ð &ð &ðð ð ð ð
0ð 0ð 0ð 0ð 0ð 0r&   rô   c                  ó   — e Zd ZdZdZdZdS )ÚConverterScala)Úscala)ÚsclN)r•   r–   r—   r   r   r   r   r&   r$   r  r  a  s!   € € € € € Ø €OØ&ÐØ'ÐÐÐr&   r  c                  ó>   ‡ — e Zd ZdZdZdZˆ fd„Zdd„Z	 ddd„Zˆ xZ	S )ÚConverterHumdrumzZ
    Simple class wrapper for parsing Humdrum data provided in a file or in a string.
    )Úhumdrum)Úkrnc                óH   •—  t          ¦   «         j        di |¤Ž d | _        d S r”   ©rÒ   r%   Údata©r#   r!   rÕ   s     €r$   r%   zConverterHumdrum.__init__o  ó+   ø€ Ø�‰ŒÔÐ$Ð$˜8Ð$Ð$Ð$ØˆŒ	ˆ	ˆ	r&   Nc                óŠ   — ddl m}  ||¦  «        }|                     ¦   «          || _        | j        j        | _        | j        S )aí  
        Open Humdrum data from a string -- calls
        :meth:`~music21.humdrum.spineParser.HumdrumDataCollection.parse()`.

        >>> humData = ('**kern\n*M2/4\n=1\n24r\n24g#\n24f#\n24e\n24c#\n'
        ...            '24f\n24r\n24dn\n24e-\n24gn\n24e-\n24dn\n*-')
        >>> c = converter.subConverters.ConverterHumdrum()
        >>> s = c.parseData(humData)
        >>> c.stream.show('text')
        {0.0} <music21.metadata.Metadata object at 0x7f33545027b8>
        {0.0} <music21.stream.Part spine_0>
            {0.0} <music21.humdrum.spineParser.MiscTandem **kern>
            {0.0} <music21.stream.Measure 1 offset=0.0>
                {0.0} <music21.meter.TimeSignature 2/4>
                {0.0} <music21.note.Rest 1/6ql>
                {0.1667} <music21.note.Note G#>
                {0.3333} <music21.note.Note F#>
                {0.5} <music21.note.Note E>
                {0.6667} <music21.note.Note C#>
                {0.8333} <music21.note.Note F>
                {1.0} <music21.note.Rest 1/6ql>
                {1.1667} <music21.note.Note D>
                {1.3333} <music21.note.Note E->
                {1.5} <music21.note.Note G>
                {1.6667} <music21.note.Note E->
                {1.8333} <music21.note.Note D>
        r   )ÚHumdrumDataCollection)Úmusic21.humdrum.spineParserr  Úparser  r	   )r#   ÚhumdrumStringr'   r  Úhdfs        r$   r-   zConverterHumdrum.parseDatau  sO   € ð8 	FÐEÐEÐEÐEÐEà#Ð# MÑ2Ô2ˆØ�	Š	‰ŒˆØˆŒ	Ø”iÔ&ˆŒØŒyÐr&   r.   úpathlib.Path | strr'   r(   c                óŠ   — ddl m}  ||¦  «        }|                     ¦   «          || _        | j        j        | _        | j        S )z„
        Open Humdrum data from a file path.

        Calls humdrum.parseFile on filepath.

        Number is ignored here.
        r   )ÚHumdrumFile)r  r  ÚparseFilenamer  r	   )r#   r.   r'   r!   r  Úhfs         r$   r:   zConverterHumdrum.parseFile™  sT   € ð 	<Ð;Ð;Ð;Ð;Ð;Øˆ[˜Ñ"Ô"ˆØ
×ÒÑÔÐØˆŒ	ð ”iÔ&ˆŒØŒyÐr&   r   ©r.   r  r'   r(   )
r•   r–   r—   r˜   r   r   r%   r-   r:   rÚ   rÛ   s   @r$   r
  r
  h  s‚   ø€ € € € € ðð ð #€OØ&Ððð ð ð ð ð"ð "ð "ð "ðL &*ðð ð ð ð ð ð ð ð r&   r
  c                  ó2   ‡ — e Zd ZdZdZdZˆ fd„Zdd„Zˆ xZS )ÚConverterTinyNotationz|
    Simple class wrapper for parsing TinyNotation data provided in a file or
    in a string.

    Input only for now.
    )Útinynotation)Útntxtr   c                óH   •—  t          ¦   «         j        di |¤Ž d | _        d S r”   r  r  s     €r$   r%   zConverterTinyNotation.__init__º  r  r&   Nc                ó¾   — t          |t          ¦  «        r|}nt          d¦  «        ‚ddlm}  |j        |fi | j        ¤Ž                     ¦   «         j        | _        dS )aA  
        Open TinyNotation data from a string

        >>> tnData = "3/4 E4 r f# g=lastG trip{b-8 a g} c"
        >>> c = converter.subConverters.ConverterTinyNotation()
        >>> s = c.parseData(tnData)
        >>> c.stream.show('text')
        {0.0} <music21.stream.Measure 1 offset=0.0>
            {0.0} <music21.clef.TrebleClef>
            {0.0} <music21.meter.TimeSignature 3/4>
            {0.0} <music21.note.Note E>
            {1.0} <music21.note.Rest quarter>
            {2.0} <music21.note.Note F#>
        {3.0} <music21.stream.Measure 2 offset=3.0>
            {0.0} <music21.note.Note G>
            {1.0} <music21.note.Note B->
            {1.3333} <music21.note.Note A>
            {1.6667} <music21.note.Note G>
            {2.0} <music21.note.Note C>
            {2.5} <music21.bar.Barline type=final>
        zWTinyNotation no longer supports two-element calls; put the time signature in the streamr   )ÚtinyNotationN)	rƒ   r   r   r¾   r$  r£   r!   r  r	   )r#   ÚtnDatar'   ÚtnStrr$  s        r$   r-   zConverterTinyNotation.parseData¿  sy   € õ. �f�cÑ"Ô"ð 	#ØˆEˆEå'ð"ñ#ô #ð #ð 	)Ð(Ð(Ð(Ð(Ð(Ø,�lÔ,¨UÐDÐD°d´mÐDÐD×JÒJÑLÔLÔSˆŒˆˆr&   r   )	r•   r–   r—   r˜   r   r   r%   r-   rÚ   rÛ   s   @r$   r  r  °  sk   ø€ € € € € ðð ð (€OØ7Ððð ð ð ð ð
Tð Tð Tð Tð Tð Tð Tð Tr&   r  c                  ó,   — e Zd ZdZdZdZd„ Z	 ddd
„ZdS )ÚConverterNoteworthya·  
    Simple class wrapper for parsing NoteworthyComposer data provided in a
    file or in a string.

    Gets data with the file format .nwctxt

    Users should not need this routine.  The basic format is converter.parse('file.nwctxt')

    >>> nwcTranslatePath = common.getSourceFilePath() / 'noteworthy' #_DOCS_HIDE
    >>> paertPath = nwcTranslatePath / 'Part_OWeisheit.nwctxt' #_DOCS_HIDE
    >>> #_DOCS_SHOW paertPath = converter.parse(r'd:/desktop/arvo_part_o_weisheit.nwctxt')
    >>> paertStream = converter.parse(paertPath)
    >>> len(paertStream.parts)
    4

    For developers: see the documentation for :meth:`parseData` and :meth:`parseFile`
    to see the low-level usage.
    )Únoteworthytext)Únwctxtc                ój   — ddl m} |                     ¦   «                              |¦  «        | _        dS )aý  
        Open Noteworthy data from a string or list

        >>> nwcData = ('!NoteWorthyComposer(2.0)\n|AddStaff\n|Clef|'
        ...            'Type:Treble\n|Note|Dur:Whole|Pos:1^')
        >>> c = converter.subConverters.ConverterNoteworthy()
        >>> c.parseData(nwcData)
        >>> c.stream.show('text')
        {0.0} <music21.stream.Part ...>
            {0.0} <music21.stream.Measure 0 offset=0.0>
                {0.0} <music21.clef.TrebleClef>
                {0.0} <music21.note.Note C>
        r   ©r¿   N)Úmusic21.noteworthyr¿   ÚNoteworthyTranslatorÚparseStringr	   )r#   ÚnwcDataÚnoteworthyTranslates      r$   r-   zConverterNoteworthy.parseDataø  s<   € ð 	HÐGÐGÐGÐGÐGØ)×>Ò>Ñ@Ô@×LÒLÈWÑUÔUˆŒˆˆr&   Nr.   r  r'   r(   c                ój   — ddl m} |                     ¦   «                              |¦  «        | _        dS )aÎ  
        Open Noteworthy data (as nwctxt) from a file path.

        >>> nwcTranslatePath = common.getSourceFilePath() / 'noteworthy' #_DOCS_HIDE
        >>> filePath = nwcTranslatePath / 'Part_OWeisheit.nwctxt' #_DOCS_HIDE
        >>> #_DOCS_SHOW paertPath = converter.parse('d:/desktop/arvo_part_o_weisheit.nwctxt')
        >>> c = converter.subConverters.ConverterNoteworthy()
        >>> c.parseFile(filePath)
        >>> #_DOCS_SHOW c.stream.show()
        r   r,  N)r-  r¿   r.  r:   r	   )r#   r.   r'   r!   r1  s        r$   r:   zConverterNoteworthy.parseFile
  s<   € ð 	HÐGÐGÐGÐGÐGØ)×>Ò>Ñ@Ô@×JÒJÈ8ÑTÔTˆŒˆˆr&   r   r  ©r•   r–   r—   r˜   r   r   r-   r:   r   r&   r$   r(  r(  à  sb   € € € € € ðð ð$ *€OØ)ÐðVð Vð Vð( &*ðUð Uð Uð Uð Uð Uð Ur&   r(  c                  ó0   — e Zd ZdZdZdZdZd„ Z	 ddd„ZdS )ÚConverterNoteworthyBinaryzá
    Simple class wrapper for parsing NoteworthyComposer binary data
    provided in a file or in a string.

    Gets data with the file format .nwc

    Users should not need this routine.  Call converter.parse directly
    T)Ú
noteworthy)Únwcc                ój   — ddl m} |                     ¦   «                              |¦  «        | _        d S ©Nr   )ÚbinaryTranslate)r-  r:  ÚNWCConverterr/  r	   )r#   r0  ÚnoteworthyBinarys      r$   r-   z#ConverterNoteworthyBinary.parseData+  s9   € ØJÐJÐJÐJÐJÐJØ&×3Ò3Ñ5Ô5×AÒAÀ'ÑJÔJˆŒˆˆr&   Nr.   r  r'   r(   c                ój   — ddl m} |                     ¦   «                              |¦  «        | _        d S r9  )r-  r:  r;  r:   r	   )r#   r.   r'   r!   r<  s        r$   r:   z#ConverterNoteworthyBinary.parseFile/  s<   € ð 	KÐJÐJÐJÐJÐJØ&×3Ò3Ñ5Ô5×?Ò?ÀÑIÔIˆŒˆˆr&   r   r  )	r•   r–   r—   r˜   r   r   r   r-   r:   r   r&   r$   r5  r5    sg   € € € € € ðð ð €JØ%€OØ'ÐðKð Kð Kð &*ðJð Jð Jð Jð Jð Jð Jr&   r5  c                  ód   — e Zd ZdZdZdZdZdddœZdd d„Z	 dd!d„Z	d"d„Z
	 	 d#dddœd$d„Zd#d„ZdS )%ÚConverterMusicXMLzŠ
    Converter for MusicXML using the 2015 ElementTree system.

    Users should not need this Object.  Call converter.parse directly
    )r¦   r¨   )r¨   Úmxlr¦   )r¦   r¨   r@  r§   rº   )r§   rº   NÚ	xmlStringr   c                óˆ   — ddl m} |                     ¦   «         }||_        |                     ¦   «          |j        | _        dS )z3
        Open MusicXML data from a string.
        r   ©ÚxmlToM21N)Úmusic21.musicxmlrD  ÚMusicXMLImporterÚxmlTextÚparseXMLTextr	   )r#   rA  r'   rD  Úcs        r$   r-   zConverterMusicXML.parseDataE  sK   € ð 	.Ð-Ð-Ð-Ð-Ð-à×%Ò%Ñ'Ô'ˆØˆŒ	Ø	�ŠÑÔÐØ”hˆŒˆˆr&   r.   r/   r'   r(   c                óÂ  — ddl m} ddlm} |                     ¦   «         }|                     |¦  «        }|                     ¦   «         r0|                     ¦   «         }||_        | 	                    ¦   «          n| 
                    |¦  «         |j        j        j        €3t          j                             |¦  «        \  }	}
|
|j        j        _        |j        | _        dS )z¦
        Open from a file path; check to see if there is a pickled
        version available and up to date; if so, open that, otherwise
        open source.
        r   ©Ú	converterrC  N)r¾   rL  rE  rD  rF  ÚArchiveManagerÚ	isArchiveÚgetDatarG  rH  ÚreadFiler	   ÚmetadataÚmovementNameÚosÚpathÚsplit)r#   r.   r'   r!   rL  rD  rI  ÚarchÚarchDataÚjunkÚfns              r$   r:   zConverterMusicXML.parseFileP  sÚ   € ð 	&Ð%Ð%Ð%Ð%Ð%Ø-Ð-Ð-Ð-Ð-Ð-à×%Ò%Ñ'Ô'ˆð ×'Ò'¨Ñ1Ô1ˆØ�>Š>ÑÔð 	!Ø—|’|‘~”~ˆHØ ˆAŒIØ�NŠNÑÔÐÐà�JŠJ�xÑ Ô Ð ð Œ8ÔÔ)Ð1Ý”w—}’} XÑ.Ô.‰HˆD�"Ø-/ˆAŒHÔÔ*Ø”hˆŒˆˆr&   r|   r}   r   rF   c                ó~  — t          |t          ¦  «        st          |› d�¦  «        ‚|}|€|                      ¦   «         }nt	          j        |d¬¦  «        }|j        r|j        dk    r|                     d¦  «        }d}t          ||¦  «        5 }| 	                    |¦  «         ddd¦  «         n# 1 swxY w Y   |S )a¯  
        Writes `dataStr` which must be bytes to `fp`.
        Adds `.musicxml` suffix to `fp` if it does not already contain some suffix.

        * Changed in v7: returns a pathlib.Path.

        OMIT_FROM_DOCS

        >>> import os
        >>> from music21.converter.subConverters import ConverterMusicXML
        >>> fp = 'noSuffix'
        >>> sub = ConverterMusicXML()
        >>> outFp = sub.writeDataStream(fp, b'')
        >>> str(outFp).endswith('.musicxml')
        True

        >>> os.remove(outFp)
        >>> fp = 'other.suffix'
        >>> outFp = sub.writeDataStream(fp, b'')
        >>> str(outFp).endswith('.suffix')
        True
        >>> os.remove(outFp)
        z& must be bytes to write to this formatNTrq   ú.mxlú	.musicxmlr€   )
rƒ   r„   rQ   ru   r   rŠ   ÚsuffixÚwith_suffixr5   rc   )r#   rt   r|   r!   Ú	dataBytesÚfpPathr‹   r8   s           r$   rz   z!ConverterMusicXML.writeDataStreamq  s  € õ8 ˜'¥5Ñ)Ô)ð 	QÝ ÐOÐOÐOÑPÔPÐPØˆ	ð ˆ:Ø×*Ò*Ñ,Ô,ˆFˆFåÔ% b¸Ð=Ñ=Ô=ˆFàŒ}ð 	5 ¤°Ò 7Ð 7Ø×'Ò'¨Ñ4Ô4ˆFàˆ
å�&˜*Ñ%Ô%ð 	¨Ø�GŠG�IÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ˆs   ÂB2Â2B6Â9B6r   T)ÚmakeNotationÚcompressre   úmusic21.Music21Objectrb  úbool | Nonec               ó~  — ddl m}m}	 t          j        }
t          j        }|€A|r%t          |¦  «                             d¦  «        rd}n|                     d¦  «        rd}nd}d|v rd	t          _        d	t          _        d
}|	 	                    |¦  «        }||_
        |                     ¦   «         }|}|�;|r9t          |¦  «        }t          j                             |¦  «        d         }|dz   }|                      ||¦  «        }d|v r|
t          _        |t          _        d|v sd|v r>t          t           d         ¦  «                             d¦  «        sddlm}  |||fi |¤Ž}nT|rP|                     |ddd¬¦  «         |                     d¦  «        }t*          j                             |d¬¦  «        }n|}|S )a›  
        Write to a .musicxml file.

        Set `makeNotation=False` to prevent fixing up the notation, and where possible,
        to prevent making additional deepcopies. (This option cannot be used if `obj` is not a
        :class:`~music21.stream.Score`.) `makeNotation=True` generally solves common notation
        issues, whereas `makeNotation=False` is intended for advanced users facing
        special cases where speed is a priority or making notation reverses user choices.

        Set `compress=True` to immediately compress the output to a .mxl file.  Set
        to True automatically if format='mxl' or if `fp` is given and ends with `.mxl`
        r   )ÚarchiveToolsÚm21ToXmlNr[  Tr@  Fr§   rE   r&   r\  rº   ÚmusescoreDirectPNGPathz/skip)ÚrunThroughMuseScore)ÚdeleteOriginalÚsilentÚstrictMxlCheckrq   )rE  rf  rg  r   ÚtitleÚauthorr   ÚendswithÚ
startswithÚGeneralObjectExporterra  r  rS  rT  Úsplitextrz   rR   Úmusic21.converter.museScoreri  ÚcompressXMLr^  r   Ú	pathToolsrŠ   )r#   re   rY   rt   r`   ra  rb  r!   rf  rg  ÚsavedDefaultTitleÚsavedDefaultAuthorr_  ÚgeneralExporterÚwriteDataStreamFpÚfpStrÚ
noExtFpStrÚxmlFpri  ÚoutFpÚfilenameOuts                        r$   rc   zConverterMusicXML.write¡  s	  € ð* 	<Ð;Ð;Ð;Ð;Ð;Ð;Ð;å$œNÐÝ%œ_ÐàÐØð !•c˜"‘g”g×&Ò& vÑ.Ô.ð !Ø��Ø—’ Ñ&Ô&ð !à��à �ð �JÐÐà�HŒNØ �HŒOàˆ	Ø"×8Ò8¸Ñ=Ô=ˆØ'3ˆÔ$Ø#×)Ò)Ñ+Ô+ˆ	àÐØˆ>˜jˆ>Ý˜‘G”GˆEÝœ×)Ò)¨%Ñ0Ô0°Ô3ˆJØ *¨[Ñ 8Ðà"×2Ò2Ð3DÀiÑPÔPˆà�JÐÐØ.�HŒNØ0�HŒOà�jÐ Ð  E¨ZÐ$7Ð$7Ý�LÐ)AÔBÑCÔC×NÒNÈwÑWÔWð %8àGÐGÐGÐGÐGÐGØ'Ð'¨¨zÐFÐF¸XÐFÐFˆEˆEØð 	Ø×$Ò$ UØ48Ø,0Ø49ð %ñ ;ô ;ð ;ð  ×+Ò+¨FÑ3Ô3ˆKÝÔ$×.Ò.¨{È$Ð.ÑOÔOˆEˆEàˆEàˆr&   c                ór   —  | j         ||fd|i|¤Ž}d|v rd}nd|v rd}|                      |||¬¦  «         dS )z3
        Override to do something with png
        r`   r§   rº   ra   Nrb   rd   s          r$   rg   zConverterMusicXML.showë  sf   € ð &˜4œ: c¨3ÐRÐR¸:ÐRÈÐRÐRÐØ�JÐÐØˆCˆCØ�jÐ Ð ØˆCØ�ŠÐ$¨#°3ˆÑ7Ô7Ð7Ð7Ð7r&   r   )rA  r   r“   )r|   r}   r   rF   r”   )re   rc  rb  rd  )r•   r–   r—   r˜   r   r   r   r   r-   r:   rz   rc   rg   r   r&   r$   r?  r?  8  sà   € € € € € ðð ð
 *€OØ8ÐØ9ÐØ05Ø05ð)+ð )+Ð%ð	ð 	ð 	ð 	ð 	ð &*ðð ð ð ð ðB.ð .ð .ð .ðf Øð	Hð  Ø$(ðHð Hð Hð Hð Hð HðT	8ð 	8ð 	8ð 	8ð 	8ð 	8r&   r?  c                  ót   — e Zd ZdZdZdZdZdZedd„¦   «         Z	dd
dœdd„Z
	 dd
dœdd„Z	 	 dddd
dœdd„Zd	S ) r²   zJ
    Simple class wrapper for parsing MIDI and sending MIDI data out.
    T)r«   )Úmidr«   )r�  r   r   c                óL   — d| j         v r| j         d         r| j         d         S dS )Nr2   r   )r!   r=   s    r$   r2   zConverterMidi.encoding  s-   € à˜œÐ&Ð&¨4¬=¸Ô+DÐ&à”= Ô,Ð,Øˆwr&   NrE   r1   r2   c               ó�   — ddl m} d„ | j                             ¦   «         D ¦   «         } |j        |fd|p| j        i|¤Ž| _        dS )añ  
        Get MIDI data from a binary string representation.

        Calls midi.translate.midiStringToStream.

        Keywords to control quantization:
        `quantizePost` controls whether to quantize the output. (Default: True)
        `quarterLengthDivisors` allows for overriding the default quantization units
        in defaults.quantizationQuarterLengthDivisors. (Default: (4, 3)).

        If encoding is not provided use the encoding of the Converter
        (default "utf-8")
        r   r,  c                ó"   — i | ]\  }}|d v¯	||“ŒS ©r1   r   ©Ú.0ÚkÚvs      r$   ú
<dictcomp>z+ConverterMidi.parseData.<locals>.<dictcomp>  ó2   € ð /ð /ð /™T˜Q Ø Ð-Ð-ð �qØ-Ð-Ð-r&   r2   N)Úmusic21.midir¿   r!   ÚitemsÚmidiStringToStreamr2   r	   )r#   ÚstrDatar'   r2   ÚmidiTranslater!   s         r$   r-   zConverterMidi.parseData  s|   € ð 	<Ð;Ð;Ð;Ð;Ð;ð/ð / T¤]×%8Ò%8Ñ%:Ô%:ð /ñ /ô /ˆà6�mÔ6Øð
ð 
àÐ. ¤ð
ð ð
ð 
ˆŒˆˆr&   r.   r  r'   r(   c               ó’   — ddl m} d„ | j                             ¦   «         D ¦   «         } |j        |f| j        |p| j        dœ|¤Ž dS )aà  
        Get MIDI data from a file path.

        Calls midi.translate.midiFilePathToStream.

        Keywords to control quantization:
        `quantizePost` controls whether to quantize the output. (Default: True)
        `quarterLengthDivisors` allows for overriding the default quantization units
        in defaults.quantizationQuarterLengthDivisors. (Default: (4, 3)).

        If encoding is not provided use the encoding of the Converter
        (default "utf-8")
        r   r,  c                ó"   — i | ]\  }}|d v¯	||“ŒS r…  r   r†  s      r$   rŠ  z+ConverterMidi.parseFile.<locals>.<dictcomp>3  r‹  r&   )ÚinputM21r2   N)rŒ  r¿   r!   r�  ÚmidiFilePathToStreamr	   r2   )r#   r.   r'   r2   r!   r�  s         r$   r:   zConverterMidi.parseFile  sˆ   € ð& 	<Ð;Ð;Ð;Ð;Ð;ð/ð / T¤]×%8Ò%8Ñ%:Ô%:ð /ñ /ô /ˆà*ˆÔ*Øð	
à”[ØÐ. ¤ð	
ð 	
ð ð		
ð 	
ð 	
ð 	
ð 	
r&   r   F©ÚaddStartDelayÚaddEndDelayr2   r–  r   r—  c               óú   — ddl m}	 |€|                      ¦   «         }|	                     ||||p| j        ¬¦  «        }
|
                     |d¦  «         |
                     ¦   «          |
                     ¦   «          |S )Nr   r,  r•  r€   )rŒ  r¿   ru   Úmusic21ObjectToMidiFiler2   r5   rc   r‡   )r#   re   rY   rt   r`   r–  r—  r2   r!   r�  Úmfs              r$   rc   zConverterMidi.write<  sŽ   € ð 	<Ð;Ð;Ð;Ð;Ð;Øˆ:Ø×&Ò&Ñ(Ô(ˆBà×2Ò2°3ÀmØ?JØ<DÐ<UÈÌð 3ñ Wô Wˆð 	�Š��DÑÔÐØ
�Š‰
Œ
ˆ
Ø
�Š‰
Œ
ˆ
Øˆ	r&   )r   r   r   )r2   r   )r.   r  r'   r(   r2   r   r”   )r–  r   r—  r   r2   r   )r•   r–   r—   r˜   r   r   r   r   rš   r2   r-   r:   rc   r   r&   r$   r²   r²   ø  sÝ   € € € € € ðð ð €JØ€OØ-ÐØ'Ðàðð ð ñ „Xðð
Àð 
ð 
ð 
ð 
ð 
ð 
ð2 &*ð
ð #%ð	
ð 
ð 
ð 
ð 
ð 
ð@ Øð	ð %*Ø"&Ø ðð ð ð ð ð ð ð r&   r²   c                  ó.   — e Zd ZdZdZdZd
d„Z	 d
dd	„ZdS )ÚConverterABCz?
    Simple class wrapper for parsing ABC.

    Input only
    )ÚabcNc                ó  — ddl m} |                     ¦   «         }|                     ||¬¦  «        }|                     ¦   «         r#|j                             ||¬¦  «        | _        dS |j                             || j        ¦  «         dS )a  
        Get ABC data, as token list, from a string representation.
        If more than one work is defined in the ABC data, a
        :class:`~music21.stream.Opus` object will be returned;
        otherwise, a :class:`~music21.stream.Score` is returned.
        r   ©Ú	abcFormat©r'   N)	r¾   r   ÚABCFileÚreadstrÚdefinesReferenceNumbersr¿   ÚabcToStreamOpusr	   ÚabcToStreamScore)r#   r�  r'   r   ÚafÚ
abcHandlers         r$   r-   zConverterABC.parseData]  sž   € ð 	&Ð%Ð%Ð%Ð%Ð%Ø×ÒÑ Ô ˆà—Z’Z °�ZÑ7Ô7ˆ
à×-Ò-Ñ/Ô/ð 	Jà#Ô-×=Ò=¸jØEKð >ñ Mô MˆDŒKˆKˆKð Ô×0Ò0°¸T¼[ÑIÔIÐIÐIÐIr&   r.   r  r'   r(   c                óf  — ddl m} |                     ¦   «         }|                     |¦  «         |                     |¬¦  «        }|                     ¦   «          |                     ¦   «         r#|j                             ||¬¦  «        | _	        dS |j         
                    || j	        ¦  «         dS )ar  
        Get ABC data from a file path. If more than one work is defined in the ABC
        data, a  :class:`~music21.stream.Opus` object will be returned;
        otherwise, a :class:`~music21.stream.Score` is returned.

        If `number` is provided, and this ABC file defines multiple works
        with an X: tag, just the specified work will be returned.
        r   rŸ  r¡  N)r¾   r   r¢  r5   r7   r‡   r¤  r¿   r¥  r	   r¦  )r#   r.   r'   r!   r   r§  r¨  s          r$   r:   zConverterABC.parseFilep  s¿   € ð 	&Ð%Ð%Ð%Ð%Ð%à×ÒÑ Ô ˆØ
�Š�ÑÔÐà—W’W F�WÑ+Ô+ˆ
Ø
�Š‰
Œ
ˆ
ð ×-Ò-Ñ/Ô/ð 	Jð $Ô-×=Ò=¸jØEKð >ñ Mô MˆDŒKˆKˆKð Ô×0Ò0°¸T¼[ÑIÔIÐIÐIÐIr&   r   r  r3  r   r&   r$   rœ  rœ  T  sh   € € € € € ðð ð
 €OØ&ÐðJð Jð Jð Jð* &*ðJð Jð Jð Jð Jð Jð Jr&   rœ  c                  ó:   — e Zd ZdZdZdZdZdd„Z	 ddd„Zdd„Z	dS )ÚConverterRomanTextzK
    Simple class wrapper for parsing roman text harmonic definitions.
    )Ú	romantextÚrntext)Úrntxtr­  r¬  Úrtxt)r®  Nc                ó  — ddl m} ddl m} |                     ¦   «         }|                     |¦  «        }|                     ¦   «         r|                     |¦  «        | _        d S |                     || j        ¦  «         d S ©Nr   )Ú	rtObjectsr,  )	Úmusic21.romanTextr²  r¿   ÚRTFiler£  ÚdefinesMovementsÚromanTextToStreamOpusr	   ÚromanTextToStreamScore)r#   r�  r'   r²  ÚromanTextTranslateÚrtfÚ	rtHandlers          r$   r-   zConverterRomanText.parseData™  s”   € Ø/Ð/Ð/Ð/Ð/Ð/ØEÐEÐEÐEÐEÐEØ×ÒÑ Ô ˆØ—K’K Ñ(Ô(ˆ	Ø×%Ò%Ñ'Ô'ð 	Nà,×BÒBÀ9ÑMÔMˆDŒKˆKˆKà×5Ò5°iÀÄÑMÔMÐMÐMÐMr&   r.   r  r'   r(   c                óö   — ddl m} ddl m} |                     ¦   «         }|                     |¦  «         |                     ¦   «         }|                     ¦   «          |                     || j        ¦  «         d S r±  )	r³  r²  r¿   r´  r5   r7   r‡   r·  r	   )r#   r.   r'   r!   r²  r¸  r¹  rº  s           r$   r:   zConverterRomanText.parseFile¤  sƒ   € ð 	0Ð/Ð/Ð/Ð/Ð/ØEÐEÐEÐEÐEÐEØ×ÒÑ Ô ˆØ�Š�ÑÔÐà—H’H‘J”Jˆ	Ø�	Š	‰ŒˆØ×1Ò1°)¸T¼[ÑIÔIÐIÐIÐIr&   r   c                óŠ  — ddl m} |€|                      ¦   «         }t          |d¦  «        sat	          |dd¬¦  «        5 }|                     |¦  «        j        D ]}|                     |dz   ¦  «         Œ	 ddd¦  «         n# 1 swxY w Y   n5|                     |¦  «        j        D ]}|                     |dz   ¦  «         Œ|S )	z^
        Writes 'RomanText' files (using the extension .rntxt) from a music21.stream.
        r   )Ú
writeRomanNrc   r   r   r1   ú
)r³  r½  ru   Úhasattrr5   ÚRnWriterÚcombinedListrc   )	r#   re   rY   rt   r`   r!   r½  Ú	text_fileÚentrys	            r$   rc   zConverterRomanText.write±  s$  € ð
 	1Ð0Ð0Ð0Ð0Ð0Øˆ:Ø×&Ò&Ñ(Ô(ˆBå�r˜7Ñ#Ô#ð 	'Ý�b˜#¨Ð0Ñ0Ô0ð 2°IØ'×0Ò0°Ñ5Ô5ÔBð 2ð 2�EØ—O’O E¨D¡LÑ1Ô1Ð1Ð1ð2ð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2øð
 $×,Ò,¨SÑ1Ô1Ô>ð 'ð '�Ø—’˜ ™Ñ&Ô&Ð&Ð&àˆ	s   ¿6BÂBÂ	Br   r  r”   )
r•   r–   r—   r˜   r   r   r   r-   r:   rc   r   r&   r$   r«  r«  ‘  s€   € € € € € ðð ð .€OØFÐØ)Ðð	Nð 	Nð 	Nð 	Nð &*ðJð Jð Jð Jð Jðð ð ð ð ð r&   r«  c                  ó0   — e Zd ZdZdZdZd
dd„Z	 d
dd	„ZdS )ÚConverterClercqTemperleyzh
    Wrapper for parsing harmonic definitions in Trevor de Clercq and
    David Temperley's format.
    )ÚcttxtÚharÚclercqTemperleyNr�  r/   c                ón   — ddl m} |                     |¦  «        }|                     ¦   «         | _        d S )Nr   )rÈ  )r³  rÈ  ÚCTSongrû   r	   )r#   r�  r'   rÈ  ÚctSongs        r$   r-   z"ConverterClercqTemperley.parseDataÎ  s:   € Ø5Ð5Ð5Ð5Ð5Ð5Ø ×'Ò'¨Ñ0Ô0ˆØ—m’m‘o”oˆŒˆˆr&   r.   r  c                ó0   — |                       |¦  «         d S r   )r-   )r#   r.   r'   r!   s       r$   r:   z"ConverterClercqTemperley.parseFileÓ  s   € ð 	�Š�xÑ Ô Ð Ð Ð r&   r   )r�  r/   )r.   r  r3  r   r&   r$   rÅ  rÅ  Æ  sb   € € € € € ðð ð :€OØAÐð&ð &ð &ð &ð &ð ð!ð !ð !ð !ð !ð !ð !r&   rÅ  c                  ó.   — e Zd ZdZdZdZdd„Z	 ddd
„ZdS )ÚConverterCapellaz`
    Simple class wrapper for parsing Capella .capx XML files.  See capella/fromCapellaXML.
    )Úcapella)ÚcapxNc                óÚ   — ddl m} |                     ¦   «         }|                     |¦  «         |                     |j        j        ¦  «        }|                     |¦  «        }|| _        dS )zv
        parse a data stream of uncompressed capella xml

        N.B. for web parsing, it gets more complex.
        r   ©ÚfromCapellaXMLN)	Úmusic21.capellarÓ  ÚCapellaImporterrH  ÚsystemScoreFromScoreÚmainDomÚdocumentElementÚpartScoreFromSystemScorer	   )r#   r�  r'   rÓ  ÚciÚscoreObjÚ	partScores          r$   r-   zConverterCapella.parseDataá  so   € ð 	3Ð2Ð2Ð2Ð2Ð2Ø×+Ò+Ñ-Ô-ˆØ
�Š˜Ñ Ô Ð Ø×*Ò*¨2¬:Ô+EÑFÔFˆØ×/Ò/°Ñ9Ô9ˆ	ØˆŒˆˆr&   r.   r/   r'   r(   c                ón   — ddl m} |                     ¦   «         }|                     |¦  «        | _        dS )z&
        Parse a Capella file
        r   rÒ  N)rÔ  rÓ  rÕ  ÚscoreFromFiler	   )r#   r.   r'   r!   rÓ  rÚ  s         r$   r:   zConverterCapella.parseFileî  s@   € ð 	3Ð2Ð2Ð2Ð2Ð2Ø×+Ò+Ñ-Ô-ˆØ×&Ò& xÑ0Ô0ˆŒˆˆr&   r   r“   r3  r   r&   r$   rÎ  rÎ  Ú  s]   € € € € € ðð ð #€OØ'Ðð ð  ð  ð  ð &*ð	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1r&   rÎ  c                  ó.   — e Zd ZdZdZdZdd„Z	 ddd
„ZdS )ÚConverterMuseDataz4
    Simple class wrapper for parsing MuseData.
    ©Úmusedata)Úmdrâ  ÚzipNc                óæ   — ddl m} ddlm} t	          |t
          ¦  «        r|g}n|}|                     ¦   «         }|D ]}|                     |¦  «         Œ|                     || j	        ¦  «         dS )z<
        Get musedata from a string representation.
        r   rá  r,  N)
r¾   râ  Úmusic21.musedatar¿   rƒ   r   ÚMuseDataWorkÚ	addStringÚmuseDataWorkToStreamScorer	   )r#   r�  r'   ÚmusedataModuleÚmusedataTranslateÚstrDataListÚmdwÚstrDataInners           r$   r-   zConverterMuseData.parseData  s›   € ð 	7Ð6Ð6Ð6Ð6Ð6ØCÐCÐCÐCÐCÐCå�g�sÑ#Ô#ð 	"Ø"˜)ˆKˆKà!ˆKà×)Ò)Ñ+Ô+ˆà'ð 	(ð 	(ˆLØ�MŠM˜,Ñ'Ô'Ð'Ð'à×3Ò3°C¸¼ÑEÔEÐEÐEÐEr&   r.   r/   r'   r(   c                ó”  — t          |t          j        ¦  «        st          j        |¦  «        }n|}ddlm} ddlm} ddlm} |                     ¦   «         }| 	                    |¦  «        }	|j
        dk    s|	                     ¦   «         r/|	                     d¬¦  «        D ]}
|                     |
¦  «         Œnr|                     ¦   «         r*|                     |¦  «        }|                     ¦   «         }nt#          j        |¦  «        s|g}n|}|D ]}|                     |¦  «         Œ|                     || j        ¦  «         dS )	z8
        parse fp (a pathlib.Path()) and number
        r   rK  rá  r,  z.ziprâ  )Ú
dataFormatN)rƒ   rˆ   r‰   r¾   rL  râ  ræ  r¿   rç  rM  r]  rN  rO  rè  Úis_dirÚMuseDataDirectoryÚgetPathsr   Ú
isListLikeÚaddFileré  r	   )r#   r.   r'   r!   rt   rL  rê  rë  rí  r§  ÚpartStrÚmddÚfpListÚfpInners                 r$   r:   zConverterMuseData.parseFile  sv  € õ ˜(¥G¤LÑ1Ô1ð 	Ý”˜hÑ'Ô'ˆBˆBàˆBà%Ð%Ð%Ð%Ð%Ð%Ø6Ð6Ð6Ð6Ð6Ð6ØCÐCÐCÐCÐCÐCà×)Ò)Ñ+Ô+ˆà×%Ò% bÑ)Ô)ˆð Œ9˜ÒÐ "§,¢,¡.¤.Ðð Ÿ:š:°˜:Ñ<Ô<ð 'ð '�à—’˜gÑ&Ô&Ð&Ð&ð'ð �yŠy‰{Œ{ð Ø$×6Ò6°rÑ:Ô:�ØŸš™œ��ÝÔ& rÑ*Ô*ð Ø˜��à�à!ð %ð %�Ø—’˜GÑ$Ô$Ð$Ð$ð 	×3Ò3°C¸¼ÑEÔEÐEÐEÐEr&   r   r“   r3  r   r&   r$   rà  rà  û  sh   € € € € € ðð ð $€OØ7ÐðFð Fð Fð Fð* &*ð+Fð +Fð +Fð +Fð +Fð +Fð +Fr&   rà  c                  óF   — e Zd ZdZdZdZddd„Z	 ddd„Zd„ Zdd„Z	dd„Z
dS )ÚConverterMEIz‰
    Converter for MEI. You must use an ".mei" file extension for MEI files because music21 will
    parse ".xml" files as MusicXML.
    ©ÚmeiNr,   r   r   ústream.Streamc                ó²   — ddl m} |                     d¦  «        r
|dd…         }|                     |¦  «                             ¦   «         | _        | j        S )a  
        Convert a string with an MEI document into its corresponding music21 elements.

        * dataString: The string with XML to convert.

        * number: Unused in this class. Default is ``None``.

        Returns the music21 objects corresponding to the MEI file.
        r   rü  zmei:é   N)r¾   rý  rp  ÚMeiToM21ConverterrW   r	   )r#   r,   r'   rý  s       r$   r-   zConverterMEI.parseDataN  sb   € ð 	 ÐÐÐÐÐØ× Ò  Ñ(Ô(ð 	(Ø# A B BœˆJà×+Ò+¨JÑ7Ô7×;Ò;Ñ=Ô=ˆŒàŒ{Ðr&   r.   r/   r'   r(   c                óX  — 	 t          |dd¬¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   nN# t          $ rA t          |dd¬¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   Y nw xY w|                      ||¦  «         | j        S )a8  
        Convert a file with an MEI document into its corresponding music21 elements.

        * filePath: Full pathname to the file containing MEI data as a string or Path.

        * number: Unused in this class. Default is ``None``.

        Returns the music21 objects corresponding to the MEI file.
        Úrtr   r1   Nzutf-16)r5   r7   r†   r-   r	   )r#   r.   r'   r!   r8   r9   s         r$   r:   zConverterMEI.parseFile`  s+  € ð"	&Ý�h ¨wÐ7Ñ7Ô7ð &¸1ØŸVšV™XœX�
ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &øøå!ð 	&ð 	&ð 	&Ý�h ¨xÐ8Ñ8Ô8ð &¸AØŸVšV™XœX�
ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &øøð	&øøøð 	�Š�z 6Ñ*Ô*Ð*àŒ{ÐsP   ‚A ”5©A µ9¹A ¼9½A ÁBÁA>Á2BÁ>B	ÂBÂB	ÂBÂBc                ó   — dS )z4
        MEI export is not yet implemented.
        Fr   r"   s     r$   rD   zConverterMEI.checkShowAbility|  s	   € ð ˆur&   r   c                ó    — t          d¦  «        ‚©Nz"MEI export is not yet implemented.r*   rë   s         r$   rg   zConverterMEI.show…  ó   € Ý!Ð"FÑGÔGÐGr&   c                ó    — t          d¦  «        ‚r  r*   )r#   re   rY   rt   r`   r!   s         r$   rc   zConverterMEI.write‹  r  r&   r   )r,   r   r   rþ  )r.   r/   r'   r(   r   rþ  r”   )r•   r–   r—   r˜   r   r   r-   r:   rD   rg   rc   r   r&   r$   rû  rû  C  s£   € € € € € ðð ð €OØ&Ðð
ð ð ð ð ð*  ðð ð ð ð ð8ð ð ðHð Hð Hð HðHð Hð Hð Hð Hð Hr&   rû  c                  óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚTestc                ó´   — ddl m} |                     ¦   «         }t          j        ¦   «         }|                     |¦  «         |                     d¦  «        }d S )Nr   ©ÚnoteÚtextLine)r¾   r  ÚNoter	   rþ   rÿ   rg   )r#   r  Únr  Úunused_xs        r$   ÚtestSimpleTextShowzTest.testSimpleTextShow”  sP   € Ø Ð Ð Ð Ð Ð Ø�IŠI‰KŒKˆÝŒM‰OŒOˆØ	�Š�‰ŒˆØ—6’6˜*Ñ%Ô%ˆˆˆr&   c                óÞ   — ddl m} |                     d¦  «        5 }t          ¦   «         }|                     d¦  «         |                     d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z4
        When the string starts with "mei:"
        r   ©Úmockúmusic21.mei.MeiToM21Converterzmei: <?xml><mei><note/></mei>z <?xml><mei><note/></mei>N©Úunittestr  Úpatchrû  r-   Úassert_called_once_with©r#   r  ÚmockConvÚtestConverters       r$   ÚtestImportMei1zTest.testImportMei1›  sÐ   € ð 	"Ð!Ð!Ð!Ð!Ð!Ø�ZŠZÐ7Ñ8Ô8ð 	J¸HÝ(™NœNˆMØ×#Ò#Ð$CÑDÔDÐDØ×,Ò,Ð-HÑIÔIÐIð	Jð 	Jð 	Jñ 	Jô 	Jð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jøøøð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jó   œ9A"Á"A&Á)A&c                óÞ   — ddl m} |                     d¦  «        5 }t          ¦   «         }|                     d¦  «         |                     d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z;
        When the string doesn't start with "mei:"
        r   r  r  z<?xml><mei><note/></mei>Nr  r  s       r$   ÚtestImportMei2zTest.testImportMei2¥  sÐ   € ð 	"Ð!Ð!Ð!Ð!Ð!Ø�ZŠZÐ7Ñ8Ô8ð 	I¸HÝ(™NœNˆMØ×#Ò#Ð$>Ñ?Ô?Ð?Ø×,Ò,Ð-GÑHÔHÐHð	Ið 	Ið 	Iñ 	Iô 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Iøøøð 	Ið 	Ið 	Ið 	Ið 	Ið 	Ir  c                ó"  — ddl m} |                     d¦  «        5 }t          j        ¦   «         dz  dz  dz  }t          ¦   «         }|                     |¦  «         |                      d|j        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )	z¡
        When the file uses UTF-16 encoding rather than UTF-8 (which happens if
        it was exported from
        the "sibmei" plug-in for Sibelius).
        r   r  r  rý  Útestznotes_in_utf16.meir¥   N©	r  r  r  r   ÚgetSourceFilePathrû  r:   ÚassertEqualÚ
call_count©r#   r  r  ÚtestPathr  s        r$   ÚtestImportMei3zTest.testImportMei3¯  sÞ   € ð 	"Ð!Ð!Ð!Ð!Ð!Ø�ZŠZÐ7Ñ8Ô8ð 	5¸HÝÔ/Ñ1Ô1°EÑ9¸FÑBÐEYÑYˆHÝ(™NœNˆMØ×#Ò# HÑ-Ô-Ð-Ø×Ò˜Q Ô 3Ñ4Ô4Ð4ð		5ð 	5ð 	5ñ 	5ô 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5øøøð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ó   œABÂBÂBc                ó"  — ddl m} |                     d¦  «        5 }t          j        ¦   «         dz  dz  dz  }t          ¦   «         }|                     |¦  «         |                      d|j        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )	zk
        For the sake of completeness, this is the same as testImportMei3() but with a UTF-8 file.
        r   r  r  rý  r#  znotes_in_utf8.meir¥   Nr$  r(  s        r$   ÚtestImportMei4zTest.testImportMei4¼  sÞ   € ð 	"Ð!Ð!Ð!Ð!Ð!Ø�ZŠZÐ7Ñ8Ô8ð 	5¸HÝÔ/Ñ1Ô1°EÑ9¸FÑBÐEXÑXˆHÝ(™NœNˆMØ×#Ò# HÑ-Ô-Ð-Ø×Ò˜Q Ô 3Ñ4Ô4Ð4ð		5ð 	5ð 	5ñ 	5ô 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5øøøð 	5ð 	5ð 	5ð 	5ð 	5ð 	5r+  c                óx  — ddl m} ddlm} |                     |j        ¦  «        }|                     d¦  «        }|                      t          |¦  «         	                    d¦  «        |› d�¦  «         |                     |¬¦  «         |  
                    t          ¦  «        5  t          |dd	¬
¦  «        5 }|                     d¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t          ¦   «         }|                     |d¬¦  «        }|  
                    t          ¦  «        5  t          |dd	¬
¦  «        5 }|                     d¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t          j        |¦  «         t          j        |¦  «         d S )Nr   rK  )ÚtestPrimitiver@  r[  z does not end with .mxl)rt   r�   r   r1   é   )re   rY   )r¾   rL  rE  r/  r-   ÚmultiDigitEndingrc   Ú
assertTruer   ro  ÚassertRaisesr†   r5   r7   r?  rS  Úremove)r#   rL  r/  r  ÚmxlPathr8   rÆ   ÚmxlPath2s           r$   ÚtestWriteMXLzTest.testWriteMXLÇ  sœ  € Ø%Ð%Ð%Ð%Ð%Ð%Ø2Ð2Ð2Ð2Ð2Ð2à×Ò Ô >Ñ?Ô?ˆØ—'’'˜%‘.”.ˆØ�Š�˜G™œ×-Ò-¨fÑ5Ô5¸'Ð7ZÐ7ZÐ7ZÑ[Ô[Ð[ð 	
�Š�7ˆÑÔÐà×ÒÕ1Ñ2Ô2ð 	ð 	Ý�g˜s¨WÐ5Ñ5Ô5ð ¸Ø—’�r‘
”
�
ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ
 !Ñ"Ô"ˆØ—:’: !¨�:Ñ/Ô/ˆØ×ÒÕ1Ñ2Ô2ð 	ð 	Ý�h ¨gÐ6Ñ6Ô6ð ¸!Ø—’�r‘
”
�
ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ 	Œ	�'ÑÔÐÝ
Œ	�(ÑÔÐÐÐsl   Â%C1Â8CÃC1ÃC	ÃC1Ã!C	Ã"C1Ã1C5Ã8C5Ä;FÅE0Å$FÅ0E4	Å4FÅ7E4	Å8FÆFÆFc                óÆ  — ddl m} ddl m} ddlm} t          j        |                     d¬¦  «        ¦  «        }t          j        ¦   «         }t          j        ||g¦  «        }t          j	        |¦  «        }|  
                    t          |j        ¦  «        d¦  «         |  
                    t          |j        ¦  «        d¦  «         |                     ¦   «         }|                     |¦  «        }	|  
                    t          |	j                             ¦   «                              t
          j        ¦  «        d         j        ¦  «        d¦  «         |  
                    t          |	j                             ¦   «                              t
          j        ¦  «        d         j        ¦  «        d¦  «         |                      |¦  «        5  |                     d¬	¦  «         d d d ¦  «         n# 1 swxY w Y   |                     d
¬¦  «        d         }|                     d¬	¦  «        }
|                     |
¦  «        }	|  
                    t          |	j                             ¦   «                              t
          j        ¦  «        d         j        ¦  «        d¦  «         |  
                    t          |	j                             ¦   «                              t
          j        ¦  «        d         j        ¦  «        d¦  «         |                      |¦  «        5  |                     d¬	¦  «         d d d ¦  «         n# 1 swxY w Y   ||
fD ]}t)          j        |¦  «         Œd S )Nr   rK  r  )ÚMusicXMLExportExceptiong      @)ÚquarterLengthr¥   F)ra  T)Úrecurseé   )r¾   rL  r  Úmusic21.musicxml.xmlObjectsr9  r	   ÚMeasurer  ÚPartr   r&  ÚlenÚnotesrc   r  ÚpartsÚfirstÚgetElementsByClassr3  ÚsplitAtDurationsrS  r4  )r#   rL  r  r9  Úm1Úm2Úpr  Úout1Úround_trip_backÚout2r‘   s               r$   ÚtestWriteMusicXMLMakeNotationz"Test.testWriteMusicXMLMakeNotationà  s‘  € Ø%Ð%Ð%Ð%Ð%Ð%Ø Ð Ð Ð Ð Ð ØGÐGÐGÐGÐGÐGåŒ^˜DŸIšI°C˜IÑ8Ô8Ñ9Ô9ˆÝŒ^ÑÔˆÝŒK˜˜R˜Ñ!Ô!ˆÝŒL˜‰OŒOˆà×Ò�˜RœX™œ¨Ñ*Ô*Ð*Ø×Ò�˜RœX™œ¨Ñ*Ô*Ð*à�wŠw‰yŒyˆà#Ÿ/š/¨$Ñ/Ô/ˆØ×ÒÝ�Ô%×+Ò+Ñ-Ô-×@Ò@ÅÄÑPÔPÐQRÔSÔYÑZÔZÐ\]ñ	_ô 	_ð 	_à×ÒÝ�Ô%×+Ò+Ñ-Ô-×@Ò@ÅÄÑPÔPÐQRÔSÔYÑZÔZÐ\]ñ	_ô 	_ð 	_ð ×ÒÐ6Ñ7Ô7ð 	(ð 	(à�GŠG ˆGÑ'Ô'Ð'ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð ×Ò tÐÑ,Ô,¨QÔ/ˆØ�wŠw EˆwÑ*Ô*ˆØ#Ÿ/š/¨$Ñ/Ô/ˆð 	×ÒÝ�Ô%×+Ò+Ñ-Ô-×@Ò@ÅÄÑPÔPÐQRÔSÔYÑZÔZÐ\]ñ	_ô 	_ð 	_à×ÒÝ�Ô%×+Ò+Ñ-Ô-×@Ò@ÅÄÑPÔPÐQRÔSÔYÑZÔZÐ\]ñ	_ô 	_ð 	_ð ×ÒÐ6Ñ7Ô7ð 	(ð 	(Ø�GŠG ˆGÑ'Ô'Ð'ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð ˜$�<ð 	ð 	ˆCÝŒI�c‰NŒNˆNˆNð	ð 	s$   Ç
G-Ç-G1Ç4G1ÌL;Ì;L?ÍL?c                ó6  — ddl m} |                     d¦  «        }|                     dd¬¦  «        }t	          |dd¬	¦  «        5 }|                      d
|                     ¦   «         ¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        |¦  «         d S )Nr   rK  ztinyNotation: c1 d1 e1 f1rÍ   T)Údebugr�   r   r1   z(<music21.braille.segment BrailleSegment>)	r¾   rL  r  rc   r5   ÚassertInr7   rS  r4  )r#   rL  rH  r‘   r8   s        r$   ÚtestBrailleKeywordszTest.testBrailleKeywords  sà   € Ø%Ð%Ð%Ð%Ð%Ð%à�OŠOÐ7Ñ8Ô8ˆØ�gŠg�i tˆgÑ,Ô,ˆÝ�#�s WÐ-Ñ-Ô-ð 	P°Ø�MŠMÐDÀaÇfÂfÁhÄhÑOÔOÐOð	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pøøøð 	Pð 	Pð 	Pð 	På
Œ	�#‰Œˆˆˆs   Á)A:Á:A>ÂA>c                ó2  — dd l }ddlm} ddlm} |                     d¦  «        }|                     |d¬¦  «        } |¦   «         }|                     d|¦  «         |                      | 	                    ¦   «          
                    |¦  «        ¦  «         d S )Nr   )ÚStringIOrK  z=
            Time Signature: 3/4
            m1 C: I
        Ú	romanText)Úformat)ÚtextwrapÚiorR  r¾   rL  Údedentr  rc   r2  Úgetvaluero  )r#   rU  rR  rL  r®  r  Útext_streams          r$   ÚtestWriteRomanTextzTest.testWriteRomanText  s¯   € ØˆˆˆØÐÐÐÐÐØ%Ð%Ð%Ð%Ð%Ð%à—’ð !ñ ô ˆð �OŠO˜E¨+ˆOÑ6Ô6ˆØ�h‘j”jˆØ	�Š�˜[Ñ)Ô)Ð)Ø�Š˜×,Ò,Ñ.Ô.×7Ò7¸Ñ>Ô>Ñ?Ô?Ð?Ð?Ð?r&   N)r•   r–   r—   r  r  r!  r*  r-  r7  rL  rP  rZ  r   r&   r$   r
  r
  ’  s§   € € € € € ð&ð &ð &ðJð Jð JðIð Ið Ið5ð 5ð 5ð	5ð 	5ð 	5ðð ð ð2)ð )ð )ðVð ð ð@ð @ð @ð @ð @r&   r
  c                  ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestExternalTc                óv   — ddl m} |                     d¦  «        }| j        r|                     ¦   «          d S d S )Nr   )Úcorpuszbwv66.6)r¾   r^  r  rg   )r#   r^  rI  s      r$   ÚtestXMLShowzTestExternal.testXMLShow%  sJ   € Ø"Ð"Ð"Ð"Ð"Ð"Ø�LŠL˜Ñ#Ô#ˆØŒ9ð 	Ø�FŠF‰HŒHˆHˆHˆHð	ð 	r&   c                ó"  — ddl m} |                     ¦   «         }d|j        _        t          j        ¦   «         }|                     |¦  «         | j        r9|                     d¦  «         t          | 
                    d¦  «        ¦  «         d S d S )Nr   r  Úwholezlily.png)r¾   r  r  ÚdurationÚtyper	   rþ   rÿ   rg   rÔ   rc   )r#   r  r  r  s       r$   ÚtestWriteLilypondzTestExternal.testWriteLilypond+  sŠ   € Ø Ð Ð Ð Ð Ð Ø�IŠI‰KŒKˆØ!ˆŒ
ŒÝŒM‰OŒOˆØ	�Š�‰ŒˆØŒ9ð 	'Ø�FŠF�:ÑÔÐÝ�!—'’'˜*Ñ%Ô%Ñ&Ô&Ð&Ð&Ð&ð	'ð 	'r&   c                óà   — ddl m} ddl m} |j        j        }|                     |¦  «        }| j        r9|                     d¦  «         t          |                     d¦  «        ¦  «         dS dS )zO
        tests whether show() works for music that is 10-99 pages long
        r   )ÚomrrK  zmusicxml.pngN)	r¾   rf  rL  Ú
correctorsÚK525groundTruthFilePathr  rg   rÔ   rc   )r#   rf  rL  ÚK525s       r$   ÚtestMultiPageXMlShow1z"TestExternal.testMultiPageXMlShow15  s‰   € ð 	 ÐÐÐÐÐØ%Ð%Ð%Ð%Ð%Ð%ØŒ~Ô5ˆØ�Š˜tÑ$Ô$ˆØŒ9ð 	.Ø�IŠI�nÑ%Ô%Ð%Ý�$—*’*˜^Ñ,Ô,Ñ-Ô-Ð-Ð-Ð-ð	.ð 	.r&   N)r•   r–   r—   rg   r_  rd  rj  r   r&   r$   r\  r\  "  sF   € € € € € Ø€Dðð ð ð'ð 'ð 'ð
.ð 
.ð 
.ð 
.ð 
.r&   r\  Ú__main__)1r˜   Ú
__future__r   rV  r   rS  rˆ   rV   Útypingr°   r  r¾   r   r   r   Úmusic21.exceptions21r   r	   r±   Úcollections.abcr
   ÚEnvironmentrR   r   rœ   r¹   rË   rÝ   ræ   rî   rô   r  r
  r  r(  r5  r?  r²   rœ  r«  rÅ  rÎ  rà  rû  ÚTestCaser
  r\  r•   ÚmainTestr   r&   r$   ú<module>rs     s  ððð ð #Ð "Ð "Ð "Ð "Ð "ð Ð Ð Ð Ð Ð Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø Ð Ð Ð Ð Ð ð „?ð )Ø(Ð(Ð(Ð(Ð(Ð(à&ˆ{Ô&Ð'@ÑAÔA€ð
jð jð jð jð jñ jô jð jðZ	5ð 5ð 5ð 5ð 5�|ñ 5ô 5ð 5ðp5Sð 5Sð 5Sð 5Sð 5S˜ñ 5Sô 5Sð 5Sðp!ð !ð !ð !ð !�|ñ !ô !ð !ðHð ð ð ð �|ñ ô ð ð&)ð )ð )ð )ð )�Lñ )ô )ð )ð&#ð #ð #ð #ð #˜ñ #ô #ð #ð*50ð 50ð 50ð 50ð 50˜ñ 50ô 50ð 50ðp(ð (ð (ð (ð (�\ñ (ô (ð (ðCð Cð Cð Cð C�|ñ Cô Cð CðP-Tð -Tð -Tð -Tð -T˜Lñ -Tô -Tð -Tð`:Uð :Uð :Uð :Uð :U˜,ñ :Uô :Uð :UðzJð Jð Jð Jð J ñ Jô Jð Jð6|8ð |8ð |8ð |8ð |8˜ñ |8ô |8ð |8ð@Xð Xð Xð Xð X�Lñ Xô Xð Xðx:Jð :Jð :Jð :Jð :J�<ñ :Jô :Jð :Jðz2ð 2ð 2ð 2ð 2˜ñ 2ô 2ð 2ðj!ð !ð !ð !ð !˜|ñ !ô !ð !ð(1ð 1ð 1ð 1ð 1�|ñ 1ô 1ð 1ðBEFð EFð EFð EFð EF˜ñ EFô EFð EFðPIHð IHð IHð IHð IH�<ñ IHô IHð IHð^N@ð N@ð N@ð N@ð N@ˆ8Ôñ N@ô N@ð N@ð`.ð .ð .ð .ð .�8Ô$ñ .ô .ð .ð\ ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr&   