coltrane 1.0.1 → 1.0.2
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/.rubocop.yml +19 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +3 -3
- data/coltrane.gemspec +1 -1
- data/exe/coltrane +27 -21
- data/lib/{coltrane-cli.rb → cli.rb} +7 -1
- data/lib/cli/bass_guitar.rb +4 -1
- data/lib/cli/chord.rb +10 -3
- data/lib/cli/errors.rb +10 -4
- data/lib/cli/guitar.rb +12 -10
- data/lib/cli/notes.rb +7 -4
- data/lib/cli/piano.rb +11 -8
- data/lib/cli/representation.rb +14 -14
- data/lib/cli/scale.rb +15 -11
- data/lib/cli/text.rb +6 -3
- data/lib/cli/ukulele.rb +5 -2
- data/lib/coltrane.rb +4 -7
- data/lib/coltrane/cache.rb +10 -9
- data/lib/coltrane/cadence.rb +3 -1
- data/lib/coltrane/chord.rb +16 -8
- data/lib/coltrane/chord_quality.rb +7 -8
- data/lib/coltrane/classic_progressions.rb +10 -7
- data/lib/coltrane/classic_scales.rb +30 -43
- data/lib/coltrane/errors.rb +17 -10
- data/lib/coltrane/interval.rb +24 -23
- data/lib/coltrane/interval_sequence.rb +8 -7
- data/lib/coltrane/interval_set.rb +1 -0
- data/lib/coltrane/note.rb +23 -46
- data/lib/coltrane/note_set.rb +12 -14
- data/lib/coltrane/pitch.rb +5 -4
- data/lib/coltrane/progression.rb +9 -20
- data/lib/coltrane/qualities.rb +114 -112
- data/lib/coltrane/roman_chord.rb +8 -5
- data/lib/coltrane/scale.rb +25 -33
- data/lib/coltrane/version.rb +3 -1
- data/lib/core_ext.rb +7 -4
- metadata +7 -10
- data/db/schema.rb +0 -30
- data/lib/coltrane/chord_cache.rb +0 -4
- data/lib/coltrane/scale_chord.rb +0 -4
data/lib/coltrane/roman_chord.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Coltrane
|
4
|
+
# It deals with chords in roman notation
|
2
5
|
class RomanChord
|
3
6
|
DIGITS = {
|
4
7
|
'I' => 1,
|
5
|
-
'V' => 5
|
6
|
-
}
|
8
|
+
'V' => 5
|
9
|
+
}.freeze
|
7
10
|
|
8
11
|
def initialize(scale, roman_numeral)
|
9
12
|
@scale = scale
|
@@ -26,11 +29,11 @@ module Coltrane
|
|
26
29
|
end
|
27
30
|
|
28
31
|
def quality
|
29
|
-
ChordQuality.new(name:
|
32
|
+
ChordQuality.new(name: major? ? 'M' : 'm')
|
30
33
|
end
|
31
34
|
|
32
|
-
def
|
35
|
+
def major?
|
33
36
|
@roman_numeral[0] =~ /[[:upper]]/
|
34
37
|
end
|
35
38
|
end
|
36
|
-
end
|
39
|
+
end
|
data/lib/coltrane/scale.rb
CHANGED
@@ -1,18 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Coltrane
|
4
|
+
# Musical scale creation and manipulation
|
2
5
|
class Scale
|
3
6
|
extend ClassicScales
|
4
7
|
attr_reader :interval_sequence, :tone
|
5
8
|
|
6
9
|
def initialize(*distances, tone: 'C', mode: 1, name: nil, notes: nil)
|
7
|
-
@name
|
10
|
+
@name = name
|
8
11
|
if !distances.nil? && !tone.nil?
|
9
12
|
@tone = Note[tone]
|
10
|
-
distances = distances.rotate(mode-1)
|
13
|
+
distances = distances.rotate(mode - 1)
|
11
14
|
@interval_sequence = IntervalSequence.new(distances: distances)
|
12
15
|
elsif !notes.nil?
|
13
16
|
ds = NoteSet[*notes].interval_sequence.distances
|
14
|
-
|
15
|
-
else
|
17
|
+
new(*ds, tone: notes.first)
|
18
|
+
else
|
19
|
+
raise WrongKeywordsError, '[*distances, tone: "C", mode: 1] || [notes:]'
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
@@ -22,7 +26,7 @@ module Coltrane
|
|
22
26
|
|
23
27
|
def name
|
24
28
|
@name = begin
|
25
|
-
is =
|
29
|
+
is = interval_sequence.distances
|
26
30
|
(0...is.size).each do |i|
|
27
31
|
if (scale_name = Coltrane::ClassicScales::SCALES.key(is.rotate(i)))
|
28
32
|
return scale_name
|
@@ -36,26 +40,22 @@ module Coltrane
|
|
36
40
|
"#{tone.name} #{name}"
|
37
41
|
end
|
38
42
|
|
39
|
-
|
43
|
+
alias full_name pretty_name
|
40
44
|
|
41
45
|
def degree(d)
|
42
|
-
if d < 1 || d > size
|
43
|
-
raise WrongDegree.new(d)
|
44
|
-
end
|
45
|
-
|
46
|
+
raise WrongDegreeError, d if d < 1 || d > size
|
46
47
|
tone + interval_sequence[d - 1].semitones
|
47
48
|
end
|
48
49
|
|
49
|
-
|
50
|
+
alias [] degree
|
50
51
|
|
51
52
|
def degrees
|
52
53
|
(1..size)
|
53
54
|
end
|
54
55
|
|
55
56
|
def degree_of_chord(chord)
|
56
|
-
if chords(chord.size).map(&:name).include?(chord.name)
|
57
|
-
|
58
|
-
end
|
57
|
+
return if chords(chord.size).map(&:name).include?(chord.name)
|
58
|
+
degree_of_note(chord.root_note)
|
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 &(other)
|
67
|
+
raise HasNoNotesError unless other.respond_to?(:notes)
|
68
|
+
notes & other
|
69
69
|
end
|
70
70
|
|
71
71
|
def include_notes?(arg)
|
@@ -73,27 +73,25 @@ module Coltrane
|
|
73
73
|
(self & noteset).size == noteset.size
|
74
74
|
end
|
75
75
|
|
76
|
-
|
76
|
+
alias 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-1) % size]
|
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=3)
|
92
|
+
def tertians(n = 3)
|
93
93
|
degrees.size.times.reduce([]) do |memo, d|
|
94
|
-
ns = NoteSet[
|
95
|
-
*n.times.map { |i| notes[(d + (i*2)) % (size)]}
|
96
|
-
]
|
94
|
+
ns = NoteSet[ *Array.new(n) { |i| notes[(d + (i * 2)) % size] } ]
|
97
95
|
chord = Chord.new(notes: ns)
|
98
96
|
chord.named? ? memo + [chord] : memo
|
99
97
|
end
|
@@ -116,17 +114,11 @@ module Coltrane
|
|
116
114
|
end
|
117
115
|
|
118
116
|
def cache_key(extra)
|
119
|
-
[
|
120
|
-
@tone.name,
|
121
|
-
@interval_sequence.intervals_semitones.join(),
|
122
|
-
extra
|
123
|
-
].join('-')
|
117
|
+
[@tone.name, @interval_sequence.intervals_semitones.join, extra].join('-')
|
124
118
|
end
|
125
119
|
|
126
120
|
def all_chords
|
127
|
-
(3..size).reduce([])
|
128
|
-
memo + chords(s)
|
129
|
-
end
|
121
|
+
(3..size).reduce([]) { |memo, s| memo + chords(s) }
|
130
122
|
end
|
131
123
|
|
132
124
|
def chords(size)
|
@@ -144,4 +136,4 @@ module Coltrane
|
|
144
136
|
end
|
145
137
|
end
|
146
138
|
end
|
147
|
-
end
|
139
|
+
end
|
data/lib/coltrane/version.rb
CHANGED
data/lib/core_ext.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
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
|
1
5
|
class String
|
2
|
-
# Stolen from Active Support and changed a bit
|
3
6
|
def underscore
|
4
7
|
return self unless /[A-Z-]|::/.match?(self)
|
5
|
-
word =
|
8
|
+
word = to_s.gsub('::', '/')
|
6
9
|
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
7
10
|
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
8
|
-
word.tr!(
|
11
|
+
word.tr!('- ', '_')
|
9
12
|
word.downcase!
|
10
13
|
word
|
11
14
|
end
|
12
|
-
end
|
15
|
+
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.2
|
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-29 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: color
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: '1.8'
|
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: '1.8'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: mercenary
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- ".bundle/config"
|
106
106
|
- ".gitignore"
|
107
107
|
- ".rspec"
|
108
|
+
- ".rubocop.yml"
|
108
109
|
- ".ruby-version"
|
109
110
|
- CODE_OF_CONDUCT.md
|
110
111
|
- Gemfile
|
@@ -146,7 +147,6 @@ files:
|
|
146
147
|
- db/cache.sqlite3
|
147
148
|
- db/cache_test.sqlite3
|
148
149
|
- db/config.yml
|
149
|
-
- db/schema.rb
|
150
150
|
- exe/coltrane
|
151
151
|
- img/coltrane-logo.png
|
152
152
|
- img/screen-1.png
|
@@ -159,6 +159,7 @@ files:
|
|
159
159
|
- img/screen-7.png
|
160
160
|
- img/screen-8.png
|
161
161
|
- img/screen-9.png
|
162
|
+
- lib/cli.rb
|
162
163
|
- lib/cli/bass_guitar.rb
|
163
164
|
- lib/cli/chord.rb
|
164
165
|
- lib/cli/errors.rb
|
@@ -169,12 +170,10 @@ files:
|
|
169
170
|
- lib/cli/scale.rb
|
170
171
|
- lib/cli/text.rb
|
171
172
|
- 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
|
178
177
|
- lib/coltrane/chord_quality.rb
|
179
178
|
- lib/coltrane/classic_progressions.rb
|
180
179
|
- lib/coltrane/classic_scales.rb
|
@@ -191,10 +190,8 @@ files:
|
|
191
190
|
- lib/coltrane/qualities.rb
|
192
191
|
- lib/coltrane/roman_chord.rb
|
193
192
|
- lib/coltrane/scale.rb
|
194
|
-
- lib/coltrane/scale_chord.rb
|
195
193
|
- lib/coltrane/version.rb
|
196
194
|
- lib/core_ext.rb
|
197
|
-
- pkg/coltrane-0.0.2.gem
|
198
195
|
homepage: http://github.com/pedrozath/coltrane
|
199
196
|
licenses:
|
200
197
|
- MIT
|
data/db/schema.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# This file is auto-generated from the current state of the database. Instead
|
2
|
-
# of editing this file, please use the migrations feature of Active Record to
|
3
|
-
# incrementally modify your database, and then regenerate this schema definition.
|
4
|
-
#
|
5
|
-
# Note that this schema.rb definition is the authoritative source for your
|
6
|
-
# database schema. If you need to create the application database on another
|
7
|
-
# system, you should be using db:schema:load, not running all the migrations
|
8
|
-
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
9
|
-
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
10
|
-
#
|
11
|
-
# It's strongly recommended that you check this file into your version control system.
|
12
|
-
|
13
|
-
ActiveRecord::Schema.define(version: 20170508162849) do
|
14
|
-
|
15
|
-
create_table "scale_caches", force: :cascade do |t|
|
16
|
-
t.string "interval_sequence"
|
17
|
-
t.string "tone"
|
18
|
-
end
|
19
|
-
|
20
|
-
create_table "chord_caches", force: :cascade do |t|
|
21
|
-
t.string "name"
|
22
|
-
t.integer "size"
|
23
|
-
end
|
24
|
-
|
25
|
-
create_table "scale_chords", force: :cascade do |t|
|
26
|
-
t.integer "scale_cache_id"
|
27
|
-
t.integer "chord_cache_id"
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
data/lib/coltrane/chord_cache.rb
DELETED
data/lib/coltrane/scale_chord.rb
DELETED