예제 #1
0
def test_LilyPondParser__leaves__MultiMeasureRest_01():

    target = abjad.MultimeasureRest((1, 4))
    parser = abjad.parser.LilyPondParser()
    result = parser("{ %s }" % abjad.lilypond(target))
    assert (abjad.lilypond(target) == abjad.lilypond(result[0])
            and target is not result[0])
예제 #2
0
def durate_pitch_contour_reservoir(pitch_contour_reservoir):
    """
    Durates pitch contour reservoir.
    """
    names = ["First Violin", "Second Violin", "Viola", "Cello", "Bass"]
    durated_reservoir = {}
    for i, name in enumerate(names):
        long_duration = abjad.Duration(1, 2) * pow(2, i)
        short_duration = long_duration / 2
        rest_duration = long_duration * abjad.Multiplier(3, 2)
        div = rest_duration // abjad.Duration(3, 2)
        mod = rest_duration % abjad.Duration(3, 2)
        initial_rest = abjad.MultimeasureRest((3, 2)) * div
        maker = abjad.LeafMaker()
        if mod:
            initial_rest += maker([None], mod)
        durated_contours = [tuple(initial_rest)]
        pitch_contours = pitch_contour_reservoir[name]
        durations = [long_duration, short_duration]
        counter = 0
        maker = abjad.LeafMaker()
        for pitch_contour in pitch_contours:
            contour = []
            for pitch in pitch_contour:
                leaves = maker([pitch], [durations[counter]])
                contour.extend(leaves)
                counter = (counter + 1) % 2
            durated_contours.append(tuple(contour))
        durated_reservoir[name] = tuple(durated_contours)
    return durated_reservoir
def test_scoretools_MultimeasureRest___copy___01():

    multi_measure_rest_1 = abjad.MultimeasureRest((1, 4))
    multi_measure_rest_2 = copy.copy(multi_measure_rest_1)

    assert isinstance(multi_measure_rest_1, abjad.MultimeasureRest)
    assert isinstance(multi_measure_rest_2, abjad.MultimeasureRest)
    assert format(multi_measure_rest_1) == format(multi_measure_rest_2)
    assert multi_measure_rest_1 is not multi_measure_rest_2
def test_MultimeasureRest___copy___01():

    multi_measure_rest_1 = abjad.MultimeasureRest((1, 4))
    multi_measure_rest_2 = copy.copy(multi_measure_rest_1)

    assert isinstance(multi_measure_rest_1, abjad.MultimeasureRest)
    assert isinstance(multi_measure_rest_2, abjad.MultimeasureRest)
    assert abjad.lilypond(multi_measure_rest_1) == abjad.lilypond(
        multi_measure_rest_2)
    assert multi_measure_rest_1 is not multi_measure_rest_2
def test_scoretools_MultimeasureRest___init___01():
    r'''Initializes multimeasure rest from empty input.
    '''

    multimeasure_rest = abjad.MultimeasureRest()

    assert format(multimeasure_rest) == abjad.String.normalize(r'''
        R4
        ''')

    assert abjad.inspect(multimeasure_rest).is_well_formed()
예제 #6
0
def test_MultimeasureRest___init___01():
    """
    Initializes multimeasure rest from empty input.
    """

    multimeasure_rest = abjad.MultimeasureRest()

    assert abjad.lilypond(multimeasure_rest) == abjad.String.normalize(r"""
        R4
        """)

    assert abjad.wf.wellformed(multimeasure_rest)
예제 #7
0
파일: SegmentMaker.py 프로젝트: grrrr/rill
 def _handle_time_signatures(self):
     if not self.metronome_marks:
         return
     context = self._score["Global_Skips"]
     skips = []
     for item in self.time_signatures:
         skip = abjad.Skip(1, multiplier=item)
         time_signature = abjad.TimeSignature(item)
         abjad.attach(time_signature, skip, context="Score")
         skips.append(skip)
     context.extend(skips)
     context = self._score["Global_Rests"]
     rests = []
     for item in self.time_signatures:
         rest = abjad.MultimeasureRest(1, multiplier=item)
         rests.append(rest)
     context.extend(rests)
예제 #8
0
 def _make_mm_rests(self):
     print("Making MM rests ...")
     for voice in abjad.iterate(
             self.score_template["Staff Group"]).components(
                 abjad.Staff  # was Voice
             ):
         leaves = abjad.select(voice).leaves(grace=False)
         shards = abjad.mutate.split(leaves, self.time_signatures)
         for shard in shards[:-1]:
             if not all(isinstance(leaf, abjad.Rest) for leaf in shard):
                 continue
             indicators = abjad.get.indicators(shard[0])
             multiplier = abjad.get.duration(shard) / 2
             invisible_rest = abjad.Rest(1, multiplier=(multiplier))
             rest_literal = abjad.LilyPondLiteral(
                 r"\once \override Rest.transparent = ##t", "before")
             abjad.attach(rest_literal,
                          invisible_rest,
                          tag=abjad.Tag("applying invisibility"))
             for indicator in indicators:
                 abjad.attach(indicator,
                              invisible_rest,
                              tag=abjad.Tag("applying indicators"))
             multimeasure_rest = abjad.MultimeasureRest(
                 1, multiplier=(multiplier))
             start_command = abjad.LilyPondLiteral(
                 r"\stopStaff \once \override Staff.StaffSymbol.line-count = #1 \startStaff",
                 format_slot="before",
             )
             stop_command = abjad.LilyPondLiteral(r"\stopStaff \startStaff",
                                                  format_slot="after")
             if self.cutaway is True:
                 abjad.attach(start_command,
                              invisible_rest,
                              tag=abjad.Tag("applying cutaway"))
                 abjad.attach(
                     stop_command,
                     multimeasure_rest,
                     tag=abjad.Tag("applying cutaway"),
                 )
                 both_rests = [invisible_rest, multimeasure_rest]
                 abjad.mutate.replace(shard, both_rests[:])
             else:
                 both_rests = [invisible_rest, multimeasure_rest]
                 abjad.mutate.replace(shard, both_rests[:])
예제 #9
0
 def _make_measures(self, time_signatures, rhythm_maker, pitches, seed):
     seed = seed or 0
     measures = abjad.Voice()
     for time_signature in time_signatures:
         multimeasure_rest = abjad.MultimeasureRest(1)
         multiplier = abjad.Multiplier(time_signature)
         abjad.attach(multiplier, multimeasure_rest)
         measures.append(abjad.Measure(time_signature, [multimeasure_rest]))
     if rhythm_maker is not None:
         # rotation not available anymore
         divisions = rhythm_maker(time_signatures)
         abjad.mutate(measures).replace_measure_contents(divisions)
     if pitches is not None:
         if not isinstance(pitches, collections.Iterable):
             pitches = [pitches]
         iterator = abjad.iterate(measures).logical_ties(pitched=True)
         iterator = enumerate(iterator, seed)
         for i, logical_tie in iterator:
             pitch = pitches[i % len(pitches)]
             for leaf in logical_tie:
                 leaf.written_pitch = pitch
     return measures
예제 #10
0
def rests_to_multimeasure_rest(selection: abjad.Selection,
                               *,
                               ignore_clefs: bool = False,
                               ) -> None:
    r"""Mutates an input |abjad.Selection| in place and has no return value;
    this function looks for measures filled with regular rests and converts
    them into an |abjad.MultimeasureRest|.

    Basic usage:
        Converts any measure filled with regular rests into a measure with a
        single multi-measure rest.

        >>> container = abjad.Container(r"r1")
        >>> auxjad.mutate(container[:]).rests_to_multimeasure_rest()
        >>> abjad.f(container)
        {
            R1
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-uvebc7ft1zo.png

    .. note::

        Auxjad automatically adds this function as an extension method to
        |abjad.mutate()|. It can thus be used from either
        :func:`auxjad.mutate()` or |abjad.mutate()|. Therefore, the two lines
        below are equivalent:

        >>> auxjad.mutate(staff[:]).rests_to_multimeasure_rest()
        >>> abjad.mutate(staff[:]).rests_to_multimeasure_rest()

    Multiple rests:
        Works with measures with multiple regular rests.

        >>> container = abjad.Container(r"r2 r8.. r32 r16 r8 r16")
        >>> abjad.f(container)
        {
            r2
            r8..
            r32
            r16
            r8
            r16
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-jk4m1wzsyfa.png

        >>> auxjad.mutate(container[:]).rests_to_multimeasure_rest()
        >>> abjad.f(container)
        {
            R1
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-z8u0cs3fzdi.png

    .. note::

        When using |abjad.Container|'s, all time signatures in the output will
        be commented out with ``%%%.`` This is because Abjad only applies time
        signatures to containers that belong to a |abjad.Staff|. The present
        function works with either |abjad.Container| and |abjad.Staff|.

        >>> container = abjad.Container(r"\time 3/4 c'4 d'4 e'4")
        >>> abjad.f(container)
        {
            %%% \time 3/4 %%%
            c'4
            d'4
            e'4
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-qtq55xbkkts.png

        >>> staff = abjad.Staff([container])
        >>> abjad.f(container)
        {
            \time 3/4
            c'4
            d'4
            e'4
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-9hceg93vrmv.png

    Time signature changes:
        Works with selections from containers with multiple time signatures as
        well as notes.

        >>> container = abjad.Staff(r"\time 3/4 r2. | "
        ...                         "\time 6/8 r2. | "
        ...                         "\time 5/4 c'1 ~ c'4 | r1 r4"
        ...                         )
        >>> auxjad.mutate(container[:]).rests_to_multimeasure_rest()
        >>> abjad.f(container)
        \new Staff
        {
            \time 3/4
            R1 * 3/4
            \time 6/8
            R1 * 3/4
            \time 5/4
            c'1
            ~
            c'4
            R1 * 5/4
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-a9sqdcznoq.png

    Tuplets:
        Works with containers with tuplets.

        >>> container = abjad.Container(r"\times 2/3 {r2 r2 r2}")
        >>> abjad.f(container)
        {
            \times 2/3 {
                r2
                r2
                r2
            }
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-480a9zqvk2a.png

        >>> auxjad.mutate(container[:]).rests_to_multimeasure_rest()
        >>> abjad.f(container)
        {
            R1
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-r5yg3a3f97q.png

        It also works with containers with tuplets within tuplets.

        >>> container = abjad.Container(
        ...     r"r2 \times 2/3 {r2 r4} \times 4/5 {r2. \times 2/3 {r2 r4}}"
        ... )
        >>> abjad.f(container)
        {
            r2
            \times 2/3 {
                r2
                r4
            }
            \times 4/5 {
                r2.
                \times 2/3 {
                    r2
                    r4
                }
            }
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-codydc205jw.png

        >>> auxjad.mutate(container[:]).rests_to_multimeasure_rest()
        >>> abjad.f(container)
        {
            R1
            R1
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-f647t5j3jgw.png

    ``ignore_clefs``
        By default, the last clef of an empty measure is preserved when
        replacing it with a multi-measure rest:

        >>> staff = abjad.Staff(r"\clef bass r4 r4 \times 2/3 {r4 r8} r4 "
        ...                     r"\time 3/4 \clef treble r2. "
        ...                     r"\time 5/4 r2 \clef bass r2."
        ...                     )
        >>> abjad.f(staff)
        \new Staff
        {
            \clef "bass"
            r4
            r4
            \times 2/3 {
                r4
                r8
            }
            r4
            \time 3/4
            \clef "treble"
            r2.
            \time 5/4
            r2
            \clef "bass"
            r2.
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-6GMRGmYkEQ.png

        >>> abjad.mutate(staff[:]).rests_to_multimeasure_rest()
        >>> abjad.f(staff)
        \new Staff
        {
            \clef "bass"
            R1
            \time 3/4
            \clef "treble"
            R1 * 3/4
            \time 5/4
            \clef "bass"
            R1 * 5/4
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-UnL6ZoFoDC.png

        Invoke the mutation with ``ignore_clefs`` set to ``True`` to disable
        this behaviour and ignore all clefs:

        >>> staff = abjad.Staff(r"\clef bass r4 r4 \times 2/3 {r4 r8} r4 "
        ...                     r"\time 3/4 \clef treble r2. "
        ...                     r"\time 5/4 r2 \clef bass r2."
        ...                     )
        >>> abjad.mutate(staff[:]).rests_to_multimeasure_rest(
        ...     ignore_clefs=True,
        ... )
        >>> abjad.f(staff)
        \new Staff
        {
            R1
            \time 3/4
            R1 * 3/4
            \time 5/4
            R1 * 5/4
        }

        .. figure:: ../_images/rests_to_multimeasure_rest-KGRZJ8fvQF.png

    .. warning::

        The input selection must be a contiguous logical voice. When dealing
        with a container with multiple subcontainers (e.g. a score containing
        multiple staves), the best approach is to cycle through these
        subcontainers, applying this function to them individually.
    """
    if not isinstance(selection, abjad.Selection):
        raise TypeError("argument must be 'abjad.Selection'")
    if not selection.leaves().are_contiguous_logical_voice():
        raise ValueError("argument must be contiguous logical voice")
    if not isinstance(ignore_clefs, bool):
        raise TypeError("'ignore_clefs' must be 'bool'")

    measures = selection.group_by_measure()
    effective_time_signature = abjad.TimeSignature((4, 4))
    for measure in measures:
        head = abjad.select(measure).leaf(0)
        time_signature = abjad.inspect(head).indicator(abjad.TimeSignature)
        if time_signature is not None:
            effective_time_signature = time_signature
        if all([isinstance(leaf, abjad.Rest) for leaf in measure.leaves()]):
            if not ignore_clefs:
                for leaf in measure.leaves()[::-1]:
                    clef = abjad.inspect(leaf).indicator(abjad.Clef)
                    if clef is not None:
                        break
            duration = abjad.inspect(measure).duration()
            if duration == effective_time_signature.duration:
                if duration == 1:
                    multiplier = None
                else:
                    multiplier = abjad.Multiplier(duration)
                multimeasure_rest = abjad.MultimeasureRest(
                    (4, 4),
                    multiplier=multiplier,
                )
                if time_signature is not None:
                    abjad.attach(time_signature, multimeasure_rest)
                if not ignore_clefs and clef is not None:
                    abjad.attach(clef, multimeasure_rest)
                for indicator in abjad.inspect(head).indicators():
                    if isinstance(indicator, (abjad.BarLine,
                                              abjad.Fermata,
                                              abjad.KeySignature,
                                              abjad.LilyPondLiteral,
                                              abjad.MetronomeMark,
                                              abjad.RehearsalMark,
                                              abjad.Repeat,
                                              abjad.StaffChange,
                                              abjad.StartMarkup,
                                              abjad.StartTextSpan,
                                              abjad.StopTextSpan,
                                              )):
                        abjad.attach(indicator, multimeasure_rest)
                abjad.mutate(measure).replace(multimeasure_rest)
예제 #11
0
def rests_to_multimeasure_rest(
    selection: abjad.Selection,
    *,
    ignore_clefs: bool = False,
    ignore_dynamics: bool = False,
) -> None:
    r"""Mutates an input |abjad.Selection| in place and has no return value;
    this function looks for measures filled with regular rests and converts
    them into an |abjad.MultimeasureRest|.

    Basic usage:
        Converts any measure filled with regular rests into a measure with a
        single multi-measure rest.

        >>> container = abjad.Container(r"\time 3/4 r2.")
        >>> abjad.show(container)

        ..  docs::

            {
                \time 3/4
                r2.
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-VIj5iWyLCG.png

        >>> auxjad.mutate.rests_to_multimeasure_rest(container[:])
        >>> abjad.show(container)

        ..  docs::

            {
                \time 3/4
                R1 * 3/4
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-uvebc7ft1zo.png

    ..  note::

        Auxjad automatically adds this function as an extension function to
        |abjad.mutate|. It can thus be used from either |auxjad.mutate|_ or
        |abjad.mutate| namespaces. Therefore, the two lines below are
        equivalent:

        >>> auxjad.mutate.rests_to_multimeasure_rest(staff[:])
        >>> abjad.mutate.rests_to_multimeasure_rest(staff[:])

    Multiple rests:
        Works with measures with multiple regular rests.

        >>> container = abjad.Container(r"r2 r8.. r32 r16 r8 r16")
        >>> abjad.show(container)

        ..  docs::

            {
                r2
                r8..
                r32
                r16
                r8
                r16
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-jk4m1wzsyfa.png

        >>> auxjad.mutate.rests_to_multimeasure_rest(container[:])
        >>> abjad.show(container)

        ..  docs::

            {
                R1
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-z8u0cs3fzdi.png

    ..  note::

        When using |abjad.Container|'s, all time signatures in the output will
        be commented out with ``%%%.`` This is because Abjad only applies time
        signatures to containers that belong to a |abjad.Staff|. The present
        function works with either |abjad.Container| and |abjad.Staff|.

        >>> container = abjad.Container(r"\time 3/4 c'4 d'4 e'4")
        >>> abjad.show(container)

        ..  docs::

            {
                %%% \time 3/4 %%%
                c'4
                d'4
                e'4
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-qtq55xbkkts.png

        >>> staff = abjad.Staff([container])
        >>> abjad.show(container)

        ..  docs::

            {
                \time 3/4
                c'4
                d'4
                e'4
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-9hceg93vrmv.png

    Time signature changes:
        Works with selections from containers with multiple time signatures as
        well as notes.

        >>> container = abjad.Staff(
        ...     r"\time 3/4 r2. | "
        ...     "\time 6/8 r2. | "
        ...     "\time 5/4 c'1 ~ c'4 | r1 r4"
        ... )
        >>> abjad.show(container)

        ..  docs::

            \new Staff
            {
                \time 3/4
                r2.
                \time 6/8
                r2.
                \time 5/4
                c'1
                ~
                c'4
                r1
                r4
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-oQfFRihzEY.png

        >>> auxjad.mutate.rests_to_multimeasure_rest(container[:])
        >>> abjad.show(container)

        ..  docs::

            \new Staff
            {
                \time 3/4
                R1 * 3/4
                \time 6/8
                R1 * 3/4
                \time 5/4
                c'1
                ~
                c'4
                R1 * 5/4
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-a9sqdcznoq.png

    Tuplets:
        Works with containers with tuplets.

        >>> container = abjad.Container(r"\times 2/3 {r2 r2 r2}")
        >>> abjad.show(container)

        ..  docs::

            {
                \times 2/3
                {
                    r2
                    r2
                    r2
                }
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-480a9zqvk2a.png

        >>> auxjad.mutate.rests_to_multimeasure_rest(container[:])
        >>> abjad.show(container)

        ..  docs::

            {
                R1
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-r5yg3a3f97q.png

        It also works with containers with tuplets within tuplets.

        >>> container = abjad.Container(
        ...     r"r2 \times 2/3 {r2 r4} \times 4/5 {r2. \times 2/3 {r2 r4}}"
        ... )
        >>> abjad.show(container)

        ..  docs::

            {
                r2
                \times 2/3
                {
                    r2
                    r4
                }
                \times 4/5
                {
                    r2.
                    \times 2/3
                    {
                        r2
                        r4
                    }
                }
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-codydc205jw.png

        >>> auxjad.mutate.rests_to_multimeasure_rest(container[:])
        >>> abjad.show(container)

        ..  docs::

            {
                R1
                R1
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-f647t5j3jgw.png

    ``ignore_clefs``
        By default, the last clef of an empty measure is preserved when
        replacing it with a multi-measure rest:

        >>> staff = abjad.Staff(
        ...     r"\clef bass r4 r4 \times 2/3 {r4 r8} r4 "
        ...     r"\time 3/4 \clef treble r2. "
        ...     r"\time 5/4 r2 \clef bass r2."
        ... )
        >>> abjad.show(staff)

        ..  docs::

            \new Staff
            {
                \clef "bass"
                r4
                r4
                \times 2/3
                {
                    r4
                    r8
                }
                r4
                \time 3/4
                \clef "treble"
                r2.
                \time 5/4
                r2
                \clef "bass"
                r2.
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-6GMRGmYkEQ.png

        >>> abjad.mutate.rests_to_multimeasure_rest(staff[:])
        >>> abjad.show(staff)

        ..  docs::

            \new Staff
            {
                \clef "bass"
                R1
                \time 3/4
                \clef "treble"
                R1 * 3/4
                \time 5/4
                \clef "bass"
                R1 * 5/4
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-UnL6ZoFoDC.png

        Invoke the mutation with ``ignore_clefs`` set to ``True`` to disable
        this behaviour and ignore all clefs:

        >>> staff = abjad.Staff(
        ...     r"\clef bass r4 r4 \times 2/3 {r4 r8} r4 "
        ...     r"\time 3/4 \clef treble r2. "
        ...     r"\time 5/4 r2 \clef bass r2."
        ... )
        >>> abjad.mutate.rests_to_multimeasure_rest(
        ...     staff[:],
        ...     ignore_clefs=True,
        ... )
        >>> abjad.show(staff)

        ..  docs::

            \new Staff
            {
                R1
                \time 3/4
                R1 * 3/4
                \time 5/4
                R1 * 5/4
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-KGRZJ8fvQF.png

    ``ignore_dynamics``
        By default, the last dynamic or hairpin of an empty measure is
        preserved when replacing it with a multi-measure rest:

        >>> staff = abjad.Staff(r"c'1\p\< r2\! r2 d'1\f\> r2 r2\ppp")
        >>> abjad.show(staff)

        ..  docs::

            \new Staff
            {
                c'1
                \p
                \<
                r2
                \!
                r2
                d'1
                \f
                \>
                r2
                r2
                \ppp
            }


        ..  figure:: ../_images/rests_to_multimeasure_rest-J9T5UY8r9w.png

        >>> abjad.mutate.rests_to_multimeasure_rest(staff[:])
        >>> abjad.show(staff)

        ..  docs::

            \new Staff
            {
                c'1
                \p
                \<
                R1
                \!
                d'1
                \f
                \>
                R1
                \ppp
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-77r9QeaZBA.png

        Invoke the mutation with ``ignore_dynamics`` set to ``True`` to disable
        this behaviour and ignore all dynamics and hairpins:

        >>> staff = abjad.Staff(r"c'1\p\< r2\! r2 d'1\f\> r2 r2\ppp")
        >>> abjad.mutate.rests_to_multimeasure_rest(
        ...     staff[:],
        ...     ignore_dynamics=True,
        ... )
        >>> abjad.show(staff)

        ..  docs::

            \new Staff
            {
                c'1
                \p
                \<
                R1
                d'1
                \f
                \>
                R1
            }

        ..  figure:: ../_images/rests_to_multimeasure_rest-3UhZukx9Pw.png

        ..  warning::

            Note that dynamics are only ignored when converting rests to
            multi-measure rests. All other dynamics are preserved in the score.
            This can result in problems displaying dynamics when one or more
            unterminated hairpins is present. In the example above, the last
            note's hairpin is unterminated and, because of that, LilyPond
            ignores all dynamics in that staff:

            >>> staff = abjad.Staff(r"c'1\p\< r2\! r2 d'1\f\> r2 r2\ppp")
            >>> abjad.mutate.rests_to_multimeasure_rest(
            ...     staff[:],
            ...     ignore_dynamics=True,
            ... )
            >>> string = abjad.lilypond(staff)
            >>> print(string)
            \new Staff
            {
                c'1
                \p
                \<
                R1
                d'1
                \f
                \>
                R1
            }

    ..  warning::

        The input selection must be a contiguous logical voice. When dealing
        with a container with multiple subcontainers (e.g. a score containing
        multiple staves), the best approach is to cycle through these
        subcontainers, applying this function to them individually.
    """
    if not isinstance(selection, abjad.Selection):
        raise TypeError("argument must be 'abjad.Selection'")
    if not selection.leaves().are_contiguous_logical_voice():
        raise ValueError("argument must be contiguous logical voice")
    if not isinstance(ignore_clefs, bool):
        raise TypeError("'ignore_clefs' must be 'bool'")
    if not isinstance(ignore_dynamics, bool):
        raise TypeError("'ignore_dynamics' must be 'bool'")

    measures = selection.group_by_measure()
    effective_time_signature = abjad.TimeSignature((4, 4))
    indicators_tuple = (
        abjad.BarLine,
        abjad.Fermata,
        abjad.KeySignature,
        abjad.LilyPondLiteral,
        abjad.MetronomeMark,
        abjad.RehearsalMark,
        abjad.Repeat,
        abjad.StaffChange,
        abjad.StartMarkup,
        abjad.StartTextSpan,
        abjad.StopTextSpan,
    )

    for measure in measures:
        head = abjad.select(measure).leaf(0)
        time_signature = abjad.get.indicator(head, abjad.TimeSignature)
        if time_signature is not None:
            effective_time_signature = time_signature
        if all([isinstance(leaf, abjad.Rest) for leaf in measure.leaves()]):
            if not ignore_clefs:
                for leaf in measure.leaves()[::-1]:
                    clef = abjad.get.indicator(leaf, abjad.Clef)
                    if clef is not None:
                        break
            if not ignore_dynamics:
                for leaf in measure.leaves()[::-1]:
                    dynamics = abjad.get.indicator(leaf, (
                        abjad.Dynamic,
                        abjad.StartHairpin,
                        abjad.StopHairpin,
                    ))
                    if dynamics is not None:
                        break
            duration = abjad.get.duration(measure)
            if duration == effective_time_signature.duration:
                if duration == 1:
                    multiplier = None
                else:
                    multiplier = abjad.Multiplier(duration)
                multimeasure_rest = abjad.MultimeasureRest(
                    (4, 4),
                    multiplier=multiplier,
                )
                if time_signature is not None:
                    abjad.attach(time_signature, multimeasure_rest)
                if not ignore_clefs and clef is not None:
                    abjad.attach(clef, multimeasure_rest)
                if not ignore_dynamics and dynamics is not None:
                    abjad.attach(dynamics, multimeasure_rest)
                for indicator in abjad.get.indicators(head):
                    if isinstance(indicator, indicators_tuple):
                        abjad.attach(indicator, multimeasure_rest)
                abjad.mutate.replace(measure, multimeasure_rest)
예제 #12
0
def test_MultimeasureRest___setattr___01():

    rest = abjad.MultimeasureRest((1, 4))

    assert pytest.raises(AttributeError, "rest.foo = 'bar'")
예제 #13
0
def test_lilypondparsertools_LilyPondParser__leaves__MultiMeasureRest_01():

    target = abjad.MultimeasureRest((1, 4))
    parser = abjad.lilypondparsertools.LilyPondParser()
    result = parser('{ %s }' % format(target))
    assert format(target) == format(result[0]) and target is not result[0]
예제 #14
0
파일: LeafMaker.py 프로젝트: gsy/gmajor
 def _make_leaf_on_pitch(
     pitch,
     duration,
     decrease_monotonic=True,
     forbidden_duration=None,
     skips_instead_of_rests=False,
     use_multimeasure_rests=False,
     repeat_ties=False,
 ):
     import abjad
     note_prototype = (
         numbers.Number,
         str,
         abjad.NamedPitch,
         abjad.NumberedPitch,
         abjad.PitchClass,
     )
     chord_prototype = (tuple, list)
     rest_prototype = (type(None), )
     if isinstance(pitch, note_prototype):
         leaves = LeafMaker._make_tied_leaf(
             abjad.Note,
             duration,
             decrease_monotonic=decrease_monotonic,
             forbidden_duration=forbidden_duration,
             pitches=pitch,
             repeat_ties=repeat_ties,
         )
     elif isinstance(pitch, chord_prototype):
         leaves = LeafMaker._make_tied_leaf(
             abjad.Chord,
             duration,
             decrease_monotonic=decrease_monotonic,
             forbidden_duration=forbidden_duration,
             pitches=pitch,
             repeat_ties=repeat_ties,
         )
     elif isinstance(pitch, rest_prototype) and skips_instead_of_rests:
         leaves = LeafMaker._make_tied_leaf(
             abjad.Skip,
             duration,
             decrease_monotonic=decrease_monotonic,
             forbidden_duration=forbidden_duration,
             pitches=None,
             repeat_ties=repeat_ties,
         )
     elif isinstance(pitch, rest_prototype) and not use_multimeasure_rests:
         leaves = LeafMaker._make_tied_leaf(
             abjad.Rest,
             duration,
             decrease_monotonic=decrease_monotonic,
             forbidden_duration=forbidden_duration,
             pitches=None,
             repeat_ties=repeat_ties,
         )
     elif isinstance(pitch, rest_prototype) and use_multimeasure_rests:
         multimeasure_rest = abjad.MultimeasureRest((1))
         multiplier = abjad.Multiplier(duration)
         abjad.attach(multiplier, multimeasure_rest)
         leaves = (multimeasure_rest, )
     else:
         message = 'unknown pitch: {!r}.'
         message = message.format(pitch)
         raise ValueError(message)
     return leaves
def test_MultimeasureRest___setattr___01():

    rest = abjad.MultimeasureRest((1, 4))

    with pytest.raises(AttributeError):
        rest.foo = "bar"
예제 #16
0
    def _add_ending_skips(self):
        print("Adding ending skips ...")
        last_skip = abjad.select(
            self.score_template["Global Context"]).leaves()[-1]
        override_command = abjad.LilyPondLiteral(
            r"\once \override Score.TimeSignature.stencil = ##f",
            format_slot="before")
        abjad.attach(override_command,
                     last_skip,
                     tag=abjad.Tag("applying ending skips"))

        for voice in abjad.select(
                self.score_template["Staff Group"]).components(abjad.Voice):
            container = abjad.Container()
            sig = self.time_signatures[-1]
            leaf_duration = sig.duration / 2
            rest_leaf = abjad.Rest(1, multiplier=(leaf_duration))
            mult_rest_leaf = abjad.MultimeasureRest(1,
                                                    multiplier=(leaf_duration))
            container.append(rest_leaf)
            container.append(mult_rest_leaf)
            markup = abjad.Markup(
                rf"""\markup \center-align \musicglyph #"{self.fermata}" """,
                direction=abjad.Up,
                literal=True,
            )
            start_command = abjad.LilyPondLiteral(
                r"\stopStaff \once \override Staff.StaffSymbol.line-count = #0 \startStaff",
                format_slot="before",
            )
            stop_command = abjad.LilyPondLiteral(r"\stopStaff \startStaff",
                                                 format_slot="after")
            rest_literal = abjad.LilyPondLiteral(
                r"\once \override Rest.color = #white", "before")
            mult_rest_literal = abjad.LilyPondLiteral(
                r"\once \override MultiMeasureRest.color = #white", "before")
            penultimate_rest = container[0]
            final_rest = container[-1]
            abjad.attach(markup,
                         final_rest,
                         tag=abjad.Tag("applying ending skips"))
            abjad.attach(start_command,
                         penultimate_rest,
                         tag=abjad.Tag("applying ending skips"))
            if self.barline == "|.":
                stop_command = abjad.LilyPondLiteral(r"\stopStaff",
                                                     format_slot="after")
                abjad.attach(stop_command,
                             final_rest,
                             tag=abjad.Tag("applying ending skips"))
            else:
                abjad.attach(stop_command,
                             final_rest,
                             tag=abjad.Tag("applying ending skips"))
            abjad.attach(rest_literal,
                         penultimate_rest,
                         tag=abjad.Tag("applying ending skips"))
            abjad.attach(mult_rest_literal,
                         final_rest,
                         tag=abjad.Tag("applying ending skips"))
            voice.append(container[:])