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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a52943a09738192960b06180a04c6de4b9e81559c33b06bebac360b53deab75e
4
- data.tar.gz: 11a88b19c9030fc6a150dc3d997544e23de7a6c0f37426e7b22c87a7163ac09b
3
+ metadata.gz: 57dabf818555a71744bf6fb434099d6c33e1b9b33aa3fdaa475c38433b42554f
4
+ data.tar.gz: 0c405a62ff1eaf8fc94f0f819d4c3eac4158565ca83ba8374c21964d4c68c0e5
5
5
  SHA512:
6
- metadata.gz: f4896e2ffc004067857d91ebd397690fbe92ac7cec68943f579521eb5bdcd7d2110372e357290dcc615391cd807f277c134d415fc6202f02dd1cd6a50d198c0e
7
- data.tar.gz: '08baa1c7dd2350e1f646e465dfc968803ccd8ae18aea619efe68285c642ad1ab9447c0dbad36f805285004cb9bcda568b577b13de48c243cfb160887ad085502'
6
+ metadata.gz: 9e86b4fbad7d9961eddf2f1a6d3eb15b86f280e963322a67d4e1ae1d469f7234f632be0d1a0abaaa0d1ee1a3a9409a804e6e44ceefdad45852a402ee9b00ced4
7
+ data.tar.gz: 7dba69b15767ff2d1aac5262075e40eca9548d0aabc244fc018801876c22a4917a54815293e295e048c1c7a7b1d6a706b91010f4783551810410b24c6f2c333e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- coltrane (1.0.11)
4
+ coltrane (1.0.22)
5
5
  color (~> 1.8)
6
6
  facets (~> 3.1)
7
7
  mercenary (~> 0.3)
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/interval_sequence'
15
- require 'coltrane/interval_set'
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
- require 'coltrane/note_set'
25
+
20
26
  require 'coltrane/chord'
21
27
  require 'coltrane/roman_chord'
22
28
 
23
29
  require 'coltrane/classic_scales'
24
- require 'coltrane/classic_progressions'
30
+ require 'coltrane/scale'
25
31
 
26
- require 'coltrane/note'
27
- require 'coltrane/pitch'
32
+ require 'coltrane/classic_progressions'
28
33
  require 'coltrane/progression'
29
- require 'coltrane/scale'
34
+
30
35
  require 'coltrane/mode'
@@ -6,13 +6,21 @@ module Coltrane
6
6
  class Cache
7
7
  class << self
8
8
  def find_or_record(key, &block)
9
- unless (cached = fetch(key))
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Coltrane
4
4
  # It describe a chord
5
- class Chord < NoteSet
5
+ class Chord
6
6
  attr_reader :root_note, :quality, :notes
7
7
 
8
8
  def initialize(notes: nil, root_note: nil, quality: nil, name: nil)
@@ -7,14 +7,10 @@ module Coltrane
7
7
 
8
8
  attr_reader :scale
9
9
 
10
- def initialize(_roman_notation, key: nil, scale: nil)
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
@@ -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
- 'I' => 1,
8
- 'V' => 5
9
- }.freeze
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, roman_numeral)
12
- @scale = scale
13
- @roman_numeral = roman_numeral
14
+ def initialize(scale, notation)
15
+ @scale = scale
16
+ @notation = notation.match(NOTATION_REGEX).named_captures
14
17
  end
15
18
 
16
- def to_chord
17
- Chord.new root_note: root_note,
18
- quality: quality
19
+ def degree
20
+ DIGITS.index(@notation['degree'].upcase) + 1
19
21
  end
20
22
 
21
- def root_note
22
- @scale[degree]
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 degree
26
- @roman_numeral.split('').reduce(0) do |memo, r|
27
- memo + (DIGITS[r] || 0) + (DIGITS[r.swapcase] || 0)
28
- end
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
- ChordQuality.new(name: major? ? 'M' : 'm')
44
+ q = quality_name
45
+ ChordQuality.new(name: (q.size.zero? ? 'M' : q))
33
46
  end
34
47
 
35
- def major?
36
- @roman_numeral[0] =~ /[[:upper]]/
48
+ def root_note
49
+ @scale[@degree]
37
50
  end
38
51
  end
39
52
  end
@@ -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
- notes.permutation(size).reduce([]) do |memo, ns|
128
- chord = Chord.new(notes: ns)
129
- if chord.named? && !included_names.include?(chord.name)
130
- included_names << chord.name
131
- memo + [chord]
132
- else
133
- memo
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Coltrane
4
- VERSION = '1.0.21'
4
+ VERSION = '1.0.22'
5
5
  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.21
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-29 00:00:00.000000000 Z
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