class HeadMusic::DiatonicInterval

A diatonic interval is the distance between two spelled pitches.

Constants

NAME_SUFFIXES
NUMBER_NAMES

TODO: include Named module

QUALITY_ABBREVIATIONS
QUALITY_SEMITONES

Attributes

higher_pitch[R]
lower_pitch[R]

Public Class Methods

get(identifier) click to toggle source

Accepts a name and returns the interval with middle c on the bottom

# File lib/head_music/diatonic_interval.rb, line 287
def self.get(identifier)
  name = Parser.new(identifier)
  semitones = Semitones.new(name.degree_name.to_sym, name.quality_name).count
  higher_pitch = HeadMusic::Pitch.from_number_and_letter(HeadMusic::Pitch.middle_c + semitones, name.higher_letter)
  new(HeadMusic::Pitch.middle_c, higher_pitch)
end
new(pitch1, pitch2) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 294
def initialize(pitch1, pitch2)
  pitch1 = HeadMusic::Pitch.get(pitch1)
  pitch2 = HeadMusic::Pitch.get(pitch2)
  @lower_pitch, @higher_pitch = [pitch1, pitch2].sort
end

Public Instance Methods

<=>(other) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 358
def <=>(other)
  other = self.class.get(other) unless other.is_a?(HeadMusic::DiatonicInterval)
  semitones <=> other.semitones
end
above(pitch) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 336
def above(pitch)
  pitch = HeadMusic::Pitch.get(pitch)
  HeadMusic::Pitch.from_number_and_letter(pitch + semitones, pitch.letter_name.steps_up(number - 1))
end
below(pitch) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 341
def below(pitch)
  pitch = HeadMusic::Pitch.get(pitch)
  HeadMusic::Pitch.from_number_and_letter(pitch - semitones, pitch.letter_name.steps_down(number - 1))
end
consonance(style = :standard_practice) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 313
def consonance(style = :standard_practice)
  consonance_for_perfect(style) ||
    consonance_for_major_and_minor ||
    HeadMusic::Consonance.get(:dissonant)
end
consonance?(style = :standard_practice) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 319
def consonance?(style = :standard_practice)
  consonance(style).perfect? || consonance(style).imperfect?
end
Also aliased as: consonant?
consonant?(style = :standard_practice)
Alias for: consonance?
dissonance?(style = :standard_practice) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 332
def dissonance?(style = :standard_practice)
  consonance(style).dissonant?
end
imperfect_consonance?(style = :standard_practice) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 328
def imperfect_consonance?(style = :standard_practice)
  consonance(style).imperfect?
end
interval_class() click to toggle source
# File lib/head_music/diatonic_interval.rb, line 346
def interval_class
  [simple_semitones, 12 - simple_semitones].min
end
interval_class_name() click to toggle source
# File lib/head_music/diatonic_interval.rb, line 350
def interval_class_name
  "ic #{interval_class}"
end
inversion() click to toggle source
# File lib/head_music/diatonic_interval.rb, line 304
def inversion
  inverted_low_pitch = lower_pitch
  while inverted_low_pitch < higher_pitch
    inverted_low_pitch = HeadMusic::Pitch.fetch_or_create(lower_pitch.spelling, inverted_low_pitch.register + 1)
  end
  HeadMusic::DiatonicInterval.new(higher_pitch, inverted_low_pitch)
end
Also aliased as: invert
invert()
Alias for: inversion
perfect_consonance?(style = :standard_practice) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 324
def perfect_consonance?(style = :standard_practice)
  consonance(style).perfect?
end
quality() click to toggle source
# File lib/head_music/diatonic_interval.rb, line 300
def quality
  HeadMusic::Quality.get(quality_name)
end

Private Instance Methods

category() click to toggle source
# File lib/head_music/diatonic_interval.rb, line 377
def category
  @category ||= Category.new(number)
end
consonance_for_major_and_minor() click to toggle source
# File lib/head_music/diatonic_interval.rb, line 393
def consonance_for_major_and_minor
  HeadMusic::Consonance.get(third_or_compound? || sixth_or_compound? ? :imperfect : :dissonant) if major? || minor?
end
consonance_for_perfect(style = :standard_practice) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 389
def consonance_for_perfect(style = :standard_practice)
  HeadMusic::Consonance.get(dissonant_fourth?(style) ? :dissonant : :perfect) if perfect?
end
dissonant_fourth?(style = :standard_practice) click to toggle source
# File lib/head_music/diatonic_interval.rb, line 397
def dissonant_fourth?(style = :standard_practice)
  fourth_or_compound? && style == :two_part_harmony
end
named_number?() click to toggle source
# File lib/head_music/diatonic_interval.rb, line 385
def named_number?
  number < NUMBER_NAMES.length
end
naming() click to toggle source
# File lib/head_music/diatonic_interval.rb, line 381
def naming
  @naming ||= Naming.new(number: number, semitones: semitones)
end
size() click to toggle source
# File lib/head_music/diatonic_interval.rb, line 373
def size
  @size ||= Size.new(@lower_pitch, @higher_pitch)
end