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 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