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
Example #2
0
    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
Example #4
0
 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)
Example #6
0
 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
Example #7
0
 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
Example #8
0
 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
Example #11
0
 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
Example #12
0
 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)
Example #13
0
 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)
Example #14
0
 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
Example #15
0
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)
Example #17
0
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)
Example #19
0
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
Example #23
0
    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
Example #24
0
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)
Example #25
0
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')
Example #26
0
    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
Example #27
0
    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