coltrane 1.0.2 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +2 -5
- data/Gemfile.lock +3 -3
- data/coltrane.gemspec +1 -1
- data/db/schema.rb +30 -0
- data/exe/coltrane +21 -27
- data/lib/cli/bass_guitar.rb +1 -4
- data/lib/cli/chord.rb +3 -10
- data/lib/cli/errors.rb +4 -10
- data/lib/cli/guitar.rb +10 -12
- data/lib/cli/notes.rb +4 -7
- data/lib/cli/piano.rb +8 -11
- data/lib/cli/representation.rb +14 -14
- data/lib/cli/scale.rb +11 -15
- data/lib/cli/text.rb +3 -6
- data/lib/cli/ukulele.rb +2 -5
- data/lib/{cli.rb → coltrane-cli.rb} +2 -4
- data/lib/coltrane.rb +1 -4
- data/lib/coltrane/cache.rb +9 -10
- data/lib/coltrane/cadence.rb +1 -3
- data/lib/coltrane/chord.rb +8 -16
- data/lib/coltrane/chord_cache.rb +4 -0
- data/lib/coltrane/chord_quality.rb +8 -7
- data/lib/coltrane/classic_progressions.rb +7 -10
- data/lib/coltrane/classic_scales.rb +43 -30
- data/lib/coltrane/errors.rb +10 -17
- data/lib/coltrane/interval.rb +23 -24
- data/lib/coltrane/interval_sequence.rb +7 -8
- data/lib/coltrane/interval_set.rb +0 -1
- data/lib/coltrane/note.rb +46 -23
- data/lib/coltrane/note_set.rb +14 -12
- data/lib/coltrane/pitch.rb +4 -5
- data/lib/coltrane/progression.rb +20 -9
- data/lib/coltrane/qualities.rb +112 -114
- data/lib/coltrane/roman_chord.rb +5 -8
- data/lib/coltrane/scale.rb +33 -25
- data/lib/coltrane/scale_chord.rb +4 -0
- data/lib/coltrane/version.rb +1 -3
- data/lib/core_ext.rb +4 -7
- metadata +10 -7
- data/.rubocop.yml +0 -19
data/lib/coltrane/roman_chord.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Coltrane
|
4
|
-
# It deals with chords in roman notation
|
5
2
|
class RomanChord
|
6
3
|
DIGITS = {
|
7
4
|
'I' => 1,
|
8
|
-
'V' => 5
|
9
|
-
}
|
5
|
+
'V' => 5,
|
6
|
+
}
|
10
7
|
|
11
8
|
def initialize(scale, roman_numeral)
|
12
9
|
@scale = scale
|
@@ -29,11 +26,11 @@ module Coltrane
|
|
29
26
|
end
|
30
27
|
|
31
28
|
def quality
|
32
|
-
ChordQuality.new(name:
|
29
|
+
ChordQuality.new(name: is_major? ? 'M' : 'm')
|
33
30
|
end
|
34
31
|
|
35
|
-
def
|
32
|
+
def is_major?
|
36
33
|
@roman_numeral[0] =~ /[[:upper]]/
|
37
34
|
end
|
38
35
|
end
|
39
|
-
end
|
36
|
+
end
|
data/lib/coltrane/scale.rb
CHANGED
@@ -1,22 +1,18 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Coltrane
|
4
|
-
# Musical scale creation and manipulation
|
5
2
|
class Scale
|
6
3
|
extend ClassicScales
|
7
4
|
attr_reader :interval_sequence, :tone
|
8
5
|
|
9
6
|
def initialize(*distances, tone: 'C', mode: 1, name: nil, notes: nil)
|
10
|
-
@name
|
7
|
+
@name = name
|
11
8
|
if !distances.nil? && !tone.nil?
|
12
9
|
@tone = Note[tone]
|
13
|
-
distances = distances.rotate(mode
|
10
|
+
distances = distances.rotate(mode-1)
|
14
11
|
@interval_sequence = IntervalSequence.new(distances: distances)
|
15
12
|
elsif !notes.nil?
|
16
13
|
ds = NoteSet[*notes].interval_sequence.distances
|
17
|
-
new(*ds, tone: notes.first)
|
18
|
-
else
|
19
|
-
raise WrongKeywordsError, '[*distances, tone: "C", mode: 1] || [notes:]'
|
14
|
+
self.new(*ds, tone: notes.first)
|
15
|
+
else raise WrongKeywords.new('[*distances, (tone: "C", mode: 1)] || [notes:]')
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
@@ -26,7 +22,7 @@ module Coltrane
|
|
26
22
|
|
27
23
|
def name
|
28
24
|
@name = begin
|
29
|
-
is = interval_sequence.distances
|
25
|
+
is = self.interval_sequence.distances
|
30
26
|
(0...is.size).each do |i|
|
31
27
|
if (scale_name = Coltrane::ClassicScales::SCALES.key(is.rotate(i)))
|
32
28
|
return scale_name
|
@@ -40,22 +36,26 @@ module Coltrane
|
|
40
36
|
"#{tone.name} #{name}"
|
41
37
|
end
|
42
38
|
|
43
|
-
|
39
|
+
alias_method :full_name, :pretty_name
|
44
40
|
|
45
41
|
def degree(d)
|
46
|
-
|
42
|
+
if d < 1 || d > size
|
43
|
+
raise WrongDegree.new(d)
|
44
|
+
end
|
45
|
+
|
47
46
|
tone + interval_sequence[d - 1].semitones
|
48
47
|
end
|
49
48
|
|
50
|
-
|
49
|
+
alias_method :[], :degree
|
51
50
|
|
52
51
|
def degrees
|
53
52
|
(1..size)
|
54
53
|
end
|
55
54
|
|
56
55
|
def degree_of_chord(chord)
|
57
|
-
|
58
|
-
|
56
|
+
if chords(chord.size).map(&:name).include?(chord.name)
|
57
|
+
degree_of_note(chord.root_note)
|
58
|
+
end
|
59
59
|
end
|
60
60
|
|
61
61
|
def degree_of_note(note)
|
@@ -63,9 +63,9 @@ module Coltrane
|
|
63
63
|
return note + 1 unless note.nil?
|
64
64
|
end
|
65
65
|
|
66
|
-
def &(
|
67
|
-
raise
|
68
|
-
notes &
|
66
|
+
def &(something)
|
67
|
+
raise HasNoNotes unless something.respond_to?(:notes)
|
68
|
+
notes & something
|
69
69
|
end
|
70
70
|
|
71
71
|
def include_notes?(arg)
|
@@ -73,25 +73,27 @@ module Coltrane
|
|
73
73
|
(self & noteset).size == noteset.size
|
74
74
|
end
|
75
75
|
|
76
|
-
|
76
|
+
alias_method :include?, :include_notes?
|
77
77
|
|
78
78
|
def notes
|
79
|
-
Coltrane::Cache.find_or_record(cache_key(
|
79
|
+
Coltrane::Cache.find_or_record(cache_key("notes")) do
|
80
80
|
NoteSet[*degrees.map { |d| degree(d) }]
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
84
|
def interval(i)
|
85
|
-
interval_sequence[(i
|
85
|
+
interval_sequence[(i-1) % size]
|
86
86
|
end
|
87
87
|
|
88
88
|
def size
|
89
89
|
interval_sequence.size
|
90
90
|
end
|
91
91
|
|
92
|
-
def tertians(n
|
92
|
+
def tertians(n=3)
|
93
93
|
degrees.size.times.reduce([]) do |memo, d|
|
94
|
-
ns = NoteSet[
|
94
|
+
ns = NoteSet[
|
95
|
+
*n.times.map { |i| notes[(d + (i*2)) % (size)]}
|
96
|
+
]
|
95
97
|
chord = Chord.new(notes: ns)
|
96
98
|
chord.named? ? memo + [chord] : memo
|
97
99
|
end
|
@@ -114,11 +116,17 @@ module Coltrane
|
|
114
116
|
end
|
115
117
|
|
116
118
|
def cache_key(extra)
|
117
|
-
[
|
119
|
+
[
|
120
|
+
@tone.name,
|
121
|
+
@interval_sequence.intervals_semitones.join(),
|
122
|
+
extra
|
123
|
+
].join('-')
|
118
124
|
end
|
119
125
|
|
120
126
|
def all_chords
|
121
|
-
(3..size).reduce([])
|
127
|
+
(3..size).reduce([]) do |memo, s|
|
128
|
+
memo + chords(s)
|
129
|
+
end
|
122
130
|
end
|
123
131
|
|
124
132
|
def chords(size)
|
@@ -136,4 +144,4 @@ module Coltrane
|
|
136
144
|
end
|
137
145
|
end
|
138
146
|
end
|
139
|
-
end
|
147
|
+
end
|
data/lib/coltrane/version.rb
CHANGED
data/lib/core_ext.rb
CHANGED
@@ -1,15 +1,12 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Stolen from Active Support and changed a bit
|
4
|
-
# may in the future be substituted by facets version
|
5
1
|
class String
|
2
|
+
# Stolen from Active Support and changed a bit
|
6
3
|
def underscore
|
7
4
|
return self unless /[A-Z-]|::/.match?(self)
|
8
|
-
word = to_s.gsub(
|
5
|
+
word = self.to_s.gsub("::", "/")
|
9
6
|
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
10
7
|
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
11
|
-
word.tr!(
|
8
|
+
word.tr!("-", "_")
|
12
9
|
word.downcase!
|
13
10
|
word
|
14
11
|
end
|
15
|
-
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coltrane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pedro Maciel
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: facets
|
@@ -39,19 +39,19 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: chroma
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.2.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.2.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: mercenary
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,7 +105,6 @@ files:
|
|
105
105
|
- ".bundle/config"
|
106
106
|
- ".gitignore"
|
107
107
|
- ".rspec"
|
108
|
-
- ".rubocop.yml"
|
109
108
|
- ".ruby-version"
|
110
109
|
- CODE_OF_CONDUCT.md
|
111
110
|
- Gemfile
|
@@ -147,6 +146,7 @@ files:
|
|
147
146
|
- db/cache.sqlite3
|
148
147
|
- db/cache_test.sqlite3
|
149
148
|
- db/config.yml
|
149
|
+
- db/schema.rb
|
150
150
|
- exe/coltrane
|
151
151
|
- img/coltrane-logo.png
|
152
152
|
- img/screen-1.png
|
@@ -159,7 +159,6 @@ files:
|
|
159
159
|
- img/screen-7.png
|
160
160
|
- img/screen-8.png
|
161
161
|
- img/screen-9.png
|
162
|
-
- lib/cli.rb
|
163
162
|
- lib/cli/bass_guitar.rb
|
164
163
|
- lib/cli/chord.rb
|
165
164
|
- lib/cli/errors.rb
|
@@ -170,10 +169,12 @@ files:
|
|
170
169
|
- lib/cli/scale.rb
|
171
170
|
- lib/cli/text.rb
|
172
171
|
- lib/cli/ukulele.rb
|
172
|
+
- lib/coltrane-cli.rb
|
173
173
|
- lib/coltrane.rb
|
174
174
|
- lib/coltrane/cache.rb
|
175
175
|
- lib/coltrane/cadence.rb
|
176
176
|
- lib/coltrane/chord.rb
|
177
|
+
- lib/coltrane/chord_cache.rb
|
177
178
|
- lib/coltrane/chord_quality.rb
|
178
179
|
- lib/coltrane/classic_progressions.rb
|
179
180
|
- lib/coltrane/classic_scales.rb
|
@@ -190,8 +191,10 @@ files:
|
|
190
191
|
- lib/coltrane/qualities.rb
|
191
192
|
- lib/coltrane/roman_chord.rb
|
192
193
|
- lib/coltrane/scale.rb
|
194
|
+
- lib/coltrane/scale_chord.rb
|
193
195
|
- lib/coltrane/version.rb
|
194
196
|
- lib/core_ext.rb
|
197
|
+
- pkg/coltrane-0.0.2.gem
|
195
198
|
homepage: http://github.com/pedrozath/coltrane
|
196
199
|
licenses:
|
197
200
|
- MIT
|
data/.rubocop.yml
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
AllCops:
|
2
|
-
Include:
|
3
|
-
- 'lib/**/*'
|
4
|
-
Exclude:
|
5
|
-
- 'bin/**/*'
|
6
|
-
- '*'
|
7
|
-
|
8
|
-
Metrics/AbcSize:
|
9
|
-
Enabled: false
|
10
|
-
Metrics/ClassLength:
|
11
|
-
Enabled: false
|
12
|
-
Metrics/MethodLength:
|
13
|
-
Enabled: false
|
14
|
-
Metrics/ModuleLength:
|
15
|
-
Enabled: false
|
16
|
-
Lint/UnneededSplatExpansion:
|
17
|
-
Enabled: false
|
18
|
-
Security/MarshalLoad:
|
19
|
-
Enabled: false
|