Class: RBMusic::Interval

Inherits:
Object
  • Object
show all
Defined in:
lib/rb-music/interval.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(coord) ⇒ Interval

Returns a new instance of Interval.



6
7
8
# File 'lib/rb-music/interval.rb', line 6

def initialize(coord)
  self.coord = coord
end

Instance Attribute Details

#coordObject

Returns the value of attribute coord.



4
5
6
# File 'lib/rb-music/interval.rb', line 4

def coord
  @coord
end

Class Method Details

.from_name(name) ⇒ Object



10
11
12
# File 'lib/rb-music/interval.rb', line 10

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

.from_semitones(num) ⇒ Object



14
15
16
# File 'lib/rb-music/interval.rb', line 14

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

.from_tones_semitones(tone_semitone) ⇒ Object



18
19
20
21
# File 'lib/rb-music/interval.rb', line 18

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

Instance Method Details

#add(interval) ⇒ Object



34
35
36
37
38
39
# File 'lib/rb-music/interval.rb', line 34

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

#semitoneObject



29
30
31
32
# File 'lib/rb-music/interval.rb', line 29

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

#subtract(interval) ⇒ Object



41
42
43
44
45
46
# File 'lib/rb-music/interval.rb', line 41

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

#tone_semitoneObject



23
24
25
26
27
# File 'lib/rb-music/interval.rb', line 23

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