def __init__(self, interval_class_token=None): from abjad.tools import pitchtools if isinstance(interval_class_token, type(self)): number = interval_class_token.number elif isinstance(interval_class_token, numbers.Number): if not 0 <= interval_class_token <= 6: message = 'must be between 0 and 6, inclusive.' raise ValueError(message) number = interval_class_token elif hasattr(interval_class_token, 'semitones'): number = interval_class_token.semitones number %= 12 if 6 < number: number = 12 - number elif interval_class_token is None: number = 0 elif isinstance(interval_class_token, str): number = float(interval_class_token) if mathtools.is_integer_equivalent_expr(number): number = int(number) else: message = 'can not initialize {}: {!r}.' message = message.format(type(self).__name__, interval_class_token) raise TypeError(message) self._number = number
def _get_nth_component_in_time_order_from(self, n): assert mathtools.is_integer_equivalent_expr(n) def next(component): if component is not None: for parent in component._get_parentage(include_self=True): next_sibling = parent._get_sibling(1) if next_sibling is not None: return next_sibling def previous(component): if component is not None: for parent in component._get_parentage(include_self=True): next_sibling = parent._get_sibling(-1) if next_sibling is not None: return next_sibling result = self if 0 < n: for i in range(n): result = next(result) elif n < 0: for i in range(abs(n)): result = previous(result) return result
def __init__(self, interval_class_token=None): from abjad.tools import pitchtools if isinstance(interval_class_token, type(self)): number = interval_class_token.number elif isinstance(interval_class_token, numbers.Number): if not 0 <= interval_class_token <= 6: message = 'must be between 0 and 6, inclusive.' raise ValueError(message) number = interval_class_token elif hasattr(interval_class_token, 'semitones'): number = interval_class_token.semitones number %= 12 if 6 < number: number = 12 - number elif interval_class_token is None: number = 0 elif isinstance(interval_class_token, str): number = float(interval_class_token) if mathtools.is_integer_equivalent_expr(number): number = int(number) else: message = 'can not initialize {}: {!r}.' message = message.format(type(self).__name__, interval_class_token) raise TypeError(message) self._number = number
def _handle_main_menu_result(self, result): if not isinstance(result, str): raise TypeError('result must be string.') if result in self._user_input_to_action: self._user_input_to_action[result]() elif mathtools.is_integer_equivalent_expr(result): self.edit_item(result) else: super(ListEditor, self)._handle_main_menu_result(result)
def _handle_main_menu_result(self, result): assert isinstance(result, str) if result in self.user_input_to_action: self.user_input_to_action[result](self) elif mathtools.is_integer_equivalent_expr(result): self.interactively_edit_user_input_wrapper_at_number( result, include_newline=False) else: raise ValueError(result)
def _format_repeat_tremolo_command(self): tremolo = inspect_(self).get_indicator(indicatortools.Tremolo) reattack_duration = self._get_tremolo_reattack_duration() repeat_count = self.written_duration / reattack_duration / 2 if not mathtools.is_integer_equivalent_expr(repeat_count): message = 'can not tremolo duration {} with {} beams.' message = message.format(self.written_duration, tremolo.beam_count) raise Exception(message) repeat_count = int(repeat_count) command = r'\repeat tremolo {}'.format(repeat_count) return command
def _format_repeat_tremolo_command(self): tremolo = inspect_(self).get_indicator(indicatortools.Tremolo) reattack_duration = self._get_tremolo_reattack_duration() repeat_count = self.written_duration / reattack_duration / 2 if not mathtools.is_integer_equivalent_expr(repeat_count): message = 'can not tremolo duration {} with {} beams.' message = message.format(self.written_duration, tremolo.beam_count) raise Exception(message) repeat_count = int(repeat_count) command = r'\repeat tremolo {}'.format(repeat_count) return command
def _handle_input(self, result): assert isinstance(result, str), repr(result) if result.endswith('!') and 1 < len(result): self._session._is_autoadding = True result = result.strip('!') if result in self._command_to_method: self._command_to_method[result]() elif mathtools.is_integer_equivalent_expr(result): if self.allow_item_edit: self.edit_item(result) else: superclass = super(CollectionAutoeditor, self) superclass._handle_input(result)
def __init__( self, leaf_count=None, is_diminution=True, beam_each_cell=True, beam_cells_together=False, ): assert mathtools.is_integer_equivalent_expr(leaf_count) RhythmMaker.__init__(self, beam_each_cell=beam_each_cell, beam_cells_together=beam_cells_together ) leaf_count = int(leaf_count) self._leaf_count = leaf_count self._is_diminution = is_diminution
def __init__(self, item=None): from abjad.tools import pitchtools if isinstance(item, numbers.Number): sign = mathtools.sign(item) abs_token = abs(item) if abs_token % 12 == 0 and 12 <= abs_token: number = 12 else: number = abs_token % 12 number *= sign elif isinstance(item, pitchtools.Interval): number = item.semitones sign = mathtools.sign(number) abs_number = abs(number) if abs_number % 12 == 0 and 12 <= abs_number: number = 12 else: number = abs_number % 12 number *= sign elif isinstance(item, pitchtools.IntervalClass): number = item.number sign = mathtools.sign(number) abs_number = abs(number) if abs_number % 12 == 0 and 12 <= abs_number: number = 12 else: number = abs_number % 12 number *= sign elif item is None: number = 0 elif isinstance(item, str): number = float(item) if mathtools.is_integer_equivalent_expr(number): number = int(number) sign = mathtools.sign(number) abs_token = abs(number) if abs_token % 12 == 0 and 12 <= abs_token: number = 12 else: number = abs_token % 12 number *= sign else: message = 'can not initialize {}: {!r}.' message = message.format(type(self).__name__, item) raise ValueError(message) self._number = number
def __init__(self, item=None): from abjad.tools import pitchtools if isinstance(item, numbers.Number): sign = mathtools.sign(item) abs_token = abs(item) if abs_token % 12 == 0 and 12 <= abs_token: number = 12 else: number = abs_token % 12 number *= sign elif isinstance(item, pitchtools.Interval): number = item.semitones sign = mathtools.sign(number) abs_number = abs(number) if abs_number % 12 == 0 and 12 <= abs_number: number = 12 else: number = abs_number % 12 number *= sign elif isinstance(item, pitchtools.IntervalClass): number = item.number sign = mathtools.sign(number) abs_number = abs(number) if abs_number % 12 == 0 and 12 <= abs_number: number = 12 else: number = abs_number % 12 number *= sign elif item is None: number = 0 elif isinstance(item, str): number = float(item) if mathtools.is_integer_equivalent_expr(number): number = int(number) sign = mathtools.sign(number) abs_token = abs(number) if abs_token % 12 == 0 and 12 <= abs_token: number = 12 else: number = abs_token % 12 number *= sign else: message = 'can not initialize {}: {!r}.' message = message.format(type(self).__name__, item) raise ValueError(message) self._number = number
def _scale_taleas(self, divisions, talea_denominator, taleas): talea_denominator = talea_denominator or 1 dummy_division = (1, talea_denominator) divisions.append(dummy_division) Duration = durationtools.Duration divisions = Duration.durations_to_nonreduced_fractions(divisions) dummy_division = divisions.pop() lcd = dummy_division.denominator multiplier = lcd / talea_denominator assert mathtools.is_integer_equivalent_expr(multiplier), repr(multiplier) multiplier = int(multiplier) scaled_taleas = [] for talea in taleas: talea = [multiplier * _ for _ in talea] talea = datastructuretools.CyclicTuple(talea) scaled_taleas.append(talea) result = [divisions, lcd] result.extend(scaled_taleas) return tuple(result)
def _scale_taleas(self, divisions, talea_denominator, taleas): talea_denominator = talea_denominator or 1 dummy_division = (1, talea_denominator) divisions.append(dummy_division) Duration = durationtools.Duration divisions = Duration.durations_to_nonreduced_fractions(divisions) dummy_division = divisions.pop() lcd = dummy_division.denominator multiplier = lcd / talea_denominator assert mathtools.is_integer_equivalent_expr(multiplier), repr( multiplier) multiplier = int(multiplier) scaled_taleas = [] for talea in taleas: talea = [multiplier * _ for _ in talea] talea = datastructuretools.CyclicTuple(talea) scaled_taleas.append(talea) result = [divisions, lcd] result.extend(scaled_taleas) return tuple(result)
def __init__( self, leaf_count=1, is_diminution=True, beam_cells_together=False, beam_each_cell=True, decrease_durations_monotonically=True, forbidden_written_duration=None, ): RhythmMaker.__init__( self, beam_cells_together=beam_cells_together, beam_each_cell=beam_each_cell, decrease_durations_monotonically=decrease_durations_monotonically, forbidden_written_duration=forbidden_written_duration, ) assert mathtools.is_integer_equivalent_expr(leaf_count) leaf_count = int(leaf_count) self._leaf_count = leaf_count self._is_diminution = is_diminution
def is_integer_equivalent_singleton(expr): r'''Is true when `expr` is a singleton of integer-equivalent expressions. :: >>> mathtools.is_integer_equivalent_singleton((2.0,)) True Otherwise false: :: >>> mathtools.is_integer_equivalent_singleton((2.5,)) False Returns boolean. ''' from abjad.tools import mathtools return isinstance(expr, tuple) and len(expr) == 1 and \ all(mathtools.is_integer_equivalent_expr(x) for x in expr)
def is_integer_equivalent_pair(expr): r'''Is true when `expr` is a pair of integer-equivalent expressions. :: >>> mathtools.is_integer_equivalent_pair((2.0, '3')) True Otherwise false: :: >>> mathtools.is_integer_equivalent_pair((2.5, '3')) False Returns boolean. ''' from abjad.tools import mathtools return isinstance(expr, tuple) and len(expr) == 2 and \ all(mathtools.is_integer_equivalent_expr(x) for x in expr)
def is_integer_equivalent_pair(expr): r'''Is true when `expr` is a pair of integer-equivalent expressions. :: >>> mathtools.is_integer_equivalent_pair((2.0, '3')) True Otherwise false: :: >>> mathtools.is_integer_equivalent_pair((2.5, '3')) False Returns true or false. ''' from abjad.tools import mathtools return isinstance(expr, tuple) and len(expr) == 2 and \ all(mathtools.is_integer_equivalent_expr(x) for x in expr)
def is_integer_equivalent_n_tuple(expr, n): r'''Is true when `expr` is a tuple of `n` integer-equivalent expressions. :: >>> mathtools.is_integer_equivalent_n_tuple((2.0, '3', Fraction(4, 1)), 3) True Otherwise false: :: >>> mathtools.is_integer_equivalent_n_tuple((2.5, '3', Fraction(4, 1)), 3) False Returns boolean. ''' from abjad.tools import mathtools return isinstance(expr, tuple) and len(expr) == n and \ all(mathtools.is_integer_equivalent_expr(x) for x in expr)
def is_integer_equivalent_n_tuple(expr, n): r'''Is true when `expr` is a tuple of `n` integer-equivalent expressions. :: >>> mathtools.is_integer_equivalent_n_tuple((2.0, '3', Fraction(4, 1)), 3) True Otherwise false: :: >>> mathtools.is_integer_equivalent_n_tuple((2.5, '3', Fraction(4, 1)), 3) False Returns true or false. ''' from abjad.tools import mathtools return isinstance(expr, tuple) and len(expr) == n and \ all(mathtools.is_integer_equivalent_expr(x) for x in expr)
def is_integer_equivalent_singleton(expr): r'''Is true when `expr` is a singleton of integer-equivalent expressions. :: >>> mathtools.is_integer_equivalent_singleton((2.0,)) True Otherwise false: :: >>> mathtools.is_integer_equivalent_singleton((2.5,)) False Returns true or false. ''' from abjad.tools import mathtools return isinstance(expr, tuple) and len(expr) == 1 and \ all(mathtools.is_integer_equivalent_expr(x) for x in expr)
def all_are_integer_equivalent_exprs(expr): """True when `expr` is a sequence and all elements in `expr` are integer-equivalent expressions: :: >>> sequencetools.all_are_integer_equivalent_exprs([1, '2', 3.0, Fraction(4, 1)]) True Otherwise false: :: >>> sequencetools.all_are_integer_equivalent_exprs([1, '2', 3.5, 4]) False Returns boolean. """ try: return all(mathtools.is_integer_equivalent_expr(x) for x in expr) except TypeError: return False
def all_are_integer_equivalent_exprs(expr): '''Is true when `expr` is a sequence and all elements in `expr` are integer-equivalent expressions. :: >>> mathtools.all_are_integer_equivalent_exprs([1, '2', 3.0, Fraction(4, 1)]) True Otherwise false: :: >>> mathtools.all_are_integer_equivalent_exprs([1, '2', 3.5, 4]) False Returns true or false. ''' from abjad.tools import mathtools try: return all(mathtools.is_integer_equivalent_expr(x) for x in expr) except TypeError: return False
def _get_nth_component_in_time_order_from(self, n): assert mathtools.is_integer_equivalent_expr(n) def next(component): if component is not None: for parent in component._get_parentage(include_self=True): next_sibling = parent._get_sibling(1) if next_sibling is not None: return next_sibling def previous(component): if component is not None: for parent in component._get_parentage(include_self=True): next_sibling = parent._get_sibling(-1) if next_sibling is not None: return next_sibling result = self if 0 < n: for i in range(n): result = next(result) elif n < 0: for i in range(abs(n)): result = previous(result) return result
def test_mathtools_is_integer_equivalent_expr_02(): assert not mathtools.is_integer_equivalent_expr('foo') assert not mathtools.is_integer_equivalent_expr('12.0') assert not mathtools.is_integer_equivalent_expr(1.5) assert not mathtools.is_integer_equivalent_expr(-1.5)
def test_mathtools_is_integer_equivalent_expr_01(): assert mathtools.is_integer_equivalent_expr(12) assert mathtools.is_integer_equivalent_expr('12') assert mathtools.is_integer_equivalent_expr(-1) assert mathtools.is_integer_equivalent_expr('-1')
def list_related_tempos( self, maximum_numerator=None, maximum_denominator=None, ): r'''Lists tempos related to this tempo. Returns list of tempo / ratio pairs. Each new tempo equals not less than half of this tempo and not more than twice this tempo. .. container:: example Rewrites tempo ``58`` MM by ratios of the form ``n:d`` such that ``1 <= n <= 8`` and ``1 <= d <= 8``: ... :: >>> tempo = Tempo(Duration(1, 4), 58) >>> pairs = tempo.list_related_tempos( ... maximum_numerator=8, ... maximum_denominator=8, ... ) :: >>> for tempo, ratio in pairs: ... string = '{!s}\t{!s}'.format(tempo, ratio) ... print(string) 4=29 1:2 4=58 1:1 4=87 3:2 4=116 2:1 .. container:: example Rewrites tempo ``58`` MM by ratios of the form ``n:d`` such that ``1 <= n <= 30`` and ``1 <= d <= 30``: :: >>> tempo = Tempo(Duration(1, 4), 58) >>> pairs = tempo.list_related_tempos( ... maximum_numerator=30, ... maximum_denominator=30, ... ) :: >>> for tempo, ratio in pairs: ... string = '{!s}\t{!s}'.format(tempo, ratio) ... print(string) ... 4=30 15:29 4=32 16:29 4=34 17:29 4=36 18:29 4=38 19:29 4=40 20:29 4=42 21:29 4=44 22:29 4=46 23:29 4=48 24:29 4=50 25:29 4=52 26:29 4=54 27:29 4=56 28:29 4=58 1:1 4=60 30:29 Returns list. ''' # assert integer tempo assert isinstance(self.units_per_minute, int), repr(self) # find divisors divisors = mathtools.divisors(self.units_per_minute) if maximum_denominator is not None: divisors = [x for x in divisors if x <= maximum_denominator] # make pairs pairs = [] for divisor in divisors: start = int(math.ceil(divisor / 2.0)) stop = 2 * divisor numerators = range(start, stop + 1) if maximum_numerator is not None: numerators = [ x for x in numerators if x <= maximum_numerator ] for numerator in numerators: ratio = mathtools.Ratio(numerator, divisor) multiplier = durationtools.Multiplier(*ratio) new_units_per_minute = multiplier * self.units_per_minute assert mathtools.is_integer_equivalent_expr( new_units_per_minute) new_units_per_minute = int(new_units_per_minute) new_tempo = type(self)( duration=self.duration, units_per_minute=new_units_per_minute, ) pair = (new_tempo, ratio) if pair not in pairs: pairs.append(pair) # sort pairs pairs.sort() # return pairs return pairs
def list_related_tempos( self, maximum_numerator=None, maximum_denominator=None, ): r'''Lists tempos related to this tempo. Returns list of tempo / ratio pairs. Each new tempo equals not less than half of this tempo and not more than twice this tempo. .. container:: example Rewrites tempo ``58`` MM by ratios of the form ``n:d`` such that ``1 <= n <= 8`` and ``1 <= d <= 8``: ... :: >>> tempo = Tempo(Duration(1, 4), 58) >>> pairs = tempo.list_related_tempos( ... maximum_numerator=8, ... maximum_denominator=8, ... ) :: >>> for tempo, ratio in pairs: ... string = '{!s}\t{!s}'.format(tempo, ratio) ... print string 4=29 1:2 4=58 1:1 4=87 3:2 4=116 2:1 .. container:: example Rewrites tempo ``58`` MM by ratios of the form ``n:d`` such that ``1 <= n <= 30`` and ``1 <= d <= 30``: :: >>> tempo = Tempo(Duration(1, 4), 58) >>> pairs = tempo.list_related_tempos( ... maximum_numerator=30, ... maximum_denominator=30, ... ) :: >>> for tempo, ratio in pairs: ... string = '{!s}\t{!s}'.format(tempo, ratio) ... print string ... 4=30 15:29 4=32 16:29 4=34 17:29 4=36 18:29 4=38 19:29 4=40 20:29 4=42 21:29 4=44 22:29 4=46 23:29 4=48 24:29 4=50 25:29 4=52 26:29 4=54 27:29 4=56 28:29 4=58 1:1 4=60 30:29 Returns list. ''' # assert integer tempo assert isinstance(self.units_per_minute, int), repr(self) # find divisors divisors = mathtools.divisors(self.units_per_minute) if maximum_denominator is not None: divisors = [x for x in divisors if x <= maximum_denominator] # make pairs pairs = [] for divisor in divisors: start = int(math.ceil(divisor / 2.0)) stop = 2 * divisor numerators = range(start, stop + 1) if maximum_numerator is not None: numerators = [ x for x in numerators if x <= maximum_numerator ] for numerator in numerators: ratio = mathtools.Ratio(numerator, divisor) multiplier = durationtools.Multiplier(*ratio) new_units_per_minute = multiplier * self.units_per_minute assert mathtools.is_integer_equivalent_expr( new_units_per_minute) new_units_per_minute = int(new_units_per_minute) new_tempo = type(self)(self.duration, new_units_per_minute) pair = (new_tempo, ratio) if pair not in pairs: pairs.append(pair) # sort pairs pairs.sort() # return pairs return pairs