Sha256: 2444e997fbe8cbf67ec9205dd7624a7e43bd51208c6ed4e49557b42bb0fd5aff

Contents?: true

Size: 817 Bytes

Versions: 9

Compression:

Stored size: 817 Bytes

Contents

# frozen_string_literal: true

# Module for style guidelines.
module HeadMusic::Style::Guidelines; end

# A counterpoint guideline
class HeadMusic::Style::Guidelines::MostlyConjunct < HeadMusic::Style::Annotation
  MESSAGE = "Use mostly conjunct motion."

  MINIMUM_CONJUNCT_PORTION = HeadMusic::GOLDEN_RATIO_INVERSE**2
  # ~38%
  # Fux is 5/13 for lydian cantus firmus

  def marks
    marks_for_skips_and_leaps if conjunct_ratio < MINIMUM_CONJUNCT_PORTION
  end

  private

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

  def conjunct_ratio
    return 1 if melodic_intervals.empty?

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

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
head_music-4.0.1 lib/head_music/style/guidelines/mostly_conjunct.rb
head_music-4.0.0 lib/head_music/style/guidelines/mostly_conjunct.rb
head_music-3.0.1 lib/head_music/style/guidelines/mostly_conjunct.rb
head_music-3.0.0 lib/head_music/style/guidelines/mostly_conjunct.rb
head_music-2.0.1 lib/head_music/style/guidelines/mostly_conjunct.rb
head_music-2.0.0 lib/head_music/style/guidelines/mostly_conjunct.rb
head_music-1.0.0 lib/head_music/style/guidelines/mostly_conjunct.rb
head_music-0.29.0 lib/head_music/style/guidelines/mostly_conjunct.rb
head_music-0.28.0 lib/head_music/style/guidelines/mostly_conjunct.rb