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)], )
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)], )
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)
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 )
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 )
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)
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)
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)
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)
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)
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)
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], )
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)
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 )
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)
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
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