Class: HeadMusic::Analysis::DiatonicInterval::Parser

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

Constant Summary collapse

NUMBER_NAMES =
HeadMusic::Analysis::DiatonicInterval::NUMBER_NAMES

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(identifier) ⇒ Parser

Returns a new instance of Parser.



6
7
8
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 6

def initialize(identifier)
  @identifier = expand(identifier)
end

Instance Attribute Details

#identifierObject (readonly)

Returns the value of attribute identifier.



4
5
6
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 4

def identifier
  @identifier
end

Instance Method Details

#degree_nameObject



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

def degree_name
  words.last
end

#expand(identifier) ⇒ Object



49
50
51
52
53
54
55
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 49

def expand(identifier)
  if /[A-Z]\d{1,2}/i.match?(identifier)
    number = NUMBER_NAMES[identifier.gsub(/[A-Z]/i, "").to_i - 1]
    return [quality_for(identifier[0]), number].join("_").to_sym
  end
  identifier
end

#higher_letterObject



41
42
43
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 41

def higher_letter
  middle_c.letter_name.steps_up(steps)
end

#higher_pitchObject



17
18
19
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 17

def higher_pitch
  HeadMusic::Rudiment::Pitch.from_number_and_letter(middle_c + semitones, higher_letter)
end

#intervalObject

The interval the identifier names, voiced from middle C upward. Every interval of a given name is the same interval, so where it sits is arbitrary; middle C is simply a place to put it.



13
14
15
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 13

def interval
  HeadMusic::Analysis::DiatonicInterval.new(middle_c, higher_pitch)
end

#middle_cObject



45
46
47
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 45

def middle_c
  HeadMusic::Rudiment::Pitch.middle_c
end

#quality_abbreviationsObject



57
58
59
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 57

def quality_abbreviations
  HeadMusic::Analysis::DiatonicInterval::QUALITY_ABBREVIATIONS
end

#quality_for(abbreviation) ⇒ Object



61
62
63
64
65
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 61

def quality_for(abbreviation)
  quality_abbreviations[abbreviation.to_sym] ||
    quality_abbreviations[abbreviation.upcase.to_sym] ||
    quality_abbreviations[abbreviation.downcase.to_sym]
end

#quality_nameObject



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

def quality_name
  words[0..-2].join(" ").to_sym
end

#semitonesObject



21
22
23
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 21

def semitones
  HeadMusic::Analysis::DiatonicInterval::Semitones.new(degree_name.to_sym, quality_name).count
end

#stepsObject



37
38
39
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 37

def steps
  NUMBER_NAMES.index(degree_name)
end

#wordsObject



25
26
27
# File 'lib/head_music/analysis/diatonic_interval/parser.rb', line 25

def words
  identifier.to_s.split(/[_ ]+/)
end