Class: HeadMusic::Style::Guidelines::ConsonantDownbeats

Inherits:
Annotation
  • Object
show all
Defined in:
lib/head_music/style/guidelines/consonant_downbeats.rb

Overview

A counterpoint guideline. Dissonant downbeats are permitted only when the counterpoint note is a properly tied-over suspension (i.e., it began before the current CF note).

Constant Summary collapse

MESSAGE =
"Use consonant harmonic intervals on every downbeat (unless a tied suspension)."

Instance Method Summary collapse

Constructor Details

This class inherits a constructor from HeadMusic::Style::Annotation

Instance Method Details

#dissonant_intervalsObject (private)



26
27
28
# File 'lib/head_music/style/guidelines/consonant_downbeats.rb', line 26

def dissonant_intervals
  downbeat_harmonic_intervals.select { |interval| interval.dissonance?(:two_part_harmony) }
end

#dissonant_pairsObject (private)



18
19
20
# File 'lib/head_music/style/guidelines/consonant_downbeats.rb', line 18

def dissonant_pairs
  non_suspension_dissonant_intervals.map(&:notes).compact
end

#marksObject



10
11
12
13
14
# File 'lib/head_music/style/guidelines/consonant_downbeats.rb', line 10

def marks
  dissonant_pairs.map do |dissonant_pair|
    HeadMusic::Style::Mark.for_all(dissonant_pair)
  end.flatten
end

#non_suspension_dissonant_intervalsObject (private)



22
23
24
# File 'lib/head_music/style/guidelines/consonant_downbeats.rb', line 22

def non_suspension_dissonant_intervals
  dissonant_intervals.reject { |interval| tied_suspension?(interval) }
end

#tied_suspension?(interval) ⇒ Boolean (private)

Returns:

  • (Boolean)


30
31
32
33
34
35
# File 'lib/head_music/style/guidelines/consonant_downbeats.rb', line 30

def tied_suspension?(interval)
  cp_note = voice.note_at(interval.position)
  return false unless cp_note

  cp_note.position < interval.position
end