Class: HeadMusic::ChromaticInterval
- Inherits:
-
Object
- Object
- HeadMusic::ChromaticInterval
show all
- Includes:
- Comparable, Named
- Defined in:
- lib/head_music/chromatic_interval.rb
Overview
A chromatic interval is the distance between two pitches measured in half-steps.
Constant Summary
collapse
- NAMES =
%w[
perfect_unison minor_second major_second minor_third major_third perfect_fourth tritone perfect_fifth
minor_sixth major_sixth minor_seventh major_seventh perfect_octave
].freeze
Instance Attribute Summary collapse
-
#semitones ⇒ Object
(also: #specific_interval)
readonly
Returns the value of attribute semitones.
Attributes included from Named
#alias_name_keys, #name_key
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from Named
#ensure_localized_name, included, #localized_name, #localized_names, #name, #name=
Constructor Details
Returns a new instance of ChromaticInterval.
22
23
24
25
26
27
28
29
|
# File 'lib/head_music/chromatic_interval.rb', line 22
def initialize(identifier)
if /^\D/i.match?(identifier.to_s.strip)
candidate = identifier.to_s.downcase.gsub(/\W+/, "_")
semitones = NAMES.index(candidate) || identifier.to_i
end
@semitones = semitones || identifier.to_i
set_name
end
|
Instance Attribute Details
#semitones ⇒ Object
Also known as:
specific_interval
Returns the value of attribute semitones.
13
14
15
|
# File 'lib/head_music/chromatic_interval.rb', line 13
def semitones
@semitones
end
|
Class Method Details
.get(identifier) ⇒ Object
15
16
17
18
19
20
|
# File 'lib/head_music/chromatic_interval.rb', line 15
def self.get(identifier)
@intervals ||= {}
candidate = identifier.to_s.downcase.gsub(/\W+/, "_")
semitones = NAMES.index(candidate) || identifier.to_i
@intervals[semitones] ||= new(semitones.to_i)
end
|
Instance Method Details
#<=>(other) ⇒ Object
70
71
72
|
# File 'lib/head_music/chromatic_interval.rb', line 70
def <=>(other)
to_i <=> other.to_i
end
|
#compound? ⇒ Boolean
47
48
49
|
# File 'lib/head_music/chromatic_interval.rb', line 47
def compound?
semitones > 12
end
|
#diatonic_name ⇒ Object
55
56
57
|
# File 'lib/head_music/chromatic_interval.rb', line 55
def diatonic_name
NAMES[simple.semitones].tr("_", " ")
end
|
#set_name ⇒ Object
31
32
33
34
35
36
37
|
# File 'lib/head_music/chromatic_interval.rb', line 31
def set_name
candidate = semitones
while name.nil? && candidate > 0
self.name = NAMES[candidate]
candidate -= 12
end
end
|
#simple? ⇒ Boolean
43
44
45
|
# File 'lib/head_music/chromatic_interval.rb', line 43
def simple?
(0..12).cover?(semitones)
end
|
#to_i ⇒ Object
51
52
53
|
# File 'lib/head_music/chromatic_interval.rb', line 51
def to_i
semitones
end
|