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
60
# File 'lib/coltrane/interval_sequence.rb', line 47

def initialize(notes: nil, intervals: nil, distances: nil)
  if notes
    notes = NoteSet[*notes] if notes.is_a?(Array)
    @intervals = intervals_from_notes(notes)
  elsif intervals
    @intervals = intervals.map { |i| IntervalClass[i] }
  elsif distances
    @distances = distances
    @intervals = intervals_from_distances(distances)
  else
    require 'pry'; binding.pry
    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



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

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

#[](x) ⇒ Object



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

def [](x)
  intervals[x]
end

#allObject



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

def all
  intervals
end

#distancesObject



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

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



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

def full_names
  map(&:full_name)
end

#has?(interval_name) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#interval_namesObject



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

def names
  intervals.map(&:name)
end

#intervals_semitonesObject



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

def intervals_semitones
  map(&:semitones)
end

#inversion(index) ⇒ Object



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

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

#inversionsObject



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

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

#namesObject



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

def names
  intervals.map(&:name)
end

#next_inversionObject



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

def next_inversion
  inversion(index + 1)
end

#notes_for(root_note) ⇒ Object



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

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

#previous_inversionObject



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

def previous_inversion
  inversion(index - 1)
end

#shift(ammount) ⇒ Object



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

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

#zero_itObject



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

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