예제 #1
0
 def __new__(class_, *arguments):
     if len(arguments) == 1:
         argument = arguments[0]
         if type(argument) is class_:
             return argument
         if isinstance(argument, mathtools.NonreducedFraction):
             return Fraction.__new__(class_, *argument.pair)
         try:
             return Fraction.__new__(class_, *argument)
         except (AttributeError, TypeError):
             pass
         try:
             return Fraction.__new__(class_, argument)
         except (AttributeError, TypeError):
             pass
         if (isinstance(argument, tuple) and len(argument) == 2
                 and mathtools.is_integer_equivalent(argument[0])
                 and mathtools.is_integer_equivalent(argument[1])
                 and not argument[1] == 0):
             return Fraction.__new__(
                 class_,
                 int(argument[0]),
                 int(argument[1]),
             )
         try:
             return Fraction.__new__(class_, argument.duration)
         except AttributeError:
             pass
         if isinstance(argument, str) and '/' not in argument:
             result = Duration._initialize_from_lilypond_duration_string(
                 argument)
             return Fraction.__new__(class_, result)
         if (isinstance(argument, tuple) and len(argument) == 1
                 and mathtools.is_integer_equivalent(argument[0])):
             return Fraction.__new__(class_, int(argument[0]))
     else:
         try:
             return Fraction.__new__(class_, *arguments)
         except TypeError:
             pass
         if mathtools.all_are_integer_equivalent_numbers(arguments):
             return Fraction.__new__(class_, *[int(x) for x in arguments])
     message = 'can not construct duration: {!r}.'
     message = message.format(arguments)
     raise ValueError(message)
예제 #2
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(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
예제 #3
0
 def __init__(self, number=0):
     from abjad.tools import pitchtools
     if isinstance(number, numbers.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
     elif isinstance(number, pitchtools.Interval):
         number = number.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(number, pitchtools.IntervalClass):
         number = number.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 isinstance(number, str):
         number = float(number)
         if mathtools.is_integer_equivalent(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 {} from {!r}.'
         message = message.format(type(self).__name__, number)
         raise ValueError(message)
     self._number = number
def is_integer_equivalent_n_tuple(argument, n):
    r'''Is true when `argument` is a tuple of `n` integer-equivalent items.
    Otherwise false.

    ..  container:: example

        >>> tuple_ = (2.0, '3', abjad.Fraction(4, 1))
        >>> abjad.mathtools.is_integer_equivalent_n_tuple(tuple_, 3)
        True

        >>> tuple_ = (2.5, '3', abjad.Fraction(4, 1))
        >>> abjad.mathtools.is_integer_equivalent_n_tuple(tuple_, 3)
        False

    Returns true or false.
    '''
    from abjad.tools import mathtools
    return (isinstance(argument, tuple) and len(argument) == n
            and all(mathtools.is_integer_equivalent(_) for _ in argument))
 def __init__(self, number=0):
     if isinstance(number, type(self)):
         number = number.number
     elif isinstance(number, numbers.Number):
         if not 0 <= number <= 6:
             message = 'must be between 0 and 6, inclusive.'
             raise ValueError(message)
     elif getattr(number, 'semitones', None) is not None:
         number = number.semitones
         number %= 12
         if 6 < number:
             number = 12 - number
     elif isinstance(number, str):
         number = float(number)
         if mathtools.is_integer_equivalent(number):
             number = int(number)
     else:
         message = 'can not initialize {}: {!r}.'
         message = message.format(type(self).__name__, number)
         raise TypeError(message)
     self._number = number
예제 #6
0
def all_are_integer_equivalent(argument):
    '''Is true when `argument` is an iterable collection with
    integer-equivalent items. Otherwise false.

    ..  container:: example

        >>> items = [1, '2', 3.0, abjad.Fraction(4, 1)]
        >>> abjad.mathtools.all_are_integer_equivalent(items)
        True

        >>> abjad.mathtools.all_are_integer_equivalent([1, '2', 3.5, 4])
        False

    Returns true or false.
    '''
    from abjad.tools import mathtools
    try:
        return all(
            mathtools.is_integer_equivalent(_)
            for _ in argument
            )
    except TypeError:
        return False