coltrane 2.2.1 → 3.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +16 -1
- data/CHANGELOG.md +11 -0
- data/Gemfile.lock +25 -2
- data/README.md +3 -0
- data/bin/console +6 -2
- data/coltrane.gemspec +2 -1
- data/exe/coltrane +14 -224
- data/lib/coltrane.rb +3 -50
- data/lib/coltrane/commands.rb +14 -0
- data/lib/coltrane/commands/chords.rb +77 -0
- data/lib/coltrane/commands/command.rb +45 -0
- data/lib/coltrane/commands/common_chords.rb +33 -0
- data/lib/coltrane/commands/errors.rb +44 -0
- data/lib/coltrane/commands/find_progression.rb +28 -0
- data/lib/coltrane/commands/find_scale.rb +39 -0
- data/lib/coltrane/commands/notes.rb +44 -0
- data/lib/coltrane/commands/progression.rb +27 -0
- data/lib/{cli → coltrane/commands}/representation.rb +0 -0
- data/lib/coltrane/commands/scale.rb +46 -0
- data/lib/coltrane/renderers.rb +6 -0
- data/lib/coltrane/renderers/renderer.rb +42 -0
- data/lib/coltrane/renderers/text_renderer.rb +23 -0
- data/lib/coltrane/renderers/text_renderer/array_drawer.rb +45 -0
- data/lib/coltrane/renderers/text_renderer/base_drawer.rb +20 -0
- data/lib/coltrane/renderers/text_renderer/hash_drawer.rb +16 -0
- data/lib/coltrane/renderers/text_renderer/representation_guitar_chord_drawer.rb +95 -0
- data/lib/coltrane/renderers/text_renderer/representation_guitar_note_set_drawer.rb +76 -0
- data/lib/coltrane/renderers/text_renderer/representation_piano_note_set_drawer.rb +49 -0
- data/lib/coltrane/renderers/text_renderer/theory_chord_drawer.rb +14 -0
- data/lib/coltrane/renderers/text_renderer/theory_note_set_drawer.rb +17 -0
- data/lib/coltrane/renderers/text_renderer/theory_progression_drawer.rb +13 -0
- data/lib/coltrane/renderers/text_renderer/theory_progression_set_drawer.rb +22 -0
- data/lib/coltrane/renderers/text_renderer/theory_scale_drawer.rb +13 -0
- data/lib/coltrane/renderers/text_renderer/theory_scale_set_drawer.rb +27 -0
- data/lib/coltrane/representation.rb +12 -0
- data/lib/coltrane/representation/guitar.rb +34 -0
- data/lib/coltrane/representation/guitar/chord.rb +180 -0
- data/lib/coltrane/representation/guitar/note.rb +26 -0
- data/lib/coltrane/representation/guitar/note_set.rb +35 -0
- data/lib/coltrane/representation/guitar/string.rb +31 -0
- data/lib/coltrane/representation/guitar_like_instruments.rb +21 -0
- data/lib/coltrane/representation/piano.rb +36 -0
- data/lib/coltrane/representation/piano/note_set.rb +22 -0
- data/lib/{coltrane_synth.rb → coltrane/synth.rb.rb} +0 -0
- data/lib/{coltrane_synth → coltrane/synth}/base.rb +0 -0
- data/lib/{coltrane_synth → coltrane/synth}/synth.rb +0 -0
- data/lib/coltrane/theory.rb +54 -0
- data/lib/coltrane/theory/cadence.rb +9 -0
- data/lib/coltrane/{changes.rb → theory/changes.rb} +0 -0
- data/lib/coltrane/theory/chord.rb +101 -0
- data/lib/coltrane/theory/chord_quality.rb +113 -0
- data/lib/coltrane/theory/chord_substitutions.rb +11 -0
- data/lib/coltrane/theory/circle_of_fifths.rb +33 -0
- data/lib/coltrane/theory/classic_scales.rb +113 -0
- data/lib/coltrane/theory/diatonic_scale.rb +38 -0
- data/lib/coltrane/theory/errors.rb +97 -0
- data/lib/coltrane/theory/frequency.rb +52 -0
- data/lib/coltrane/theory/frequency_interval.rb +83 -0
- data/lib/coltrane/theory/interval.rb +209 -0
- data/lib/coltrane/theory/interval_class.rb +212 -0
- data/lib/coltrane/theory/interval_sequence.rb +157 -0
- data/lib/coltrane/theory/key.rb +18 -0
- data/lib/coltrane/{mode.rb → theory/mode.rb} +0 -0
- data/lib/coltrane/theory/notable_progressions.rb +30 -0
- data/lib/coltrane/theory/note.rb +104 -0
- data/lib/coltrane/theory/note_set.rb +101 -0
- data/lib/coltrane/theory/pitch.rb +94 -0
- data/lib/coltrane/theory/pitch_class.rb +154 -0
- data/lib/coltrane/theory/progression.rb +81 -0
- data/lib/coltrane/theory/progression_set.rb +18 -0
- data/lib/coltrane/{qualities.rb → theory/qualities.rb} +0 -0
- data/lib/coltrane/theory/roman_chord.rb +114 -0
- data/lib/coltrane/theory/scale.rb +161 -0
- data/lib/coltrane/theory/scale_search_result.rb +6 -0
- data/lib/coltrane/theory/scale_set.rb +40 -0
- data/lib/coltrane/theory/voicing.rb +41 -0
- data/lib/coltrane/version.rb +1 -1
- metadata +88 -63
- data/bin/rails +0 -17
- data/data/qualities.yml +0 -83
- data/db/cache.sqlite3 +0 -0
- data/db/cache_test.sqlite3 +0 -0
- data/db/config.yml +0 -11
- data/lib/cli.rb +0 -24
- data/lib/cli/bass_guitar.rb +0 -12
- data/lib/cli/chord.rb +0 -39
- data/lib/cli/config.rb +0 -39
- data/lib/cli/errors.rb +0 -46
- data/lib/cli/guitar.rb +0 -67
- data/lib/cli/guitar_chords.rb +0 -122
- data/lib/cli/notes.rb +0 -20
- data/lib/cli/piano.rb +0 -57
- data/lib/cli/scale.rb +0 -53
- data/lib/cli/text.rb +0 -16
- data/lib/cli/ukulele.rb +0 -14
- data/lib/coltrane/cache.rb +0 -43
- data/lib/coltrane/cadence.rb +0 -7
- data/lib/coltrane/chord.rb +0 -89
- data/lib/coltrane/chord_quality.rb +0 -111
- data/lib/coltrane/chord_substitutions.rb +0 -9
- data/lib/coltrane/circle_of_fifths.rb +0 -31
- data/lib/coltrane/classic_scales.rb +0 -94
- data/lib/coltrane/diatonic_scale.rb +0 -36
- data/lib/coltrane/errors.rb +0 -95
- data/lib/coltrane/frequency.rb +0 -50
- data/lib/coltrane/frequency_interval.rb +0 -81
- data/lib/coltrane/interval.rb +0 -208
- data/lib/coltrane/interval_class.rb +0 -210
- data/lib/coltrane/interval_sequence.rb +0 -155
- data/lib/coltrane/key.rb +0 -16
- data/lib/coltrane/notable_progressions.rb +0 -28
- data/lib/coltrane/note.rb +0 -98
- data/lib/coltrane/note_set.rb +0 -89
- data/lib/coltrane/pitch.rb +0 -92
- data/lib/coltrane/pitch_class.rb +0 -148
- data/lib/coltrane/progression.rb +0 -74
- data/lib/coltrane/roman_chord.rb +0 -112
- data/lib/coltrane/scale.rb +0 -154
- data/lib/coltrane/unordered_interval_class.rb +0 -7
- data/lib/coltrane/voicing.rb +0 -39
- data/lib/coltrane_game/question.rb +0 -7
- data/lib/coltrane_instruments.rb +0 -7
- data/lib/coltrane_instruments/guitar.rb +0 -10
- data/lib/coltrane_instruments/guitar/base.rb +0 -29
- data/lib/coltrane_instruments/guitar/chord.rb +0 -170
- data/lib/coltrane_instruments/guitar/note.rb +0 -24
- data/lib/coltrane_instruments/guitar/string.rb +0 -29
- data/lib/os.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b31feba198134bfc6fb460384f54e2ab64673195da1d8a49387b0330992d684
|
4
|
+
data.tar.gz: 0185a37862223cf82da552d1b93ba2b0423044cf788956fc2c3d66a8cc9cb19a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecdcbace2c6c7cf71c39acec0768728ac92fc46250310fecb046309e5b97a12b6f2f3c987be29a0a72e88e3c72781a3e867b56a781159db11d62f6110fb16a85
|
7
|
+
data.tar.gz: 3ddfd6129273dc69b6e20a176129cb86d079735ad47cdcb98a5b16c6706d12ea29414a834c0a488be1273b7dc73d3328416b2575064a6870c47a737a1086c9c7
|
data/.travis.yml
CHANGED
@@ -1,10 +1,25 @@
|
|
1
|
+
env:
|
2
|
+
global:
|
3
|
+
- CC_TEST_REPORTER_ID=ef9987fd97eefaf4017a8b88e063e9376b408e93b170ad4610c8fce4370f4be2
|
4
|
+
|
1
5
|
language: ruby
|
2
6
|
git:
|
3
7
|
depth: 1
|
8
|
+
|
4
9
|
rvm:
|
5
10
|
- 2.5.0
|
11
|
+
|
12
|
+
before_script:
|
13
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
14
|
+
- chmod +x ./cc-test-reporter
|
15
|
+
- ./cc-test-reporter before-build
|
16
|
+
|
6
17
|
script:
|
7
18
|
- bin/rspec spec
|
19
|
+
|
20
|
+
after_script:
|
21
|
+
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
22
|
+
|
8
23
|
deploy:
|
9
24
|
provider: rubygems
|
10
25
|
api_key:
|
@@ -14,4 +29,4 @@ deploy:
|
|
14
29
|
repo: pedrozath/coltrane
|
15
30
|
notifications:
|
16
31
|
slack:
|
17
|
-
secure:
|
32
|
+
secure: Z1DrNRL47BvEB/PWyb+EsVlAwVsGapytLGCiyQeTlNBTK7iCfP3N57fkVZDyaMYWJ7oweCk16aTBxljnP6SPNaqQhKWilDXiwnX9s3uWxz06ONgg8TE46hGyplD5fmt/liIxQ/XeJoCA8C6qWJRAc94Y0b42yK23eFbCU3632ISt1wVwipOcuAyCD0TTjQUHRjWT4Zbg6gqytG+U3rsx2+wGUDbu2Nu5r6C90uU0vbmHyhcmf2S7V7is7Kpc24aDhPhBBrP44uWXLEXh8Hgthca95jVm2CoL2GVK+f6W/mAkQugkg0Rz//d8+9M5SJcHQiUBwNIXxfgEQKkVFSuiMcySdG0RFBh9dyPPem3AUWEO9HwNlF+juMkwP+Wavj9eoN3cWNeVJrT00mXaTzmPdxFKxvRKp/NSJQIKI7dzg74oggyzu5BSmTlth2YGgNzEhKbAjOGL+B2ClE5KeR4ZIUsEH7Z/KAoHH4EPERYqec+aSsbLuoAAQiuRIqul+MyZiz0ox/kA1hFVndbDg7avxqZUzBSBZ7f9nMzKxQeUGSJYS3f5XWYpIDCxEiub5LiLMkltaM2AGAzZfFhLYEC96J/HoyF7xxHZNWbEJiv+bLuQGcD8BUCTNfRZM15nQbaKNBpyx/lC0h4kRAGnaGAnfGYCuKHjHPWsSAc8jcmW3Bw=
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,17 @@
|
|
5
5
|
- Fix chords so that they generate a barre and a non-barre version and prevent
|
6
6
|
barre chords from picking notes before the barre.
|
7
7
|
|
8
|
+
## [3.0.0]
|
9
|
+
|
10
|
+
### Changes
|
11
|
+
|
12
|
+
- This is a huge architectural refactor. Hopefully the last big one. All code were redivided into the modules:
|
13
|
+
|
14
|
+
1. Coltrane::Theory concentrates all music theory logic
|
15
|
+
2. Coltrane::Representation contain musical instruments and any other needed musical-related abstract representations.
|
16
|
+
3. Coltrane::Renderers right now contains the TextRenderer which has the ability of rendering Theory Objects, Representation Objects, etc
|
17
|
+
4. Coltrane::Commands are ways of fetching Theory and Representation objects. They also glue Mercenary (the gem used for the CLI) into everything else.
|
18
|
+
|
8
19
|
## [2.2.0]
|
9
20
|
|
10
21
|
- Intervals were completely refactored according to [#11](https://github.com/pedrozath/coltrane/issues/11) and (https://github.com/pedrozath/coltrane/issues/12). Thanks [@art-of-dom](https://github.com/art-of-dom) for the valuable information. We now have new interval classes and new ways on how to deal with them.
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
coltrane (
|
4
|
+
coltrane (3.0.0.pre)
|
5
5
|
color (~> 1.8)
|
6
6
|
dry-monads (~> 0.4)
|
7
|
-
paint (~> 2.0)
|
7
|
+
paint (~> 2.0.1)
|
8
8
|
pedrozath-mercenary (~> 0.3)
|
9
|
+
tty-prompt (~> 0.16.0)
|
9
10
|
|
10
11
|
GEM
|
11
12
|
remote: https://rubygems.org/
|
@@ -25,12 +26,14 @@ GEM
|
|
25
26
|
dry-monads (0.4.0)
|
26
27
|
dry-core (~> 0.3, >= 0.3.3)
|
27
28
|
dry-equalizer
|
29
|
+
equatable (0.5.0)
|
28
30
|
faraday (0.14.0)
|
29
31
|
multipart-post (>= 1.2, < 3)
|
30
32
|
gitlab (3.6.1)
|
31
33
|
httparty
|
32
34
|
terminal-table
|
33
35
|
hike (1.2.3)
|
36
|
+
hitimes (1.2.6)
|
34
37
|
httparty (0.16.1)
|
35
38
|
multi_xml (>= 0.5.2)
|
36
39
|
interception (0.5)
|
@@ -38,6 +41,7 @@ GEM
|
|
38
41
|
method_source (0.9.0)
|
39
42
|
multi_xml (0.6.0)
|
40
43
|
multipart-post (2.0.0)
|
44
|
+
necromancer (0.4.0)
|
41
45
|
octokit (4.8.0)
|
42
46
|
sawyer (~> 0.8.0, >= 0.5.3)
|
43
47
|
opal (0.10.5)
|
@@ -51,6 +55,9 @@ GEM
|
|
51
55
|
parallel (1.12.1)
|
52
56
|
parser (2.4.0.2)
|
53
57
|
ast (~> 2.3)
|
58
|
+
pastel (0.7.2)
|
59
|
+
equatable (~> 0.5.0)
|
60
|
+
tty-color (~> 0.4.0)
|
54
61
|
pedrozath-mercenary (0.3.6)
|
55
62
|
powerpack (0.1.1)
|
56
63
|
pronto (0.6.0)
|
@@ -112,7 +119,23 @@ GEM
|
|
112
119
|
unicode-display_width (~> 1.1, >= 1.1.1)
|
113
120
|
thor (0.19.4)
|
114
121
|
tilt (2.0.8)
|
122
|
+
timers (4.1.2)
|
123
|
+
hitimes
|
124
|
+
tty-color (0.4.2)
|
125
|
+
tty-cursor (0.5.0)
|
126
|
+
tty-prompt (0.16.0)
|
127
|
+
necromancer (~> 0.4.0)
|
128
|
+
pastel (~> 0.7.0)
|
129
|
+
timers (~> 4.0)
|
130
|
+
tty-cursor (~> 0.5.0)
|
131
|
+
tty-reader (~> 0.2.0)
|
132
|
+
tty-reader (0.2.0)
|
133
|
+
tty-cursor (~> 0.5.0)
|
134
|
+
tty-screen (~> 0.6.4)
|
135
|
+
wisper (~> 2.0.0)
|
136
|
+
tty-screen (0.6.4)
|
115
137
|
unicode-display_width (1.3.0)
|
138
|
+
wisper (2.0.0)
|
116
139
|
|
117
140
|
PLATFORMS
|
118
141
|
ruby
|
data/README.md
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
[![Build Status](https://travis-ci.org/pedrozath/coltrane.svg?branch=master)](https://travis-ci.org/pedrozath/coltrane)
|
2
|
+
[![Gem Version](https://badge.fury.io/rb/coltrane.svg)](https://badge.fury.io/rb/coltrane)
|
3
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/a99a88d28ad37a79dbf6/maintainability)](https://codeclimate.com/github/pedrozath/coltrane/maintainability)
|
4
|
+
[![Test Coverage](https://api.codeclimate.com/v1/badges/a99a88d28ad37a79dbf6/test_coverage)](https://codeclimate.com/github/pedrozath/coltrane/test_coverage)
|
2
5
|
|
3
6
|
# Coltrane
|
4
7
|
|
data/bin/console
CHANGED
@@ -3,10 +3,14 @@ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
|
3
3
|
|
4
4
|
require "bundler/setup"
|
5
5
|
require "coltrane"
|
6
|
-
require "
|
7
|
-
|
6
|
+
require "coltrane/representation"
|
7
|
+
require "coltrane/renderers"
|
8
8
|
|
9
9
|
require "pry"
|
10
10
|
|
11
11
|
include Coltrane
|
12
|
+
include Coltrane::Theory
|
13
|
+
include Coltrane::Representation
|
14
|
+
include Coltrane::Renderers
|
15
|
+
|
12
16
|
Pry.start
|
data/coltrane.gemspec
CHANGED
@@ -32,8 +32,9 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
33
33
|
spec.require_paths = ["lib"]
|
34
34
|
|
35
|
+
spec.add_runtime_dependency 'tty-prompt', '~> 0.16.0'
|
35
36
|
spec.add_runtime_dependency 'dry-monads', '~> 0.4'
|
36
|
-
spec.add_runtime_dependency 'paint', '~> 2.0'
|
37
|
+
spec.add_runtime_dependency 'paint', '~> 2.0.1'
|
37
38
|
spec.add_runtime_dependency 'color', '~> 1.8'
|
38
39
|
spec.add_runtime_dependency 'pedrozath-mercenary', '~> 0.3'
|
39
40
|
spec.add_development_dependency "bundler", '~> 1.14'
|
data/exe/coltrane
CHANGED
@@ -1,20 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
# rubocop:disable Metrics/BlockLength
|
5
|
-
|
6
4
|
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
7
5
|
|
8
|
-
require '
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
require 'paint'
|
7
|
+
require 'color'
|
8
|
+
require 'mercenary'
|
9
|
+
require 'coltrane/commands'
|
10
|
+
require 'pry'
|
12
11
|
|
13
|
-
|
14
|
-
Paint.mode = 0xFFFFFF
|
15
|
-
elsif safe_mode_terminals.include?(ENV['TERM_PROGRAM'])
|
16
|
-
Paint.mode = 0
|
17
|
-
end
|
12
|
+
Paint.mode = 0xFFFFFF
|
18
13
|
|
19
14
|
Mercenary.program(:Coltrane) do |p|
|
20
15
|
p.version Coltrane::VERSION
|
@@ -22,226 +17,21 @@ Mercenary.program(:Coltrane) do |p|
|
|
22
17
|
A music querying interface
|
23
18
|
by Pedro Maciel (pedro@pedromaciel.com)
|
24
19
|
|
25
|
-
Check the chat room for project discussion/
|
20
|
+
Check the chat room for project help/discussion/contribution: https://coltrane-ruby.herokuapp.com
|
26
21
|
DESC
|
27
22
|
p.syntax 'coltrane <subcommand> [options]'
|
28
23
|
|
29
|
-
|
30
|
-
|
31
|
-
'--on guitar INSTRUMENT',
|
32
|
-
'Shows the notes on the given instrument/representation type. Can be piano, guitar, ukulele, bass or text'
|
33
|
-
]
|
34
|
-
|
35
|
-
@flavor_option = [
|
36
|
-
:flavor,
|
37
|
-
'--flavor FLAVOR',
|
38
|
-
'Chooses which additional information to display: marks, notes, intervals or degrees'
|
39
|
-
]
|
40
|
-
|
41
|
-
@sound_option = [
|
42
|
-
:sound,
|
43
|
-
'--sound',
|
44
|
-
'beta/macOS only: plays the sound of related notes/chords'
|
45
|
-
]
|
46
|
-
|
47
|
-
p.command(:note) do |c|
|
48
|
-
c.alias(:notes)
|
49
|
-
c.syntax 'notes <notes separated by space> [--on <instrument>]'
|
50
|
-
c.description 'Shows the given notes.'
|
51
|
-
c.option(*@instrument_option)
|
52
|
-
c.option(*@flavor_option)
|
53
|
-
c.option(*@sound_option)
|
54
|
-
c.action do |(notes), on: 'text', flavor: 'notes'|
|
55
|
-
Coltrane::Cli.config do |c|
|
56
|
-
c.on = on.to_sym
|
57
|
-
c.flavor = flavor.to_sym
|
58
|
-
end
|
59
|
-
|
60
|
-
raise 'Provide some notes. Ex: coltrane notes C-D-Gb' if notes.empty?
|
61
|
-
notes = Coltrane::NoteSet[*notes.split('-')]
|
62
|
-
Coltrane::Cli::Notes.new(notes)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
p.command(:chord) do |c|
|
67
|
-
c.alias(:chords)
|
68
|
-
c.syntax 'chord <chord-name> [--on <instrument>]'
|
69
|
-
c.description 'Shows the given chord. Ex: coltrane chord Cmaj7 --on piano'
|
70
|
-
c.option(*@instrument_option)
|
71
|
-
c.option(*@flavor_option)
|
72
|
-
c.option(*@sound_option)
|
73
|
-
c.option :notes, '--notes C-D-E', 'finds chords with those notes, provided they are separated by dashes'
|
74
|
-
c.action do |(chords), notes: nil, on: 'text', flavor: 'notes', sound: nil|
|
75
|
-
Coltrane::Cli.config do |c|
|
76
|
-
c.on = on.to_sym
|
77
|
-
c.flavor = flavor.to_sym
|
78
|
-
c.sound = sound
|
79
|
-
end
|
80
|
-
|
81
|
-
chords = chords&.split('-')
|
82
|
-
Coltrane::Cli::Chord.new(*chords, notes: notes&.split('-'))
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
p.command(:scale) do |c|
|
87
|
-
c.syntax 'scale <name of scale>-<root note> [--on <instrument>]'
|
88
|
-
c.description 'Gives you information about a scale. Ex: coltrane scale natural-minor-Db --on guitar'
|
89
|
-
c.option(*@instrument_option)
|
90
|
-
c.option(*@flavor_option)
|
91
|
-
c.option(*@sound_option)
|
92
|
-
c.option :triads, '--triads', 'Outputs triads from the scale'
|
93
|
-
c.option :sevenths, '--sevenths', 'Outputs seventh chords from the scale'
|
94
|
-
c.option :pentads, '--pentads', 'Outputs pentad chords from the scale'
|
95
|
-
c.option :tertians, '--tertians SIZE', 'Outputs all tertian chords from the given size from the scale'
|
96
|
-
c.option :chords, '--chords [SIZE]', 'Outputs all chords from given size from the scale. Leave size empty to retrieve all'
|
97
|
-
c.action do |(scale_str), flavor: 'degrees', on: 'text', sound: false, **options|
|
98
|
-
Coltrane::Cli.config do |c|
|
99
|
-
c.on = on.to_sym
|
100
|
-
c.flavor = flavor.to_sym
|
101
|
-
c.sound = sound
|
102
|
-
end
|
103
|
-
|
104
|
-
scale = Coltrane::Cli::Scale.parse(scale_str)
|
105
|
-
if options.include?(:triads)
|
106
|
-
chords = scale.triads
|
107
|
-
Coltrane::Cli::Chord.new(*chords, **keyword_args)
|
108
|
-
elsif options.include?(:sevenths)
|
109
|
-
chords = scale.sevenths
|
110
|
-
Coltrane::Cli::Chord.new(*chords, **keyword_args)
|
111
|
-
elsif options.include?(:pentads)
|
112
|
-
chords = scale.pentads
|
113
|
-
Coltrane::Cli::Chord.new(*chords, **keyword_args)
|
114
|
-
elsif options.include?(:tertians)
|
115
|
-
chords = scale.tertians(options[:tertians].to_i)
|
116
|
-
Coltrane::Cli::Chord.new(*chords, **keyword_args)
|
117
|
-
elsif options.include?(:chords)
|
118
|
-
chords = if options[:chords].nil?
|
119
|
-
scale.all_chords
|
120
|
-
else
|
121
|
-
scale.chords(options[:chords])
|
122
|
-
end
|
123
|
-
Coltrane::Cli::Chord.new(*chords)
|
124
|
-
else
|
125
|
-
Coltrane::Cli::Scale.new(scale)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
p.command(:progression) do |c|
|
131
|
-
c.syntax 'progression <roman numeral notation> in <key> [--on <instrument>]'
|
132
|
-
c.description 'Gives you chords of a progression in a key. Ex: coltrane progression I-IV-iv-V in Am --on guitar'
|
133
|
-
c.option(*@instrument_option)
|
134
|
-
c.option(*@flavor_option)
|
135
|
-
c.option(*@sound_option)
|
136
|
-
c.action do |(prog, _, key), on: 'text', flavor: 'notes', sound: nil|
|
137
|
-
Coltrane::Cli.config do |c|
|
138
|
-
c.on = on.symbolize
|
139
|
-
c.flavor = flavor.symbolize
|
140
|
-
c.sound = sound
|
141
|
-
end
|
142
|
-
|
143
|
-
possible_method = prog.tr('-', '_')
|
144
|
-
progression = if Coltrane::Progression.respond_to?(possible_method)
|
145
|
-
Coltrane::Progression.send(possible_method, key)
|
146
|
-
else
|
147
|
-
Coltrane::Progression.new(prog, key: key)
|
148
|
-
end
|
149
|
-
|
150
|
-
Coltrane::Cli::Chord.new(*progression.chords)
|
151
|
-
end
|
24
|
+
Coltrane::Commands::Command.subclasses.each do |command|
|
25
|
+
command.mercenary_init(p)
|
152
26
|
end
|
153
27
|
|
154
|
-
p.command(:
|
155
|
-
c.
|
156
|
-
c.
|
157
|
-
|
158
|
-
progressions = Coltrane::Progression.find(*chord_notation.split('-'))
|
159
|
-
notation_width = progressions.map(&:notation).map(&:size).max
|
160
|
-
progressions.each do |progression|
|
161
|
-
puts "#{progression.notation.ljust(notation_width + 1, ' ')} in #{progression.scale} (#{progression.notes_out.size} notes out)"
|
162
|
-
end
|
28
|
+
p.command(:about) do |c|
|
29
|
+
c.description 'Shows this screen'
|
30
|
+
c.action do
|
31
|
+
puts p
|
163
32
|
end
|
164
33
|
end
|
165
34
|
|
166
|
-
p.
|
167
|
-
list.syntax 'list [scales, flavors, instruments (used in --on options), chord-qualities]'
|
168
|
-
list.description 'List information.'
|
169
|
-
list.action do |(arg)|
|
170
|
-
puts case arg
|
171
|
-
when 'scales' then Coltrane::Scale.known_scales
|
172
|
-
when 'flavors' then %w[marks notes intervals degrees]
|
173
|
-
when 'instruments' then %w[guitar bass ukulele piano text]
|
174
|
-
when 'chords', 'chord-qualities' then Coltrane::ChordQuality.intervals_per_name.keys.join(' ')
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
p.command(:'find-scale') do |c|
|
180
|
-
c.syntax 'find-scale --notes C-D-E-...] OR --chord Cmaj7-Db7'
|
181
|
-
c.description 'finds scales with the provided --notes or --chord'
|
182
|
-
c.option :notes, '--notes C-D-E', 'Find scales with those notes'
|
183
|
-
c.option :chords, '--chords Cmaj7-D11', 'find scales with those chords'
|
184
|
-
c.action do |(_arg), options|
|
185
|
-
options[:notes] = (options[:notes]).to_s.split('-')
|
186
|
-
options[:chords] = (options[:chords]).to_s.split('-')
|
187
|
-
Coltrane::Cli::Scale.find(**options)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
p.command(:'common-chords') do |c|
|
192
|
-
c.syntax 'common-chords <SCALE1 SCALE2 [SCALE3]>'
|
193
|
-
c.description 'Finds chords that are shared between the given scales'
|
194
|
-
c.option(*@instrument_option)
|
195
|
-
c.option(*@flavor_option)
|
196
|
-
c.action do |(*scale_strings), on: 'text', flavor: 'notes'|
|
197
|
-
raise 'Provide at least 2 scales' if scale_strings.size < 2
|
198
|
-
first_scale_str, *other_scales_strs = scale_strings
|
199
|
-
first_scale = Coltrane::Cli::Scale.parse(first_scale_str)
|
200
|
-
chords = other_scales_strs.reduce(first_scale.all_chords.map(&:name)) do |memo, scale_str|
|
201
|
-
scale = Coltrane::Cli::Scale.parse(scale_str)
|
202
|
-
memo & scale.all_chords.map(&:name)
|
203
|
-
end
|
204
|
-
raise 'No common chords were found' if chords.empty?
|
205
|
-
Coltrane::Cli::Chord.new(*chords)
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
p.command(:help) do |c|
|
210
|
-
c.description 'May give you some help.'
|
211
|
-
c.syntax 'help <command> [subcommand, sub-subcommand, ...]'
|
212
|
-
c.action do |(*command_path), _options|
|
213
|
-
if command_path.empty?
|
214
|
-
puts p
|
215
|
-
else
|
216
|
-
puts begin
|
217
|
-
command_path.reduce(p) do |memo, key|
|
218
|
-
memo.commands.delete(key.to_sym)
|
219
|
-
end || "\n Sorry, command found."
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
# p.command(:start) do |c|
|
226
|
-
# c.description 'Starts interactive mode'
|
227
|
-
# c.action do
|
228
|
-
# begin
|
229
|
-
# Coltrane::Cli.erase_config
|
230
|
-
# puts "\n"
|
231
|
-
# print Paint['coltrane ', '#F88550']
|
232
|
-
# cmd = gets.chomp
|
233
|
-
# return if %w[exit exit q quit stop].include?(cmd)
|
234
|
-
# puts "\n"
|
235
|
-
# p.go(cmd.split(' '))
|
236
|
-
# rescue Exception
|
237
|
-
# ensure
|
238
|
-
# p.instance_variable_set :'@config', {}
|
239
|
-
# end
|
240
|
-
# p.execute(['start'], {})
|
241
|
-
# end
|
242
|
-
# end
|
243
|
-
|
244
|
-
# p.default_command(:start)
|
35
|
+
p.default_command(:about)
|
245
36
|
end
|
246
37
|
|
247
|
-
# rubocop:enable Metrics/BlockLength
|
data/lib/coltrane.rb
CHANGED
@@ -1,58 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'coltrane/version'
|
4
|
+
|
3
5
|
require 'json'
|
4
6
|
require 'forwardable'
|
5
7
|
require 'core_ext'
|
6
8
|
require 'ostruct'
|
7
9
|
require 'dry-monads'
|
8
10
|
|
9
|
-
|
10
|
-
module Coltrane
|
11
|
-
autoload :Frequency, 'coltrane/frequency'
|
12
|
-
|
13
|
-
BASE_OCTAVE = 4
|
14
|
-
BASE_PITCH_INTEGER = 9
|
15
|
-
|
16
|
-
def self.tuning=(f)
|
17
|
-
@base_tuning = Frequency[f].octave(-4)
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.base_tuning
|
21
|
-
@base_tuning
|
22
|
-
end
|
23
|
-
|
24
|
-
@base_tuning = Frequency[440].octave(-4)
|
25
|
-
|
26
|
-
require 'coltrane/version'
|
27
|
-
require 'coltrane/errors'
|
28
|
-
|
29
|
-
autoload :Pitch, 'coltrane/pitch'
|
30
|
-
autoload :Voicing, 'coltrane/voicing'
|
31
|
-
|
32
|
-
autoload :PitchClass, 'coltrane/pitch_class'
|
33
|
-
autoload :Note, 'coltrane/note'
|
34
|
-
autoload :NoteSet, 'coltrane/note_set'
|
35
|
-
|
36
|
-
autoload :FrequencyInterval, 'coltrane/frequency_interval'
|
37
|
-
autoload :IntervalClass, 'coltrane/interval_class'
|
38
|
-
autoload :Interval, 'coltrane/interval'
|
39
|
-
autoload :UnorderedIntervalClass, 'coltrane/unordered_interval_class'
|
40
|
-
autoload :IntervalSequence, 'coltrane/interval_sequence'
|
41
|
-
autoload :Qualities, 'coltrane/qualities'
|
42
|
-
autoload :ChordQuality, 'coltrane/chord_quality'
|
43
|
-
autoload :Chord, 'coltrane/chord'
|
44
|
-
autoload :ChordSubstitutions, 'coltrane/chord_substitutions'
|
45
|
-
autoload :RomanChord, 'coltrane/roman_chord'
|
46
|
-
|
47
|
-
autoload :ClassicScales, 'coltrane/classic_scales'
|
48
|
-
autoload :Scale, 'coltrane/scale'
|
49
|
-
autoload :CircleOfFifths, 'coltrane/circle_of_fifths'
|
50
|
-
autoload :DiatonicScale, 'coltrane/diatonic_scale'
|
51
|
-
autoload :Key, 'coltrane/key'
|
52
|
-
|
53
|
-
autoload :NotableProgressions, 'coltrane/notable_progressions'
|
54
|
-
autoload :Changes, 'coltrane/changes'
|
55
|
-
autoload :Cadence, 'coltrane/cadence'
|
56
|
-
autoload :Progression, 'coltrane/progression'
|
57
|
-
autoload :Mode, 'coltrane/mode'
|
58
|
-
end
|
11
|
+
require 'coltrane/theory'
|