Sha256: 9991cc962bc9abc422dd87f35a223ca5edd53606585f16d1eaa913e87b76858e

Contents?: true

Size: 1.44 KB

Versions: 2

Compression:

Stored size: 1.44 KB

Contents

module HeadMusic::Style::Annotations
end

class HeadMusic::Style::Annotations::ConsonantClimax < HeadMusic::Style::Annotation
  MESSAGE = "Peak on a consonant high note one time or twice with a step between."

  def marks
    HeadMusic::Style::Mark.for_each(highest_notes) if !adherent_climax?
  end

  private

  def adherent_climax?
    notes? && highest_pitch_consonant_with_tonic? &&
      ( highest_pitch_appears_once? || highest_pitch_appears_twice_with_step_between? )
  end

  def highest_pitch_consonant_with_tonic?
    functional_interval_to_highest_pitch.consonance?(:melodic)
  end

  def functional_interval_to_highest_pitch
    @functional_interval_to_highest_pitch ||=
      HeadMusic::FunctionalInterval.new(tonic_pitch, highest_pitch)
  end

  def highest_pitch_appears_once?
    highest_notes.length == 1
  end

  def highest_pitch_appears_twice_with_step_between?
    highest_pitch_appears_twice? &&
    single_note_between_highest_notes? &&
    step_between_highest_notes?
  end

  def highest_pitch_appears_twice?
    highest_notes.length == 2
  end

  def step_between_highest_notes?
    HeadMusic::MelodicInterval.new(voice, highest_notes.first, notes_between_highest_notes.first).step?
  end

  def single_note_between_highest_notes?
    notes_between_highest_notes.length == 1
  end

  def notes_between_highest_notes
    indexes = highest_notes.map { |note| notes.index(note) }
    notes[(indexes.first + 1)..(indexes.last - 1)] || []
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
head_music-0.14.8 lib/head_music/style/annotations/consonant_climax.rb
head_music-0.14.7 lib/head_music/style/annotations/consonant_climax.rb