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)
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