coltrane 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.bundle/config +2 -0
- data/.rspec +2 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +164 -0
- data/Guardfile +71 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +6 -0
- data/bin/_guard-core +17 -0
- data/bin/bundler +17 -0
- data/bin/coderay +17 -0
- data/bin/coltrane +11 -0
- data/bin/console +14 -0
- data/bin/erubis +17 -0
- data/bin/guard +17 -0
- data/bin/htmldiff +17 -0
- data/bin/kill-pry-rescue +17 -0
- data/bin/ldiff +17 -0
- data/bin/listen +17 -0
- data/bin/nokogiri +17 -0
- data/bin/pry +17 -0
- data/bin/rackup +17 -0
- data/bin/rails +17 -0
- data/bin/rake +17 -0
- data/bin/rdoc +17 -0
- data/bin/rescue +17 -0
- data/bin/ri +17 -0
- data/bin/rspec +17 -0
- data/bin/rubocop +17 -0
- data/bin/ruby-parse +17 -0
- data/bin/ruby-rewrite +17 -0
- data/bin/setup +8 -0
- data/bin/sprockets +17 -0
- data/bin/thor +17 -0
- data/bin/tilt +17 -0
- data/coltrane.gemspec +35 -0
- data/db/cache.sqlite3 +0 -0
- data/db/cache_test.sqlite3 +0 -0
- data/db/config.yml +11 -0
- data/db/schema.rb +30 -0
- data/lib/coltrane.rb +48 -0
- data/lib/coltrane/cadence.rb +4 -0
- data/lib/coltrane/chord.rb +81 -0
- data/lib/coltrane/chord_cache.rb +4 -0
- data/lib/coltrane/chord_quality.rb +48 -0
- data/lib/coltrane/classic_scales.rb +134 -0
- data/lib/coltrane/essential_guitar_chords.rb +82 -0
- data/lib/coltrane/fret_set.rb +0 -0
- data/lib/coltrane/guitar.rb +15 -0
- data/lib/coltrane/guitar_chord.rb +50 -0
- data/lib/coltrane/guitar_chord_finder.rb +98 -0
- data/lib/coltrane/guitar_note.rb +50 -0
- data/lib/coltrane/guitar_note_set.rb +61 -0
- data/lib/coltrane/guitar_representation.rb +96 -0
- data/lib/coltrane/guitar_string.rb +52 -0
- data/lib/coltrane/interval.rb +33 -0
- data/lib/coltrane/interval_sequence.rb +70 -0
- data/lib/coltrane/interval_set.rb +23 -0
- data/lib/coltrane/mode.rb +0 -0
- data/lib/coltrane/note.rb +98 -0
- data/lib/coltrane/note_set.rb +50 -0
- data/lib/coltrane/piano_representation.rb +58 -0
- data/lib/coltrane/pitch.rb +27 -0
- data/lib/coltrane/progression.rb +4 -0
- data/lib/coltrane/qualities.rb +115 -0
- data/lib/coltrane/scale.rb +139 -0
- data/lib/coltrane/scale_cache.rb +4 -0
- data/lib/coltrane/scale_chord.rb +4 -0
- data/lib/coltrane/version.rb +3 -0
- 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
|
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: []
|