class HeadMusic::Style::Guidelines::RecoverLargeLeaps

Ok, so a rule might be that after the first leap (after previous steps) one should normally move by step in the opposite direction unless another leap (in either direction) creates a consonant triad.

Constants

MESSAGE

Public Instance Methods

marks() click to toggle source
# File lib/head_music/style/guidelines/recover_large_leaps.rb, line 13
def marks
  melodic_intervals.each_cons(3).map do |intervals|
    if unrecovered_leap?(intervals[0], intervals[1], intervals[2])
      HeadMusic::Style::Mark.for_all(notes_in_intervals(intervals))
    end
  end.compact
end

Private Instance Methods

direction_changed?(first_interval, second_interval) click to toggle source
# File lib/head_music/style/guidelines/recover_large_leaps.rb, line 41
def direction_changed?(first_interval, second_interval)
  first_interval.ascending? && second_interval.descending? ||
    first_interval.descending? && second_interval.ascending?
end
notes_in_intervals(intervals) click to toggle source
# File lib/head_music/style/guidelines/recover_large_leaps.rb, line 23
def notes_in_intervals(intervals)
  (intervals[0].notes + intervals[1].notes).uniq
end
spelling_consonant_triad?(first_interval, second_interval, third_interval) click to toggle source
# File lib/head_music/style/guidelines/recover_large_leaps.rb, line 36
def spelling_consonant_triad?(first_interval, second_interval, third_interval)
  first_interval.spells_consonant_triad_with?(second_interval) ||
    second_interval.spells_consonant_triad_with?(third_interval)
end
unrecovered_leap?(first_interval, second_interval, third_interval) click to toggle source
# File lib/head_music/style/guidelines/recover_large_leaps.rb, line 27
def unrecovered_leap?(first_interval, second_interval, third_interval)
  first_interval.large_leap? &&
    !spelling_consonant_triad?(first_interval, second_interval, third_interval) &&
    (
      !direction_changed?(first_interval, second_interval) ||
      !second_interval.step?
    )
end