Sha256: 2b054f59197d5df8b204563f8831932cae63de866d6866bc9490298d6328424f

Contents?: true

Size: 1.38 KB

Versions: 9

Compression:

Stored size: 1.38 KB

Contents

module RBMusic

  class Interval
    attr_accessor :coord

    def initialize(coord)
      self.coord = coord
    end

    def self.from_name(name)
      Interval.new(INTERVALS[name.to_sym])
    end

    def self.from_semitones(num)
      Interval.new(INTERVALS_SEMITONES[num])
    end

    def self.from_tones_semitones(tone_semitone)
      # multiply [tones, semitones] vector with [-1 2;3 -5] to get coordinate from tones and semitones
      Interval.new([tone_semitone[0] * -1 + tone_semitone[1] * 3, tone_semitone[0] * 2 + tone_semitone[1] * -5])
    end

    def tone_semitone
      # multiply coord vector with [5 2;3 1] to get coordinate in tones and semitones
      # [5 2;3 1] is the inverse of [-1 2;3 -5], which is the coordinates of [tone; semitone]
      @tone_semitone ||= [coord[0] * 5 + coord[1] * 3, coord[0] * 2 + coord[1] * 1]
    end

    def semitone
      # number of semitones of interval = tones * 2 + semitones
      tone_semitone[0] * 2 + tone_semitone[1]
    end

    def add(interval)
      if interval.is_a?(String)
        interval = Interval.from_name(interval)
      end
      Interval.new([coord[0] + interval.coord[0], coord[1] + interval.coord[1]])
    end

    def subtract(interval)
      if interval.is_a?(String)
        interval = Interval.from_name(interval)
      end
      Interval.new([coord[0] - interval.coord[0], coord[1] - interval.coord[1]])
    end

  end

end

Version data entries

9 entries across 9 versions & 2 rubygems

Version Path
rb-music-0.0.6 lib/rb-music/interval.rb
motion-music-0.0.6 lib/rb-music/interval.rb
rb-music-0.0.5 lib/rb-music/interval.rb
motion-music-0.0.5 lib/rb-music/interval.rb
rb-music-0.0.4 lib/rb-music/interval.rb
motion-music-0.0.4 lib/rb-music/interval.rb
motion-music-0.0.3 lib/rb-music/interval.rb
motion-music-0.0.2 lib/rb-music/interval.rb
rb-music-0.0.1 lib/rb-music/interval.rb