def semitones(self): r'''Gets semitones of named interval. .. container:: example >>> abjad.NamedInterval('+M9').semitones 14 >>> abjad.NamedInterval('-M9').semitones -14 >>> abjad.NamedInterval('P1').semitones 0 >>> abjad.NamedInterval('+P8').semitones 12 >>> abjad.NamedInterval('-P8').semitones -12 Returns number. ''' from abjad.tools import pitchtools result = 0 interval_class_number_to_semitones = { 1: 0, 2: 1, 3: 3, 4: 5, 5: 7, 6: 8, 7: 10, 8: 0, } perfect_interval_classes = ( 1, 4, 5, 8, ) interval_class_number = abs( pitchtools.NamedIntervalClass(self).number) result += interval_class_number_to_semitones[interval_class_number] result += (abs(self.number) - 1) // 7 * 12 quality_string_to_semitones = { 'perfect': 0, 'major': 1, 'minor': 0, 'augmented': 1, 'diminished': -1, } result += quality_string_to_semitones[self.quality_string] if interval_class_number not in perfect_interval_classes and \ self.quality_string == "augmented": result += 1 if self.number < 0: result *= -1 return result
def named_interval_class(self): r'''Named interval class of named interval. :: >>> interval.named_interval_class NamedIntervalClass('+M2') Returns named inversion-equivalent interval-class. ''' from abjad.tools import pitchtools quality_string, number = self._quality_string, self.number return pitchtools.NamedIntervalClass(quality_string, number)
def label_leaves_in_expr_with_named_interval_classes(expr, markup_direction=Up): r"""Label leaves in `expr` with named interval classes: :: >>> notes = scoretools.make_notes([0, 25, 11, -4, -14, -13, 9, 10, 6, 5], [Duration(1, 8)]) >>> staff = Staff(notes) >>> labeltools.label_leaves_in_expr_with_named_interval_classes(staff) .. doctest:: >>> print(format(staff)) \new Staff { c'8 ^ \markup { +aug8 } cs'''8 ^ \markup { -M2 } b'8 ^ \markup { -aug2 } af8 ^ \markup { -m7 } bf,8 ^ \markup { aug1 } b,8 ^ \markup { +m7 } a'8 ^ \markup { +m2 } bf'8 ^ \markup { -dim4 } fs'8 ^ \markup { aug1 } f'8 } :: >>> show(staff) # doctest: +SKIP Returns none. """ for note in iterate(expr).by_class(scoretools.Note): logical_voice_iterator = iterate(note).by_logical_voice_from_component( scoretools.Leaf, ) try: next(logical_voice_iterator) next_leaf = next(logical_voice_iterator) if isinstance(next_leaf, scoretools.Note): mdi = pitchtools.NamedInterval.from_pitch_carriers( note, next_leaf) mdic = pitchtools.NamedIntervalClass(mdi) markup = markuptools.Markup(mdic, markup_direction) attach(markup, note) except StopIteration: pass
def __init__(self, *args): from abjad.tools import pitchtools if len(args) == 1 and isinstance(args[0], type(self)): self._initialize_by_self_reference(args[0]) elif len(args) == 1 and isinstance(args[0], str): self._initialize_by_string(args[0]) elif len(args) == 1 and isinstance(args[0], pitchtools.NamedIntervalClass): self._initialize_by_string(str(args[0])) elif len(args) == 1 and isinstance(args[0], pitchtools.NamedInterval): interval_class = pitchtools.NamedIntervalClass(args[0]) self._initialize_by_string(str(interval_class)) elif len(args) == 1 and isinstance(args[0], tuple): self._initialize_by_quality_string_and_number(*args[0]) elif len(args) == 2: self._initialize_by_quality_string_and_number(*args) elif len(args) == 0: self._initialize_by_string('P1') else: message = 'can not initialize {}: {!r}.' message = message.format(type(self).__name__, args) raise ValueError(message)
def instantiate_pitch_and_interval_test_collection(): r'''Instantiate pitch and interval test collection: :: >>> for x in pitchtools.instantiate_pitch_and_interval_test_collection(): x ... NumberedInversionEquivalentIntervalClass(1) NamedInversionEquivalentIntervalClass('+M2') NumberedInterval(1) NumberedIntervalClass(1) NamedInterval('+M2') NamedIntervalClass('+M2') NamedPitch('c') NamedPitchClass('c') NumberedPitch(1) NumberedPitchClass(1) Use to test pitch and interval interface consistency. Returns list. ''' from abjad.tools import pitchtools result = [] result.append(pitchtools.NumberedInversionEquivalentIntervalClass(1)) result.append(pitchtools.NamedInversionEquivalentIntervalClass('M2')) result.append(pitchtools.NumberedInterval(1)) result.append(pitchtools.NumberedIntervalClass(1)) result.append(pitchtools.NamedInterval('M2')) result.append(pitchtools.NamedIntervalClass('M2')) result.append(pitchtools.NamedPitch('c')) result.append(pitchtools.NamedPitchClass('c')) result.append(pitchtools.NumberedPitch(1)) result.append(pitchtools.NumberedPitchClass(1)) return result