Class: HeadMusic::Analysis::DiatonicInterval::Naming

Inherits:
Object
  • Object
show all
Defined in:
lib/head_music/analysis/diatonic_interval/naming.rb

Overview

Accepts a number and number of semitones and provides the naming methods.

Constant Summary collapse

QUALITY_SEMITONES =
HeadMusic::Analysis::DiatonicInterval::QUALITY_SEMITONES
NUMBER_NAMES =
HeadMusic::Analysis::DiatonicInterval::NUMBER_NAMES
NAME_SUFFIXES =
HeadMusic::Analysis::DiatonicInterval::NAME_SUFFIXES

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(number:, semitones:) ⇒ Naming

Returns a new instance of Naming.



9
10
11
12
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 9

def initialize(number:, semitones:)
  @number = number
  @semitones = semitones
end

Instance Attribute Details

#numberObject (readonly)

Returns the value of attribute number.



7
8
9
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 7

def number
  @number
end

#semitonesObject (readonly)

Returns the value of attribute semitones.



7
8
9
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 7

def semitones
  @semitones
end

Instance Method Details

#nameObject



37
38
39
40
41
42
43
44
45
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 37

def name
  if named_number?
    [quality_name, number_name].join(" ")
  elsif simple_name == "perfect octave"
    "#{octaves.humanize} octaves"
  else
    "#{octaves.humanize} octaves and #{quality.article} #{simple_name}"
  end
end

#named_number?Boolean (private)

Returns:

  • (Boolean)


58
59
60
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 58

def named_number?
  number < NUMBER_NAMES.length
end

#number_nameObject



33
34
35
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 33

def number_name
  NUMBER_NAMES[number - 1] || (number.to_s + NAME_SUFFIXES[number % 10])
end

#octave_equivalent?Boolean (private)

Returns:

  • (Boolean)


70
71
72
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 70

def octave_equivalent?
  number > 1 && ((number - 1) % 7).zero?
end

#octavesObject (private)



66
67
68
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 66

def octaves
  @octaves ||= semitones / 12
end

#qualityObject (private)



62
63
64
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 62

def quality
  @quality ||= HeadMusic::Rudiment::Quality.get(quality_name)
end

#quality_nameObject



22
23
24
25
26
27
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 22

def quality_name
  starting_quality = QUALITY_SEMITONES[simple_number_name.to_sym].keys.first
  delta = simple_semitones - (QUALITY_SEMITONES[simple_number_name.to_sym][starting_quality] % 12)
  delta -= 12 while delta >= 6
  HeadMusic::Rudiment::Quality.from(starting_quality, delta)
end

#shorthandObject



47
48
49
50
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 47

def shorthand
  step_shorthand = (number == 1) ? "U" : number
  [quality.shorthand, step_shorthand].join
end

#simple_nameObject



18
19
20
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 18

def simple_name
  [quality_name, simple_number_name].join(" ")
end

#simple_numberObject



14
15
16
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 14

def simple_number
  @simple_number ||= octave_equivalent? ? 8 : (number - 1) % 7 + 1
end

#simple_number_nameObject



29
30
31
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 29

def simple_number_name
  NUMBER_NAMES[simple_number - 1]
end

#simple_semitonesObject (private)



54
55
56
# File 'lib/head_music/analysis/diatonic_interval/naming.rb', line 54

def simple_semitones
  @simple_semitones ||= semitones % 12
end