§
    ƒØj¦Š  ã                  ó®  — d 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 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„Zd d„Z G d„ d¦  «        Z G d„ d¦  «        Zeeeeg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 )!aV  
This module, the heart of fbRealizer, is all about realizing
a bass line of (bassNote, notationString)
pairs. All it takes to create well-formed realizations of a
bass line is a few lines of music21 code,
from start to finish. See :class:`~music21.figuredBass.realizer.FiguredBassLine` for more details.

>>> from music21.figuredBass import realizer
>>> fbLine = realizer.FiguredBassLine()
>>> fbLine.addElement(note.Note('C3'))
>>> fbLine.addElement(note.Note('D3'), '4,3')
>>> fbLine.addElement(note.Note('C3', quarterLength = 2.0))
>>> allSols = fbLine.realize()
>>> allSols.getNumSolutions()
30
>>> #_DOCS_SHOW allSols.generateRandomRealizations(14).show()

    .. image:: images/figuredBass/fbRealizer_intro.*
        :width: 500

The same can be accomplished by taking the notes and notations
from a :class:`~music21.stream.Stream`.
See :meth:`~music21.figuredBass.realizer.figuredBassFromStream` for more details.

>>> s = converter.parse('tinynotation: C4 D4_4,3 C2', makeNotation=False)
>>> fbLine = realizer.figuredBassFromStream(s)
>>> allSols2 = fbLine.realize()
>>> allSols2.getNumSolutions()
30
é    )ÚannotationsN)Úchord)Úclef)Úexceptions21)Úkey)Úmeter)Únote)Úpitch)Ústream)Úchecker)Únotation)ÚrealizerScale)Úrules)ÚsegmentÚ
streamPartústream.StreamÚreturnÚFiguredBassLinec                óä  ‡— |                       ¦   «         }|                     t          j        ¦  «        }|t          j                                      ¦   «         x}r|}nP|t          j                                      ¦   «         x}r|                     d¦  «        }nt	          j        d¦  «        }|t          j
                                      ¦   «         x}r|}nt          j
        d¦  «        }t          ||¦  «        }|                      ¦   «         r;|                      dd¬¦  «        }	t          j        r|	€J ‚|	j        }
|
dk    r|
|_        dˆfd„Š|D ]�}|j        rd}t'          |j        ¦  «        D ]Q\  }}|j        dv rŒd|j        v r|j        }n ‰||j        ¦  «        }|dz   t+          |j        ¦  «        k     r|dz  }ŒR|                     ||¦  «         Œˆ|                     |¦  «         Œž|S )až  
    Takes a :class:`~music21.stream.Part` (or another :class:`~music21.stream.Stream` subclass)
    and returns a :class:`~music21.figuredBass.realizer.FiguredBassLine` object whose bass notes
    have notations taken from the lyrics in the source stream. This method along with the
    :meth:`~music21.figuredBass.realizer.FiguredBassLine.realize` method provide the easiest
    way of converting from a notated version of a figured bass (such as in a MusicXML file) to
    a realized version of the same line.

    >>> s = converter.parse('tinynotation: 4/4 C4 D8_6 E8_6 F4 G4_7 c1', makeNotation=False)
    >>> fb = figuredBass.realizer.figuredBassFromStream(s)
    >>> fb
    <music21.figuredBass.realizer.FiguredBassLine object at 0x...>

    >>> fbRules = figuredBass.rules.Rules()
    >>> fbRules.partMovementLimits = [(1, 2), (2, 12), (3, 12)]
    >>> fbRealization = fb.realize(fbRules)
    >>> fbRealization.getNumSolutions()
    13
    >>> #_DOCS_SHOW fbRealization.generateRandomRealizations(8).show()

    .. image:: images/figuredBass/fbRealizer_fbStreamPart.*
        :width: 500

    * Changed in v7.3: multiple figures in same lyric (e.g. '64') now supported.
    ÚmajorÚCú4/4r   T)ÚindicesNotNumbersNç        ÚannotationStringÚstrÚ	inputTextr   c                ó  •— d}|d         dv r0t          |¦  «        dk    r|d                              ¦   «         rd}n|d                              ¦   «         rd}nd}| |d|…         z  } ||d…         r| dz  }  ‰| ||d…         ¦  «        } | S )zß
        Continue building the working `annotationString` based on some `inputText`
        that has yet to be processed. Called recursively until `inputText` is exhausted
        or contains unexpected characters.
        r   ú+#bné   é   iè  Nú, )ÚlenÚ	isnumeric)r   r   Ústop_index_exclusiveÚupdateAnnotationStrings      €ú‘/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/figuredBass/realizer.pyr&   z5figuredBassFromStream.<locals>.updateAnnotationStringt   sÔ   ø€ ð %&ÐØ�QŒ<˜6Ð!Ð!¥c¨)¡n¤n°qÒ&8Ð&8¸YÀq¼\×=SÒ=SÑ=UÔ=UÐ&8Ø#$Ð Ð Ø�qŒ\×#Ò#Ñ%Ô%ð 	(Ø#$Ð Ð ð $(Ð Ø˜IÐ&;Ð';Ð&;Ô<Ñ<ÐàÐ)Ð*Ð*Ô+ð 	DØ Ñ$ÐØ5Ð5Ø  )Ð,@Ð,AÐ,AÔ"Bñ Dô  DÐàÐó    Ú )Nr)   ú,r    r"   )r   r   r   r   r   r   )ÚflattenÚgetElementsByClassr	   ÚNoter   ÚKeyÚfirstÚKeySignatureÚasKeyr   ÚTimeSignaturer   ÚhasMeasuresÚmeasureÚtÚTYPE_CHECKINGÚpaddingLeftÚ_paddingLeftÚlyricsÚ	enumerateÚtextr#   Ú
addElement)r   ÚsfÚsfnÚfirstKeyÚmyKeyÚfirstKeySignatureÚfirst_tsÚtsÚfbÚm_firstr7   Únr   ÚiÚ
lyric_liner&   s                  @r'   ÚfiguredBassFromStreamrI   ?   s/  ø€ ð6 
×	Ò	Ñ	Ô	€BØ
×
Ò
¥¤	Ñ
*Ô
*€Cà•c”g”;×$Ò$Ñ&Ô&Ð&€xð ØˆˆØ ¥Ô!1Ô2×8Ò8Ñ:Ô:Ð	:Ð	ð Ø!×'Ò'¨Ñ0Ô0ˆˆå”˜‘”ˆð •eÔ)Ô*×0Ò0Ñ2Ô2Ð2€xð (ØˆˆåÔ  Ñ'Ô'ˆå	˜ Ñ	#Ô	#€BØ×ÒÑÔð *Ø×$Ò$ Q¸$Ð$Ñ?Ô?ˆÝŒ?ð 	'ØÐ&Ð&Ð&ØÔ)ˆØ˜#ÒÐØ)ˆBŒOð ð  ð  ð  ð  ð  ð. ð ð ˆØŒ8ð 	Ø$&ÐÝ!*¨1¬8Ñ!4Ô!4ð -ð -‘��:Ø”? jÐ0Ð0ØØ˜*œ/Ð)Ð)ð (2¤Ð$Ð$ð (>Ð'=Ð>NÐPZÔP_Ñ'`Ô'`Ð$Ø�q‘5�3˜qœx™=œ=Ò(Ð(Ø$¨Ñ,Ð$øØ�MŠM˜!Ð-Ñ.Ô.Ð.Ð.à�MŠM˜!ÑÔÐÐà€Ir(   c                ó$  — g | _         t          j        |¦  «        }|j        sdS t	          d„ |j        D ¦   «         ¦  «        }|j        D ]E}d}t          |t          |¦  «        z
  ¦  «        D ]}|dz  }Œ|                      ||z   d¬¦  «         ŒFdS )a  
    Takes in a bassNote and a corresponding notationString as arguments.
    Adds the parsed notationString as lyrics to the bassNote, which is
    useful when displaying the figured bass in external software.

    >>> from music21.figuredBass import realizer
    >>> n1 = note.Note('G3')
    >>> realizer.addLyricsToBassNote(n1, '6,4')
    >>> n1.lyrics[0].text
    '6'
    >>> n1.lyrics[1].text
    '4'
    >>> #_DOCS_SHOW n1.show()

    .. image:: images/figuredBass/fbRealizer_lyrics.*
        :width: 100
    Nc                ó,   — g | ]}t          |¦  «        ‘ŒS © )r#   )Ú.0Úfss     r'   ú
<listcomp>z'addLyricsToBassNote.<locals>.<listcomp>·   s   € Ð7Ð7Ð7 •S˜‘W”WÐ7Ð7Ð7r(   r)   ú T)ÚapplyRaw)r9   r   ÚNotationÚfigureStringsÚmaxÚranger#   ÚaddLyric)ÚbassNoteÚnotationStringrF   Ú	maxLengthrN   ÚspacesInFrontrG   s          r'   ÚaddLyricsToBassNoter[   ¡   s·   € ð$ €H„OÝÔ˜.Ñ)Ô)€AØŒ?ð ØˆÝÐ7Ð7 q¤Ð7Ñ7Ô7Ñ8Ô8€IØŒoð =ð =ˆØˆÝ�y¥3 r¡7¤7Ñ*Ñ+Ô+ð 	!ð 	!ˆAØ˜SÑ ˆMˆMØ×Ò˜-¨"Ñ,°tÐÑ<Ô<Ð<Ð<ð	=ð =r(   c                  ód   — e Zd ZU dZg d¢ZdddœZded<   dd	„Zddd„Zd„ Z	dd„Z
d„ Zdd„Zd„ ZdS )r   a‘  
    A FiguredBassLine is an interface for realization of a line of (bassNote, notationString) pairs.
    Currently, only 1:1 realization is supported, meaning that every bassNote is realized and the
    :attr:`~music21.note.GeneralNote.quarterLength` or duration of a realization above a bassNote
    is identical to that of the bassNote.

    `inKey` defaults to C major.

    `inTime` defaults to 4/4.

    >>> from music21.figuredBass import realizer
    >>> fbLine = realizer.FiguredBassLine(key.Key('B'), meter.TimeSignature('3/4'))
    >>> fbLine.inKey
    <music21.key.Key of B major>
    >>> fbLine.inTime
    <music21.meter.TimeSignature 3/4>
    )r<   ÚgenerateBassLineÚrealizezÌ
            A :class:`~music21.key.Key` which implies a scale value,
            scale mode, and key signature for a
            :class:`~music21.figuredBass.realizerScale.FiguredBassScale`.
            z»
            A :class:`~music21.meter.TimeSignature` which specifies the
            time signature of realizations outputted to a
            :class:`~music21.stream.Score`.
            )ÚinKeyÚinTimeúdict[str, str]Ú	_DOC_ATTRNc                ó*  — |€t          j        d¦  «        }|€t          j        d¦  «        }|| _        || _        d| _        t          j        ¦   «         | _	        t          j        |                     d¦  «        |j        ¦  «        | _        g | _        d S )Nr   r   r   r    )r   r.   r   r2   r_   r`   r8   r   ÚPartÚ_overlaidPartsr   ÚFiguredBassScaleÚpitchFromDegreeÚmodeÚ_fbScaleÚ_fbList)Úselfr_   r`   s      r'   Ú__init__zFiguredBassLine.__init__ß   s~   € Øˆ=Ý”G˜C‘L”LˆEØˆ>ÝÔ(¨Ñ/Ô/ˆFàˆŒ
ØˆŒØˆÔÝ$œk™mœmˆÔÝ%Ô6°u×7LÒ7LÈQÑ7OÔ7OÐQVÔQ[Ñ\Ô\ˆŒØˆŒˆˆr(   Ú
bassObjectú	note.Notec                óø   — ||j         _        |j        }d|v r.| j                             ||f¦  «         t          ||¦  «         dS d|v sd|v r| j                             |¦  «         dS t          d|›�¦  «        ‚)aó  
        Use this method to add (bassNote, notationString) pairs to the bass line. Elements
        are realized in the order they are added.

        >>> from music21.figuredBass import realizer
        >>> fbLine = realizer.FiguredBassLine(key.Key('B'), meter.TimeSignature('3/4'))
        >>> fbLine.addElement(note.Note('B2'))
        >>> fbLine.addElement(note.Note('C#3'), '6')
        >>> fbLine.addElement(note.Note('D#3'), '6')
        >>> #_DOCS_SHOW fbLine.generateBassLine().show()

        .. image:: images/figuredBass/fbRealizer_bassLine.*
            :width: 200

        OMIT_FROM_DOCS

        >>> fbLine = realizer.FiguredBassLine(key.Key('C'), meter.TimeSignature('4/4'))
        >>> fbLine.addElement(harmony.ChordSymbol('C'))
        >>> fbLine.addElement(harmony.ChordSymbol('G'))

        >>> fbLine = realizer.FiguredBassLine(key.Key('C'), meter.TimeSignature('4/4'))
        >>> fbLine.addElement(roman.RomanNumeral('I'))
        >>> fbLine.addElement(roman.RomanNumeral('V'))
        r-   ÚRomanNumeralÚChordSymbolzcNot a valid bassObject (only note.Note, harmony.ChordSymbol, and roman.RomanNumeral supported) was N)Ú	editorialrX   Úclassesrj   Úappendr[   ÚFiguredBassLineException)rk   rm   rX   Úcs       r'   r<   zFiguredBassLine.addElementì   s©   € ð2 /=ˆ
ÔÔ+ØÔˆØ�Qˆ;ˆ;ØŒL×Ò ¨^Ð <Ñ=Ô=Ð=Ý 
¨NÑ;Ô;Ð;Ð;Ð;à˜qÐ Ð  M°QÐ$6Ð$6ØŒL×Ò 
Ñ+Ô+Ð+Ð+Ð+å*ð]ØNXð]ð ]ñô ð r(   c                ó2  — t          j        ¦   «         }|                     t          j        ¦   «         ¦  «         |                     t          j        | j        j        ¦  «        ¦  «         |                     t          j
        | j        ¦  «        ¦  «         d}| j        dk    r/t          j        | j        ¬¦  «        }|                     |¦  «         | j        D ]\  }}|                     |¦  «         Œ|                     dd¬¦  «        }|�‰|                     t           j        ¦  «                             ¦   «         }|                     |                     t          j        ¦  «                             ¦   «         ¦  «         |                     ¦   «          |S )a¢  
        Generates the bass line as a :class:`~music21.stream.Score`.

        >>> from music21.figuredBass import realizer
        >>> fbLine = realizer.FiguredBassLine(key.Key('B'), meter.TimeSignature('3/4'))
        >>> fbLine.addElement(note.Note('B2'))
        >>> fbLine.addElement(note.Note('C#3'), '6')
        >>> fbLine.addElement(note.Note('D#3'), '6')
        >>> #_DOCS_SHOW fbLine.generateBassLine().show()

        .. image:: images/figuredBass/fbRealizer_bassLine.*
            :width: 200

        >>> sBach = corpus.parse('bach/bwv307')
        >>> sBach.parts.last().measure(0).show('text')
        {0.0} ...
        {0.0} <music21.clef.BassClef>
        {0.0} <music21.key.Key of B- major>
        {0.0} <music21.meter.TimeSignature 4/4>
        {0.0} <music21.note.Note B->
        {0.5} <music21.note.Note C>

        >>> fbLine = realizer.figuredBassFromStream(sBach.parts.last())
        >>> fbLine.generateBassLine().measure(1).show('text')
        {0.0} <music21.clef.BassClef>
        {0.0} <music21.key.KeySignature of 2 flats>
        {0.0} <music21.meter.TimeSignature 4/4>
        {3.0} <music21.note.Note B->
        {3.5} <music21.note.Note C>
        Nr   ©ÚquarterLengthF©ÚinPlaceÚcautionaryNotImmediateRepeat)r   rd   rt   r   ÚBassClefr   r0   r_   ÚsharpsÚcopyÚdeepcopyr`   r8   r	   ÚRestrj   ÚmakeNotationr,   ÚMeasurer/   ÚremoveÚpadAsAnacrusis)rk   ÚbassLineÚrrW   Úunused_notationStringÚbl2Úm0s          r'   r]   z FiguredBassLine.generateBassLine  sQ  € õ> ”;‘=”=ˆØ�Š�œ™œÑ(Ô(Ð(Ø�Š�Ô(¨¬Ô):Ñ;Ô;Ñ<Ô<Ð<Ø�Š�œ d¤kÑ2Ô2Ñ3Ô3Ð3ØˆØÔ Ò#Ð#Ý”	¨Ô(9Ð:Ñ:Ô:ˆAØ�OŠO˜AÑÔÐà15´ð 	&ð 	&Ñ-ˆXÐ,Ø�OŠO˜HÑ%Ô%Ð%Ð%à×#Ò#¨EÐPUÐ#ÑVÔVˆØˆ=Ø×'Ò'­¬Ñ7Ô7×=Ò=Ñ?Ô?ˆBØ�IŠI�b×+Ò+­D¬IÑ6Ô6×<Ò<Ñ>Ô>Ñ?Ô?Ð?Ø×ÒÑÔÐØˆ
r(   é   c           	     óô  — |€t          j        ¦   «         }|€t          j        d¦  «        }g }|                      ¦   «         }t          | j        ¦  «        dk    r4| j                             |¦  «         t          j	        | j        ¦  «        }nt          j
        |¦  «        }t          |                     ¦   «         ¦  «        }|                     ¦   «         j        }d}||         }	||d                  d         }
t          j        |
|
j        j        | j        |||¦  «        }|	j        |_        |                     |¦  «         |dd…         D �])}|\  }}||         d         }
t          j        |
|
j        j        | j        |||¦  «        }t+          dt          ||         ¦  «        ¦  «        D ]4}||         |dz
           }|j        j                             ||f¦  «         Œ5||	j        |	j        z   k    r|dz  }||         }	|	j        |_        nOt+          t          ||         ¦  «        |dz   ¦  «        D ]!}|j        j                             |¦  «         Œ"d|_        |                     |¦  «         |}�Œ+|S )zÐ
        generates the segmentList from an fbList, including any overlaid Segments

        if fbRules is None, creates a new rules.Rules() object

        if maxPitch is None, uses pitch.Pitch('B5')
        NÚB5r    r   éÿÿÿÿr   )r   ÚRulesr
   ÚPitchr]   r#   re   rt   r   ÚextractHarmoniesÚcreateOffsetMappingÚsortedÚkeysr+   Únotesr   ÚOverlaidSegmentrr   rX   ri   ry   rU   ÚfbRulesÚ_partPitchLimitsÚoffsetÚ_partsToCheck)rk   r—   ÚnumPartsÚmaxPitchÚsegmentListr†   ÚcurrentMappingÚallKeysÚbassNoteIndexÚpreviousBassNoterW   ÚpreviousSegmentÚkÚ	startTimeÚunused_endTimeÚcurrentSegmentÚ
partNumberÚ
upperPitchs                     r'   ÚretrieveSegmentsz FiguredBassLine.retrieveSegmentsE  s”  € ð ˆ?Ý”k‘m”mˆGØÐÝ”{ 4Ñ(Ô(ˆHØˆØ×(Ò(Ñ*Ô*ˆÝˆtÔ"Ñ#Ô# qÒ(Ð(ØÔ×&Ò& xÑ0Ô0Ð0Ý$Ô5°dÔ6IÑJÔJˆNˆNå$Ô8¸ÑBÔBˆNÝ˜×,Ò,Ñ.Ô.Ñ/Ô/ˆØ×#Ò#Ñ%Ô%Ô+ˆØˆØ# MÔ2ÐØ! '¨!¤*Ô-¨bÔ1ˆÝ!Ô1°(¸HÔ<NÔ<]Ø37´=Ø3:¸HÀhñPô Pˆð )9Ô(FˆÔ%Ø×Ò˜?Ñ+Ô+Ð+Ø˜˜˜”ð 	-ñ 	-ˆAØ*+Ñ'ˆY˜Ø% aÔ(¨Ô,ˆHÝ$Ô4°X¸xÔ?QÔ?`Ø6:´mØ6=¸xÈñSô SˆNõ $ A¥s¨>¸!Ô+<Ñ'=Ô'=Ñ>Ô>ð Yð Y�
Ø+¨AÔ.¨z¸A©~Ô>�
ØÔ&Ô7×>Ò>À
ÈJÐ?WÑXÔXÐXÐXØÐ,Ô3Ð6FÔ6TÑTÒTÐTØ Ñ"�Ø#+¨MÔ#:Ð Ø/?Ô/M�Ô,Ð,å"'­¨N¸1Ô,=Ñ(>Ô(>ÀÈ1ÁÑ"MÔ"Mð Mð M�JØ#Ô+Ô9×@Ò@ÀÑLÔLÐLÐLð 03�Ô,Ø×Ò˜~Ñ.Ô.Ð.Ø,ˆO‰OØÐr(   c                ó:   — | j                              |¦  «         d S ©N)re   rt   )rk   Úmusic21Parts     r'   ÚoverlayPartzFiguredBassLine.overlayParty  s   € ØÔ×"Ò" ;Ñ/Ô/Ð/Ð/Ð/r(   c           	     óV  — |€t          j        ¦   «         }|€t          j        d¦  «        }g }d}| j        D ]-}	 |j        }n# t          $ r Y Œw xY wd|v r nd|v sd|v rd} nŒ.|râ| j        D ]Ù}g }	|j        D ]}
|	                     |
j	        ¦  «         Œi }|	D ]}|||<   Œ| 
                    ¦   «         }d„ }t          j        |                     ¦   «         j         ||j        j        ¦  «        ¬	¦  «        }t#          j        || j        ||||¬
¦  «        } ||j        j        ¦  «        |_        |                     |¦  «         ŒÚn|                      |||¦  «        }t+          |¦  «        dk    rµt-          t+          |¦  «        dz
  ¦  «        D ]}||         }||dz            }|                     |¦  «        }t1          j        t4          ¦  «        |_        t5          |¦  «        }|D ]%\  }}|j        |                              |¦  «         Œ&Œ€|                      |¦  «         nSt+          |¦  «        dk    r/|d         }t5          |                     ¦   «         ¦  «        |_        n|st?          d¦  «        ‚tA          || j!        | j"        | j#        dd…         | j$        ¬¦  «        S )aA	  
        Creates a :class:`~music21.figuredBass.segment.Segment`
        for each (bassNote, notationString) pair
        added using :meth:`~music21.figuredBass.realizer.FiguredBassLine.addElement`.
        Each Segment is associated
        with the :class:`~music21.figuredBass.rules.Rules` object provided, meaning that rules are
        universally applied across all Segments. The number of parts in a realization
        (including the bass) can be controlled through numParts, and the maximum pitch can
        likewise be controlled through maxPitch.
        Returns a :class:`~music21.figuredBass.realizer.Realization`.

        If this method is called without having provided any (bassNote, notationString) pairs,
        a FiguredBassLineException is raised. If only one pair is provided, the Realization will
        contain :meth:`~music21.figuredBass.segment.Segment.allCorrectConsecutivePossibilities`
        for the one note.

        if `fbRules` is None, creates a new rules.Rules() object

        if `maxPitch` is None, uses pitch.Pitch('B5')

        >>> from music21.figuredBass import realizer
        >>> from music21.figuredBass import rules
        >>> fbLine = realizer.FiguredBassLine(key.Key('B'), meter.TimeSignature('3/4'))
        >>> fbLine.addElement(note.Note('B2'))
        >>> fbLine.addElement(note.Note('C#3'), '6')
        >>> fbLine.addElement(note.Note('D#3'), '6')
        >>> fbRules = rules.Rules()
        >>> r1 = fbLine.realize(fbRules)
        >>> r1.getNumSolutions()
        208
        >>> fbRules.forbidVoiceOverlap = False
        >>> r2 = fbLine.realize(fbRules)
        >>> r2.getNumSolutions()
        7908

        OMIT_FROM_DOCS
        >>> fbLine3 = realizer.FiguredBassLine(key.Key('C'), meter.TimeSignature('2/4'))
        >>> h1 = harmony.ChordSymbol('C')
        >>> h1.bass().octave = 4
        >>> fbLine3.addElement(h1)
        >>> h2 = harmony.ChordSymbol('G')
        >>> h2.bass().octave = 4
        >>> fbLine3.addElement(h2)
        >>> r3 = fbLine3.realize()
        >>> r3.getNumSolutions()
        13
        >>> fbLine4 = realizer.FiguredBassLine(key.Key('C'), meter.TimeSignature('2/4'))
        >>> fbLine4.addElement(roman.RomanNumeral('I'))
        >>> fbLine4.addElement(roman.RomanNumeral('IV'))
        >>> r4 = fbLine4.realize()
        >>> r4.getNumSolutions()
        13

        Nr�   Fr-   rp   rq   Tc                ó   — | dk    r| ndS )Nr   g      ð?rL   )Úys    r'   Úgz"FiguredBassLine.realize.<locals>.gÓ  s   € Ø ! S¢ ˜1˜1¨cÐ1r(   rx   )rW   ÚfbScaler—   r›   rœ   ÚlistOfPitchesr!   r    r   z/No (bassNote, notationString) pairs to realize.rŽ   )ÚrealizedSegmentListr_   r`   ÚoverlaidPartsr7   )%r   r�   r
   r�   rj   rs   ÚAttributeErrorÚpitchesrt   ÚnameÚvaluesr	   r-   ÚbassÚnameWithOctaveÚdurationry   r   ÚSegmentri   r©   r#   rU   Ú"allCorrectConsecutivePossibilitiesÚcollectionsÚdefaultdictÚlistÚ	movementsÚ_trimAllMovementsÚallCorrectSinglePossibilitiesÚcorrectAru   ÚRealizationr_   r`   re   r8   )rk   r—   r›   rœ   r�   ÚlistOfHarmonyObjectsÚitemrv   ÚharmonyObjectÚlistOfPitchesJustNamesÚ	thisPitchÚdÚxÚ
outputListr±   Ú
passedNoteÚcorrespondingSegmentÚsegmentIndexÚsegmentAÚsegmentBÚ	correctABÚlistABÚpossibAÚpossibBs                           r'   r^   zFiguredBassLine.realize|  sO  € ðp ˆ?Ý”k‘m”mˆGØÐÝ”{ 4Ñ(Ô(ˆHàˆà$ÐØ”Lð 
	ð 
	ˆDðØ”L��øÝ!ð ð ð Ø�ðøøøà˜ˆ{ˆ{Ø�à Ð"Ð" m°qÐ&8Ð&8Ø'+Ð$Ø�ð '9ð  ð 	MØ!%¤ð 9ð 9�Ø)+Ð&Ø!.Ô!6ð Bð B�IØ*×1Ò1°)´.ÑAÔAÐAÐAà�Ø/ð ð �AØ�A�a‘D�DØŸXšX™ZœZ�
ð2ð 2ð 2õ "œY }×'9Ò'9Ñ';Ô';Ô'JØ56°Q°}Ô7MÔ7[Ñ5\Ô5\ð^ñ ^ô ^�
å'.¤À
Ø?C¼}Ø?FØ@HØ@HØEOð(Qñ (Qô (QÐ$ð 67°Q°}Ô7MÔ7[Ñ5\Ô5\Ð$Ô2Ø×"Ò"Ð#7Ñ8Ô8Ð8Ð8ð-9ð2 ×/Ò/°¸À8ÑLÔLˆKåˆ{ÑÔ˜qÒ Ð Ý %¥c¨+Ñ&6Ô&6¸Ñ&:Ñ ;Ô ;ð @ð @�Ø& |Ô4�Ø& |°aÑ'7Ô8�Ø$×GÒGÈÑQÔQ�	Ý%0Ô%<½TÑ%BÔ%B�Ô"Ý˜i™œ�Ø*0ð @ð @Ñ&�W˜gØÔ& wÔ/×6Ò6°wÑ?Ô?Ð?Ð?ð@à×"Ò" ;Ñ/Ô/Ð/Ð/Ý�ÑÔ Ò"Ð"Ø" 1”~ˆHÝ $ X×%KÒ%KÑ%MÔ%MÑ NÔ NˆHÔÐØð 	^Ý*Ð+\Ñ]Ô]Ð]å¨{À$Ä*Ø"&¤+¸TÔ=PÐQRÐSUÐQUÔ=VØ'+Ô'8ð:ñ :ô :ð 	:s   ºAÁ
AÁAc                óœ  ‡— t          |¦  «        dk    st          |¦  «        dk    rdS t          |¦  «        dk    �r|                     ¦   «          d}t          dt          |¦  «        dz
  ¦  «        D ]•}||dz            j        }||         j        Št	          ‰                     ¦   «         ¦  «        D ]
\  }}|s‰|= Œt	          |                     ¦   «         ¦  «        D ](\  }}t	          t          ˆfd„|¦  «        ¦  «        ||<   Œ)Œ–t	          |                     ¦   «         ¦  «        D ]
\  }}|s||= Œ|                     ¦   «          dS dS )a£  
        Each :class:`~music21.figuredBass.segment.Segment` which resolves to another
        defines a list of movements, nextMovements. Keys for nextMovements are correct
        single possibilities of the current Segment. For a given key, a value is a list
        of correct single possibilities in the subsequent Segment representing acceptable
        movements between the two. There may be movements in a string of Segments which
        directly or indirectly lead nowhere. This method is designed to be called on
        a list of Segments **after** movements are found, as happens in
        :meth:`~music21.figuredBass.realizer.FiguredBassLine.realize`.
        r    r!   Té   Nc                ó   •— | ‰v S r«   rL   )ÚpossibBBÚmovementsBCs    €r'   ú<lambda>z3FiguredBassLine._trimAllMovements.<locals>.<lambda>  s   ø€ °¸[Ð1H€ r(   )r#   ÚreverserU   rÂ   rÁ   ÚitemsÚfilter)	rk   r�   ÚmovementsABrÑ   r×   ÚpossibCListrÖ   ÚpossibBListrÜ   s	           @r'   rÃ   z!FiguredBassLine._trimAllMovementsø  s“  ø€ õ ˆ{ÑÔ˜qÒ Ð ¥C¨Ñ$4Ô$4¸Ò$9Ð$9Ø�4Ý�ÑÔ Ò"Ñ"Ø×ÒÑ!Ô!Ð!àˆKÝ % a­¨[Ñ)9Ô)9¸AÑ)=Ñ >Ô >ð 	Yð 	Y�Ø)¨,¸Ñ*:Ô;ÔE�Ø)¨,Ô7ÔA�å.2°;×3DÒ3DÑ3FÔ3FÑ.GÔ.Gð 1ð 1Ñ*�W˜kØ&ð 1Ø'¨Ð0øÝ.2°;×3DÒ3DÑ3FÔ3FÑ.GÔ.Gð Yð YÑ*�W˜kÝ+/ÝÐIÐIÐIÐIÈ;ÑWÔWñ,Yô ,Y�K Ñ(Ð(ðYõ +/¨{×/@Ò/@Ñ/BÔ/BÑ*CÔ*Cð -ð -Ñ&�˜+Ø"ð -Ø# GÐ,øà×ÒÑ!Ô!Ð!Ø�4ð) #Ð"r(   )NNr«   )rm   rn   )Nr‹   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú
_DOC_ORDERrb   Ú__annotations__rl   r<   r]   r©   r­   r^   rÃ   rL   r(   r'   r   r   ¿   sá   € € € € € € ðð ð" ?Ð>Ð>€Jðð
ð!ð !€Ið ð ð ñ ðð ð ð ð%ð %ð %ð %ð %ðN0ð 0ð 0ðd2ð 2ð 2ð 2ðh0ð 0ð 0ðz:ð z:ð z:ð z:ðx!ð !ð !ð !ð !r(   c                  ó`   — e Zd ZU dZg d¢ZddiZded<   d„ Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zd„ Zdd„ZdS )rÆ   a@  
    Returned by :class:`~music21.figuredBass.realizer.FiguredBassLine` after calling
    :meth:`~music21.figuredBass.realizer.FiguredBassLine.realize`. Allows for the
    generation of realizations as a :class:`~music21.stream.Score`.

    * See the :mod:`~music21.figuredBass.examples` module for examples on the generation
      of realizations.
    * A possibility progression is a valid progression through a string of
      :class:`~music21.figuredBass.segment.Segment` instances.
      See :mod:`~music21.figuredBass.possibility` for more details on possibilities.
    )ÚgetNumSolutionsÚgenerateRandomRealizationÚgenerateRandomRealizationsÚgenerateAllRealizationsÚgetAllPossibilityProgressionsÚgetRandomPossibilityProgressionÚ-generateRealizationFromPossibilityProgressionÚkeyboardStyleOutputa  
            True by default. If True, generated realizations
            are represented in keyboard style, with two staves. If False,
            realizations are represented in chorale style with n staves,
            where n is the number of parts. SATB if n = 4.ra   rb   c                ó  — d|v r|d         | _         d|v r0|d         | _        t          j        | j        j        ¦  «        | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d| _	        d S )Nr´   r_   r`   rµ   r7   T)
Ú_segmentListÚ_inKeyr   r0   r~   Ú_keySigÚ_inTimere   r8   rò   )rk   ÚfbLineOutputss     r'   rl   zRealization.__init__4  sž   € à  MÐ1Ð1Ø -Ð.CÔ DˆDÔØ�mÐ#Ð#Ø'¨Ô0ˆDŒKÝÔ+¨D¬KÔ,>Ñ?Ô?ˆDŒLØ�}Ð$Ð$Ø(¨Ô2ˆDŒLØ˜mÐ+Ð+Ø"/°Ô"@ˆDÔØ˜MÐ)Ð)Ø -¨mÔ <ˆDÔØ#'ˆÔ Ð Ð r(   c                ó  — t          | j        ¦  «        dk    rt          | j        d         j        ¦  «        S | j                             ¦   «          i }t	          dt          | j        ¦  «        ¦  «        D ]i}| j        |         }i }|s(|j        D ]}t          |j        |         ¦  «        ||<   Œ n,|j        D ]$}d}|j        |         D ]}|||         z  }Œ|||<   Œ%|}Œjd}|D ]}|||         z  }Œ| j                             ¦   «          |S )aÝ  
        Returns the number of solutions (unique realizations) to a Realization by calculating
        the total number of paths through a string of :class:`~music21.figuredBass.segment.Segment`
        movements. This is faster and more efficient than compiling each unique realization into a
        list, adding it to a master list, and then taking the length of the master list.

        >>> from music21.figuredBass import examples
        >>> fbLine = examples.exampleB()
        >>> fbRealization = fbLine.realize()
        >>> fbRealization.getNumSolutions()
        422
        >>> fbLine2 = examples.exampleC()
        >>> fbRealization2 = fbLine2.realize()
        >>> fbRealization2.getNumSolutions()
        833
        r    r   )r#   rô   rÅ   rÞ   rU   rÂ   )	rk   ÚpathListrÑ   rÒ   ÚnewPathListrÖ   Ú	prevValuer×   ÚnumSolutionss	            r'   rë   zRealization.getNumSolutionsC  sW  € õ" ˆtÔ Ñ!Ô! QÒ&Ð&Ý�tÔ(¨Ô+Ô4Ñ5Ô5Ð5àÔ×!Ò!Ñ#Ô#Ð#ØˆÝ! !¥S¨Ô):Ñ%;Ô%;Ñ<Ô<ð 	#ð 	#ˆLØÔ(¨Ô6ˆHØˆKØð 5Ø'Ô1ð Lð L�GÝ+.¨xÔ/AÀ'Ô/JÑ+KÔ+K�K Ñ(Ð(ðLð  (Ô1ð 5ð 5�GØ !�IØ#+Ô#5°gÔ#>ð 7ð 7˜Ø! X¨gÔ%6Ñ6˜	˜	Ø+4�K Ñ(Ð(Ø"ˆHˆHàˆØð 	.ð 	.ˆGØ˜H WÔ-Ñ-ˆLˆLØÔ×!Ò!Ñ#Ô#Ð#ØÐr(   c                óˆ  — g }t          | j        ¦  «        dk    r-| j        d         j        D ]}|                     |g¦  «         Œ|S | j        d         j        }|D ]&}||         }|D ]}|                     ||g¦  «         ŒŒ't          dt          | j        ¦  «        dz
  ¦  «        D ]™}| j        |         j        }t          t          |¦  «        ¦  «        D ]h}|                     d¦  «        }|d         }||         D ]@}	t          j        |¦  «        }
|
                     |	¦  «         |                     |
¦  «         ŒAŒiŒš|S )a  
        Compiles each unique possibility progression, adding
        it to a master list. Returns the master list.

        .. warning:: This method is unoptimized, and may take a prohibitive amount
            of time for a Realization which has more than 200,000 solutions.
        r    r   rŽ   )r#   rô   rÅ   rt   rÂ   rU   Úpopr   )rk   ÚprogressionsrÖ   ÚcurrMovementsrã   r×   rÑ   Úunused_progressionIndexÚprogressionÚpossibCÚnewProgressions              r'   rï   z)Realization.getAllPossibilityProgressionsm  sˆ  € ð ˆÝˆtÔ Ñ!Ô! QÒ&Ð&ØÔ,¨QÔ/Ô8ð /ð /�Ø×#Ò# W IÑ.Ô.Ð.Ð.ØÐàÔ)¨!Ô,Ô6ˆØ$ð 	8ð 	8ˆGØ'¨Ô0ˆKØ&ð 8ð 8�Ø×#Ò# W¨gÐ$6Ñ7Ô7Ð7Ð7ð8õ " !¥S¨Ô):Ñ%;Ô%;¸aÑ%?Ñ@Ô@ð 	8ð 	8ˆLØ Ô-¨lÔ;ÔEˆMÝ+0µ°\Ñ1BÔ1BÑ+CÔ+Cð 8ð 8Ð'Ø*×.Ò.¨qÑ1Ô1�Ø% bœ/�Ø,¨WÔ5ð 8ð 8�GÝ%)¤Y¨{Ñ%;Ô%;�NØ"×)Ò)¨'Ñ2Ô2Ð2Ø ×'Ò'¨Ñ7Ô7Ð7Ð7ð8ð8ð Ðr(   c                ó–  — g }t          | j        ¦  «        dk    rBt          j        | j        d         j        d¦  «        d         }|                     |¦  «         |S | j        d         j        }|                      ¦   «         dk    rt          d¦  «        ‚t          j        | 	                    ¦   «         d¦  «        d         }|                     |¦  «         t          t          | j        ¦  «        dz
  ¦  «        D ]L}| j        |         j        }t          j        ||         d¦  «        d         }|                     |¦  «         |}ŒM|S )zB
        Returns a random unique possibility progression.
        r    r   úZero solutions)r#   rô   ÚrandomÚsamplerÅ   rt   rÂ   rë   ru   r”   rU   )rk   r  rÖ   r  Ú
prevPossibrÑ   Ú
nextPossibs          r'   rð   z+Realization.getRandomPossibilityProgression�  s9  € ð ˆÝˆtÔ Ñ!Ô! QÒ&Ð&Ý”m DÔ$5°aÔ$8Ô$AÀ1ÑEÔEÀaÔHˆGØ×Ò˜wÑ'Ô'Ð'ØÐàÔ)¨!Ô,Ô6ˆØ×ÒÑ!Ô! QÒ&Ð&Ý*Ð+;Ñ<Ô<Ð<Ý”] =×#5Ò#5Ñ#7Ô#7¸Ñ;Ô;¸AÔ>ˆ
Ø×Ò˜:Ñ&Ô&Ð&å!¥# dÔ&7Ñ"8Ô"8¸1Ñ"<Ñ=Ô=ð 	$ð 	$ˆLØ Ô-¨lÔ;ÔEˆMÝœ }°ZÔ'@À!ÑDÔDÀQÔGˆJØ×Ò˜zÑ*Ô*Ð*Ø#ˆJˆJàÐr(   c                ój
  — t          j        ¦   «         }t          j        ¦   «         }|                     t	          j        | j        ¦  «        t	          j        | j        ¦  «        g¦  «         d}| j        dk    rAt          j
        | j        ¬¦  «        }|                     t	          j        |¦  «        ¦  «         | j        �r½t          j        ¦   «         }|                     d|¦  «         |                     t	          j        | j        ¦  «        t	          j        | j        ¦  «        g¦  «         |�'|                     t	          j        |¦  «        ¦  «         t          t          | j        ¦  «        ¦  «        D ]�}||         }| j        |         j        }|                     t	          j        |¦  «        ¦  «         |dd…         }	t#          j        |	¦  «        }
| j        |         j        |
_        |                     |
¦  «         ŒŽ|                     dt)          j        ¦   «         ¦  «         |                     dd¬¦  «         |�5|d                              d	¦  «         |d                              ¦   «          �n)g }t          t          |d         ¦  «        d
z
  ¦  «        D ]®}t          j        ¦   «         }|                     d|¦  «         |                     t	          j        | j        ¦  «        t	          j        | j        ¦  «        g¦  «         |�'|                     t	          j        |¦  «        ¦  «         |                     |¦  «         Œ¯t          t          | j        ¦  «        ¦  «        D ]±}||         }| j        |         j        }|                     t	          j        |¦  «        ¦  «         t          t          |¦  «        d
z
  ¦  «        D ]N}t          j        ||         ¦  «        }| j        |         j        |_        ||                              |¦  «         ŒOŒ²|D ]}}t)          j        |dd¬¦  «        }|                     d|¦  «         |                     dd¬¦  «         |�5|d                              d	¦  «         |d                              ¦   «          Œ~|                     dt)          j        ¦   «         ¦  «         |                     dd¬¦  «         |�5|d                              d	¦  «         |d                              ¦   «          |                     d|¦  «         |S )zn
        Generates a realization as a :class:`~music21.stream.Score` given a possibility progression.
        Nr   rx   r   rŽ   TFrz   rÙ   r    )ÚallowTreble8vbÚrecurse)r   ÚScorerd   rt   r   r€   rö   r÷   r8   r	   r�   rò   ÚinsertrU   r#   rô   rW   r   ÚChordry   r   Ú
TrebleClefr‚   rÿ   r…   r-   ÚbestClefr}   )rk   ÚpossibilityProgressionÚsolr†   r‡   Ú	rightHandrÑ   rÖ   rW   Ú	rhPitchesÚrhChordÚ
upperPartsÚ_partNumberÚfbPartr§   Ún1Ú	upperPartrv   s                     r'   rñ   z9Realization.generateRealizationFromPossibilityProgression¥  s•  € õ Œl‰nŒnˆå”;‘=”=ˆØ�Š�œ t¤|Ñ4Ô4µd´mÀDÄLÑ6QÔ6QÐRÑSÔSÐSØˆØÔ Ò#Ð#Ý”	¨Ô(9Ð:Ñ:Ô:ˆAØ�OŠO�DœM¨!Ñ,Ô,Ñ-Ô-Ð-àÔ#ñ 0	2Ýœ™œˆIØ�JŠJ�s˜IÑ&Ô&Ð&Ø×Ò�dœm¨D¬LÑ9Ô9½4¼=ÈÌÑ;VÔ;VÐWÑXÔXÐXØˆ}Ø× Ò ¥¤¨qÑ!1Ô!1Ñ2Ô2Ð2å %¥c¨$Ô*;Ñ&<Ô&<Ñ =Ô =ð *ð *�Ø0°Ô>�ØÔ,¨\Ô:ÔC�Ø—’¥¤¨hÑ 7Ô 7Ñ8Ô8Ð8Ø# A b DœM�	Ýœ+ iÑ0Ô0�Ø(,Ô(9¸,Ô(GÔ(U�Ô%Ø× Ò  Ñ)Ô)Ð)Ð)Ø×Ò˜S¥$¤/Ñ"3Ô"3Ñ4Ô4Ð4à×"Ò"¨4ÈeÐ"ÑTÔTÐTØˆ}Ø˜!”× Ò  Ñ#Ô#Ð#Ø˜!”×+Ò+Ñ-Ô-Ð-ùð ˆJÝ$¥SÐ)?ÀÔ)BÑ%CÔ%CÀaÑ%GÑHÔHð *ð *�Ýœ™œ�Ø—
’
˜3 Ñ'Ô'Ð'Ø—’�tœ}¨T¬\Ñ:Ô:½D¼MÈ$Ì,Ñ<WÔ<WÐXÑYÔYÐYØ�=Ø—M’M¥$¤-°Ñ"2Ô"2Ñ3Ô3Ð3Ø×!Ò! &Ñ)Ô)Ð)Ð)å %¥c¨$Ô*;Ñ&<Ô&<Ñ =Ô =ð 6ð 6�Ø0°Ô>�ØÔ,¨\Ô:ÔC�Ø—’¥¤¨hÑ 7Ô 7Ñ8Ô8Ð8å"'­¨G©¬°qÑ(8Ñ"9Ô"9ð 6ð 6�JÝœ 7¨:Ô#6Ñ7Ô7�BØ'+Ô'8¸Ô'FÔ'T�BÔ$Ø˜zÔ*×1Ò1°"Ñ5Ô5Ð5Ð5ð6ð
 (ð 2ð 2�	Ý”M )¸DÈ$ÐOÑOÔO�Ø× Ò   aÑ(Ô(Ð(Ø×&Ò&¨tÐRWÐ&ÑXÔXÐXØ�=Ø˜a”L×$Ò$ QÑ'Ô'Ð'Ø˜a”L×/Ò/Ñ1Ô1Ð1øà�Š˜�Tœ]™_œ_Ñ-Ô-Ð-Ø×Ò dÈÐÑOÔOÐOØˆ=Ø�QŒK�OŠO˜AÑÔÐØ�QŒK×&Ò&Ñ(Ô(Ð(Ø�
Š
�3˜Ñ!Ô!Ð!Øˆ
r(   c                óà  — t          j        ¦   «         }|                      ¦   «         }|st          d¦  «        ‚|                      |d         ¦  «        }|D ]}|                     |¦  «         Œt          dt          |¦  «        ¦  «        D ]b}|                      ||         ¦  «        }t          t          |¦  «        ¦  «        D ](}||         D ]}||                              |¦  «         ŒŒ)Œc|S )zõ
        Generates all unique realizations as a :class:`~music21.stream.Score`.

        .. warning:: This method is unoptimized, and may take a prohibitive amount
            of time for a Realization which has more than 100 solutions.
        r  r   r    )r   r  rï   ru   rñ   rt   rU   r#   )	rk   ÚallSolsÚpossibilityProgressionsÚsol0r¬   ÚpossibIndexÚsolXÚ	partIndexÚmusic21Measures	            r'   rî   z#Realization.generateAllRealizationsì  s  € õ ”,‘.”.ˆØ"&×"DÒ"DÑ"FÔ"FÐØ&ð 	=Ý*Ð+;Ñ<Ô<Ð<Ø×AÒAÐBYÐZ[ÔB\Ñ]Ô]ˆØð 	(ð 	(ˆKØ�NŠN˜;Ñ'Ô'Ð'Ð'å  ¥CÐ(?Ñ$@Ô$@ÑAÔAð 	>ð 	>ˆKØ×EÒEØ'¨Ô4ñ6ô 6ˆDå"¥3 t¡9¤9Ñ-Ô-ð >ð >�	Ø&*¨9¤oð >ð >�NØ˜IÔ&×-Ò-¨nÑ=Ô=Ð=Ð=ð>ð>ð ˆr(   c                óT   — |                       ¦   «         }|                      |¦  «        S )z\
        Generates a random unique realization as a :class:`~music21.stream.Score`.
        )rð   rñ   )rk   r  s     r'   rì   z%Realization.generateRandomRealization  s+   € ð "&×!EÒ!EÑ!GÔ!GÐØ×AÒAÐBXÑYÔYÐYr(   é   c                ó¸  — ||                       ¦   «         k    r|                      ¦   «         S t          j        ¦   «         }|                      ¦   «         }|D ]}|                     |¦  «         Œt          d|¦  «        D ][}|                      ¦   «         }t          t          |¦  «        ¦  «        D ](}||         D ]}||                              |¦  «         ŒŒ)Œ\|S )zõ
        Generates *amountToGenerate* unique realizations as a :class:`~music21.stream.Score`.

        .. warning:: This method is unoptimized, and may take a prohibitive amount
            of time if amountToGenerate is more than 100.
        r    )rë   rî   r   r  rì   rt   rU   r#   )	rk   ÚamountToGenerater  r!  r¬   Úunused_counter_solutionr#  r$  r%  s	            r'   rí   z&Realization.generateRandomRealizations  sö   € ð ˜d×2Ò2Ñ4Ô4Ò4Ð4Ø×/Ò/Ñ1Ô1Ð1å”,‘.”.ˆØ×-Ò-Ñ/Ô/ˆØð 	(ð 	(ˆKØ�NŠN˜;Ñ'Ô'Ð'Ð'å',¨QÐ0@Ñ'AÔ'Að 	>ð 	>Ð#Ø×1Ò1Ñ3Ô3ˆDÝ"¥3 t¡9¤9Ñ-Ô-ð >ð >�	Ø&*¨9¤oð >ð >�NØ˜IÔ&×-Ò-¨nÑ=Ô=Ð=Ð=ð>ð>ð ˆr(   N)r'  )rä   rå   ræ   rç   rè   rb   ré   rl   rë   rï   rð   rñ   rî   rì   rí   rL   r(   r'   rÆ   rÆ     sß   € € € € € € ð
ð 
ðCð Cð C€Jð
 	ð  >ð!€Ið ð ð ñ ð(ð (ð (ð(ð (ð (ðTð ð ð@ð ð ð0Eð Eð EðNð ð ð0Zð Zð Zðð ð ð ð ð r(   rÆ   c                  ó   — e Zd ZdS )ru   N)rä   rå   ræ   rL   r(   r'   ru   ru   '  s   € € € € € Ø€Dr(   ru   c                  ó   — e Zd Zd„ ZdS )ÚTestc                ó  — ddl m} |                     dd¬¦  «        }|t          j                 d         }|                      |j        d¦  «         t          |¦  «        }|                      |j        j	        d¦  «         d	|_        t          |¦  «        }|                      |j        j	        d
¦  «         d|_        t          |¦  «        }|                      |j        j	        d¦  «         d|_        t          |¦  «        }|                      |j        j	        d¦  «         dD ]f}|  
                    |¬¦  «        5  ||_        t          |¦  «        }|                      |j        j	        |¦  «         d d d ¦  «         n# 1 swxY w Y   Œgd S )Nr   )Ú	converterz#tinynotation: 4/4 C4 F4 G4_64 G4 C1F)r‚   r!   Ú64z6, 4z#6#42z	#6, #4, 2z#64#2z	#6, 4, #2z6
4r   )Úsingle_symbol)Úmusic21r/  Úparser	   r-   ÚassertEqualÚlyricrI   rr   rX   ÚsubTest)rk   r/  ÚsÚ
third_noteÚ	unused_fbr1  s         r'   ÚtestMultipleFiguresInLyriczTest.testMultipleFiguresInLyric.  sÜ  € Ø%Ð%Ð%Ð%Ð%Ð%à�OŠOÐAÐPUˆOÑVÔVˆØ•t”y”\ !”_ˆ
Ø×Ò˜Ô)¨4Ñ0Ô0Ð0Ý)¨!Ñ,Ô,ˆ	Ø×Ò˜Ô-Ô<¸fÑEÔEÐEà"ˆ
ÔÝ)¨!Ñ,Ô,ˆ	Ø×Ò˜Ô-Ô<¸kÑJÔJÐJà"ˆ
ÔÝ)¨!Ñ,Ô,ˆ	Ø×Ò˜Ô-Ô<¸kÑJÔJÐJð "ˆ
ÔÝ)¨!Ñ,Ô,ˆ	Ø×Ò˜Ô-Ô<¸fÑEÔEÐEð $ð 	Uð 	UˆMØ—’¨M�Ñ:Ô:ð Uð UØ#0�
Ô Ý1°!Ñ4Ô4�	Ø× Ò  Ô!5Ô!DÀmÑTÔTÐTðUð Uð Uñ Uô Uð Uð Uð Uð Uð Uð Uøøøð Uð Uð Uð Uøð	Uð 	Us   Ä<7E?Å?F	ÆF	N)rä   rå   ræ   r:  rL   r(   r'   r-  r-  -  s(   € € € € € ðUð Uð Uð Uð Ur(   r-  Ú__main__)r   r   r   r   r«   )#rç   Ú
__future__r   r¿   r   r  Útypingr5   Úunittestr2  r   r   r   r   r   r	   r
   r   Úmusic21.figuredBassr   r   r   r   r   rI   r[   r   rÆ   rè   ÚMusic21Exceptionru   ÚTestCaser-  rä   ÚmainTestrL   r(   r'   ú<module>rC     s|  ððð ð< #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø (Ð (Ð (Ð (Ð (Ð (Ø -Ð -Ð -Ð -Ð -Ð -Ø %Ð %Ð %Ð %Ð %Ð %Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'ð_ð _ð _ð _ðD=ð =ð =ð =ð<Zð Zð Zð Zð Zñ Zô Zð Zðz
Dð Dð Dð Dð Dñ Dô Dð DðN $Ð%8Ø˜{ð,€
ð	ð 	ð 	ð 	ð 	˜|Ô<ñ 	ô 	ð 	ðUð Uð Uð Uð Uˆ8Ôñ Uô Uð Uð> ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr(   