coltrane 1.0.21 → 1.0.22
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.lock +1 -1
- data/lib/coltrane.rb +12 -7
- data/lib/coltrane/cache.rb +9 -1
- data/lib/coltrane/chord.rb +1 -1
- data/lib/coltrane/progression.rb +1 -5
- data/lib/coltrane/roman_chord.rb +32 -19
- data/lib/coltrane/scale.rb +10 -7
- data/lib/coltrane/version.rb +1 -1
- metadata +2 -3
- data/lib/coltrane/interval_set.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57dabf818555a71744bf6fb434099d6c33e1b9b33aa3fdaa475c38433b42554f
|
4
|
+
data.tar.gz: 0c405a62ff1eaf8fc94f0f819d4c3eac4158565ca83ba8374c21964d4c68c0e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e86b4fbad7d9961eddf2f1a6d3eb15b86f280e963322a67d4e1ae1d469f7234f632be0d1a0abaaa0d1ee1a3a9409a804e6e44ceefdad45852a402ee9b00ced4
|
7
|
+
data.tar.gz: 7dba69b15767ff2d1aac5262075e40eca9548d0aabc244fc018801876c22a4917a54815293e295e048c1c7a7b1d6a706b91010f4783551810410b24c6f2c333e
|
data/Gemfile.lock
CHANGED
data/lib/coltrane.rb
CHANGED
@@ -9,22 +9,27 @@ require 'coltrane/version'
|
|
9
9
|
require 'coltrane/errors'
|
10
10
|
|
11
11
|
require 'coltrane/cache'
|
12
|
+
# Coltrane::Cache.disable
|
13
|
+
|
12
14
|
require 'coltrane/cadence'
|
13
15
|
|
14
|
-
require 'coltrane/
|
15
|
-
require 'coltrane/
|
16
|
+
require 'coltrane/note'
|
17
|
+
require 'coltrane/pitch'
|
18
|
+
require 'coltrane/note_set'
|
19
|
+
|
16
20
|
require 'coltrane/interval'
|
21
|
+
require 'coltrane/interval_sequence'
|
22
|
+
|
17
23
|
require 'coltrane/qualities'
|
18
24
|
require 'coltrane/chord_quality'
|
19
|
-
|
25
|
+
|
20
26
|
require 'coltrane/chord'
|
21
27
|
require 'coltrane/roman_chord'
|
22
28
|
|
23
29
|
require 'coltrane/classic_scales'
|
24
|
-
require 'coltrane/
|
30
|
+
require 'coltrane/scale'
|
25
31
|
|
26
|
-
require 'coltrane/
|
27
|
-
require 'coltrane/pitch'
|
32
|
+
require 'coltrane/classic_progressions'
|
28
33
|
require 'coltrane/progression'
|
29
|
-
|
34
|
+
|
30
35
|
require 'coltrane/mode'
|
data/lib/coltrane/cache.rb
CHANGED
@@ -6,13 +6,21 @@ module Coltrane
|
|
6
6
|
class Cache
|
7
7
|
class << self
|
8
8
|
def find_or_record(key, &block)
|
9
|
-
|
9
|
+
if @disabled || !(cached = fetch(key))
|
10
10
|
cached = yield block
|
11
11
|
record(key, cached)
|
12
12
|
end
|
13
13
|
cached
|
14
14
|
end
|
15
15
|
|
16
|
+
def disable
|
17
|
+
@disabled = true
|
18
|
+
end
|
19
|
+
|
20
|
+
def enable
|
21
|
+
@disabled = false
|
22
|
+
end
|
23
|
+
|
16
24
|
private
|
17
25
|
|
18
26
|
def dir
|
data/lib/coltrane/chord.rb
CHANGED
data/lib/coltrane/progression.rb
CHANGED
@@ -7,14 +7,10 @@ module Coltrane
|
|
7
7
|
|
8
8
|
attr_reader :scale
|
9
9
|
|
10
|
-
def initialize(
|
10
|
+
def initialize(roman_notation, key: nil, scale: nil)
|
11
11
|
@scale = Scale.from_key(key) unless key.nil?
|
12
12
|
end
|
13
13
|
|
14
|
-
# def chords
|
15
|
-
|
16
|
-
# end
|
17
|
-
|
18
14
|
private
|
19
15
|
|
20
16
|
def chord_indexes
|
data/lib/coltrane/roman_chord.rb
CHANGED
@@ -1,39 +1,52 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Coltrane
|
4
|
+
attr_reader :degree, :quality
|
5
|
+
|
4
6
|
# It deals with chords in roman notation
|
5
7
|
class RomanChord
|
6
|
-
DIGITS =
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
DIGITS = %w[I II III IV V VI VII].freeze
|
9
|
+
NOTATION_REGEX = %r{
|
10
|
+
(?<degree>[ivIV]*)
|
11
|
+
(?<quality>.*)
|
12
|
+
}x
|
10
13
|
|
11
|
-
def initialize(scale,
|
12
|
-
@scale
|
13
|
-
@
|
14
|
+
def initialize(scale, notation)
|
15
|
+
@scale = scale
|
16
|
+
@notation = notation.match(NOTATION_REGEX).named_captures
|
14
17
|
end
|
15
18
|
|
16
|
-
def
|
17
|
-
|
18
|
-
quality: quality
|
19
|
+
def degree
|
20
|
+
DIGITS.index(@notation['degree'].upcase) + 1
|
19
21
|
end
|
20
22
|
|
21
|
-
def
|
22
|
-
|
23
|
+
def quality_name
|
24
|
+
[
|
25
|
+
minor_notation,
|
26
|
+
@notation['quality'].gsub('o', 'dim').gsub('ø', 'm7b5')
|
27
|
+
].join
|
23
28
|
end
|
24
29
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
|
30
|
+
def minor_notation
|
31
|
+
return 'm' if !@notation['quality'].match?((/dim|m7b5/)) && !upcase?
|
32
|
+
end
|
33
|
+
|
34
|
+
def upcase?
|
35
|
+
!!(@notation['degree'][0].match /[[:upper:]]/)
|
36
|
+
end
|
37
|
+
|
38
|
+
def chord
|
39
|
+
Chord.new root_note: root_note,
|
40
|
+
quality: quality
|
29
41
|
end
|
30
42
|
|
31
43
|
def quality
|
32
|
-
|
44
|
+
q = quality_name
|
45
|
+
ChordQuality.new(name: (q.size.zero? ? 'M' : q))
|
33
46
|
end
|
34
47
|
|
35
|
-
def
|
36
|
-
@
|
48
|
+
def root_note
|
49
|
+
@scale[@degree]
|
37
50
|
end
|
38
51
|
end
|
39
52
|
end
|
data/lib/coltrane/scale.rb
CHANGED
@@ -124,13 +124,16 @@ module Coltrane
|
|
124
124
|
def chords(size)
|
125
125
|
Coltrane::Cache.find_or_record(cache_key("chords-#{size}")) do
|
126
126
|
included_names = []
|
127
|
-
|
128
|
-
|
129
|
-
if
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
127
|
+
scale_rotations = interval_sequence.inversions.map(&:intervals_semitones)
|
128
|
+
ChordQuality::CHORD_QUALITIES.reduce([]) do |memo1, (qname, qintervals)|
|
129
|
+
next memo1 if qintervals.size != size
|
130
|
+
memo1 + scale_rotations.each_with_index.reduce([]) do |memo2, (rot, index)|
|
131
|
+
if (rot & qintervals).size == size
|
132
|
+
memo2 + [ Chord.new(root_note: degree(index+1),
|
133
|
+
quality: ChordQuality.new(name: qname)) ]
|
134
|
+
else
|
135
|
+
memo2
|
136
|
+
end
|
134
137
|
end
|
135
138
|
end
|
136
139
|
end
|
data/lib/coltrane/version.rb
CHANGED
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.22
|
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-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: facets
|
@@ -180,7 +180,6 @@ files:
|
|
180
180
|
- lib/coltrane/errors.rb
|
181
181
|
- lib/coltrane/interval.rb
|
182
182
|
- lib/coltrane/interval_sequence.rb
|
183
|
-
- lib/coltrane/interval_set.rb
|
184
183
|
- lib/coltrane/mode.rb
|
185
184
|
- lib/coltrane/note.rb
|
186
185
|
- lib/coltrane/note_set.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
|
2
|
-
# frozen_string_literal: true
|
3
|
-
# class IntervalSet
|
4
|
-
# def initialize(*intervals)
|
5
|
-
# @intervals = intervals
|
6
|
-
# @number_of_frets = 24
|
7
|
-
# sum = @intervals.reduce(:+)
|
8
|
-
# sum < 12 && @intervals << 12 - sum
|
9
|
-
# end
|
10
|
-
|
11
|
-
# def to_s
|
12
|
-
# @intervals.to_s
|
13
|
-
# end
|
14
|
-
|
15
|
-
# def to_frets(offset = 0)
|
16
|
-
# frets = [-offset]
|
17
|
-
# i = 0
|
18
|
-
# while frets.last < @number_of_frets
|
19
|
-
# frets << frets.last + @intervals[i % @intervals.length]
|
20
|
-
# i += 1
|
21
|
-
# end
|
22
|
-
# frets
|
23
|
-
# end
|
24
|
-
# end
|