Class: Coltrane::IntervalSequence

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/coltrane/interval_sequence.rb

Overview

It describes a sequence of intervals

Direct Known Subclasses

ChordQuality

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(notes: nil, intervals: nil, distances: nil) ⇒ IntervalSequence

Returns a new instance of IntervalSequence.



47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/coltrane/interval_sequence.rb', line 47

def initialize(notes: nil, intervals: nil, distances: nil)
  if !notes.nil?
    notes = NoteSet[*notes] if notes.is_a?(Array)
    @intervals = intervals_from_notes(notes)
  elsif !intervals.nil?
    @intervals = intervals.map { |i| Interval[i] }
  elsif !distances.nil?
    @distances = distances
    @intervals = intervals_from_distances(distances)
  else
    raise 'Provide: [notes:] || [intervals:] || [distances:]'
  end
end

Instance Attribute Details

#intervalsObject (readonly)

Returns the value of attribute intervals.



7
8
9
# File 'lib/coltrane/interval_sequence.rb', line 7

def intervals
  @intervals
end

Instance Method Details

#&(other) ⇒ Object



137
138
139
140
141
142
# File 'lib/coltrane/interval_sequence.rb', line 137

def &(other)
  case other
  when Array then intervals & other
  when IntervalSequence then intervals & other.semitones
  end
end

#[](x) ⇒ Object



85
86
87
# File 'lib/coltrane/interval_sequence.rb', line 85

def [](x)
  intervals[x]
end

#allObject



81
82
83
# File 'lib/coltrane/interval_sequence.rb', line 81

def all
  intervals
end

#distancesObject



61
62
63
64
65
66
67
68
69
# File 'lib/coltrane/interval_sequence.rb', line 61

def distances
  intervals_semitones[1..-1].each_with_index.map do |n, i|
    if i.zero?
      n
    elsif i < intervals_semitones.size
      n - intervals_semitones[i]
    end
  end + [12 - intervals_semitones.last]
end

#full_namesObject



125
126
127
# File 'lib/coltrane/interval_sequence.rb', line 125

def full_names
  map(&:full_name)
end

#has?(interval_name) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
# File 'lib/coltrane/interval_sequence.rb', line 75

def has?(interval_name)
  @intervals.include?(Interval[interval_name])
end

#interval_namesObject



79
80
81
# File 'lib/coltrane/interval_sequence.rb', line 79

def names
  intervals.map(&:name)
end

#intervals_semitonesObject



117
118
119
# File 'lib/coltrane/interval_sequence.rb', line 117

def intervals_semitones
  map(&:semitones)
end

#inversion(index) ⇒ Object



99
100
101
# File 'lib/coltrane/interval_sequence.rb', line 99

def inversion(index)
  IntervalSequence.new(intervals: intervals.rotate(index)).zero_it
end

#inversionsObject



111
112
113
114
115
# File 'lib/coltrane/interval_sequence.rb', line 111

def inversions
  Array.new(intervals.length) do |index|
    inversion(index)
  end
end

#namesObject



71
72
73
# File 'lib/coltrane/interval_sequence.rb', line 71

def names
  intervals.map(&:name)
end

#next_inversionObject



103
104
105
# File 'lib/coltrane/interval_sequence.rb', line 103

def next_inversion
  inversion(index + 1)
end

#notes_for(root_note) ⇒ Object



129
130
131
132
133
134
135
# File 'lib/coltrane/interval_sequence.rb', line 129

def notes_for(root_note)
  NoteSet[
    *intervals.reduce([]) do |memo, interval|
      memo + [root_note + interval]
    end
  ]
end

#previous_inversionObject



107
108
109
# File 'lib/coltrane/interval_sequence.rb', line 107

def previous_inversion
  inversion(index - 1)
end

#shift(ammount) ⇒ Object



89
90
91
92
93
# File 'lib/coltrane/interval_sequence.rb', line 89

def shift(ammount)
  IntervalSequence.new(intervals: intervals.map do |i|
    (i.semitones + ammount) % 12
  end)
end

#zero_itObject



95
96
97
# File 'lib/coltrane/interval_sequence.rb', line 95

def zero_it
  shift(-intervals.first.semitones)
end