Beispiel #1
0
 def _get_format_specification(self):
     items = []
     if self.item_class.__name__.startswith('Named'):
         items = [str(x) for x in self]
     elif hasattr(self.item_class, 'pitch_number'):
         items = [x.pitch_number for x in self]
     elif hasattr(self.item_class, 'pitch_class_number'):
         items = [x.pitch_class_number for x in self]
     elif self.item_class.__name__.startswith('Numbered'):
         items = [
             mathtools.integer_equivalent_number_to_integer(float(x.number))
             for x in self
         ]
     elif hasattr(self.item_class, '__abs__'):
         items = [abs(x) for x in self]
     else:
         message = 'invalid item class: {!r}.'
         message = message.format(self.item_class)
         raise ValueError(message)
     return FormatSpecification(
         client=self,
         repr_is_indented=False,
         repr_kwargs_names=['name'],
         repr_args_values=[items],
         storage_format_args_values=[tuple(self._collection)],
     )
Beispiel #2
0
 def _get_format_specification(self):
     items = []
     if self.item_class.__name__.startswith("Named"):
         items = [str(x) for x in self]
     elif hasattr(self.item_class, "pitch_number"):
         items = [x.pitch_number for x in self]
     elif hasattr(self.item_class, "pitch_class_number"):
         items = [x.pitch_class_number for x in self]
     elif self.item_class.__name__.startswith("Numbered"):
         items = [
             mathtools.integer_equivalent_number_to_integer(float(x.number))
             for x in self
         ]
     elif hasattr(self.item_class, "__abs__"):
         items = [abs(x) for x in self]
     else:
         message = "invalid item class: {!r}."
         message = message.format(self.item_class)
         raise ValueError(message)
     return FormatSpecification(
         client=self,
         repr_is_indented=False,
         repr_kwargs_names=["name"],
         repr_args_values=[items],
         storage_format_args_values=[tuple(self._collection)],
     )
Beispiel #3
0
    def _named_to_numbered(cls, direction, quality, diatonic_number):
        octave_number = 0
        diatonic_pc_number = abs(diatonic_number)
        while diatonic_pc_number >= 8:
            diatonic_pc_number -= 7
            octave_number += 1

        quartertone = ''
        if quality.endswith(('+', '~')):
            quality, quartertone = quality[:-1], quality[-1]

        base_quality = quality
        if base_quality == 'P' and octave_number and diatonic_pc_number == 1:
            return 12 * direction
        if len(quality) > 1:
            base_quality = quality[0]

        semitones = constants._diatonic_number_and_quality_to_semitones[
            diatonic_pc_number][base_quality]
        if base_quality == 'd':
            semitones -= (len(quality) - 1)
        elif base_quality == 'A':
            semitones += (len(quality) - 1)

        if quartertone == '+':
            semitones += 0.5
        elif quartertone == '~':
            semitones -= 0.5

        if abs(diatonic_number) == 1:
            semitones = abs(semitones)
        while abs(semitones) > 12:
            semitones = (abs(semitones) - 12) * mathtools.sign(semitones)
        semitones *= direction
        return mathtools.integer_equivalent_number_to_integer(semitones)
Beispiel #4
0
    def number(self):
        """
        Gets number of named pitch.

        ..  container:: example

            >>> abjad.NamedPitch("c''").number
            12

            >>> abjad.NamedPitch("cs''").number
            13

            >>> abjad.NamedPitch("df''").number
            13

            >>> abjad.NamedPitch("cf'").number
            -1

        Returns number.
        """
        diatonic_pc_number = self.pitch_class._get_diatonic_pc_number()
        pc_number = constants._diatonic_pc_number_to_pitch_class_number[diatonic_pc_number]
        alteration = self.pitch_class._get_alteration()
        octave_base_pitch = (self.octave.number - 4) * 12
        return mathtools.integer_equivalent_number_to_integer(
            pc_number + alteration + octave_base_pitch
            )
Beispiel #5
0
    def number(self):
        """
        Gets number of named pitch.

        ..  container:: example

            >>> abjad.NamedPitch("c''").number
            12

            >>> abjad.NamedPitch("cs''").number
            13

            >>> abjad.NamedPitch("df''").number
            13

            >>> abjad.NamedPitch("cf'").number
            -1

        Returns number.
        """
        diatonic_pc_number = self.pitch_class._get_diatonic_pc_number()
        pc_number = constants._diatonic_pc_number_to_pitch_class_number[
            diatonic_pc_number
        ]
        alteration = self.pitch_class._get_alteration()
        octave_base_pitch = (self.octave.number - 4) * 12
        return mathtools.integer_equivalent_number_to_integer(
            pc_number + alteration + octave_base_pitch
        )
Beispiel #6
0
    def _named_to_numbered(cls, direction, quality, diatonic_number):
        octave_number = 0
        diatonic_pc_number = abs(diatonic_number)
        while diatonic_pc_number >= 8:
            diatonic_pc_number -= 7
            octave_number += 1

        quartertone = ""
        if quality.endswith(("+", "~")):
            quality, quartertone = quality[:-1], quality[-1]

        base_quality = quality
        if len(quality) > 1:
            base_quality = quality[0]

        semitones = constants._diatonic_number_and_quality_to_semitones[
            diatonic_pc_number
        ][base_quality]
        if base_quality == "d":
            semitones -= len(quality) - 1
        elif base_quality == "A":
            semitones += len(quality) - 1

        if quartertone == "+":
            semitones += 0.5
        elif quartertone == "~":
            semitones -= 0.5

        if abs(diatonic_number) == 1:
            semitones = abs(semitones)
        else:
            semitones += octave_number * 12
        semitones *= direction
        return mathtools.integer_equivalent_number_to_integer(semitones)
Beispiel #7
0
    def _named_to_numbered(cls, direction, quality, diatonic_number):
        octave_number = 0
        diatonic_pc_number = abs(diatonic_number)
        while diatonic_pc_number >= 8:
            diatonic_pc_number -= 7
            octave_number += 1

        quartertone = ""
        if quality.endswith(("+", "~")):
            quality, quartertone = quality[:-1], quality[-1]

        base_quality = quality
        if len(quality) > 1:
            base_quality = quality[0]

        semitones = constants._diatonic_number_and_quality_to_semitones[
            diatonic_pc_number][base_quality]
        if base_quality == "d":
            semitones -= len(quality) - 1
        elif base_quality == "A":
            semitones += len(quality) - 1

        if quartertone == "+":
            semitones += 0.5
        elif quartertone == "~":
            semitones -= 0.5

        if abs(diatonic_number) == 1:
            semitones = abs(semitones)
        else:
            semitones += octave_number * 12
        semitones *= direction
        return mathtools.integer_equivalent_number_to_integer(semitones)
Beispiel #8
0
 def _to_nearest_quarter_tone(number):
     number = round(float(number) * 4) / 4
     div, mod = divmod(number, 1)
     if mod == 0.75:
         div += 1
     elif mod == 0.5:
         div += 0.5
     return mathtools.integer_equivalent_number_to_integer(div)
Beispiel #9
0
 def _to_nearest_quarter_tone(number):
     number = round(float(number) * 4) / 4
     div, mod = divmod(number, 1)
     if mod == 0.75:
         div += 1
     elif mod == 0.5:
         div += 0.5
     return mathtools.integer_equivalent_number_to_integer(div)
Beispiel #10
0
 def _from_named_parts(self, dpc_number, alteration, octave):
     import abjad
     pc_number = constants._diatonic_pc_number_to_pitch_class_number[
         dpc_number]
     pc_number += alteration
     pc_number += (octave - 4) * 12
     self._number = mathtools.integer_equivalent_number_to_integer(
         pc_number)
     octave_number, pc_number = divmod(self._number, 12)
     self._pitch_class = abjad.NumberedPitchClass(pc_number)
     self._octave = abjad.Octave(octave_number + 4)
Beispiel #11
0
    def _from_named_parts(self, dpc_number, alteration, octave):
        import abjad

        pc_number = constants._diatonic_pc_number_to_pitch_class_number[
            dpc_number
        ]
        pc_number += alteration
        pc_number += (octave - 4) * 12
        self._number = mathtools.integer_equivalent_number_to_integer(
            pc_number
        )
        octave_number, pc_number = divmod(self._number, 12)
        self._pitch_class = abjad.NumberedPitchClass(pc_number)
        self._octave = abjad.Octave(octave_number + 4)
Beispiel #12
0
    def number(self):
        """
        Gets number of numbered pitch.

        ..  container:: example

            >>> abjad.NumberedPitch(13).number
            13

        Returns number.
        """
        pc_number = float(self.pitch_class)
        octave_base_pitch = (self.octave.number - 4) * 12
        return mathtools.integer_equivalent_number_to_integer(
            pc_number + octave_base_pitch)
Beispiel #13
0
 def _get_format_specification(self):
     if self.item_class.__name__.startswith("Named"):
         repr_items = {str(k): v for k, v in self.items()}
     else:
         repr_items = {
             mathtools.integer_equivalent_number_to_integer(float(
                 k.number)): v
             for k, v in self.items()
         }
     return FormatSpecification(
         client=self,
         repr_is_indented=False,
         repr_args_values=[repr_items],
         storage_format_args_values=[self._collection],
     )
Beispiel #14
0
    def from_pitch_carriers(class_, pitch_carrier_1, pitch_carrier_2):
        """Makes numbered interval from `pitch_carrier_1` and
        `pitch_carrier_2`.

        ..  container:: example

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(-2),
            ...     abjad.NamedPitch(12),
            ...     )
            NumberedInterval(14)

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(12),
            ...     abjad.NamedPitch(12),
            ...     )
            NumberedInterval(0)

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(9),
            ...     abjad.NamedPitch(12),
            ...     )
            NumberedInterval(3)

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(12),
            ...     abjad.NamedPitch(9),
            ...     )
            NumberedInterval(-3)

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(12),
            ...     abjad.NamedPitch(-2),
            ...     )
            NumberedInterval(-14)

        Returns numbered interval.
        """
        import abjad.pitch

        pitch_1 = abjad.pitch.NamedPitch(pitch_carrier_1)
        pitch_2 = abjad.pitch.NamedPitch(pitch_carrier_2)
        number = (
            abjad.pitch.NumberedPitch(pitch_2).number
            - abjad.pitch.NumberedPitch(pitch_1).number
        )
        number = mathtools.integer_equivalent_number_to_integer(number)
        return class_(number)
Beispiel #15
0
    def number(self):
        """
        Gets number of numbered pitch.

        ..  container:: example

            >>> abjad.NumberedPitch(13).number
            13

        Returns number.
        """
        pc_number = float(self.pitch_class)
        octave_base_pitch = (self.octave.number - 4) * 12
        return mathtools.integer_equivalent_number_to_integer(
            pc_number + octave_base_pitch
        )
Beispiel #16
0
    def from_pitch_carriers(class_, pitch_carrier_1, pitch_carrier_2):
        """Makes numbered interval from `pitch_carrier_1` and
        `pitch_carrier_2`.

        ..  container:: example

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(-2),
            ...     abjad.NamedPitch(12),
            ...     )
            NumberedInterval(14)

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(12),
            ...     abjad.NamedPitch(12),
            ...     )
            NumberedInterval(0)

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(9),
            ...     abjad.NamedPitch(12),
            ...     )
            NumberedInterval(3)

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(12),
            ...     abjad.NamedPitch(9),
            ...     )
            NumberedInterval(-3)

            >>> abjad.NumberedInterval.from_pitch_carriers(
            ...     abjad.NamedPitch(12),
            ...     abjad.NamedPitch(-2),
            ...     )
            NumberedInterval(-14)

        Returns numbered interval.
        """
        import abjad.pitch

        pitch_1 = abjad.pitch.NamedPitch(pitch_carrier_1)
        pitch_2 = abjad.pitch.NamedPitch(pitch_carrier_2)
        number = (abjad.pitch.NumberedPitch(pitch_2).number -
                  abjad.pitch.NumberedPitch(pitch_1).number)
        number = mathtools.integer_equivalent_number_to_integer(number)
        return class_(number)
Beispiel #17
0
 def __init__(self, name='', *, arrow=None):
     import abjad
     semitones = 0
     _arrow = None
     if name is None:
         pass
     elif isinstance(name, str):
         if name in constants._accidental_name_to_abbreviation:
             name = constants._accidental_name_to_abbreviation[name]
             semitones = constants._accidental_abbreviation_to_semitones[
                 name]
         else:
             match = constants._comprehensive_accidental_regex.match(name)
             if not match:
                 try:
                     pitch = abjad.NamedPitch(name)
                     semitones = pitch.accidental.semitones
                     _arrow = pitch.accidental.arrow
                 except Exception:
                     message = 'can not instantiate {} from {!r}.'
                     message = message.format(type(self).__name__, name)
                     raise TypeError(message)
             else:
                 group_dict = match.groupdict()
                 if group_dict['alphabetic_accidental']:
                     prefix, _, suffix = name.partition('q')
                     if prefix.startswith('s'):
                         semitones += len(prefix)
                     elif prefix.startswith('f'):
                         semitones -= len(prefix)
                     if suffix == 's':
                         semitones += 0.5
                         if prefix == 't':
                             semitones += 1
                     elif suffix == 'f':
                         semitones -= 0.5
                         if prefix == 't':
                             semitones -= 1
                 elif group_dict['symbolic_accidental']:
                     semitones += name.count('#')
                     semitones -= name.count('b')
                     if name.endswith('+'):
                         semitones += 0.5
                     elif name.endswith('~'):
                         semitones -= 0.5
     elif isinstance(name, numbers.Number):
         semitones = float(name)
         assert (semitones % 1.) in (0., 0.5)
     elif hasattr(name, 'accidental'):
         _arrow = name.accidental.arrow
         semitones = name.accidental.semitones
     elif isinstance(name, type(self)):
         _arrow = name.arrow
         semitones = name.semitones
     else:
         try:
             pitch = abjad.NamedPitch(name)
             semitones = pitch.accidental.semitones
             _arrow = pitch.accidental.arrow
         except Exception:
             message = 'can not initialize accidental from value: {!r}'
             message = message.format(name)
             raise ValueError(message)
     semitones = mathtools.integer_equivalent_number_to_integer(semitones)
     self._semitones = semitones
     self._arrow = _arrow
     if arrow is not None:
         arrow = enums.VerticalAlignment.from_expr(arrow)
         if arrow is enums.Center:
             arrow = None
         self._arrow = arrow
Beispiel #18
0
    def __init__(self, name="", *, arrow=None):
        import abjad

        semitones = 0
        _arrow = None
        if name is None:
            pass
        elif isinstance(name, str):
            if name in constants._accidental_name_to_abbreviation:
                name = constants._accidental_name_to_abbreviation[name]
                semitones = constants._accidental_abbreviation_to_semitones[
                    name
                ]
            else:
                match = constants._comprehensive_accidental_regex.match(name)
                if not match:
                    try:
                        pitch = abjad.NamedPitch(name)
                        semitones = pitch.accidental.semitones
                        _arrow = pitch.accidental.arrow
                    except Exception:
                        message = "can not instantiate {} from {!r}."
                        message = message.format(type(self).__name__, name)
                        raise TypeError(message)
                else:
                    group_dict = match.groupdict()
                    if group_dict["alphabetic_accidental"]:
                        prefix, _, suffix = name.partition("q")
                        if prefix.startswith("s"):
                            semitones += len(prefix)
                        elif prefix.startswith("f"):
                            semitones -= len(prefix)
                        if suffix == "s":
                            semitones += 0.5
                            if prefix == "t":
                                semitones += 1
                        elif suffix == "f":
                            semitones -= 0.5
                            if prefix == "t":
                                semitones -= 1
                    elif group_dict["symbolic_accidental"]:
                        semitones += name.count("#")
                        semitones -= name.count("b")
                        if name.endswith("+"):
                            semitones += 0.5
                        elif name.endswith("~"):
                            semitones -= 0.5
        elif isinstance(name, numbers.Number):
            semitones = float(name)
            assert (semitones % 1.0) in (0.0, 0.5)
        elif hasattr(name, "accidental"):
            _arrow = name.accidental.arrow
            semitones = name.accidental.semitones
        elif isinstance(name, type(self)):
            _arrow = name.arrow
            semitones = name.semitones
        else:
            try:
                pitch = abjad.NamedPitch(name)
                semitones = pitch.accidental.semitones
                _arrow = pitch.accidental.arrow
            except Exception:
                message = "can not initialize accidental from value: {!r}"
                message = message.format(name)
                raise ValueError(message)
        semitones = mathtools.integer_equivalent_number_to_integer(semitones)
        self._semitones = semitones
        self._arrow = _arrow
        if arrow is not None:
            arrow = enums.VerticalAlignment.from_expr(arrow)
            if arrow is enums.Center:
                arrow = None
            self._arrow = arrow