class HeadMusic::Style::Guidelines::DirectionChanges

A melodic line should have direction changes.

Public Instance Methods

marks() click to toggle source
# File lib/head_music/style/guidelines/direction_changes.rb, line 8
def marks
  return unless overage.positive?

  penalty_exponent = overage**0.5
  HeadMusic::Style::Mark.for_all(notes, fitness: HeadMusic::PENALTY_FACTOR**penalty_exponent)
end

Private Instance Methods

melodic_intervals_changing_direction() click to toggle source
# File lib/head_music/style/guidelines/direction_changes.rb, line 27
def melodic_intervals_changing_direction
  melodic_intervals.each_cons(2).reject do |interval_pair|
    interval_pair[0].direction == interval_pair[1].direction
  end
end
notes_per_direction() click to toggle source
# File lib/head_music/style/guidelines/direction_changes.rb, line 23
def notes_per_direction
  notes.length.to_f / (melodic_intervals_changing_direction.length + 1)
end
overage() click to toggle source
# File lib/head_music/style/guidelines/direction_changes.rb, line 17
def overage
  return 0 if notes.length < 2

  [notes_per_direction - self.class.maximum_notes_per_direction, 0].max
end