def __call__(self, pitches, durations) -> Selection: """ Calls note-maker on ``pitches`` and ``durations``. """ from .Tuplet import Tuplet if isinstance(pitches, str): pitches = pitches.split() if not isinstance(pitches, collections.abc.Iterable): pitches = [pitches] if isinstance(durations, (numbers.Number, tuple)): durations = [durations] nonreduced_fractions = Sequence( [NonreducedFraction(_) for _ in durations] ) size = max(len(nonreduced_fractions), len(pitches)) nonreduced_fractions = nonreduced_fractions.repeat_to_length(size) pitches = Sequence(pitches).repeat_to_length(size) durations = Duration._group_by_implied_prolation(nonreduced_fractions) result: typing.List[typing.Union[Note, Tuplet]] = [] for duration in durations: # get factors in denominator of duration group duration not 1 or 2 factors = set(mathtools.factors(duration[0].denominator)) factors.discard(1) factors.discard(2) ps = pitches[0 : len(duration)] pitches = pitches[len(duration) :] if len(factors) == 0: result.extend( self._make_unprolated_notes( ps, duration, increase_monotonic=self.increase_monotonic, repeat_ties=self.repeat_ties, tag=self.tag, ) ) else: # compute prolation denominator = duration[0].denominator numerator = mathtools.greatest_power_of_two_less_equal( denominator ) multiplier = Multiplier(numerator, denominator) ratio = multiplier.reciprocal duration = [ratio * Duration(d) for d in duration] ns = self._make_unprolated_notes( ps, duration, increase_monotonic=self.increase_monotonic, repeat_ties=self.repeat_ties, tag=self.tag, ) tuplet = Tuplet(multiplier, ns) result.append(tuplet) return Selection(result)
def __call__(self, pitches, durations) -> Selection: """ Calls note-maker on ``pitches`` and ``durations``. """ from .Tuplet import Tuplet if isinstance(pitches, str): pitches = pitches.split() if not isinstance(pitches, collections.abc.Iterable): pitches = [pitches] if isinstance(durations, (numbers.Number, tuple)): durations = [durations] nonreduced_fractions = Sequence( [NonreducedFraction(_) for _ in durations] ) size = max(len(nonreduced_fractions), len(pitches)) nonreduced_fractions = nonreduced_fractions.repeat_to_length(size) pitches = Sequence(pitches).repeat_to_length(size) durations = Duration._group_by_implied_prolation(nonreduced_fractions) result: typing.List[typing.Union[Note, Tuplet]] = [] for duration in durations: # get factors in denominator of duration group duration not 1 or 2 factors = set(mathtools.factors(duration[0].denominator)) factors.discard(1) factors.discard(2) ps = pitches[0 : len(duration)] pitches = pitches[len(duration) :] if len(factors) == 0: result.extend( self._make_unprolated_notes( ps, duration, increase_monotonic=self.increase_monotonic, tag=self.tag, ) ) else: # compute prolation denominator = duration[0].denominator numerator = mathtools.greatest_power_of_two_less_equal( denominator ) multiplier = Multiplier(numerator, denominator) ratio = multiplier.reciprocal duration = [ratio * Duration(d) for d in duration] ns = self._make_unprolated_notes( ps, duration, increase_monotonic=self.increase_monotonic, tag=self.tag, ) tuplet = Tuplet(multiplier, ns) result.append(tuplet) return Selection(result)
def __call__(self, pitches, durations) -> Selection: """ Calls leaf-maker on ``pitches`` and ``durations``. Returns selection. """ from .Tuplet import Tuplet if isinstance(pitches, str): pitches = pitches.split() if not isinstance(pitches, collections.abc.Iterable): pitches = [pitches] if isinstance(durations, (numbers.Number, tuple)): durations = [durations] nonreduced_fractions = Sequence( [NonreducedFraction(_) for _ in durations] ) size = max(len(nonreduced_fractions), len(pitches)) nonreduced_fractions = nonreduced_fractions.repeat_to_length(size) pitches = Sequence(pitches).repeat_to_length(size) duration_groups = Duration._group_by_implied_prolation( nonreduced_fractions ) result: typing.List[typing.Union[Tuplet, Leaf]] = [] for duration_group in duration_groups: # get factors in denominator of duration group other than 1, 2. factors = mathtools.factors(duration_group[0].denominator) factors = set(factors) factors.discard(1) factors.discard(2) current_pitches = pitches[0 : len(duration_group)] pitches = pitches[len(duration_group) :] if len(factors) == 0: for pitch, duration in zip(current_pitches, duration_group): leaves = self._make_leaf_on_pitch( pitch, duration, increase_monotonic=self.increase_monotonic, forbidden_note_duration=self.forbidden_note_duration, forbidden_rest_duration=self.forbidden_rest_duration, repeat_ties=self.repeat_ties, skips_instead_of_rests=self.skips_instead_of_rests, tag=self.tag, use_multimeasure_rests=self.use_multimeasure_rests, ) result.extend(leaves) else: # compute tuplet prolation denominator = duration_group[0].denominator numerator = mathtools.greatest_power_of_two_less_equal( denominator ) multiplier = (numerator, denominator) ratio = 1 / Duration(*multiplier) duration_group = [ ratio * Duration(duration) for duration in duration_group ] # make tuplet leaves tuplet_leaves: typing.List[Leaf] = [] for pitch, duration in zip(current_pitches, duration_group): leaves = self._make_leaf_on_pitch( pitch, duration, increase_monotonic=self.increase_monotonic, repeat_ties=self.repeat_ties, skips_instead_of_rests=self.skips_instead_of_rests, tag=self.tag, use_multimeasure_rests=self.use_multimeasure_rests, ) tuplet_leaves.extend(leaves) tuplet = Tuplet(multiplier, tuplet_leaves) result.append(tuplet) return Selection(result)
def __call__(self, pitches, durations) -> Selection: """ Calls leaf-maker on ``pitches`` and ``durations``. Returns selection. """ from .Tuplet import Tuplet if isinstance(pitches, str): pitches = pitches.split() if not isinstance(pitches, collections.Iterable): pitches = [pitches] if isinstance(durations, (numbers.Number, tuple)): durations = [durations] nonreduced_fractions = Sequence( [NonreducedFraction(_) for _ in durations]) size = max(len(nonreduced_fractions), len(pitches)) nonreduced_fractions = nonreduced_fractions.repeat_to_length(size) pitches = Sequence(pitches).repeat_to_length(size) duration_groups = Duration._group_by_implied_prolation( nonreduced_fractions) result: typing.List[typing.Union[Tuplet, Leaf]] = [] for duration_group in duration_groups: # get factors in denominator of duration group other than 1, 2. factors = mathtools.factors(duration_group[0].denominator) factors = set(factors) factors.discard(1) factors.discard(2) current_pitches = pitches[0:len(duration_group)] pitches = pitches[len(duration_group):] if len(factors) == 0: for pitch, duration in zip(current_pitches, duration_group): leaves = self._make_leaf_on_pitch( pitch, duration, increase_monotonic=self.increase_monotonic, forbidden_note_duration=self.forbidden_note_duration, forbidden_rest_duration=self.forbidden_rest_duration, repeat_ties=self.repeat_ties, skips_instead_of_rests=self.skips_instead_of_rests, tag=self.tag, use_multimeasure_rests=self.use_multimeasure_rests, ) result.extend(leaves) else: # compute tuplet prolation denominator = duration_group[0].denominator numerator = mathtools.greatest_power_of_two_less_equal( denominator) multiplier = (numerator, denominator) ratio = 1 / Duration(*multiplier) duration_group = [ ratio * Duration(duration) for duration in duration_group ] # make tuplet leaves tuplet_leaves: typing.List[Leaf] = [] for pitch, duration in zip(current_pitches, duration_group): leaves = self._make_leaf_on_pitch( pitch, duration, increase_monotonic=self.increase_monotonic, repeat_ties=self.repeat_ties, skips_instead_of_rests=self.skips_instead_of_rests, tag=self.tag, use_multimeasure_rests=self.use_multimeasure_rests, ) tuplet_leaves.extend(leaves) tuplet = Tuplet(multiplier, tuplet_leaves) result.append(tuplet) return Selection(result)