Sha256: fb640e7b800e28a2dbc1707e93536126885e41d0f13505c5fc4855a629292e3e

Contents?: true

Size: 1.82 KB

Versions: 9

Compression:

Stored size: 1.82 KB

Contents

# frozen_string_literal: true

# A melodic interval is the distance between one note and the next.
class HeadMusic::MelodicInterval
  attr_reader :first_note, :second_note

  def initialize(note1, note2)
    @first_note = note1
    @second_note = note2
  end

  def diatonic_interval
    @diatonic_interval ||= HeadMusic::DiatonicInterval.new(first_pitch, second_pitch)
  end

  def position_start
    first_note.position
  end

  def position_end
    second_note.next_position
  end

  def notes
    [first_note, second_note]
  end

  def pitches
    [first_pitch, second_pitch]
  end

  def first_pitch
    @first_pitch ||= first_note.pitch
  end

  def second_pitch
    @second_pitch ||= second_note.pitch
  end

  def to_s
    [direction, diatonic_interval].join(" ")
  end

  def ascending?
    direction == :ascending
  end

  def descending?
    direction == :descending
  end

  def moving?
    ascending? || descending?
  end

  def repetition?
    !moving?
  end

  def spans?(pitch)
    pitch >= low_pitch && pitch <= high_pitch
  end

  def high_pitch
    pitches.max
  end

  def low_pitch
    pitches.min
  end

  def direction
    @direction ||=
      if first_pitch < second_pitch
        :ascending
      elsif first_pitch > second_pitch
        :descending
      else
        :none
      end
  end

  def spells_consonant_triad_with?(other_interval)
    return false if step? || other_interval.step?

    combined_pitches = (pitches + other_interval.pitches).uniq
    return false if combined_pitches.length < 3

    HeadMusic::PitchSet.new(combined_pitches).consonant_triad?
  end

  def method_missing(method_name, *args, &block)
    respond_to_missing?(method_name) ? diatonic_interval.send(method_name, *args, &block) : super
  end

  def respond_to_missing?(method_name, *_args)
    diatonic_interval.respond_to?(method_name)
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

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