Class: Coltrane::Scale
Overview
Musical scale creation and manipulation
Constant Summary
ClassicScales::MODES, ClassicScales::SCALES
Instance Attribute Summary collapse
Instance Method Summary
collapse
fetch, from_key, having_chords, having_notes, known_scales, standard_scales
Constructor Details
#initialize(*distances, tone: 'C', mode: 1, name: nil, notes: nil) ⇒ Scale
Returns a new instance of Scale.
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# File 'lib/coltrane/scale.rb', line 9
def initialize(*distances, tone: 'C', mode: 1, name: nil, notes: nil)
@name = name
if !distances.nil? && !tone.nil?
@tone = Note[tone]
distances = distances.rotate(mode - 1)
@interval_sequence = IntervalSequence.new(distances: distances)
elsif !notes.nil?
ds = NoteSet[*notes].interval_sequence.distances
new(*ds, tone: notes.first)
else
raise WrongKeywordsError, '[*distances, tone: "C", mode: 1] || [notes:]'
end
end
|
Instance Attribute Details
#interval_sequence ⇒ Object
Returns the value of attribute interval_sequence.
7
8
9
|
# File 'lib/coltrane/scale.rb', line 7
def interval_sequence
@interval_sequence
end
|
#tone ⇒ Object
Returns the value of attribute tone.
7
8
9
|
# File 'lib/coltrane/scale.rb', line 7
def tone
@tone
end
|
Instance Method Details
#&(other) ⇒ Object
65
66
67
68
|
# File 'lib/coltrane/scale.rb', line 65
def &(other)
raise HasNoNotesError unless other.respond_to?(:notes)
notes & other
end
|
#all_chords ⇒ Object
118
119
120
|
# File 'lib/coltrane/scale.rb', line 118
def all_chords
chords
end
|
#chords(size = 3..12) ⇒ Object
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
# File 'lib/coltrane/scale.rb', line 122
def chords(size = 3..12)
size = (size..size) if size.is_a?(Integer)
included_names = []
scale_rotations = interval_sequence.inversions
ChordQuality.intervals_per_name.reduce([]) do |memo1, (qname, qintervals)|
next memo1 unless size.include?(qintervals.size)
memo1 + scale_rotations.each_with_index.reduce([]) do |memo2, (rot, index)|
if (rot & qintervals).size == qintervals.size
memo2 + [ Chord.new(root_note: degree(index+1),
quality: ChordQuality.new(name: qname)) ]
else
memo2
end
end
end
end
|
#degree(d) ⇒ Object
Also known as:
[]
45
46
47
48
|
# File 'lib/coltrane/scale.rb', line 45
def degree(d)
raise WrongDegreeError, d if d < 1 || d > size
tone + interval_sequence[d - 1].semitones
end
|
#degree_of_chord(chord) ⇒ Object
56
57
58
59
|
# File 'lib/coltrane/scale.rb', line 56
def degree_of_chord(chord)
return if chords(chord.size).map(&:name).include?(chord.name)
degree_of_note(chord.root_note)
end
|
#degree_of_note(note) ⇒ Object
61
62
63
|
# File 'lib/coltrane/scale.rb', line 61
def degree_of_note(note)
notes.index(note)
end
|
#degrees ⇒ Object
52
53
54
|
# File 'lib/coltrane/scale.rb', line 52
def degrees
(1..size)
end
|
#id ⇒ Object
23
24
25
|
# File 'lib/coltrane/scale.rb', line 23
def id
[(name || @interval_sequence), tone.number]
end
|
#include_notes?(arg) ⇒ Boolean
Also known as:
include?
70
71
72
73
|
# File 'lib/coltrane/scale.rb', line 70
def include_notes?(arg)
noteset = arg.is_a?(Note) ? NoteSet[arg] : arg
(self & noteset).size == noteset.size
end
|
#interval(i) ⇒ Object
81
82
83
|
# File 'lib/coltrane/scale.rb', line 81
def interval(i)
interval_sequence[(i - 1) % size]
end
|
#name ⇒ Object
27
28
29
30
31
32
33
34
35
36
37
|
# File 'lib/coltrane/scale.rb', line 27
def name
@name = begin
is = interval_sequence.distances
(0...is.size).each do |i|
if (scale_name = Coltrane::ClassicScales::SCALES.key(is.rotate(i)))
return scale_name
end
end
nil
end
end
|
#notes ⇒ Object
77
78
79
|
# File 'lib/coltrane/scale.rb', line 77
def notes
NoteSet[*degrees.map { |d| degree(d) }]
end
|
#pentads ⇒ Object
110
111
112
|
# File 'lib/coltrane/scale.rb', line 110
def pentads
tertians(5)
end
|
#pretty_name ⇒ Object
Also known as:
full_name
39
40
41
|
# File 'lib/coltrane/scale.rb', line 39
def pretty_name
"#{tone.name} #{name}"
end
|
#progression(*degrees) ⇒ Object
114
115
116
|
# File 'lib/coltrane/scale.rb', line 114
def progression(*degrees)
Progression.new(self, degrees)
end
|
#sevenths ⇒ Object
106
107
108
|
# File 'lib/coltrane/scale.rb', line 106
def sevenths
tertians(4)
end
|
#size ⇒ Object
85
86
87
|
# File 'lib/coltrane/scale.rb', line 85
def size
interval_sequence.size
end
|
#tertians(n = 3) ⇒ Object
89
90
91
92
93
94
95
96
97
98
99
100
|
# File 'lib/coltrane/scale.rb', line 89
def tertians(n = 3)
degrees.size.times.reduce([]) do |memo, d|
ns = NoteSet[ *Array.new(n) { |i| notes[(d + (i * 2)) % size] } ]
begin
chord = Chord.new(notes: ns)
rescue ChordNotFoundError
memo
else
memo + [chord]
end
end
end
|
#triads ⇒ Object
102
103
104
|
# File 'lib/coltrane/scale.rb', line 102
def triads
tertians(3)
end
|