Sha256: f0ab9b2cd1310a21a6a9cb446091002f2df914ff07372507cc6f4440ba2c2f04

Contents?: true

Size: 952 Bytes

Versions: 20

Compression:

Stored size: 952 Bytes

Contents

class HeadMusic::Interval
  include Comparable

  private_class_method :new

  NAMES = %w{perfect_unison minor_second major_second minor_third major_third perfect_fourth tritone perfect_fifth minor_sixth major_sixth minor_seventh major_seventh perfect_octave}

  attr_reader :semitones

  def self.get(semitones)
    @intervals ||= {}
    @intervals[semitones.to_i] ||= new(semitones.to_i)
  end

  def self.named(name)
    name = name.to_s
    get(NAMES.index(name)) if NAMES.include?(name)
  end

  def initialize(semitones)
    @semitones = semitones
  end

  def simple
    HeadMusic::Interval.get(semitones % 12)
  end

  def simple?
    (0..12).include?(semitones)
  end

  def compound?
    semitones > 12
  end

  def to_i
    semitones
  end

  def +(value)
    HeadMusic::Interval.get(to_i + value.to_i)
  end

  def -(value)
    HeadMusic::Interval.get((to_i - value.to_i).abs)
  end

  def <=>(other)
    self.to_i <=> other.to_i
  end
end

Version data entries

20 entries across 20 versions & 1 rubygems

Version Path
head_music-0.14.8 lib/head_music/interval.rb
head_music-0.14.7 lib/head_music/interval.rb
head_music-0.14.5 lib/head_music/interval.rb
head_music-0.14.4 lib/head_music/interval.rb
head_music-0.14.2 lib/head_music/interval.rb
head_music-0.14.1 lib/head_music/interval.rb
head_music-0.13.2 lib/head_music/interval.rb
head_music-0.11.9 lib/head_music/interval.rb
head_music-0.11.8 lib/head_music/interval.rb
head_music-0.11.7 lib/head_music/interval.rb
head_music-0.11.6 lib/head_music/interval.rb
head_music-0.11.5 lib/head_music/interval.rb
head_music-0.11.4 lib/head_music/interval.rb
head_music-0.11.3 lib/head_music/interval.rb
head_music-0.11.2 lib/head_music/interval.rb
head_music-0.11.1 lib/head_music/interval.rb
head_music-0.10.0 lib/head_music/interval.rb
head_music-0.5.2 lib/head_music/interval.rb
head_music-0.5.1 lib/head_music/interval.rb
head_music-0.5.0 lib/head_music/interval.rb