コード例 #1
0
ファイル: Measure.py プロジェクト: Alwnikrotikz/abjad
 def _scale(self, multiplier=None):
     from abjad.tools import containertools
     from abjad.tools import contexttools
     from abjad.tools import iterationtools
     from abjad.tools import timesignaturetools
     from abjad.tools.scoretools import attach
     if multiplier is None:
         return
     multiplier = durationtools.Multiplier(multiplier)
     old_time_signature = self.time_signature
     if mathtools.is_nonnegative_integer_power_of_two(multiplier) and \
         1 <= multiplier:
         old_numerator = old_time_signature.numerator
         old_denominator = old_time_signature.denominator
         new_denominator = old_denominator / multiplier.numerator
         pair = (old_numerator, new_denominator)
         new_time_signature = contexttools.TimeSignatureMark(pair)
     else:
         old_denominator = old_time_signature.denominator
         old_duration = old_time_signature.duration
         new_duration = multiplier * old_duration
         new_time_signature = \
             timesignaturetools.duration_and_possible_denominators_to_time_signature(
             new_duration, [old_denominator], multiplier.denominator)
     for mark in self._get_marks(contexttools.TimeSignatureMark):
         mark.detach()
     attach(new_time_signature, self)
     contents_multiplier_denominator = \
         mathtools.greatest_power_of_two_less_equal(multiplier.denominator)
     pair = (multiplier.numerator, contents_multiplier_denominator)
     contents_multiplier = durationtools.Multiplier(*pair)
     self._scale_contents(contents_multiplier)
コード例 #2
0
 def _fuse_measures(self):
     from abjad.tools import contexttools
     from abjad.tools import measuretools
     from abjad.tools import selectiontools
     from abjad.tools import timesignaturetools
     # check input
     assert self._all_are_contiguous_components_in_same_parent(
         self, component_classes=(measuretools.Measure, ))
     # return none on empty measures
     if len(self) == 0:
         return None
     # TODO: instantiate a new measure
     #       instead of returning a reference to existing measure
     if len(self) == 1:
         return self[0]
     selection = selectiontools.SliceSelection(self)
     parent, start, stop = selection._get_parent_and_start_stop_indices()
     old_denominators = []
     new_duration = durationtools.Duration(0)
     for measure in self:
         effective_time_signature = measure.time_signature
         old_denominators.append(effective_time_signature.denominator)
         new_duration += effective_time_signature.duration
     new_time_signature = \
         timesignaturetools.duration_and_possible_denominators_to_time_signature(
         new_duration, old_denominators)
     music = []
     for measure in self:
         # scale before reassignment to prevent tie chain scale drama
         signature = measure.time_signature
         prolation = signature.implied_prolation
         multiplier = prolation / new_time_signature.implied_prolation
         measure._scale_contents(multiplier)
         measure_music = measure[:]
         measure_music._set_parents(None)
         music += measure_music
     new_measure = measuretools.Measure(new_time_signature, music)
     if parent is not None:
         self._give_dominant_spanners([new_measure])
     self._set_parents(None)
     if parent is not None:
         parent.insert(start, new_measure)
     return new_measure
def scale_measure_denominator_and_adjust_measure_contents(measure, factor):
    r"""Scales power-of-two `measure` to non-power-of-two measure 
    with new denominator `factor`:

    ..  container:: example

        **Example.**

        ::

            >>> measure = Measure((2, 8), "c'8 d'8")
            >>> beam = spannertools.BeamSpanner()
            >>> attach(beam, measure.select_leaves())
            >>> show(measure) # doctest: +SKIP

        ..  doctest::

            >>> f(measure)
            {
                \time 2/8
                c'8 [
                d'8 ]
            }

        ::

            >>> measuretools.scale_measure_denominator_and_adjust_measure_contents(
            ...     measure, 3)
            Measure(3/12, [c'8., d'8.])
            >>> show(measure) # doctest: +SKIP

        ..  doctest::

            >>> f(measure)
            {
                \time 3/12
                \scaleDurations #'(2 . 3) {
                    c'8. [
                    d'8. ]
                }
            }

    Treats new denominator `factor` like clever form of ``1``:
    ``3/3`` or ``5/5`` or ``7/7``, etc.

    Preserves `measure` prolated duration.

    Derives new `measure` multiplier.

    Scales `measure` contents.

    Picks best new time signature.
    """
    from abjad.tools import measuretools
    from abjad.tools import timesignaturetools
    from abjad.tools.scoretools import attach

    # save old time signature duration
    old_time_signature_duration = measure.time_signature.duration

    # find new time signature
    new_time_signature = timesignaturetools.duration_and_possible_denominators_to_time_signature(
        old_time_signature_duration, factor=factor
    )

    # scale contents of measures in expr
    multiplier = new_time_signature.implied_prolation.reciprocal
    measure._scale(multiplier)

    # assign new time signature
    for mark in measure._get_marks(contexttools.TimeSignatureMark):
        mark.detach()
    attach(new_time_signature, measure)

    # return measure
    return measure