Class: HeadMusic::Style::Guidelines::MostlyConjunct

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

Overview

A counterpoint guideline. Configurable via the minimum_conjunct_portion: option (the minimum fraction of melodic motion that must be stepwise).

Constant Summary collapse

MESSAGE =
"Use mostly conjunct motion."
MINIMUM_CONJUNCT_PORTION =
HeadMusic::GOLDEN_RATIO_INVERSE**2

Instance Method Summary collapse

Constructor Details

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

Instance Method Details

#conjunct_ratioObject (private)



29
30
31
32
33
# File 'lib/head_music/style/guidelines/mostly_conjunct.rb', line 29

def conjunct_ratio
  return 1 if melodic_note_pairs.empty?

  melodic_note_pairs.count(&:step?).to_f / melodic_note_pairs.length
end

#marksObject

~38% Fux is 5/13 for lydian cantus firmus



13
14
15
# File 'lib/head_music/style/guidelines/mostly_conjunct.rb', line 13

def marks
  marks_for_skips_and_leaps if conjunct_ratio < minimum_conjunct_portion
end

#marks_for_skips_and_leapsObject (private)



23
24
25
26
27
# File 'lib/head_music/style/guidelines/mostly_conjunct.rb', line 23

def marks_for_skips_and_leaps
  melodic_note_pairs
    .reject(&:step?)
    .map { |note_pair| HeadMusic::Style::Mark.for_all(note_pair.notes, fitness: HeadMusic::SMALL_PENALTY_FACTOR) }
end

#minimum_conjunct_portionObject (private)



19
20
21
# File 'lib/head_music/style/guidelines/mostly_conjunct.rb', line 19

def minimum_conjunct_portion
  options.fetch(:minimum_conjunct_portion) { self.class::MINIMUM_CONJUNCT_PORTION }
end