§
    ƒØj´‰  ã                  ó¢  — 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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 ddlmZ ddlmZ ddlmZ  G d„ dej        ¦  «        Z G d„ d¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Zedk    rddlZ ej         e¦  «         dS dS )a  
A beta version of a complete .capx to music21 converter.

Currently only handles one <voice> per <staff> and does not deal with
Slurs, Dynamics, Ornamentation, etc.

Does not handle pickup notes, which are defined simply with an early barline
(same as incomplete bars at the end).
é    )Úannotations)ÚStringION)Úbar)Úchord)Úclef)Úcommon)Úduration)Úexceptions21)Úlayout)Úkey)Úmeter)Únote)Úpitch)Ústream)Útiec                  ó   — e Zd ZdS )ÚCapellaImportExceptionN)Ú__name__Ú
__module__Ú__qualname__© ó    ú“/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/capella/fromCapellaXML.pyr   r   N   s   € € € € € Ø€Dr   r   c                  ó  — e Zd ZdZd„ Zd'd„Zd„ Zd(d„Zd(d„Zd)d„Z	d(d„Z
d(d„Zd(d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zej        ej        ej        ej        ej        dœZd„ Zd„ Zd„ Zd„ Zd„ Z ddd d!d"d#d$œZ!d%„ Z"d&„ Z#dS )*ÚCapellaImportera.  
    Object for importing .capx, CapellaXML files into music21 (from which they can be
    converted to musicxml, MIDI, lilypond, etc.)

    Note that Capella stores files closer to their printed versions -- that is to say,
    Systems enclose all the parts for that system and have new clefs etc.
    c                ó0   — d | _         d | _        d | _        d S ©N)ÚxmlTextÚzipFilenameÚmainDom)Úselfs    r   Ú__init__zCapellaImporter.__init__[   s   € ØˆŒØˆÔØˆŒˆˆr   Fc                óÂ   — |                       |¦  «         |                      ¦   «          |                      | j        ¦  «        }|du r|S |                      |¦  «        }|S )zë
        main program: opens a file given by filename and returns a complete
        music21 Score from it.

        If systemScore is True then it skips the step of making Parts from Systems
        and Measures within Parts.
        T)ÚreadCapellaXMLFileÚparseXMLTextÚsystemScoreFromScorer    ÚpartScoreFromSystemScore)r!   ÚfilenameÚsystemScoreÚscoreObjÚ	partScores        r   ÚscoreFromFilezCapellaImporter.scoreFromFile`   sh   € ð 	×Ò Ñ)Ô)Ð)Ø×ÒÑÔÐØ×,Ò,¨T¬\Ñ:Ô:ˆØ˜$ÐÐØˆOà×5Ò5°hÑ?Ô?ˆIØÐr   c                óÚ   — t          |¦  «        | _        t          j        t          |¦  «        d¦  «        5 }|                     d¦  «        }ddd¦  «         n# 1 swxY w Y   || _        |S )zÏ
        Reads in a .capx file at `filename`, stores it as self.zipFilename, unzips it,
        extracts the score.xml embedded file, sets self.xmlText to the contents.

        Returns self.xmlText
        Úrz	score.xmlN)Ústrr   ÚzipfileÚZipFileÚreadr   )r!   r(   ÚzipFileHandler   s       r   r$   z"CapellaImporter.readCapellaXMLFileq   s›   € õ ˜x™=œ=ˆÔÝŒ_�S ™]œ]¨CÑ0Ô0ð 	6°MØ#×(Ò(¨Ñ5Ô5ˆGð	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6àˆŒØˆs   ·AÁAÁ ANc                ó^  — |€| j         }t          |t          ¦  «        s|                     d¦  «        }t          j        j                             t          |¦  «        ¦  «        }|D ]4\  }}d|j	        v r&|j	         
                    dd¦  «        d         |_	        Œ5|j        | _        | j        S )z«
        Takes the string (or unicode string) in xmlText and parses it with `xml.etree`.
        Sets `self.mainDom` to the dom object and returns the dom object.
        Nzutf-8Ú}é   )r   Ú
isinstancer/   ÚdecodeÚxmlÚetreeÚElementTreeÚ	iterparser   ÚtagÚsplitÚrootr    )r!   r   ÚitÚunusedÚels        r   r%   zCapellaImporter.parseXMLText~   sŸ   € ð
 ˆ?Ø”lˆGÝ˜'¥3Ñ'Ô'ð 	.Ø—n’n WÑ-Ô-ˆGÝŒYÔ"×,Ò,­X°gÑ->Ô->Ñ?Ô?ˆØð 	1ð 	1‰JˆF�BØ�b”fˆ}ˆ}ØœŸš c¨1Ñ-Ô-¨aÔ0�”øØ”wˆŒØŒ|Ðr   c                óJ   — t           j        j                             |¦  «        S )aœ  
        Utility method, especially for the documentation examples/tests, which uses
        `xml.etree.ElementTree` to parse the string and returns its root object.

        Not used by the main parser

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> funnyTag = ci.domElementFromText(
        ...    '<funny yes="definitely"><greg/>hi<greg><ha>ha</ha>'
        ...    '<greg type="embedded"/></greg></funny>')
        >>> funnyTag
        <Element 'funny' at 0x...>

        iter searches recursively

        >>> len(list(funnyTag.iter('greg')))
        3

        findall does not:

        >>> len(funnyTag.findall('greg'))
        2
        )r9   r:   r;   Ú
fromstring)r!   r   s     r   ÚdomElementFromTextz"CapellaImporter.domElementFromTextŽ   s   € õ0 ŒyÔ$×/Ò/°Ñ8Ô8Ð8r   r)   ústream.ScoreÚreturnc           	     ót  — |                      t          j        ¦  «        }i }|D ]Ý}|                     |¦  «        }|                      t          j        ¦  «        }t          |¦  «        D ]—\  }}|j        |vr-t	          j        ¦   «         }	|j        |	_        |	|dœ||j        <   n||j                 d         }	|D ]2}
|	                     t          j
        |
j        |z   ¦  «        |
¦  «         Œ3|	                     ¦   «          Œ˜ŒÞt	          j        ¦   «         }d„ t          t          |¦  «        ¦  «        D ¦   «         }|D ]}||         }|d         ||d         <   Œ|D ]È}|€t!          d¦  «         Œ|                      t"          j        ¦  «        }|                      t&          j        ¦  «        }d}d}|D ] }||k    r|                     |¦  «         Œ|}Œ!|D ] }||k    r|                     |¦  «         Œ|}Œ!|                     d¬¦  «         |                     d	|¦  «         ŒÉ|                     ¦   «          |S )
z©
        Take a :class:`~music21.stream.Score` object which is organized
        by Systems and return a new `Score` object which is organized by
        Parts.
        )ÚpartÚnumberrI   c                ó   — g | ]}d ‘ŒS r   r   )Ú.0Úis     r   ú
<listcomp>z<CapellaImporter.partScoreFromSystemScore.<locals>.<listcomp>Ã   s   € Ð(PÐ(PÐ(P°!¨Ð(PÐ(PÐ(Pr   rJ   Nz#part entries do not match partDict!T)ÚinPlacer   )ÚgetElementsByClassr   ÚSystemÚelementOffsetr   ÚPartÚ	enumerateÚidÚ
coreInsertr   ÚopFracÚoffsetÚcoreElementsChangedÚScoreÚrangeÚlenÚprintr   ÚClefr   ÚKeySignatureÚremoveÚmakeMeasures)r!   r)   ÚsystemStreamÚpartDictByIdÚ
thisSystemÚsystemOffsetÚ
partStreamÚjÚthisPartÚnewPartrB   ÚnewScoreÚpartsÚpartIdÚpartDictÚpÚclefsÚkeySignaturesÚlastClefÚlastKeySignatureÚcÚkss                         r   r'   z(CapellaImporter.partScoreFromSystemScore¨   sx  € ð #×5Ò5µf´mÑDÔDˆØ8:ˆØ&ð 	.ð 	.ˆJð '×4Ò4°ZÑ@Ô@ˆLØ#×6Ò6µv´{ÑCÔCˆJÝ(¨Ñ4Ô4ð 	.ð 	.‘��8Ø”; lÐ2Ð2Ý$œk™mœm�GØ!)¤�G”JØ9@ÈAÐ0NÐ0N�L ¤Ñ-Ð-à*¨8¬;Ô7¸Ô?�GØ"ð Tð T�BØ×&Ò&¥v¤}°R´YÀÑ5MÑ'NÔ'NÐPRÑSÔSÐSÐSØ×+Ò+Ñ-Ô-Ð-Ð-ð	.õ ”<‘>”>ˆà(PÐ(Pµu½SÀÑ=NÔ=NÑ7OÔ7OÐ(PÑ(PÔ(PˆØ"ð 	9ð 	9ˆFØ# FÔ+ˆHØ(0°Ô(8ˆE�(˜8Ô$Ñ%Ð%Øð 	&ð 	&ˆAàˆyÝÐ;Ñ<Ô<Ð<ØØ×(Ò(­¬Ñ3Ô3ˆEØ×0Ò0µÔ1AÑBÔBˆMØˆHØ#ÐØð !ð !�Ø˜’=�=Ø—H’H˜Q‘K”K�K�Kà �H�HØ#ð *ð *�ØÐ)Ò)Ð)Ø—H’H˜R‘L”L�L�Là')Ð$Ð$Ø�NŠN 4ˆNÑ(Ô(Ð(ð ×Ò  1Ñ%Ô%Ð%Ð%Ø×$Ò$Ñ&Ô&Ð&Øˆr   c                óÖ  — |€t          j        ¦   «         }|                     d¦  «        }|st          d¦  «        ‚t	          |¦  «        dk    rt          d¦  «        ‚|d         }|                     d¦  «        }|st          d¦  «        ‚t          |¦  «        D ]9\  }}|                      |¦  «        }|dz   |_        |                     |¦  «         Œ:| 	                    ¦   «          |S )	aX  
        returns an :class:`~music21.stream.Score` object from a <score> tag.

        The Score object is not a standard music21 Score object which contains
        parts, then measures, then voices, but instead contains systems which
        optionally contain voices, which contain parts.  No measures have yet
        been created.
        NÚsystemsz1Cannot find a <systems> tag in the <score> objectr6   zMFound more than one <systems> tag in the <score> object, what does this mean?r   ÚsystemzHCannot find any <system> tags in the <systems> tag in the <score> object)
r   rZ   Úfindallr   r\   rT   ÚsystemFromSystemÚsystemNumberÚ
coreAppendrY   )	r!   ÚscoreElementr*   ÚsystemsListÚsystemsElementÚ
systemListrz   rd   Ú	systemObjs	            r   r&   z$CapellaImporter.systemScoreFromScoreê   s  € ð ÐÝ”|‘~”~ˆHà"×*Ò*¨9Ñ5Ô5ˆØð 	EÝ(ØCñEô Eð Eåˆ{ÑÔ˜aÒÐÝ(Ø_ñaô að aà$ Qœˆà#×+Ò+¨HÑ5Ô5ˆ
Øð 	\Ý(ØZñ\ô \ð \õ )2°*Ñ(=Ô(=ð 	+ð 	+Ñ$ˆL˜*Ø×-Ò-¨jÑ9Ô9ˆIØ%1°AÑ%5ˆIÔ"Ø×Ò 	Ñ*Ô*Ð*Ð*à×$Ò$Ñ&Ô&Ð&Øˆr   c                ód  — |€t          j        ¦   «         }|                     d¦  «        }|st          d¦  «        ‚t	          |¦  «        dk    rt          d¦  «        ‚|d         }|                     d¦  «        }|st          d¦  «        ‚|D �] }d	}d
|j        v r|j        d
         }t          j        ¦   «         }||_        |                     d¦  «        }	|	st          d¦  «        ‚|	d         }
|
                     d¦  «        }|st          d¦  «        ‚t	          |¦  «        dk    rn|d         }|                     d¦  «        }|st          d¦  «        ‚t	          |¦  «        dk    rt          d¦  «        ‚|d         }|  	                    ||¦  «         | 
                    d|¦  «         �Œ"|S )a  
        returns a :class:`~music21.stream.System` object from a <system> tag.
        The System object will contain :class:`~music21.stream.Part` objects
        which will have the notes, etc. contained in it.

        TODO: Handle multiple <voices>
        NÚstavesz.No <staves> tag found in this <system> elementr6   z9More than one <staves> tag found in this <system> elementr   ÚstaffzFNo <staff> tag found in the <staves> element for this <system> elementÚUnknownPartr   Úvoicesz[No <voices> tag found in the <staff> tag for the <staves> element for this <system> elementÚvoicezoNo <voice> tag found in the <voices> tag for the <staff> tag for the <staves> element for this <system> elementÚnoteObjectszŽNo <noteObjects> tag found in the <voice> tag found in the <voices> tag for the <staff> tag for the <staves> element for this <system> elementz™More than one <noteObjects> tag found in the <voice> tag found in the <voices> tag for the <staff> tag for the <staves> element for this <system> element)r   rQ   rx   r   r\   Úattribr   rS   rU   ÚstreamFromNoteObjectsÚinsert)r!   ÚsystemElementr€   Ú
stavesListÚstavesElementÚ	staffListÚthisStaffElementrl   ÚpartObjÚ
voicesListÚvoicesElementÚ	voiceListÚthisVoiceElementÚnoteObjectsListÚthisNoteObjects                  r   ry   z CapellaImporter.systemFromSystem  s  € ð ÐÝœ™œˆIà"×*Ò*¨8Ñ4Ô4ˆ
Øð 	[Ý(Ð)YÑZÔZÐZÝˆz‰?Œ?˜QÒÐÝ(ØKñMô Mð Mà" 1œˆØ!×)Ò)¨'Ñ2Ô2ˆ	Øð 	ZÝ(ØXñZô Zð Zà )ð "	)ñ "	)Ðà"ˆFØÐ+Ô2Ð2Ð2Ø)Ô0°Ô:�Ý”k‘m”mˆGØˆGŒJà)×1Ò1°(Ñ;Ô;ˆJØð 3Ý,ð2ñ3ô 3ð 3ð ' qœMˆMØ%×-Ò-¨gÑ6Ô6ˆIØð DÝ,ðCñDô Dð Dõ �9‰~Œ~ Ò"Ð"Ø#,¨Q¤<Ð Ø"2×":Ò":¸=Ñ"IÔ"I�Ø&ð 3Ý0ð2ñ3ô 3ð 3õ �Ñ'Ô'¨!Ò+Ð+Ý0ð6ñ7ô 7ð 7ð "1°Ô!3�Ø×*Ò*¨>¸7ÑCÔCÐCØ×Ò˜Q Ñ(Ô(Ð(Ñ(ØÐr   c                ó¨  — |€t          j        ¦   «         }n|}| j        | j        | j        | j        | j        | j        dœ}|D ]{}d}|j        }||vrt          d|› �¦  «         Œ" ||         |¦  «        }t          |t          ¦  «        r|D ]}|                     |¦  «         ŒŒc|€Œf|                     |¦  «         Œ||                     ¦   «          |S )a¢  
        Converts a <noteObjects> tag into a :class:`~music21.stream.Stream` object
        which is returned.
        A Stream can be given as an optional argument, in which case the objects of this
        Stream are appended to this object.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> noteObjectsString = r"""
        ...           <noteObjects>
        ...                <clefSign clef="G2-"/>
        ...                <keySign fifths="-1"/>
        ...                <chord>
        ...                    <duration base="1/2"/>
        ...                    <lyric>
        ...                        <verse i="0">das,</verse>
        ...                        <verse i="1">scherz,</verse>
        ...                    </lyric>
        ...                    <heads>
        ...                        <head pitch="G4"/>
        ...                    </heads>
        ...                </chord>
        ...                <chord>
        ...                    <duration base="1/2"/>
        ...                    <lyric>
        ...                        <verse i="0">so</verse>
        ...                        <verse i="1">der</verse>
        ...                    </lyric>
        ...                    <heads>
        ...                        <head pitch="A4"/>
        ...                    </heads>
        ...                </chord>
        ...                <barline type="end"/>
        ...            </noteObjects>
        ...            """
        >>> noteObjectsElement = ci.domElementFromText(noteObjectsString)
        >>> streamObj = ci.streamFromNoteObjects(noteObjectsElement)
        >>> streamObj.show('text')
        {0.0} <music21.clef.Treble8vbClef>
        {0.0} <music21.key.KeySignature of 1 flat>
        {0.0} <music21.note.Note G>
        {2.0} <music21.note.Note A>
        {4.0} <music21.bar.Barline type=final>

        >>> streamObj.highestTime
        4.0
        N)ÚclefSignÚkeySignÚtimeSignÚrestr   ÚbarlinezUnknown tag type: )r   ÚStreamÚclefFromClefSignÚkeySignatureFromKeySignÚtimeSignatureFromTimeSignÚrestFromRestÚchordOrNoteFromChordÚbarlineListFromBarliner=   r]   r7   Úlistr{   rY   )	r!   ÚnoteObjectsElementÚ	streamObjÚsÚmappingÚdrB   ÚdTagÚelSubs	            r   r‰   z%CapellaImporter.streamFromNoteObjectsG  s  € ð` ÐÝ”‘”ˆAˆAàˆAà#Ô4Ø"Ô:Ø#Ô=ØÔ,Ø Ô5Ø"Ô9ðð ˆð $ð 	%ð 	%ˆAØˆBØ”5ˆDØ˜7Ð"Ð"ÝÐ1¨4Ð1Ð1Ñ2Ô2Ð2Ð2à"�W˜T”] 1Ñ%Ô%�Ý˜b¥$Ñ'Ô'ð %Ø!#ð ,ð ,˜ØŸš UÑ+Ô+Ð+Ð+ð,à�ZØà—L’L Ñ$Ô$Ð$Ð$à	×ÒÑÔÐØˆr   c                ó–   — t          j        ¦   «         }|                     d¦  «        }|                      |d         ¦  «        |_        |S )aj  
        Returns a :class:`~music21.rest.Rest` object from a <rest> tag.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> restElement = ci.domElementFromText('<rest><duration base="1/2"/></rest>')
        >>> r = ci.restFromRest(restElement)
        >>> r
        <music21.note.Rest half>
        >>> r.duration.type
        'half'
        r	   r   )r   ÚRestrx   ÚdurationFromDurationr	   )r!   ÚrestElementr.   ÚdurationLists       r   r¡   zCapellaImporter.restFromRest–  s@   € õ ŒI‰KŒKˆØ"×*Ò*¨:Ñ6Ô6ˆØ×.Ò.¨|¸A¬Ñ?Ô?ˆŒ
Øˆr   c                ó2  — |                      d¦  «        }|                      d¦  «        }t          |¦  «        dk    st          |¦  «        dk    rt          d¦  «        ‚|                      |d         ¦  «        }d}|st          d¦  «        ‚t          |¦  «        dk    r	|d         }nt	          j        |¦  «        }|                      |d         ¦  «        |_        |                      d¦  «        }|r"|                      |d         ¦  «        }||_	        |S )aì  
        returns a :class:`~music21.note.Note` or :class:`~music21.chord.Chord`
        from a chordElement -- a `Note`
        is returned if the <chord> has one <head> element, a `Chord` is
        returned if there are multiple <head> elements.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> chordElement = ci.domElementFromText(
        ...     '<chord><duration base="1/1"/><heads><head pitch="G4"/></heads></chord>')
        >>> n = ci.chordOrNoteFromChord(chordElement)
        >>> n
        <music21.note.Note G>
        >>> n.duration
        <music21.duration.Duration 4.0>

        This one is an actual chord

        >>> chordElement = ci.domElementFromText(
        ...        '<chord><duration base="1/8"/>'
        ...        '<heads><head pitch="G4"/><head pitch="A5"/></heads></chord>')
        >>> c = ci.chordOrNoteFromChord(chordElement)
        >>> c
        <music21.chord.Chord G3 A4>
        >>> c.duration
        <music21.duration.Duration 0.5>
        r	   Úheadsr6   zMalformed chord!r   NÚlyric)
rx   r\   r   ÚnotesFromHeadsr   ÚChordr®   r	   ÚlyricListFromLyricÚlyrics)r!   ÚchordElementr°   Ú	headsListÚ	notesListÚnoteOrChordÚ
lyricsLists          r   r¢   z$CapellaImporter.chordOrNoteFromChord¨  s  € ð: $×+Ò+¨JÑ7Ô7ˆØ ×(Ò(¨Ñ1Ô1ˆ	åˆ|ÑÔ Ò!Ð!¥S¨¡^¤^°qÒ%8Ð%8Ý(Ð);Ñ<Ô<Ð<à×'Ò'¨	°!¬Ñ5Ô5ˆ	àˆØð 	=Ý(Ð);Ñ<Ô<Ð<åˆy‰>Œ>˜QÒÐØ# Aœ,ˆKˆKåœ+ iÑ0Ô0ˆKà#×8Ò8¸Àa¼ÑIÔIˆÔà!×)Ò)¨'Ñ2Ô2ˆ
Øð 	,Ø×0Ò0°¸A´Ñ?Ô?ˆJØ!+ˆKÔàÐr   c                óŽ   — g }|                      d¦  «        }|D ]*}|                     |                      |¦  «        ¦  «         Œ+|S )a’  
        returns a list of :class:`~music21.note.Note` elements for each <head> in <heads>

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> headsElement = ci.domElementFromText(
        ...    '<heads><head pitch="B7"><alter step="-1"/></head><head pitch="C2"/></heads>')
        >>> ci.notesFromHeads(headsElement)
        [<music21.note.Note B->, <music21.note.Note C>]
        Úhead)rx   ÚappendÚnoteFromHead)r!   ÚheadsElementÚnotesÚheadDomListÚheadElements        r   r´   zCapellaImporter.notesFromHeadsß  sS   € ð ˆØ"×*Ò*¨6Ñ2Ô2ˆØ&ð 	9ð 	9ˆKØ�LŠL˜×*Ò*¨;Ñ7Ô7Ñ8Ô8Ð8Ð8Øˆr   c                ó\  — d|j         vrt          d¦  «        ‚|j         d         }t          j        ¦   «         }||_        |j        dz
  |_        |                     d¦  «        }t          |¦  «        dk    rt          d¦  «        ‚t          |¦  «        dk    r'|                      |d         ¦  «        }||j	        _
        |                     d¦  «        }t          |¦  «        dk    rt          d¦  «        ‚t          |¦  «        dk    r"|                      |d         ¦  «        }||_        |S )	a™  
        return a :class:`~music21.note.Note` object from a <head> element.  This will become
        part of Chord._notes if there are multiple, but in any case, it needs to be a Note
        not a Pitch for now, because it could have Tie information

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> headElement = ci.domElementFromText(
        ...      '<head pitch="B7"><alter step="-1"/><tie end="true"/></head>')
        >>> n = ci.noteFromHead(headElement)
        >>> n
        <music21.note.Note B->
        >>> n.octave  # capella octaves are one higher than written
        6
        >>> n.tie
        <music21.tie.Tie stop>
        r   z.Cannot deal with <head> element without pitch!r6   Úalterz+Cannot deal with multiple <alter> elements!r   r   z)Cannot deal with multiple <tie> elements!)rˆ   r   r   ÚNoteÚnameWithOctaveÚoctaverx   r\   ÚaccidentalFromAlterr   Ú
accidentalÚ
tieFromTier   )r!   rÄ   ÚnoteNameWithOctaveÚnÚaltersÚaccÚtiesÚthisTies           r   rÀ   zCapellaImporter.noteFromHeadð  s  € ð$ ˜+Ô,Ð,Ð,Ý(Ð)YÑZÔZÐZà(Ô/°Ô8ÐÝŒI‰KŒKˆØ-ˆÔØ”8˜a‘<ˆŒà×$Ò$ WÑ-Ô-ˆÝˆv‰;Œ;˜Š?ˆ?Ý(Ð)VÑWÔWÐWåˆv‰;Œ;˜!ÒÐØ×*Ò*¨6°!¬9Ñ5Ô5ˆCØ!$ˆAŒGÔà×"Ò" 5Ñ)Ô)ˆÝˆt‰9Œ9�qŠ=ˆ=Ý(Ð)TÑUÔUÐUåˆt‰9Œ9˜Š>ˆ>Ø—o’o d¨1¤gÑ.Ô.ˆGØˆAŒEàˆr   c                óÚ   — d|j         v rt          |j         d         ¦  «        }nt          d¦  «         d}t          j        |¦  «        }d|j         v r|j         d         dk    rd|_        |S )ao  
        return a :class:`~music21.pitch.Accidental` object from an <alter> tag.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> alter = ci.domElementFromText('<alter step="-1"/>')
        >>> ci.accidentalFromAlter(alter)
        <music21.pitch.Accidental flat>

        The only known display type is "suppress"

        >>> alter = ci.domElementFromText('<alter step="2" display="suppress"/>')
        >>> accidentalObject = ci.accidentalFromAlter(alter)
        >>> accidentalObject
        <music21.pitch.Accidental double-sharp>
        >>> accidentalObject.displayType
        'never'
        ÚstepzNo alteration...r   ÚdisplayÚsuppressÚnever)rˆ   Úintr]   r   Ú
AccidentalÚdisplayType)r!   ÚalterElementÚ
alterationrÐ   s       r   rÊ   z#CapellaImporter.accidentalFromAlter  sz   € ð$ �\Ô(Ð(Ð(Ý˜\Ô0°Ô8Ñ9Ô9ˆJˆJåÐ$Ñ%Ô%Ð%ØˆJÝÔ˜zÑ*Ô*ˆà˜Ô+Ð+Ð+°Ô0CÀIÔ0NÐR\Ò0\Ð0\Ø%ˆCŒOØˆ
r   c                óà   — d}d}d|j         v r|j         d         dk    rd}d|j         v r|j         d         dk    rd}d}|du r|du rd}n|du rd}n	|du rd	}ndS t          j        |¦  «        }|S )
a×  
        returns a :class:`~music21.tie.Tie` element from a <tie> tag

        if begin == 'true' then Tie.type = start

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> tieEl = ci.domElementFromText('<tie begin="true"/>')
        >>> ci.tieFromTie(tieEl)
        <music21.tie.Tie start>

        if end == 'true' then Tie.type = stop

        >>> tieEl = ci.domElementFromText('<tie end="true"/>')
        >>> ci.tieFromTie(tieEl)
        <music21.tie.Tie stop>

        if begin == 'true' and end == 'true' then Tie.type = continue (is this right???)

        >>> tieEl = ci.domElementFromText('<tie begin="true" end="true"/>')
        >>> ci.tieFromTie(tieEl)
        <music21.tie.Tie continue>
        FÚbeginÚtrueTÚendNÚcontinueÚstartÚstop)rˆ   r   ÚTie)r!   Ú
tieElementrÞ   rà   ÚtieTypeÚtieObjs         r   rÌ   zCapellaImporter.tieFromTie9  s®   € ð. ˆØˆØ�jÔ'Ð'Ð'¨JÔ,=¸gÔ,FÈ&Ò,PÐ,PØˆEØ�JÔ%Ð%Ð%¨*Ô*;¸EÔ*BÀfÒ*LÐ*LØˆCàˆØ�Dˆ=ˆ=˜S D˜[˜[Ø ˆGˆGØ�dˆ]ˆ]ØˆGˆGØ�Dˆ[ˆ[ØˆGˆGà�4å”˜Ñ!Ô!ˆØˆr   c                ó–   — g }|                      d¦  «        }|D ].}|                      |¦  «        }|�|                     |¦  «         Œ/|S )aH  
        returns a list of :class:`~music21.note.Lyric` objects from a <lyric> tag

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> lyricEl = ci.domElementFromText(
        ...      '<lyric><verse i="0" hyphen="true">di</verse>'
        ...      '<verse i="1">man,</verse><verse i="2">frau,</verse></lyric>')
        >>> ci.lyricListFromLyric(lyricEl)
        [<music21.note.Lyric number=1 syllabic=begin text='di'>,
         <music21.note.Lyric number=2 syllabic=single text='man,'>,
         <music21.note.Lyric number=3 syllabic=single text='frau,'>]
        Úverse)rx   ÚlyricFromVerser¿   )r!   ÚlyricElementÚ	lyricListÚversesr©   Ú	thisLyrics         r   r¶   z"CapellaImporter.lyricListFromLyricd  s_   € ð ˆ	Ø×%Ò% gÑ.Ô.ˆØð 	,ð 	,ˆAØ×+Ò+¨AÑ.Ô.ˆIØÐ$Ø× Ò  Ñ+Ô+Ð+øØÐr   c                óä   — d}d}d|j         v rt          |j         d         ¦  «        dz   }d|j         v r|j         d         dk    rd}|j        }|�|dk    rdS t          j        |||d	¬
¦  «        }|S )a§  
        returns a :class:`~music21.note.Lyric` object from a <verse> tag

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> verse = ci.domElementFromText('<verse i="0" hyphen="true">di&quot;</verse>')
        >>> ci.lyricFromVerse(verse)
        <music21.note.Lyric number=1 syllabic=begin text='di"'>

        Does not yet support 'align' attribute

        if the text is empty, returns None
        r6   ÚsinglerM   Úhyphenrß   rÞ   NÚ T)ÚtextrJ   ÚsyllabicÚapplyRaw)rˆ   rØ   ró   r   ÚLyric)r!   ré   ÚverseNumberrô   ró   r³   s         r   rê   zCapellaImporter.lyricFromVersey  sŽ   € ð ˆØˆØ�%”,ÐÐÝ˜eœl¨3Ô/Ñ0Ô0°1Ñ4ˆKØ�u”|Ð#Ð#¨¬°XÔ(>À&Ò(HÐ(HØˆHØŒzˆØˆ<˜4 2š:˜:Ø�4å”J D°ÀxÐZ^Ð_Ñ_Ô_ˆEØˆLr   )ÚtrebleÚbassÚaltoÚtenorzG2-c                óx  — d|j         v r°|j         d         }|| j        v r | j        |         ¦   «         S |d         dk    rt          j        ¦   «         S t	          |¦  «        dk    rS|dd…         }d}t	          |¦  «        dk    r|d         dk    rd}n|d         dk    rd}t          j        ||¦  «        }|S d	S )
aø  
        returns a :class:`~music21.clef.Clef` object or subclass from a <clefSign> tag.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> clefSign = ci.domElementFromText('<clefSign clef="treble"/>')
        >>> ci.clefFromClefSign(clefSign)
        <music21.clef.TrebleClef>

        >>> clefSign = ci.domElementFromText('<clefSign clef="G2-"/>')
        >>> ci.clefFromClefSign(clefSign)
        <music21.clef.Treble8vbClef>

        >>> clefSign = ci.domElementFromText('<clefSign clef="F1+"/>')
        >>> clefObject = ci.clefFromClefSign(clefSign)
        >>> clefObject
        <music21.clef.FClef>
        >>> clefObject.sign
        'F'
        >>> clefObject.line
        1
        >>> clefObject.octaveChange
        1
        r   r   rn   r6   é   ú+ú-éÿÿÿÿN)rˆ   ÚclefMappingr   ÚPercussionClefr\   ÚclefFromString)r!   r˜   Ú	clefValueÚclefSignAndLineÚclefOctaveChangeÚclefObjs         r   rž   z CapellaImporter.clefFromClefSignŸ  sÞ   € ð2 �X”_Ð$Ð$Ø œ¨Ô/ˆIØ˜DÔ,Ð,Ð,Ø2�tÔ'¨	Ô2Ñ4Ô4Ð4Ø˜1” Ò$Ð$ÝÔ*Ñ,Ô,Ð,Ý�Y‘” !Ò#Ð#Ø"+¨A¨a¨C¤.�Ø#$Ð Ý�y‘>”> AÒ%Ð%Ø  ”| sÒ*Ð*Ø+,Ð(Ð(Ø" 1œ¨Ò,Ð,Ø+-Ð(ÝÔ-¨oÐ?OÑPÔP�Ø�àˆtr   c                ót   — d|j         v r.t          |j         d         ¦  «        }t          j        |¦  «        S dS )a7  
        Returns a :class:`~music21.key.KeySignature` object from a keySign tag.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> keySign = ci.domElementFromText('<keySign fifths="-1"/>')
        >>> ci.keySignatureFromKeySign(keySign)
        <music21.key.KeySignature of 1 flat>
        ÚfifthsN)rˆ   rØ   r   r_   )r!   r™   Ú	keyFifthss      r   rŸ   z'CapellaImporter.keySignatureFromKeySignË  s>   € ð �w”~Ð%Ð%Ý˜GœN¨8Ô4Ñ5Ô5ˆIÝÔ# IÑ.Ô.Ð.ð &Ð%r   c                ój   — d|j         v r)|j         d         }|dk    rt          j        |¦  «        S dS dS )aÑ  
        Returns a :class:`~music21.meter.TimeSignature` object from a timeSign tag.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> timeSign = ci.domElementFromText('<timeSign time="4/4"/>')
        >>> ci.timeSignatureFromTimeSign(timeSign)
        <music21.meter.TimeSignature 4/4>

        >>> timeSign = ci.domElementFromText('<timeSign time="infinite"/>')
        >>> ci.timeSignatureFromTimeSign(timeSign) is None
        True
        ÚtimeÚinfiniteN)rˆ   r   ÚTimeSignature)r!   rš   Ú
timeStrings      r   r    z)CapellaImporter.timeSignatureFromTimeSignÙ  sC   € ð �X”_Ð$Ð$Ø!œ¨Ô0ˆJØ˜ZÒ'Ð'ÝÔ*¨:Ñ6Ô6Ð6à�tà�4r   c                óê  — t          j        ¦   «         }d|j        v rh|j        d         }|                     d¦  «        }|dk    r@t	          |d|…         ¦  «        }t	          ||dz   d…         ¦  «        }d|z  |z  }||_        d|j        v r!t	          |j        d         ¦  «        }||_        |                     d	¦  «        }	|	D ],}
|                      |
¦  «        }| 	                    |¦  «         Œ-|S )
a’  
        Return a music21.duration.Duration element from an XML Element representing
        a duration.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> durationTag = ci.domElementFromText('<duration base="1/32" dots="1"/>')
        >>> durationObj = ci.durationFromDuration(durationTag)
        >>> durationObj
        <music21.duration.Duration 0.1875>
        >>> durationObj.type
        '32nd'
        >>> durationObj.dots
        1

        Here with Tuplets

        >>> durationTag2 = ci.domElementFromText(
        ...      '<duration base="1/4"><tuplet count="3"/></duration>')
        >>> d2 = ci.durationFromDuration(durationTag2)
        >>> d2
        <music21.duration.Duration 2/3>
        >>> d2.type
        'quarter'
        >>> d2.tuplets
        (<music21.duration.Tuplet 3/2>,)

        Does not handle noDuration='true', display, churchStyle on rest durations
        Úbaseú/r   r   r6   Ng      @ÚdotsÚtuplet)
r	   ÚDurationrˆ   ÚfindrØ   ÚquarterLengthr  rx   ÚtupletFromTupletÚappendTuplet)r!   ÚdurationElementÚdurÚ	baseValueÚ
slashIndexÚfirstNumberÚsecondNumberr  Ú	dotNumberÚtupletsr©   r  s               r   r®   z$CapellaImporter.durationFromDurationð  s  € õ: ÔÑ!Ô!ˆà�_Ô+Ð+Ð+Ø'Ô.¨vÔ6ˆIØ"Ÿš¨Ñ,Ô,ˆJØ˜RÒÐÝ! )¨A¨j¨LÔ"9Ñ:Ô:�Ý" 9¨Z¸!©^¨_¨_Ô#=Ñ>Ô>�Ø!$ {Ñ!2°lÑ B�Ø$1�Ô!à�_Ô+Ð+Ð+Ý˜OÔ2°6Ô:Ñ;Ô;ˆIØ ˆCŒHà!×)Ò)¨(Ñ3Ô3ˆØð 	%ð 	%ˆAØ×*Ò*¨1Ñ-Ô-ˆFØ×Ò˜VÑ$Ô$Ð$Ð$àˆ
r   c                ó  — d}d}d|j         v r3t          |j         d         ¦  «        }d}||dz  k    r|dz  }||dz  k    °d|j         v r|j         d         dk    r|dz  }d|j         v rt          d¦  «         t          j        ||¦  «        }|S )aW  
        Returns a :class:`~music21.duration.Tuplet` object from a <tuplet> tag.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> tupletTag = ci.domElementFromText('<tuplet count="3"/>')
        >>> ci.tupletFromTuplet(tupletTag)
        <music21.duration.Tuplet 3/2>

        does not handle 'tripartite' = True
        r6   Úcountrý   Úprolongrß   Ú
tripartitezOWE DON'T HANDLE TRIPARTITE YET! Email the file and a pdf so I can figure it out)rˆ   rØ   r]   r	   ÚTuplet)r!   ÚtupletElementÚ	numeratorÚdenominatorÚtups        r   r  z CapellaImporter.tupletFromTuplet#  sÉ   € ð ˆ	ØˆØ�mÔ*Ð*Ð*Ý˜MÔ0°Ô9Ñ:Ô:ˆIØˆKØ˜k¨A™oÒ-Ð-Ø˜qÑ �ð ˜k¨A™oÒ-Ð-à˜Ô,Ð,Ð,°Ô1EÀgÔ1NÐRXÒ1XÐ1XØ˜1ÑˆKà˜=Ô/Ð/Ð/ÝØañcô cð cõ Œo˜i¨Ñ5Ô5ˆØˆ
r   ÚnormalÚdoubleÚfinalrà   râ   z	end-start)rð   r,  rà   ÚrepEndÚrepBeginÚrepEndBeginc                ó(  — g }d}d|j         v �r|j         d         }|                     d¦  «        r¦|| j        v rœ| j        |         }|                     d¦  «        dk    r)|                     t          j        d¦  «        ¦  «         d}|                     d¦  «        dk    r4t          j        d¦  «        }|du rd|_        |                     |¦  «         n;|| j        v r2|                     t          j        | j        |         ¦  «        ¦  «         |S )	ai  
        Indication that the barline at this point should be something other than normal.

        Capella does not indicate measure breaks or barline breaks normally, so the only barlines
        that are indicated are unusual ones.

        Returns a LIST of :class:`~music21.bar.Barline` or :class:`~music21.bar.Repeat` objects
        because the `repEndBegin` type requires two `bar.Repeat` objects to encode in `music21`.

        >>> ci = capella.fromCapellaXML.CapellaImporter()
        >>> barlineTag = ci.domElementFromText('<barline type="end"/>')
        >>> ci.barlineListFromBarline(barlineTag)
        [<music21.bar.Barline type=final>]

        >>> repeatTag = ci.domElementFromText('<barline type="repEndBegin"/>')
        >>> ci.barlineListFromBarline(repeatTag)
        [<music21.bar.Repeat direction=end>, <music21.bar.Repeat direction=start>]

        FÚtypeÚreprà   r   Trâ   r6   )	rˆ   Ú
startswithÚ
barlineMapr  r¿   r   ÚRepeatÚpriorityÚBarline)r!   ÚbarlineElementÚbarlineListÚhasRepeatEndÚbarlineTypeÚ
repeatTypeÚstartReps          r   r£   z&CapellaImporter.barlineListFromBarlineG  s  € ð( ˆØˆØ�^Ô*Ð*Ñ*Ø(Ô/°Ô7ˆKØ×%Ò% eÑ,Ô,ð RØ $¤/Ð1Ð1Ø!%¤°Ô!=�JØ!—’ uÑ-Ô-°Ò2Ð2Ø#×*Ò*­3¬:°eÑ+<Ô+<Ñ=Ô=Ð=Ø'+˜Ø!—’ wÑ/Ô/°"Ò4Ð4Ý#&¤:¨gÑ#6Ô#6˜Ø'¨4Ð/Ð/Ø01˜HÔ-Ø#×*Ò*¨8Ñ4Ô4Ð4øà $¤/Ð1Ð1Ø×&Ò&¥s¤{°4´?À;Ô3OÑ'PÔ'PÑQÔQÐQàÐr   c                ó   — dS )z!
        not implemented
        Nr   )r!   ÚdrawObjs     r   ÚslurFromDrawObjSlurz#CapellaImporter.slurFromDrawObjSlurp  s	   € ð 	ˆr   )Fr   )r)   rF   rG   rF   )$r   r   r   Ú__doc__r"   r,   r$   r%   rE   r'   r&   ry   r‰   r¡   r¢   r´   rÀ   rÊ   rÌ   r¶   rê   r   Ú
TrebleClefÚBassClefÚAltoClefÚ	TenorClefÚTreble8vbClefr  rž   rŸ   r    r®   r  r5  r£   rA  r   r   r   r   r   R   s  € € € € € ðð ðð ð ð
ð ð ð ð"ð ð ðð ð ð ð 9ð 9ð 9ð 9ð4@ð @ð @ð @ðD ð  ð  ð  ðD9ð 9ð 9ð 9ðvMð Mð Mð Mð^ð ð ð$5ð 5ð 5ðnð ð ð"*ð *ð *ðXð ð ð:)ð )ð )ðVð ð ð*ð ð ð> "œ_Øœ=Øœ=Ø œNØÔ,ð	ð €Kð*ð *ð *ðX/ð /ð /ðð ð ð.1ð 1ð 1ðfð ð ð8 %Ø$Ø Ø!Ø%Ø!,ðð €Jð'ð 'ð 'ðRð ð ð ð r   r   c                  ó   — e Zd Zd„ ZdS )ÚTestc                ó&  — ddl m} t          ¦   «         }t          j        ¦   «         dz  }|dz  }|                     |¦  «        }|                      t          |j        ¦  «        d¦  «         |  	                    t          | 
                    ¦   «         j        ¦  «        d¦  «         |                      d|                     |j        d         d¦  «        ¦  «         |                      d	|                     |j        d         d
¦  «        ¦  «         d S )Nr   )ró   ÚcapellaúNu_rue_mit_sorgen.capxé   é   zmass!r6   Úscherzrý   )Úmusic21ró   r   r   ÚgetSourceFilePathr,   ÚassertEqualr\   rk   ÚassertGreaterÚrecurserÂ   ÚassertInÚassembleLyrics)r!   ró   ÚciÚcapellaDirPathÚ
oswaldPathr+   s         r   ÚtestCompletezTest.testCompletex  sù   € Ø Ð Ð Ð Ð Ð åÑÔˆÝÔ1Ñ3Ô3°iÑ?ˆØ#Ð&?Ñ?ˆ
Ø×$Ò$ ZÑ0Ô0ˆ	Ø×Ò�˜Yœ_Ñ-Ô-¨qÑ1Ô1Ð1Ø×Ò�3˜y×0Ò0Ñ2Ô2Ô8Ñ9Ô9¸2Ñ>Ô>Ð>Ø�Š�g˜t×2Ò2°9´?À1Ô3EÀqÑIÔIÑJÔJÐJØ�Š�h × 3Ò 3°I´OÀAÔ4FÈÑ JÔ JÑKÔKÐKÐKÐKr   N)r   r   r   rZ  r   r   r   rI  rI  w  s(   € € € € € ð
Lð 
Lð 
Lð 
Lð 
Lr   rI  c                  ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestExternalTc                ó¼   — t          ¦   «         }t          j        ¦   «         dz  }|dz  }|                     |¦  «        }| j        r|                     ¦   «          d S d S ©NrK  rL  )r   r   rQ  r,   Úshow)r!   rW  rX  rY  r+   s        r   rZ  zTestExternal.testComplete‡  sh   € ÝÑÔˆÝÔ1Ñ3Ô3°iÑ?ˆØ#Ð&?Ñ?ˆ
Ø×$Ò$ ZÑ0Ô0ˆ	ØŒ9ð 	Ø�NŠNÑÔÐÐÐð	ð 	r   c                óL  — t          ¦   «         }t          j        ¦   «         dz  }|dz  }|                     |¦  «         |                     ¦   «          |                     |j        j        ¦  «        }|                     |¦  «        }| j	        r| 	                    ¦   «          d S d S r^  )
r   r   rQ  r$   r%   r&   r    ÚdocumentElementr'   r_  )r!   rW  rX  rY  r*   r+   s         r   ÚxtestImportSorgenzTestExternal.xtestImportSorgen�  s¦   € ÝÑÔˆÝÔ1Ñ3Ô3°iÑ?ˆØ#Ð&?Ñ?ˆ
à
×Ò˜jÑ)Ô)Ð)Ø
�ŠÑÔÐð
 ×*Ò*¨2¬:Ô+EÑFÔFˆØ×/Ò/°Ñ9Ô9ˆ	ØŒ9ð 	Ø�NŠNÑÔÐÐÐð	ð 	r   N)r   r   r   r_  rZ  rb  r   r   r   r\  r\  „  s7   € € € € € Ø€Dðð ð ðð ð ð ð r   r\  Ú__main__)!rB  Ú
__future__r   Úior   ÚtypingÚtÚunittestÚxml.etree.ElementTreer9   r0   rP  r   r   r   r   r	   r
   r   r   r   r   r   r   r   ÚMusic21Exceptionr   r   ÚTestCaserI  r\  r   ÚmainTestr   r   r   ú<module>rm     sA  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðN	ð 	ð 	ð 	ð 	˜\Ô:ñ 	ô 	ð 	ðbð bð bð bð bñ bô bð bðJLð Lð Lð Lð Lˆ8Ôñ Lô Lð Lðð ð ð ð �8Ô$ñ ô ð ð< ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   