.. _moduleRepeat:

music21.repeat
==============

.. WARNING: DO NOT EDIT THIS FILE: AUTOMATICALLY GENERATED. Edit the .py file directly

.. module:: music21.repeat


This module provides the base class for all RepeatMark objects: entities that denote repeats.

Some RepeatMark objects are Expression objects; others are Bar objects. See for instance,
:class:`~music21.bar.Repeat` which represents a normal barline repeat.





.. function:: insertRepeatEnding(s, start, end, endingNumber=1, inPlace=False)


    Designates a range of measures as being repeated endings (i.e. first and second endings)
    within a stream s, where s either contains measures,
    or contains parts which contain measures.  Start and end are integers corresponding to the first and last measure
    number of the "repeatNum" ending.  e.g. if start=6, end=7, and repeatNum=2, the method adds a second ending
    from measures 6 to 7.

    Does not (yet) add a :class:`~music21.bar.RepeatMark` to the end of the first ending.

    Example: create first and second endings over measures 4-6 and measures 11-13 of a chorale, respectively.



    >>> from music21 import *
    >>> c1 = corpus.parse(corpus.getBachChorales()[1])
    >>> repeat.insertRepeatEnding(c1,  4,  6, 1, inPlace=True)
    >>> repeat.insertRepeatEnding(c1, 11, 13, 2, inPlace=True)

    We now have 8 repeatBrackets since each part gets its own first and second ending.



    >>> repeatBrackets = c1.flat.getElementsByClass(spanner.RepeatBracket)
    >>> len(repeatBrackets)
    8
    >>> len(c1.parts[0].getElementsByClass(spanner.RepeatBracket))
    2



RepeatExpression
----------------

Inherits from: :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: RepeatExpression()


    This class models any mark added to a Score to mark
    repeat start and end points that are designated by
    text expressions or symbols, such as D.S. Al Coda, etc.

    N.B. Repeat(Barline) objects are not RepeatExpression objects,
    but both are RepeatMark subclasses.

    This class stores internally a
    :class:`~music21.expressions.TextExpression`. This object
    is used for rendering text output in translation. A
    properly configured TextExpression object can also be
    used to create an instance of a RepeatExpressions.



    **RepeatExpression** **attributes**

        Attributes without Documentation: `useSymbol`

        Attributes inherited from :class:`~music21.base.Music21Object`: :attr:`~music21.base.Music21Object.classSortOrder`, :attr:`~music21.base.Music21Object.isSpanner`, :attr:`~music21.base.Music21Object.isStream`, :attr:`~music21.base.Music21Object.isVariant`, :attr:`~music21.base.Music21Object.hideObjectOnPrint`, :attr:`~music21.base.Music21Object.groups`, :attr:`~music21.base.Music21Object.id`

    **RepeatExpression** **properties**

        Properties inherited from :class:`~music21.base.Music21Object`: :attr:`~music21.base.Music21Object.activeSite`, :attr:`~music21.base.Music21Object.beat`, :attr:`~music21.base.Music21Object.beatDuration`, :attr:`~music21.base.Music21Object.beatStr`, :attr:`~music21.base.Music21Object.beatStrength`, :attr:`~music21.base.Music21Object.classes`, :attr:`~music21.base.Music21Object.derivationHierarchy`, :attr:`~music21.base.Music21Object.duration`, :attr:`~music21.base.Music21Object.isGrace`, :attr:`~music21.base.Music21Object.measureNumber`, :attr:`~music21.base.Music21Object.offset`, :attr:`~music21.base.Music21Object.priority`, :attr:`~music21.base.Music21Object.seconds`

        Properties inherited from :class:`~music21.base.JSONSerializer`: :attr:`~music21.base.JSONSerializer.json`

    **RepeatExpression** **methods**

        .. method:: applyTextFormatting(te=None)

            Apply the default text formatting to the text expression version of of this repeat



        .. method:: getText()

            Get the text used for this expression.



        .. method:: getTextExpression()

            Return a copy of the TextExpression stored in this object.



        .. method:: isValidText(value)

            Return True or False if the supplied text could be used for this RepeatExpression.



        .. method:: setText(value)

            Set the text of this repeat expression. This is also the primary way that the stored TextExpression object is created.



        .. method:: setTextExpression(value)

            Directly set a TextExpression object.



        Methods inherited from :class:`~music21.base.Music21Object`: :meth:`~music21.base.Music21Object.searchActiveSiteByAttr`, :meth:`~music21.base.Music21Object.getContextAttr`, :meth:`~music21.base.Music21Object.setContextAttr`, :meth:`~music21.base.Music21Object.addContext`, :meth:`~music21.base.Music21Object.addLocation`, :meth:`~music21.base.Music21Object.addLocationAndActiveSite`, :meth:`~music21.base.Music21Object.freezeIds`, :meth:`~music21.base.Music21Object.getAllContextsByClass`, :meth:`~music21.base.Music21Object.getCommonSiteIds`, :meth:`~music21.base.Music21Object.getCommonSites`, :meth:`~music21.base.Music21Object.getContextByClass`, :meth:`~music21.base.Music21Object.getOffsetBySite`, :meth:`~music21.base.Music21Object.getSiteIds`, :meth:`~music21.base.Music21Object.getSites`, :meth:`~music21.base.Music21Object.getSpannerSites`, :meth:`~music21.base.Music21Object.hasContext`, :meth:`~music21.base.Music21Object.hasSite`, :meth:`~music21.base.Music21Object.hasSpannerSite`, :meth:`~music21.base.Music21Object.hasVariantSite`, :meth:`~music21.base.Music21Object.isClassOrSubclass`, :meth:`~music21.base.Music21Object.mergeAttributes`, :meth:`~music21.base.Music21Object.next`, :meth:`~music21.base.Music21Object.previous`, :meth:`~music21.base.Music21Object.purgeLocations`, :meth:`~music21.base.Music21Object.purgeOrphans`, :meth:`~music21.base.Music21Object.purgeUndeclaredIds`, :meth:`~music21.base.Music21Object.removeLocationBySite`, :meth:`~music21.base.Music21Object.removeLocationBySiteId`, :meth:`~music21.base.Music21Object.setOffsetBySite`, :meth:`~music21.base.Music21Object.show`, :meth:`~music21.base.Music21Object.splitAtDurations`, :meth:`~music21.base.Music21Object.splitAtQuarterLength`, :meth:`~music21.base.Music21Object.splitByQuarterLengths`, :meth:`~music21.base.Music21Object.unfreezeIds`, :meth:`~music21.base.Music21Object.unwrapWeakref`, :meth:`~music21.base.Music21Object.wrapWeakref`, :meth:`~music21.base.Music21Object.write`

        Methods inherited from :class:`~music21.base.JSONSerializer`: :meth:`~music21.base.JSONSerializer.jsonAttributes`, :meth:`~music21.base.JSONSerializer.jsonComponentFactory`, :meth:`~music21.base.JSONSerializer.jsonPrint`, :meth:`~music21.base.JSONSerializer.jsonRead`, :meth:`~music21.base.JSONSerializer.jsonWrite`


RepeatExpressionMarker
----------------------

Inherits from: :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: RepeatExpressionMarker()


    Some repeat expressions are markers of positions
    in the score to jump to; these classes model those makers,
    such as Coda, Segno, and Fine, which are subclassed below.




Coda
----

Inherits from: :class:`~music21.repeat.RepeatExpressionMarker`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: Coda(text=None)

    The coda symbol, or the word coda, as placed in a score.



    >>> from music21 import *
    >>> rm = repeat.Coda()




Segno
-----

Inherits from: :class:`~music21.repeat.RepeatExpressionMarker`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: Segno()

    The segno sign as placed in a score.



    >>> from music21 import *
    >>> rm = repeat.Segno()
    >>> rm.useSymbol
    True





Fine
----

Inherits from: :class:`~music21.repeat.RepeatExpressionMarker`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: Fine()

    The fine word as placed in a score.



    >>> from music21 import *
    >>> rm = repeat.Fine()




RepeatExpressionCommand
-----------------------

Inherits from: :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: RepeatExpressionCommand()


    Some repeat expressions are commands, instructing
    the reader to go somewhere else. DaCapo and
    related are examples.



    **RepeatExpressionCommand** **attributes**

        Attributes without Documentation: `repeatAfterJump`

        Attributes inherited from :class:`~music21.repeat.RepeatExpression`: :attr:`~music21.repeat.RepeatExpression.useSymbol`

        Attributes inherited from :class:`~music21.base.Music21Object`: :attr:`~music21.base.Music21Object.classSortOrder`, :attr:`~music21.base.Music21Object.isSpanner`, :attr:`~music21.base.Music21Object.isStream`, :attr:`~music21.base.Music21Object.isVariant`, :attr:`~music21.base.Music21Object.hideObjectOnPrint`, :attr:`~music21.base.Music21Object.groups`, :attr:`~music21.base.Music21Object.id`

    **RepeatExpressionCommand** **properties**

        Properties inherited from :class:`~music21.base.Music21Object`: :attr:`~music21.base.Music21Object.activeSite`, :attr:`~music21.base.Music21Object.beat`, :attr:`~music21.base.Music21Object.beatDuration`, :attr:`~music21.base.Music21Object.beatStr`, :attr:`~music21.base.Music21Object.beatStrength`, :attr:`~music21.base.Music21Object.classes`, :attr:`~music21.base.Music21Object.derivationHierarchy`, :attr:`~music21.base.Music21Object.duration`, :attr:`~music21.base.Music21Object.isGrace`, :attr:`~music21.base.Music21Object.measureNumber`, :attr:`~music21.base.Music21Object.offset`, :attr:`~music21.base.Music21Object.priority`, :attr:`~music21.base.Music21Object.seconds`

        Properties inherited from :class:`~music21.base.JSONSerializer`: :attr:`~music21.base.JSONSerializer.json`

    **RepeatExpressionCommand** **methods**

        Methods inherited from :class:`~music21.repeat.RepeatExpression`: :meth:`~music21.repeat.RepeatExpression.applyTextFormatting`, :meth:`~music21.repeat.RepeatExpression.getText`, :meth:`~music21.repeat.RepeatExpression.getTextExpression`, :meth:`~music21.repeat.RepeatExpression.isValidText`, :meth:`~music21.repeat.RepeatExpression.setText`, :meth:`~music21.repeat.RepeatExpression.setTextExpression`

        Methods inherited from :class:`~music21.base.Music21Object`: :meth:`~music21.base.Music21Object.searchActiveSiteByAttr`, :meth:`~music21.base.Music21Object.getContextAttr`, :meth:`~music21.base.Music21Object.setContextAttr`, :meth:`~music21.base.Music21Object.addContext`, :meth:`~music21.base.Music21Object.addLocation`, :meth:`~music21.base.Music21Object.addLocationAndActiveSite`, :meth:`~music21.base.Music21Object.freezeIds`, :meth:`~music21.base.Music21Object.getAllContextsByClass`, :meth:`~music21.base.Music21Object.getCommonSiteIds`, :meth:`~music21.base.Music21Object.getCommonSites`, :meth:`~music21.base.Music21Object.getContextByClass`, :meth:`~music21.base.Music21Object.getOffsetBySite`, :meth:`~music21.base.Music21Object.getSiteIds`, :meth:`~music21.base.Music21Object.getSites`, :meth:`~music21.base.Music21Object.getSpannerSites`, :meth:`~music21.base.Music21Object.hasContext`, :meth:`~music21.base.Music21Object.hasSite`, :meth:`~music21.base.Music21Object.hasSpannerSite`, :meth:`~music21.base.Music21Object.hasVariantSite`, :meth:`~music21.base.Music21Object.isClassOrSubclass`, :meth:`~music21.base.Music21Object.mergeAttributes`, :meth:`~music21.base.Music21Object.next`, :meth:`~music21.base.Music21Object.previous`, :meth:`~music21.base.Music21Object.purgeLocations`, :meth:`~music21.base.Music21Object.purgeOrphans`, :meth:`~music21.base.Music21Object.purgeUndeclaredIds`, :meth:`~music21.base.Music21Object.removeLocationBySite`, :meth:`~music21.base.Music21Object.removeLocationBySiteId`, :meth:`~music21.base.Music21Object.setOffsetBySite`, :meth:`~music21.base.Music21Object.show`, :meth:`~music21.base.Music21Object.splitAtDurations`, :meth:`~music21.base.Music21Object.splitAtQuarterLength`, :meth:`~music21.base.Music21Object.splitByQuarterLengths`, :meth:`~music21.base.Music21Object.unfreezeIds`, :meth:`~music21.base.Music21Object.unwrapWeakref`, :meth:`~music21.base.Music21Object.wrapWeakref`, :meth:`~music21.base.Music21Object.write`

        Methods inherited from :class:`~music21.base.JSONSerializer`: :meth:`~music21.base.JSONSerializer.jsonAttributes`, :meth:`~music21.base.JSONSerializer.jsonComponentFactory`, :meth:`~music21.base.JSONSerializer.jsonPrint`, :meth:`~music21.base.JSONSerializer.jsonRead`, :meth:`~music21.base.JSONSerializer.jsonWrite`


DaCapo
------

Inherits from: :class:`~music21.repeat.RepeatExpressionCommand`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: DaCapo(text=None)


    The Da Capo command, indicating a return to the beginning
    and a continuation to the end. By default,
    `repeatAfterJump` is False, indicating that any repeats
    encountered on the Da Capo repeat not be repeated.




DaCapoAlFine
------------

Inherits from: :class:`~music21.repeat.RepeatExpressionCommand`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: DaCapoAlFine(text=None)


    The Da Capo al Fine command, indicating a return to
    the beginning and a continuation to the
    :class:`~music21.repeat.Fine` object. By default,
    `repeatAfterJump` is False, indicating that any
    repeats encountered on the Da Capo repeat not
    be repeated.



    >>> from music21 import *
    >>> rm = repeat.DaCapoAlFine()




DaCapoAlCoda
------------

Inherits from: :class:`~music21.repeat.RepeatExpressionCommand`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: DaCapoAlCoda(text=None)


    The Da Capo al Coda command, indicating a return
    to the beginning and a continuation to the
    :class:`~music21.repeat.Coda` object. The music
    resumes at a second :class:`~music21.repeat.Coda`
    object. By default, `repeatAfterJump` is False,
    indicating that any repeats encountered on the
    Da Capo repeat not be repeated.



    >>> from music21 import *
    >>> rm = repeat.DaCapoAlCoda()




AlSegno
-------

Inherits from: :class:`~music21.repeat.RepeatExpressionCommand`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: AlSegno(text=None)


    Jump to the sign. Presumably a forward jump, not a repeat.



    >>> from music21 import *
    >>> rm = repeat.AlSegno()




DalSegno
--------

Inherits from: :class:`~music21.repeat.RepeatExpressionCommand`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: DalSegno(text=None)


    The Dal Segno command, indicating a return to the segno
    and a continuation to the end. By default, `repeatAfterJump`
    is False, indicating that any repeats encountered on
    the Da Capo repeat not be repeated.



    >>> from music21 import *
    >>> rm = repeat.DaCapoAlFine()




DalSegnoAlFine
--------------

Inherits from: :class:`~music21.repeat.RepeatExpressionCommand`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: DalSegnoAlFine(text=None)


    The Dal Segno al Fine command, indicating a return to the
    segno and a continuation to the :class:`~music21.repeat.Fine`
    object. By default, `repeatAfterJump` is False, indicating
    that any repeats encountered on the Dal Segno repeat not
    be repeated.



    >>> from music21 import *
    >>> rm = repeat.DaCapoAlFine()




DalSegnoAlCoda
--------------

Inherits from: :class:`~music21.repeat.RepeatExpressionCommand`, :class:`~music21.repeat.RepeatExpression`, :class:`~music21.repeat.RepeatMark`, :class:`~music21.expressions.Expression`, :class:`~music21.base.Music21Object`, :class:`~music21.base.JSONSerializer`

.. class:: DalSegnoAlCoda(text=None)


    The Dal Segno al Coda command, indicating a return to the
    beginning and a continuation to the :class:`~music21.repeat.Coda`
    object. The music resumes at a second
    :class:`~music21.repeat.Coda` object. By default,
    `repeatAfterJump` is False, indicating that any repeats encountered
    on the Da Segno repeat not be repeated.



    >>> from music21 import *
    >>> rm = repeat.DaCapoAlCoda()




Expander
--------



.. class:: Expander(streamObj=None)


    The Expander object can expand a single Part or Part-like Stream with repeats. Nested
    repeats given with :class:`~music21.bar.Repeat` objects, or
    repeats and sections designated with
    :class:`~music21.repeat.RepeatExpression` objects, are all expanded.

    This class is a utility processor. Direct usage is more commonly
    from the :meth:`~music21.stream.Stream.expandRepeats` method.

    To use this object directly, call :meth:`~music21.repeat.Expander.process` on the
    score



    >>> from music21 import *
    >>> s = converter.parse('tinynotation: 3/4 C4 D E')
    >>> s.makeMeasures(inPlace = True)
    >>> s.measure(1).rightBarline = bar.Repeat(direction='end', times=3)
    >>> e = repeat.Expander(s)
    >>> s2 = e.process()
    >>> s2.show('text')
    {0.0} <music21.stream.Measure 1 offset=0.0>
        {0.0} <music21.clef.BassClef>
        {0.0} <music21.meter.TimeSignature 3/4>
        {0.0} <music21.note.Note C>
        {1.0} <music21.note.Note D>
        {2.0} <music21.note.Note E>
        {3.0} <music21.bar.Barline style=double>
    {3.0} <music21.stream.Measure 1 offset=3.0>
        {0.0} <music21.clef.BassClef>
        {0.0} <music21.meter.TimeSignature 3/4>
        {0.0} <music21.note.Note C>
        {1.0} <music21.note.Note D>
        {2.0} <music21.note.Note E>
        {3.0} <music21.bar.Barline style=double>
    {6.0} <music21.stream.Measure 1 offset=6.0>
        {0.0} <music21.clef.BassClef>
        {0.0} <music21.meter.TimeSignature 3/4>
        {0.0} <music21.note.Note C>
        {1.0} <music21.note.Note D>
        {2.0} <music21.note.Note E>
        {3.0} <music21.bar.Barline style=double>




    **Expander** **methods**

        .. method:: isExpandable()


            Return True or False if this Stream is expandable, that is,
            if it has balanced repeats or sensible da copo or dal segno
            indications.



        .. method:: process()


            Process all repeats. Note that this processing only
            happens for Measures contained in the given Stream.
            Other objects in that Stream are neither processed nor copied.




InsufficientLength
------------------

Inherits from: :class:`~exceptions.Exception`, :class:`~exceptions.BaseException`

.. class:: InsufficientLength



NoInternalStream
----------------

Inherits from: :class:`~exceptions.Exception`, :class:`~exceptions.BaseException`

.. class:: NoInternalStream



RepeatFinder
------------



.. class:: RepeatFinder(inpStream=None, defaultMeasureHashFunction=<function translateStreamToString at 0x032BA6F0>)


    An object for finding and simplifying repeated sections of music.

    Can be passed a stream which contains measures, or which contains parts which contain measures.

    the defaultMeasureHashFunction is a function that hashes a measure to search for similar passages.
    By default it's search.translateStreamToString.



    **RepeatFinder** **attributes**

        .. attribute:: defaultHash


            takes a stream of notesAndRests only and returns
            a string for searching on.



            >>> from music21 import *
            >>> s = converter.parse("c4 d8 r16 FF8. a'8 b-2.", "3/4")
            >>> sn = s.flat.notesAndRests
            >>> streamString = search.translateStreamToString(sn)
            >>> print streamString
            <P>F<)KQFF_
            >>> len(streamString)
            12



        Attributes without Documentation: `mList`, `s`, `mGroups`

    **RepeatFinder** **methods**

        .. method:: deleteMeasures(toDelete, inPlace=False)


            Given a stream s and a list of number toDelete, removes each measure with a number
            corresponding to a number in toDelete.  Renumbers the remaining measures in the stream.

            Can take as input either a stream of measures, or a stream of parts containing measures.




            >>> from music21 import *
            >>> from copy import deepcopy
            >>> chorale1 = corpus.parse(corpus.getBachChorales()[1])
            >>> s = deepcopy(chorale1)
            >>> repeat.RepeatFinder(s).deleteMeasures([6, 3, 4], inPlace=True)
            >>> m2 = search.translateStreamToString( chorale1.parts[1].measure(2).notesAndRests)
            >>> resm2 = search.translateStreamToString( s.parts[1].measure(2).notesAndRests)
            >>> m2 == resm2
            True
            >>> m5 = search.translateStreamToString( chorale1.parts[1].measure(5).notesAndRests)
            >>> resm3 = search.translateStreamToString( s.parts[1].measure(3).notesAndRests)
            >>> m5 == resm3
            True
            >>> m7 = search.translateStreamToString( chorale1.parts[1].measure(7).notesAndRests)
            >>> resm4 = search.translateStreamToString( s.parts[1].measure(4).notesAndRests)
            >>> m7 == resm4
            True
            >>> lenS = len(s.parts[0].getElementsByClass(stream.Measure))
            >>> lenChorale1 = len(chorale1.parts[0].getElementsByClass(stream.Measure))
            >>> lenS + 3 == lenChorale1
            True
            >>> chorale2 = corpus.parse(corpus.getBachChorales()[2])
            >>> s = deepcopy(chorale2)
            >>> repeat.RepeatFinder(s).deleteMeasures([3, 4, 5], True)
            >>> m2 = search.translateStreamToString( chorale2.parts[0].measure(2).notesAndRests)
            >>> resm2 = search.translateStreamToString( s.parts[0].measure(2).notesAndRests)
            >>> m3 = search.translateStreamToString( chorale2.parts[0].measure(3).notesAndRests)
            >>> m6 = search.translateStreamToString( chorale2.parts[0].measure(6).notesAndRests)
            >>> resm3 = search.translateStreamToString( s.parts[0].measure(3).notesAndRests)
            >>> m2 == resm2
            True
            >>> resm3 == m3
            False
            >>> resm3 == m6
            True
            >>> chorale3 = corpus.parse(corpus.getBachChorales()[3])
            >>> s = repeat.RepeatFinder(chorale3).deleteMeasures([2, 3])
            >>> len(s.parts[2].getElementsByClass(stream.Measure)) == len(chorale3.parts[2].getElementsByClass(stream.Measure)) - 2
            True
            >>> s = repeat.RepeatFinder(chorale3).deleteMeasures([2, 3])
            >>> len(s.parts[2].getElementsByClass(stream.Measure)) == len(chorale3.parts[2].getElementsByClass(stream.Measure)) - 2
            True
            >>> s = repeat.RepeatFinder(chorale3).deleteMeasures([999, 1001001])
            >>> len(s.parts[2]) == len(chorale3.parts[2])
            True




        .. method:: getMeasureSimilarityList(measureHashFunction=None)


            Returns a list mList = [ [2, 3], [3], ... ] such that measures i and j are the same, with i < j, if and only
            if mList[i] contains j.  NOTE: this function refers to the very first measure as measure 0 _regardless_ of whether
            s starts with measure 0 or 1 (i.e. treats a pickup bar as an entire measure).

            hashFunction is a function which takes a stream and hashes it to some type that can be compared with the '==' operator.
            Measures m and n are considered the same if the hashFunction(m) == hashFunction(n)



            >>> from music21 import *
            >>> chorales = corpus.getBachChorales()
            >>> chorale49 = corpus.parse(chorales[49])
            >>> repeat.RepeatFinder(chorale49).getMeasureSimilarityList()
            [[4], [5], [6], [7, 15], [], [], [], [15], [], [], [], [], [], [], [], []]
            >>> repeat.RepeatFinder(chorale49.parts[0]).getMeasureSimilarityList()
            [[4, 12], [5], [6], [7, 15], [12], [], [], [15], [], [], [], [], [], [], [], []]
            >>> chorale47 = corpus.parse(chorales[47])
            >>> repeat.RepeatFinder(chorale47).getMeasureSimilarityList()    #chorale47 has a pickup
            [[], [5], [6], [7], [], [], [], [], [], [], [], [], [], [], [], [], []]



        .. method:: getQuarterLengthOfPickupMeasure()



            Returns the number of quarterlengths of the pickup bar.
            If there is no pickup bar, returns 0.0



            >>> from music21 import *
            >>> chorales = corpus.getBachChorales()
            >>> noPickup = corpus.parse(chorales[1])
            >>> repeat.RepeatFinder(noPickup).getQuarterLengthOfPickupMeasure()
            0.0
            >>> hasPickup = corpus.parse(chorales[2])
            >>> repeat.RepeatFinder(hasPickup).getQuarterLengthOfPickupMeasure()
            1.0



        .. method:: hasPickup()


            Returns True if and only if the internal stream has a pickup bar.



            >>> from music21 import *
            >>> chorales = corpus.getBachChorales()
            >>> noPickup = corpus.parse(chorales[1])
            >>> repeat.RepeatFinder(noPickup).hasPickup()
            False
            >>> hasPickup = corpus.parse(chorales[2])
            >>> repeat.RepeatFinder(hasPickup).hasPickup()
            True



        .. method:: insertRepeat(barStart, barEnd, inPlace=False)


            Given a stream s, inserts a start-repeat at the beginning of the
            bar specified by barStart and inserts an end-repeat at the bar specified
            by barEnd.  Works on either a stream with measures, or a stream
            with parts containing measures.



            >>> from music21 import *
            >>> from copy import deepcopy
            >>> chorale1 = corpus.parse(corpus.getBachChorales()[1])
            >>> s = repeat.RepeatFinder(chorale1).insertRepeat(3, 6, inPlace=False)
            >>> m4 = search.translateStreamToString( chorale1.parts[1].measure(4).notesAndRests)
            >>> resm4 = search.translateStreamToString( s.parts[1].measure(4).notesAndRests)
            >>> m6 = search.translateStreamToString( chorale1.parts[1].measure(4).notesAndRests)
            >>> resm6 = search.translateStreamToString( s.parts[1].measure(4).notesAndRests)
            >>> m7 = search.translateStreamToString( chorale1.parts[1].measure(4).notesAndRests)
            >>> resm7 = search.translateStreamToString( s.parts[1].measure(4).notesAndRests)
            >>> m4 == resm4
            True
            >>> m6 == resm6
            True
            >>> m7 == resm7
            True
            >>> len(s.parts[0].flat.getElementsByClass(bar.Repeat))
            2
            >>> len(s.flat.getElementsByClass(bar.Repeat))
            8
            >>> s.parts[0].measure(3).leftBarline.direction
            'start'
            >>> s.parts[0].measure(6).rightBarline.direction
            'end'




        .. method:: simplify(repeatThreshold=4, repeatEndingThreshold=3, inPlace=False)

            No documentation.



RepeatMark
----------



.. class:: RepeatMark()

    Base class of all repeat objects, including RepeatExpression objects and Repeat (Barline) objects.

    This object is used to for multiple-inheritance of such objects and to filter by class in order
    to get all things that mark repeats.

    The RepeatMark is not itself a :class:`~music21.base.Music21Object` so you should use multiple
    inheritance to put these things in Streams.

    The following demonstration shows how a user might see if a Stream has any repeats in it.



    >>> from music21 import *
    >>> class PartialRepeat(repeat.RepeatMark, base.Music21Object):
    ...    def __init__(self):
    ...        base.Music21Object.__init__(self)
    ⁠ 
    >>> s = stream.Stream()
    >>> s.append(note.Note())
    >>> s.append(PartialRepeat())
    >>> repeats = s.getElementsByClass(repeat.RepeatMark)
    >>> if len(repeats) > 0:
    ...    print "Stream has %d repeat(s) in it" % (len(repeats))
    Stream has 1 repeat(s) in it




