§
    „Øjã_  ã                  ó*  — d Z ddlm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  G d„ dej        ¦  «        Z	 dd d„Z	 d!d"d„Z G d„ dej        ¦  «        Zedk    rddlZ ej        e¦  «         dS dS )#zT
Writer for the 'RomanText' format (Tymoczko, Gotham, Cuthbert, & Ariza ISMIR 2019)
é    )ÚannotationsN)Úbar)Úbase)Úmetadata)Úmeter)Úprebase)Úroman)Ú	romanText)Ústreamc                  ó8   — e Zd ZdZdd„Zdd„Zdd	„Zd
„ Zdd„ZdS )ÚRnWriteraÍ  
    Extracts the relevant information from a source
    (usually a :class:`~music21.stream.Stream` of
    :class:`~music21.roman.RomanNumeral` objects) for
    writing to text files in the 'RomanText' format (rntxt).

    Writing rntxt is handled externally in the
    :meth:`~music21.converter.subConverters.WriteRoman` so
    most users will never need to call this class directly, only invoking
    it indirectly through .write('rntxt').
    Possible exceptions include users who want to convert Roman numerals into rntxt type
    strings and want to work with those strings directly, without writing to disk.

    For consistency with the
    :meth:`~music21.base.Music21Object.show` and :meth:`~music21.base.Music21Object.write`
    methods across music21, this class is theoretically callable on
    any type of music21 object.
    Most relevant use cases will involve calling a
    stream containing one or more Roman numerals.
    This class supports any such stream:
    an :class:`~music21.stream.Opus` object of one or more scores,
    a :class:`~music21.stream.Score` with or without :class:`~music21.stream.Part` (s),
    a :class:`~music21.stream.Part`, or
    a :class:`~music21.stream.Measure`.

    >>> scoreBach = corpus.parse('bach/choraleAnalyses/riemenschneider004.rntxt')
    >>> rnWriterFromScore = romanText.writeRoman.RnWriter(scoreBach)

    The strings are stored in the RnWriter's combinedList variable, starting with the metadata:

    >>> rnWriterFromScore.combinedList[0]
    'Composer: J. S. Bach'

    Composer and work metadata is inherited from score metadata wherever possible.
    A composer entry will register directly as will any entries for
    workTitle, movementNumber, and movementName
    (see :meth:`~music21.romanText.writeRoman.RnWriter.prepTitle` for details).

    >>> rnWriterFromScore.combinedList[0] == 'Composer: ' + rnWriterFromScore.composer
    True

    As always, these metadata entries are user-settable.
    Make any adjustments to the metadata before calling this class.

    After the metadata, the list continues with strings for each measure in order.
    Here's the last in our example:

    >>> rnWriterFromScore.combinedList[-1]
    'm10 V6/V b2 V b3 I'

    In the case of the score, the top part is assumed to contain the Roman numerals.
    This is consistent with the parsing of rntxt which involves putting Roman numerals in a part
    (the top, and only part) within a score.

    In all other cases, the objects are iteratively inserted into larger streams until we end up
    with a part object (e.g. measure > part).

    >>> rn = roman.RomanNumeral('viio64', 'a')
    >>> rnWriterFromRn = romanText.writeRoman.RnWriter(rn)
    >>> rnWriterFromRn.combinedList[0]
    'Composer: Composer unknown'

    >>> rnWriterFromRn.combinedList[-1]
    'm0 a: viio64'

    OMIT_FROM_DOCS

    Users can do these insertions themselves, but don't need to:

    >>> m = stream.Measure()
    >>> m.insert(0, rn)
    >>> rnWriterFromMeasure = romanText.writeRoman.RnWriter(m)
    >>> rnWriterFromMeasure.combinedList == rnWriterFromRn.combinedList
    True

    >>> p = stream.Part()
    >>> p.insert(0, m)
    >>> rnWriterFromPart = romanText.writeRoman.RnWriter(p)
    >>> rnWriterFromPart.combinedList == rnWriterFromMeasure.combinedList
    True

    >>> s = stream.Score()
    >>> s.insert(0, m)
    >>> rnWriterFromScoreWithoutPart = romanText.writeRoman.RnWriter(p)
    >>> rnWriterFromScoreWithoutPart.combinedList == rnWriterFromMeasure.combinedList
    True
    Úobjúbase.Music21Objectc                ó8  — d| _         d| _        d| _        d| _        g | _        |  t          |t          j        ¦  «        �r³t          |t          j        ¦  «        rQd„ |D ¦   «         }|D ]@}|j        D ]}| j         	                    |¦  «         Œ| j         	                    d¦  «         ŒAd S t          |t          j
        ¦  «        r+|j                             ¦   «         }|�|| _        n’|| _        nŠt          |t          j        ¦  «        r|| _        nht          |t          j        ¦  «        r4t          j        ¦   «         | _        | j                             d|¦  «         n|                      |¦  «        | _        |j        rq|                      |j        ¦  «         |j        j         r|j        j         | _         |j        j        r|j        j        | _        |j        j        r|j        j        | _        n|                      |g¦  «        | _        d| j         › �d| j        › �d	| j        › �d
| j        › �dg| _        | j        t(          j                 s-| j                             dt)          j        d¦  «        ¦  «         d| _        |                      ¦   «          d S )NzComposer unknownzTitle unknownÚ c                ó,   — g | ]}t          |¦  «        ‘ŒS © )r   ©Ú.0Úxs     ú‘/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/romanText/writeRoman.pyú
<listcomp>z%RnWriter.__init__.<locals>.<listcomp>…   s   € Ð&@Ð&@Ð&@°q¥x°¡{¤{Ð&@Ð&@Ð&@ó    ú
r   z
Composer: zTitle: ú	Analyst: úProofreader: z4/4)ÚcomposerÚtitleÚanalystÚproofreaderÚcombinedListÚ
isinstancer   ÚStreamÚOpusÚappendÚScoreÚpartsÚfirstÚ	containerÚPartÚMeasureÚinsertÚ_makeContainerr   Ú	prepTitler   ÚTimeSignatureÚcurrentKeyStringÚprepSequentialListOfLines)Úselfr   ÚconstituentElementsÚ
scoreOrSimr   Úps         r   Ú__init__zRnWriter.__init__x   s‘  € ð +ˆŒØ$ˆŒ
ØˆŒØˆÔØ')ˆÔØÐ0å�c�6œ=Ñ)Ô)ñ $	8Ý˜#�vœ{Ñ+Ô+ð :Ø&@Ð&@¸CÐ&@Ñ&@Ô&@Ð#Ø"5ð 3ð 3�JØ'Ô4ð 4ð 4˜ØÔ)×0Ò0°Ñ3Ô3Ð3Ð3ØÔ%×,Ò,¨TÑ2Ô2Ð2Ð2Ø�å˜C¥¤Ñ.Ô.ð :Ø”I—O’OÑ%Ô%�Ø�=Ø%&�D”N�Nà%(�D”N�Nå˜C¥¤Ñ-Ô-ð :Ø!$�”�å˜C¥¤Ñ0Ô0ð :Ý!'¤¡¤�”Ø”×%Ò% a¨Ñ-Ô-Ð-Ð-ð "&×!4Ò!4°SÑ!9Ô!9�”àŒ|ð @Ø—’˜sœ|Ñ,Ô,Ð,Ø”<Ô(ð :Ø$'¤LÔ$9�D”MØ”<Ô'ð 8Ø#&¤<Ô#7�D”LØ”<Ô+ð @Ø'*¤|Ô'?�DÔ$øð "×0Ò0°#°Ñ7Ô7ˆDŒNà9¨$¬-Ð9Ð9Ø3 t¤zÐ3Ð3Ø7¨¬Ð7Ð7Ø?¨TÔ-=Ð?Ð?Øð	!ˆÔð Œ~�eÔ1Ô2ð 	AØŒN×!Ò! !¥UÔ%8¸Ñ%?Ô%?Ñ@Ô@Ð@à%'ˆÔØ×&Ò&Ñ(Ô(Ð(Ð(Ð(r   ústream.Stream | listc                ó²   — t          j        ¦   «         }|D ]}|                     |¦  «         Œt          j        ¦   «         }|                     d|¦  «         |S )a  
        Makes a placeholder container for the unusual cases where this class is called on
        generic- or non-stream object as opposed to
        a :class:`~music21.stream.Score`, :class:`~music21.stream.Part`,
        or :class:`~music21.stream.Measure`.
        r   )r   r+   r%   r*   r,   )r2   r   Úmr   r)   s        r   r-   zRnWriter._makeContainerµ   sX   € õ ŒNÑÔˆØð 	ð 	ˆAØ�HŠH�Q‰KŒKˆKˆKÝ”K‘M”Mˆ	Ø×Ò˜˜AÑÔÐØÐr   Úmdúmetadata.Metadatac                óV  — g }|j         r|                     |j         ¦  «         |j        r|                     d|j        › d�¦  «         |j        r*|j        |j        k    r|                     |j        ¦  «         t          |¦  «        dk    rd                     |¦  «        | _        dS dS )aÄ  
        Attempt to prepare a single work title from the score metadata looking at each of
        the title, movementNumber and movementName attributes.
        Failing that, a placeholder 'Title unknown' stands in.

        >>> s = stream.Score()
        >>> rnScore = romanText.writeRoman.RnWriter(s)
        >>> rnScore.title
        'Title unknown'

        >>> s.insert(0, metadata.Metadata())
        >>> s.metadata.title = 'Fake title'
        >>> s.metadata.movementNumber = 123456789
        >>> s.metadata.movementName = 'Fake movementName'
        >>> rnScoreWithMD = romanText.writeRoman.RnWriter(s)
        >>> rnScoreWithMD.title
        'Fake title - No.123456789: Fake movementName'
        z- No.ú:r   ú N)Ú	bestTitler%   ÚmovementNumberÚmovementNamer   ÚlenÚjoin)r2   r:   ÚworkingTitles      r   r.   zRnWriter.prepTitleÄ   s¸   € ð* ˆàŒ<ð 	.Ø×Ò ¤Ñ-Ô-Ð-ØÔð 	>Ø×ÒÐ <¨Ô(9Ð <Ð <Ð <Ñ=Ô=Ð=ØŒ?ð 	5ØŒ "¤(Ò*Ð*Ø×#Ò# B¤OÑ4Ô4Ð4åˆ|ÑÔ˜qÒ Ð ØŸš ,Ñ/Ô/ˆDŒJˆJˆJð !Ð r   c                ó>  — | j                              t          j        ¦  «        D �]ö}|                     t          j        ¦  «        }|rs|d         }| j                             d|j        › �¦  «         t          |¦  «        dk    r6d„ |dd…         D ¦   «         }d|› �}| j                             d|› �¦  «         t          |j        ¦  «        }|j        �
||j        z  }d}t          |j        t          j        ¦  «        r#|j        j        d	k    rt%          |d
d|¬¦  «        }|                     t&          j        ¦  «        }|D ]F}	|	j        �|	j        j        d	k    r-|                      |	¦  «        }
t%          ||	j        |
|¬¦  «        }ŒGt          |j        t          j        ¦  «        rS|j        j        dk    rC|t&          j                                      ¦   «         }|€d
}n|j        }t%          ||d|¬¦  «        }|r| j                             |¦  «         �ŒødS )a  
        Prepares a sequential list of text lines, with time signatures and Roman numerals
        adding this to the (already prepared) metadata preamble ready for printing.

        >>> p = stream.Part()
        >>> m = stream.Measure(number=1)
        >>> m.insert(0, meter.TimeSignature('4/4'))
        >>> m.insert(0, roman.RomanNumeral('V', 'G'))
        >>> p.insert(0, m)
        >>> testCase = romanText.writeRoman.RnWriter(p)
        >>> testCase.combinedList[-1]  # Last entry, after the metadata
        'm1 G: V'

        This follows the wider rntxt syntax in supporting
        Time Signature (:class:`~music21.meter.TimeSignature`) changes and
        Repeats marks (:class:`~music21.bar.Repeat`)
        but only (currently) between measures.

        Let's add a new measure to the stream we started,
        with a time signature change beforehand and
        both start and end repeats in it:

        >>> m2 = stream.Measure(number=2)
        >>> m2.insert(0, meter.TimeSignature('3/4'))
        >>> m2.leftBarline = bar.Repeat(direction='start')
        >>> m2.rightBarline = bar.Repeat(direction='end')
        >>> m2.insert(0, roman.RomanNumeral('I', 'G'))
        >>> p.insert(0, m2)
        >>> testCase = romanText.writeRoman.RnWriter(p)

        The last line of the `.combinedList` gives the new measure:

        >>> testCase.combinedList[-1]
        'm2 ||: I :||'

        The line before that gives the time signature change:

        >>> testCase.combinedList[-2]
        'Time Signature: 3/4'

        r   zTime Signature: é   c                ó   — g | ]	}|j         ‘Œ
S r   )ÚratioStringr   s     r   r   z6RnWriter.prepSequentialListOfLines.<locals>.<listcomp>  s   € Ð%OÐ%OÐ%O¸ a¤mÐ%OÐ%OÐ%Or   Nz.further time signature change(s) unprocessed: zNote: r   Ústartg      ð?z||:)ÚmeasureNumberÚbeatÚchordStringÚinStringÚendz:||)r)   ÚgetElementsByClassr   r+   r   r/   r!   r%   rH   rB   ÚstrrJ   ÚnumberSuffixr"   ÚleftBarliner   ÚRepeatÚ	directionÚrnStringr	   ÚRomanNumeralÚtieÚtypeÚgetChordStringrK   ÚrightBarlineÚlast)r2   ÚthisMeasureÚtsThisMeasureÚfirstTSÚunprocessedTSsÚmsgÚmeasureNumberStringÚmeasureStringÚrnsThisMeasureÚrnrL   Úlast_rnrK   s                r   r1   z"RnWriter.prepSequentialListOfLinesè   sZ  € ðV  œ>×<Ò<½V¼^ÑLÔLð 9	8ñ 9	8ˆKð (×:Ò:½5Ô;NÑOÔOˆMØð =Ø'¨Ô*�ØÔ!×(Ò(Ð)Q¸GÔ<OÐ)QÐ)QÑRÔRÐRÝ�}Ñ%Ô%¨Ò)Ð)Ø%OÐ%O¸]È1È2È2Ô=NÐ%OÑ%OÔ%O�NØ[È>Ð[Ð[�CØÔ%×,Ò,¨^°c¨^¨^Ñ<Ô<Ð<å"% kÔ&?Ñ"@Ô"@ÐØÔ'Ð3Ø# {Ô'?Ñ?Ð#àˆMõ ˜;Ô2µC´JÑ?Ô?ð +Ø#Ô/Ô9¸WÒDÐDÝ (Ð7JØ.1Ø5:Ø2?ð!+ñ !+ô !+�ð )×;Ò;½EÔ<NÑOÔOˆNØ$ð /ð /�Ø”6�> R¤V¤[°GÒ%;Ð%;Ø"&×"5Ò"5°bÑ"9Ô"9�KÝ$,Ð;NØ24´'Ø9DØ6Cð%/ñ %/ô %/�Møõ ˜;Ô3µS´ZÑ@Ô@ð +Ø#Ô0Ô:¸eÒCÐCð &¥eÔ&8Ô9×>Ò>Ñ@Ô@�Ø�?Ø�D�Dà"œ<�DÝ (Ð7JØ.2Ø5:Ø2?ð!+ñ !+ô !+�ð ð 8ØÔ!×(Ò(¨Ñ7Ô7Ð7ùðs9	8ð 9	8r   rd   úroman.RomanNumeralc                ó¦   — |j         j                             dd¦  «        }|| j        k    r|| _        |› d|j        › �S t          |j        ¦  «        S )aˆ  
        Produce a string from a Roman numeral with the chord and
        the key if that key constitutes a change from the foregoing context.

        >>> p = stream.Part()
        >>> m = stream.Measure()
        >>> m.insert(0, meter.TimeSignature('4/4'))
        >>> m.insert(0, roman.RomanNumeral('V', 'G'))
        >>> p.insert(0, m)
        >>> testCase = romanText.writeRoman.RnWriter(p)
        >>> sameKeyChord = testCase.getChordString(roman.RomanNumeral('I', 'G'))
        >>> sameKeyChord
        'I'

        >>> changeKeyChord = testCase.getChordString(roman.RomanNumeral('V', 'D'))
        >>> changeKeyChord
        'D: V'
        ú-Úbz: )ÚkeyÚtonicPitchNameWithCaseÚreplacer0   ÚfigurerP   )r2   rd   Ú	keyStrings      r   rY   zRnWriter.getChordStringN  sX   € ð* ”FÔ1×9Ò9¸#¸sÑCÔCˆ	Ø˜Ô-Ò-Ð-Ø$-ˆDÔ!ØÐ.Ð. 2¤9Ð.Ð.Ð.å�r”y‘>”>Ð!r   N)r   r   )r   r7   )r:   r;   )rd   rf   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6   r-   r.   r1   rY   r   r   r   r   r      s†   € € € € € ðVð Vðp;)ð ;)ð ;)ð ;)ðzð ð ð ð 0ð  0ð  0ð  0ðHd8ð d8ð d8ðL"ð "ð "ð "ð "ð "r   r   r   rJ   ú	int | strrK   ú&str | int | float | fractions.FractionrL   rP   rM   ú
str | Nonec                ó  — |r^|                      d¦  «        d         dd…         }|t          | ¦  «        k    r'd| › d�}|d|› d�z  }|d	| › d
�z  }t          |¦  «        ‚nd| › �}t          |¦  «        }|dk    r|› d|› �}n
|› d|› d|› �}|S )aM  
    Creates or extends a string of RomanText such that the output corresponds to a single
    measure line.

    If the inString is not given, None, or an empty string then this function starts a new line.

    >>> lineStarter = romanText.writeRoman.rnString(14, 1, 'G: I')
    >>> lineStarter
    'm14 G: I'

    For any other inString, that string is the start of a measure line continued by the new values

    >>> continuation = romanText.writeRoman.rnString(14, 2, 'viio6', 'm14 G: I')
    >>> continuation
    'm14 G: I b2 viio6'

    Naturally, this function requires the measure number of any such continuation to match
    that of the inString and raises an error where that is not the case.

    As these examples show, the chordString can be a Roman numeral alone (e.g. 'viio6')
    or one prefixed by a change of key ('G: I').

    r>   r   rF   Nz&The current measureNumber is given as z, but zthe contextual inString (z) refers to zmeasure number z. They should match.r9   z b)ÚsplitrP   Ú
ValueErrorÚintBeat)rJ   rK   rL   rM   ÚinStringMeasureNumberr`   ÚbtÚ	newStrings           r   rU   rU   m  sç   € ð8 ð 'Ø (§¢¨sÑ 3Ô 3°AÔ 6°q°r°rÔ :Ðð !¥C¨Ñ$6Ô$6Ò6Ð6ØP¸=ÐPÐPÐPˆCØÐE¨xÐEÐEÐEÑEˆCØÐH ]ÐHÐHÐHÑHˆCÝ˜S‘/”/Ð!ð	 7ð '�}Ð&Ð&ˆå	�‰Œ€BØ	ˆQ‚w€wØÐ/Ð/ +Ð/Ð/ˆ	ˆ	àÐ5Ð5 2Ð5Ð5¨Ð5Ð5ˆ	àÐr   é   Ú
roundValueÚintc                ó´  — t           t          t          t          j        f}t          | |¦  «        st          d| › d|› d�¦  «        ‚t          | t           t          j        f¦  «        rt          | ¦  «        } | dk     rd| › d�}t          |¦  «        ‚t          | t          ¦  «        r| S t          | ¦  «        | k    rt          | ¦  «        S t          | |¦  «        S )a6  
    Converts beats to integers if possible, and otherwise to rounded decimals.
    Accepts input as string, int, float, or fractions.Fraction.

    >>> testInt = romanText.writeRoman.intBeat(1, roundValue=2)
    >>> testInt
    1

    >>> testFrac = romanText.writeRoman.intBeat(8 / 3, roundValue=2)
    >>> testFrac
    2.67

    >>> testStr = romanText.writeRoman.intBeat('0.666666666', roundValue=2)
    >>> testStr
    0.67

    The roundValue sets the number of decimal places to round to. The default is two:

    >>> testRound2 = romanText.writeRoman.intBeat(1.11111111, roundValue=2)
    >>> testRound2
    1.11

    But this can be set to any integer:

    >>> testRound1 = romanText.writeRoman.intBeat(1.11111111, roundValue=1)
    >>> testRound1
    1.1

    Raises an error if called on a negative value.
    zBeat, (currently z) must be one of ú.r   zBeat (currently z) must not be negative.)	rP   r   ÚfloatÚ	fractionsÚFractionr"   Ú	TypeErrorrx   Úround)rK   r~   ÚoptionsÚnegativeErrorMessages       r   ry   ry   Ÿ  sá   € õB •C�¥	Ô 2Ð3€GÝ�d˜GÑ$Ô$ð OÝÐM¨DÐMÐMÀ7ÐMÐMÐMÑNÔNÐNå�$��iÔ0Ð1Ñ2Ô2ð Ý�T‰{Œ{ˆð ˆa‚x€xØO°$ÐOÐOÐOÐÝÐ-Ñ.Ô.Ð.å�$�ÑÔð Øˆõ ˆ4�y„y�DÒÐÝ�4‰yŒyÐå�T˜:Ñ&Ô&Ð&r   c                  ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚTesta	  
    Tests for two analysis cases (the smallest rntxt files in the music21 corpus)
    along with two test by modifying those scores.

    Additional tests for the standalone functions rnString and intBeat and
    for handling the special case of opus objects.
    c                óä   — ddl m} d}|                     d|z   ¦  «        }|                      |t          j        ¦  «         t          |¦  «        }dD ]}|                      ||j        ¦  «         ŒdS )aŠ  
        As the rntxt input parser handles Opus objects
        (i.e. more than one score within the same rntxt files),
        this RnWriter also needs to accept that type.

        This test parses a fake (tiny) Opus file in three (really tiny!) movements.
        Checks ensure that the parsed version is indeed an Opus object and that
        the data is faithfully transferred through that process.

        In practice, Opus handling will bypass this module in the typical case of a simple
        .write() because writing Opus objects explicitly separates them into their constituent
        score files prior to invoking this module.
        r   ©Ú	convertera  Composer: Fake composer
        Piece: Fake piece
        Movement: 1
        m1 C: I b3 IV b4 V
        m2 I

        Movement: 2
        m1 G: I
        m3 IV
        m4 V
        m5 I

        Movement: 3
        m1 C: I
        m2 V
        m3 I
        zromantext: )zTitle: Fake piece - No.1:zTitle: Fake piece - No.2:zTitle: Fake piece - No.3:zm2 Izm5 Izm3 IN)	Úmusic21r�   ÚparseÚassertIsInstancer   r$   r   ÚassertInr!   )r2   r�   ÚtestOpusStringÚtestOpusÚtestOpusRnWriterr   s         r   r“   zTest.testOpusá  s“   € ð 	&Ð%Ð%Ð%Ð%Ð%ðˆð$ —?’? =°>Ñ#AÑBÔBˆØ×Ò˜h­¬Ñ4Ô4Ð4å# HÑ-Ô-Ððð 	<ð 	<ˆAð �MŠM˜!Ð-Ô:Ñ;Ô;Ð;Ð;ð	<ð 	<r   c                ó^  — ddl m} |                     d¦  «        }t          |¦  «        }|                      d|j        ¦  «         |j        d                              d¦  «                             dt          j
        d¦  «        ¦  «         |j        d                              d¦  «                             dt          j
        d¦  «        ¦  «         t          |¦  «        }d	}d
}|                      ||j        ¦  «         |                      ||j        ¦  «         |                      |j                             |¦  «        |j                             |¦  «        dz   ¦  «         |                     d¦  «        }t          |¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d         d¦  «         d|j        _        d|j        _        d|j        _        t          |¦  «        }	|                      |	j        d¦  «         dS )z–
        Tests for two analysis cases (the smallest rntxt files in the music21 corpus)
        along with two test by modifying those scores.
        r   )Úcorpusz-bach/choraleAnalyses/riemenschneider004.rntxtzm10 V6/V b2 V b3 Ié   z10/8rF   z5/8zTime Signature: 10/8z;Note: further time signature change(s) unprocessed: ['5/8']zmonteverdi/madrigal.3.8.rntxtÚ
MonteverdizLa piaga c'ho nel coreéÿÿÿÿzm57 Iz
Fake titleiÍ[zFake movementNamez,Fake title - No.123456789: Fake movementNameN)rŽ   r–   r�   r   r‘   r!   r'   Úmeasurer,   r   r/   ÚassertEqualÚindexr   r   r   r@   rA   )
r2   r–   Ú	scoreBachÚrnaBachÚ	wonkyBachÚ	tsString1Ú	tsString2Ú
scoreMonteÚrnMonteÚadjustedMontes
             r   Ú$testTwoCorpusPiecesAndTwoCorruptionsz)Test.testTwoCorpusPiecesAndTwoCorruptions  s  € ð 	#Ð"Ð"Ð"Ð"Ð"à—L’LÐ!PÑQÔQˆ	å˜9Ñ%Ô%ˆØ�ŠÐ*¨GÔ,@ÑAÔAÐAð 	Œ˜Ô×"Ò" 1Ñ%Ô%×,Ò,¨QµÔ0CÀFÑ0KÔ0KÑLÔLÐLØŒ˜Ô×"Ò" 1Ñ%Ô%×,Ò,¨QµÔ0CÀEÑ0JÔ0JÑKÔKÐKå˜YÑ'Ô'ˆ	à*ˆ	ØQˆ	à�Š�i Ô!7Ñ8Ô8Ð8Ø�Š�i Ô!7Ñ8Ô8Ð8à×Ò˜Ô/×5Ò5°iÑ@Ô@Ø"Ô/×5Ò5°iÑ@Ô@À1ÑDñ	Fô 	Fð 	Fð
 —\’\Ð"AÑBÔBˆ
Ý˜:Ñ&Ô&ˆà×Ò˜Ô)¨<Ñ8Ô8Ð8à×Ò˜œÐ(@ÑAÔAÐAØ×Ò˜Ô-¨bÔ1°7Ñ;Ô;Ð;ð
 %1ˆ
ÔÔ!Ø-6ˆ
ÔÔ*Ø+>ˆ
ÔÔ(å  Ñ,Ô,ˆØ×Ò˜Ô,Ð.\Ñ]Ô]Ð]Ð]Ð]r   c                óB  — t          j        ¦   «         }t          j                             |¦  «         t          j        ¦   «         }t          j                             |¦  «         |                     d|¦  «         t          j                             |¦  «         t          j        ¦   «         }t	          |¦  «         t          j        ¦   «         }t	          |¦  «        }|  	                    |j
        g d¢¦  «         t          j        dd¦  «        }t	          |¦  «         dS )zi
        Tests successful init on a range of supported objects (score, part, even RomanNumeral).
        r   )zComposer: Composer unknownzTitle: Title unknownr   r   r   Úviio6ÚGN)r   r&   r
   Ú
writeRomanr   r*   r,   r+   ÚVoicer›   r!   r	   rV   )r2   Úsr5   r9   ÚvÚemptyWriterrd   s          r   ÚtestTypeParseszTest.testTypeParsesB  sí   € õ
 ŒL‰NŒNˆÝÔ×%Ò% aÑ(Ô(Ð(åŒK‰MŒMˆÝÔ×%Ò% aÑ(Ô(Ð(à	�Š��A‰ŒˆÝÔ×%Ò% aÑ(Ô(Ð(åŒNÑÔˆÝ�‰ŒˆåŒL‰NŒNˆå˜q‘k”kˆØ×Ò˜Ô1ð 4
ð 4
ð 4
ñ 	ô 	ð 	õ Ô ¨Ñ-Ô-ˆÝ�‰Œˆˆˆr   c                ó,  — ddl m} t          j        d¦  «        }|                     |d¬¦  «        }t          |¦  «        }d                     |j        ¦  «                             ¦   «          	                    |                     ¦   «         ¦  «        sJ ‚d S )Nr   rŒ   z¬
            Time Signature: 2/4
            m1 ||: C: I
            m2 V :||
            m3 ||: I :||
            m4 ||: I
            m5a V :||
            m5b I
        r
   )Úformatr   )
rŽ   r�   ÚtextwrapÚdedentr�   r   rC   r!   ÚstripÚendswith)r2   r�   Úrntxtr«   Úwriters        r   ÚtestRepeatszTest.testRepeatsa  s�   € Ø%Ð%Ð%Ð%Ð%Ð%Ý”ð !ñ ô ˆð �OŠO˜E¨+ˆOÑ6Ô6ˆÝ˜!‘”ˆØ�yŠy˜Ô,Ñ-Ô-×3Ò3Ñ5Ô5×>Ò>¸u¿{º{¹}¼}ÑMÔMÐMÐMÐMÐMÐMr   c                ó,  — t          ddd¦  «        }|                      |d¦  «         t          ddd¦  «        }|                      |d¦  «         |                      t          ¦  «        5  t          ddd	d
¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NrF   zG: Izm1 G: Ir   é   zb: Vz
m0 b4 b: Vé   r§   zm14 G: I)rU   r›   ÚassertRaisesrx   )r2   Útests     r   ÚtestRnStringzTest.testRnStringp  sÜ   € Ý˜˜1˜fÑ%Ô%ˆØ×Ò˜˜yÑ)Ô)Ð)å˜˜1˜fÑ%Ô%ˆØ×Ò˜˜|Ñ,Ô,Ð,à×Ò�zÑ*Ô*ð 	1ð 	1Ý�R˜˜G ZÑ0Ô0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1s   Á)B	Â	BÂBc                óX  — t          dd¬¦  «        }|                      |d¦  «         t          dd¬¦  «        }|                      |d¦  «         t          dd¬¦  «        }|                      |d¦  «         t          dd¬¦  «        }|                      |d¦  «         t          dd¬¦  «        }|                      |d	¦  «         t          t          j        d
d¦  «        d¬¦  «        }|                      |d	¦  «         t          dd¬¦  «        }|                      |d¦  «         |                      t
          ¦  «        5  t          g d¢¦  «         d d d ¦  «         n# 1 swxY w Y   |                      t          ¦  «        5  t          d¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NrF   r}   )r~   g      ø?g’ÁzqÇñ?gÃõ(\�Âñ?gš™™™™™ñ?gUUUUUU@g\�Âõ(\@é   r—   z0.666666666gq=
×£på?)r   rF   r}   g      ø¿)ry   r›   rƒ   r„   r»   r…   rx   )r2   ÚtestIntÚ
testOneDecÚ
testRound1Ú
testRound2Ú	testFrac1Ú	testFrac2ÚtestStrs           r   ÚtestIntBeatzTest.testIntBeatz  s'  € Ý˜!¨Ð*Ñ*Ô*ˆØ×Ò˜ !Ñ$Ô$Ð$å˜S¨QÐ/Ñ/Ô/ˆ
Ø×Ò˜ SÑ)Ô)Ð)å˜Z°AÐ6Ñ6Ô6ˆ
Ø×Ò˜ TÑ*Ô*Ð*å˜Z°AÐ6Ñ6Ô6ˆ
Ø×Ò˜ SÑ)Ô)Ð)å˜E¨aÐ0Ñ0Ô0ˆ	Ø×Ò˜ DÑ)Ô)Ð)å�IÔ.¨q°!Ñ4Ô4ÀÐCÑCÔCˆ	Ø×Ò˜ DÑ)Ô)Ð)å˜-°AÐ6Ñ6Ô6ˆØ×Ò˜ $Ñ'Ô'Ð'à×Ò�yÑ)Ô)ð 	ð 	Ý�I�I�IÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ×Ò�zÑ*Ô*ð 	ð 	Ý�D‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s$   Ä?EÅE!Å$E!ÆFÆF#Æ&F#N)
ro   rp   rq   rr   r“   r¥   r®   r·   r½   rÇ   r   r   r   rŠ   rŠ   Ø  s€   € € € € € ðð ð.<ð .<ð .<ð`/^ð /^ð /^ðbð ð ð>Nð Nð Nð1ð 1ð 1ðð ð ð ð r   rŠ   Ú__main__)r   )rJ   rs   rK   rt   rL   rP   rM   ru   )r}   )rK   rt   r~   r   )rr   Ú
__future__r   rƒ   r±   ÚunittestrŽ   r   r   r   r   r   r	   r
   r   ÚProtoM21Objectr   rU   ry   ÚTestCaserŠ   ro   ÚmainTestr   r   r   ú<module>rÎ      s²  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð
I"ð I"ð I"ð I"ð I"ˆwÔ%ñ I"ô I"ð I"ðb
 #%ð/ð /ð /ð /ð /ðf  ð4'ð 4'ð 4'ð 4'ð 4'ðr|ð |ð |ð |ð |ˆ8Ôñ |ô |ð |ðB ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   