coltrane 0.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.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.bundle/config +2 -0
  3. data/.rspec +2 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +17 -0
  6. data/Gemfile.lock +164 -0
  7. data/Guardfile +71 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +41 -0
  10. data/Rakefile +6 -0
  11. data/bin/_guard-core +17 -0
  12. data/bin/bundler +17 -0
  13. data/bin/coderay +17 -0
  14. data/bin/coltrane +11 -0
  15. data/bin/console +14 -0
  16. data/bin/erubis +17 -0
  17. data/bin/guard +17 -0
  18. data/bin/htmldiff +17 -0
  19. data/bin/kill-pry-rescue +17 -0
  20. data/bin/ldiff +17 -0
  21. data/bin/listen +17 -0
  22. data/bin/nokogiri +17 -0
  23. data/bin/pry +17 -0
  24. data/bin/rackup +17 -0
  25. data/bin/rails +17 -0
  26. data/bin/rake +17 -0
  27. data/bin/rdoc +17 -0
  28. data/bin/rescue +17 -0
  29. data/bin/ri +17 -0
  30. data/bin/rspec +17 -0
  31. data/bin/rubocop +17 -0
  32. data/bin/ruby-parse +17 -0
  33. data/bin/ruby-rewrite +17 -0
  34. data/bin/setup +8 -0
  35. data/bin/sprockets +17 -0
  36. data/bin/thor +17 -0
  37. data/bin/tilt +17 -0
  38. data/coltrane.gemspec +35 -0
  39. data/db/cache.sqlite3 +0 -0
  40. data/db/cache_test.sqlite3 +0 -0
  41. data/db/config.yml +11 -0
  42. data/db/schema.rb +30 -0
  43. data/lib/coltrane.rb +48 -0
  44. data/lib/coltrane/cadence.rb +4 -0
  45. data/lib/coltrane/chord.rb +81 -0
  46. data/lib/coltrane/chord_cache.rb +4 -0
  47. data/lib/coltrane/chord_quality.rb +48 -0
  48. data/lib/coltrane/classic_scales.rb +134 -0
  49. data/lib/coltrane/essential_guitar_chords.rb +82 -0
  50. data/lib/coltrane/fret_set.rb +0 -0
  51. data/lib/coltrane/guitar.rb +15 -0
  52. data/lib/coltrane/guitar_chord.rb +50 -0
  53. data/lib/coltrane/guitar_chord_finder.rb +98 -0
  54. data/lib/coltrane/guitar_note.rb +50 -0
  55. data/lib/coltrane/guitar_note_set.rb +61 -0
  56. data/lib/coltrane/guitar_representation.rb +96 -0
  57. data/lib/coltrane/guitar_string.rb +52 -0
  58. data/lib/coltrane/interval.rb +33 -0
  59. data/lib/coltrane/interval_sequence.rb +70 -0
  60. data/lib/coltrane/interval_set.rb +23 -0
  61. data/lib/coltrane/mode.rb +0 -0
  62. data/lib/coltrane/note.rb +98 -0
  63. data/lib/coltrane/note_set.rb +50 -0
  64. data/lib/coltrane/piano_representation.rb +58 -0
  65. data/lib/coltrane/pitch.rb +27 -0
  66. data/lib/coltrane/progression.rb +4 -0
  67. data/lib/coltrane/qualities.rb +115 -0
  68. data/lib/coltrane/scale.rb +139 -0
  69. data/lib/coltrane/scale_cache.rb +4 -0
  70. data/lib/coltrane/scale_chord.rb +4 -0
  71. data/lib/coltrane/version.rb +3 -0
  72. metadata +144 -0
@@ -0,0 +1,139 @@
1
+ module Coltrane
2
+ class Scale
3
+ extend ClassicScales
4
+ attr_reader :interval_sequence, :tone
5
+
6
+ def initialize(*interval_steps, tone: 'C', mode: 1)
7
+ @tone = Note.new(tone)
8
+ intervals = interval_steps.rotate(mode-1).reduce([0]) do |intervals, step|
9
+ intervals << (intervals.last + step)
10
+ end
11
+
12
+ @interval_sequence = IntervalSequence.new(intervals)
13
+ end
14
+
15
+ def [](degree)
16
+ if degree < 1
17
+ raise 'Wrong degree! Use music convention for requesting degrees'
18
+ end
19
+
20
+ tone + interval_sequence[(degree-1) % (size)].number
21
+ end
22
+
23
+ def degrees
24
+ (1..size)
25
+ end
26
+
27
+ def degree_of_chord(chord)
28
+ if chords(chord.size).map(&:name).include?(chord.name)
29
+ degree_of_note(chord.root_note)
30
+ end
31
+ end
32
+
33
+ def degree_of_note(note)
34
+ note = notes.map(&:name).index(note.name)
35
+ return note + 1 unless note.nil?
36
+ end
37
+
38
+ def include_notes?(*arg_notes)
39
+ arg_notes.each_with_object([]) do |n, memo|
40
+ memo << n if notes.map(&:name).include?(n.name)
41
+ end
42
+ end
43
+
44
+ def notes
45
+ @notes ||= degrees.map { |d| self[d] }
46
+ end
47
+
48
+ def interval(i)
49
+ interval_sequence[(i-1) % size]
50
+ end
51
+
52
+ def size
53
+ interval_sequence.all.count - 1
54
+ end
55
+
56
+ def tertians
57
+ degrees.reduce([]) do |chords, degree|
58
+ intervals = IntervalSequence.new(3.times.map { |i| interval(degree+(i*2)) })
59
+ intervals = intervals.shift(-intervals.numbers[0])
60
+ chord_name = "#{self[degree].name}#{ChordQuality.new(intervals).name}"
61
+ chords << Chord.new(chord_name)
62
+ end
63
+ end
64
+
65
+ def sevenths
66
+ degrees.reduce([]) do |chords, degree|
67
+ intervals = IntervalSequence.new(4.times.map { |i| interval(degree+(i*2)) })
68
+ intervals = intervals.shift(-intervals.numbers[0])
69
+ chord_name = "#{self[degree].name}#{ChordQuality.new(intervals).name}"
70
+ chords << Chord.new(chord_name)
71
+ end
72
+ end
73
+
74
+ def on_guitar
75
+ NoteSet.new(notes).guitar_notes.render
76
+ end
77
+
78
+ def intervals_on_guitar
79
+ NoteSet.new(notes).guitar_notes.render(tone)
80
+ end
81
+
82
+ def degrees_on_guitar
83
+ GuitarRepresentation.render_degrees(NoteSet.new(notes).guitar_notes, self)
84
+ end
85
+
86
+ def notes_on_guitar
87
+ GuitarRepresentation.render_notes(NoteSet.new(notes).guitar_notes, self)
88
+ end
89
+
90
+ def intervals_on_piano
91
+ PianoRepresentation.render_intervals(notes, tone)
92
+ end
93
+
94
+ def on_piano
95
+ intervals_on_piano
96
+ end
97
+
98
+
99
+ def cache
100
+ ScaleCache.find_or_create_by(
101
+ interval_sequence: interval_sequence.numbers.to_s,
102
+ tone: tone.name
103
+ )
104
+ end
105
+
106
+ def cached_chords(size)
107
+ cchords = cache.chord_caches.where(size: size)
108
+ cchords.map do |chord_cache|
109
+ Chord.new(chord_cache.name)
110
+ end
111
+ end
112
+
113
+ def cache_chords(chords)
114
+ []
115
+ chords.each do |chord|
116
+ cache.chord_caches.create name: chord.name, size: chord.size
117
+ end
118
+ end
119
+
120
+ def chords(size)
121
+ cchords = cached_chords(size)
122
+ if cchords.empty?
123
+ cache_chords(begin
124
+ permutations = interval_sequence.numbers.permutation(size).map do |intervals|
125
+ IntervalSequence.new(intervals)
126
+ end
127
+ permutations.uniq.map do |c|
128
+ quality = ChordQuality.new(c.zero_it)
129
+ unless quality.name.nil?
130
+ Chord.new "#{(tone + c[0].number).name}#{quality.name}"
131
+ end
132
+ end.compact
133
+ end)
134
+ else
135
+ cchords
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,4 @@
1
+ class ScaleCache < ActiveRecord::Base
2
+ has_many :scale_chords
3
+ has_many :chord_caches, through: :scale_chords
4
+ end
@@ -0,0 +1,4 @@
1
+ class ScaleChord < ActiveRecord::Base
2
+ belongs_to :chord_cache
3
+ belongs_to :scale_cache
4
+ end
@@ -0,0 +1,3 @@
1
+ module Coltrane
2
+ VERSION = "0.0.2"
3
+ end
metadata ADDED
@@ -0,0 +1,144 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coltrane
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Pedro Maciel
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-05-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description:
42
+ email:
43
+ - pedro@pedromaciel.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".bundle/config"
49
+ - ".rspec"
50
+ - CODE_OF_CONDUCT.md
51
+ - Gemfile
52
+ - Gemfile.lock
53
+ - Guardfile
54
+ - LICENSE.txt
55
+ - README.md
56
+ - Rakefile
57
+ - bin/_guard-core
58
+ - bin/bundler
59
+ - bin/coderay
60
+ - bin/coltrane
61
+ - bin/console
62
+ - bin/erubis
63
+ - bin/guard
64
+ - bin/htmldiff
65
+ - bin/kill-pry-rescue
66
+ - bin/ldiff
67
+ - bin/listen
68
+ - bin/nokogiri
69
+ - bin/pry
70
+ - bin/rackup
71
+ - bin/rails
72
+ - bin/rake
73
+ - bin/rdoc
74
+ - bin/rescue
75
+ - bin/ri
76
+ - bin/rspec
77
+ - bin/rubocop
78
+ - bin/ruby-parse
79
+ - bin/ruby-rewrite
80
+ - bin/setup
81
+ - bin/sprockets
82
+ - bin/thor
83
+ - bin/tilt
84
+ - coltrane.gemspec
85
+ - db/cache.sqlite3
86
+ - db/cache_test.sqlite3
87
+ - db/config.yml
88
+ - db/schema.rb
89
+ - lib/coltrane.rb
90
+ - lib/coltrane/cadence.rb
91
+ - lib/coltrane/chord.rb
92
+ - lib/coltrane/chord_cache.rb
93
+ - lib/coltrane/chord_quality.rb
94
+ - lib/coltrane/classic_scales.rb
95
+ - lib/coltrane/essential_guitar_chords.rb
96
+ - lib/coltrane/fret_set.rb
97
+ - lib/coltrane/guitar.rb
98
+ - lib/coltrane/guitar_chord.rb
99
+ - lib/coltrane/guitar_chord_finder.rb
100
+ - lib/coltrane/guitar_note.rb
101
+ - lib/coltrane/guitar_note_set.rb
102
+ - lib/coltrane/guitar_representation.rb
103
+ - lib/coltrane/guitar_string.rb
104
+ - lib/coltrane/interval.rb
105
+ - lib/coltrane/interval_sequence.rb
106
+ - lib/coltrane/interval_set.rb
107
+ - lib/coltrane/mode.rb
108
+ - lib/coltrane/note.rb
109
+ - lib/coltrane/note_set.rb
110
+ - lib/coltrane/piano_representation.rb
111
+ - lib/coltrane/pitch.rb
112
+ - lib/coltrane/progression.rb
113
+ - lib/coltrane/qualities.rb
114
+ - lib/coltrane/scale.rb
115
+ - lib/coltrane/scale_cache.rb
116
+ - lib/coltrane/scale_chord.rb
117
+ - lib/coltrane/version.rb
118
+ homepage: http://github.com/pedrozath/coltrane
119
+ licenses:
120
+ - MIT
121
+ metadata:
122
+ allowed_push_host: https://rubygems.org
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project:
139
+ rubygems_version: 2.6.11
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: It deals with all sorts of calculations around music theory and allows for
143
+ graphical representations of it
144
+ test_files: []