coltrane 1.0.21 → 1.0.22
Sign up to get free protection for your applications and to get access to all the features.
- 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
|