coltrane 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: []