coltrane 0.0.2 → 1.0.0
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.
- checksums.yaml +5 -5
- data/.gitignore +2 -0
- data/.ruby-version +1 -0
- data/Gemfile +15 -10
- data/Gemfile.lock +47 -128
- data/README.md +30 -8
- data/Rakefile +0 -4
- data/bin/bundle +105 -0
- data/bin/byebug +29 -0
- data/bin/coderay +12 -0
- data/bin/coltrane +25 -7
- data/bin/htmldiff +12 -0
- data/bin/kill-pry-rescue +12 -0
- data/bin/ldiff +12 -0
- data/bin/pry +12 -0
- data/bin/rake +12 -0
- data/bin/rescue +12 -0
- data/bin/rspec +12 -0
- data/bin/rubocop +12 -0
- data/bin/ruby-parse +12 -0
- data/bin/ruby-rewrite +12 -0
- data/exe/coltrane +173 -0
- data/lib/cli/bass_guitar.rb +9 -0
- data/lib/cli/chord.rb +24 -0
- data/lib/cli/errors.rb +28 -0
- data/lib/cli/guitar.rb +55 -0
- data/lib/cli/notes.rb +18 -0
- data/lib/cli/piano.rb +54 -0
- data/lib/cli/representation.rb +47 -0
- data/lib/cli/scale.rb +48 -0
- data/lib/cli/text.rb +13 -0
- data/lib/cli/ukulele.rb +11 -0
- data/lib/coltrane-cli.rb +12 -0
- data/lib/coltrane.rb +16 -31
- data/lib/coltrane/cache.rb +34 -0
- data/lib/coltrane/chord.rb +28 -41
- data/lib/coltrane/chord_quality.rb +14 -39
- data/lib/coltrane/classic_progressions.rb +37 -0
- data/lib/coltrane/classic_scales.rb +92 -118
- data/lib/coltrane/errors.rb +54 -0
- data/lib/coltrane/interval.rb +25 -17
- data/lib/coltrane/interval_sequence.rb +57 -27
- data/lib/coltrane/note.rb +44 -30
- data/lib/coltrane/note_set.rb +37 -22
- data/lib/coltrane/piano_representation.rb +0 -58
- data/lib/coltrane/pitch.rb +12 -3
- data/lib/coltrane/progression.rb +31 -0
- data/lib/coltrane/qualities.rb +115 -114
- data/lib/coltrane/roman_chord.rb +36 -0
- data/lib/coltrane/scale.rb +85 -77
- data/lib/coltrane/version.rb +1 -1
- data/lib/core_ext.rb +12 -0
- data/pkg/coltrane-0.0.2.gem +0 -0
- metadata +27 -14
- data/lib/coltrane/essential_guitar_chords.rb +0 -82
- data/lib/coltrane/fret_set.rb +0 -0
- data/lib/coltrane/guitar.rb +0 -15
- data/lib/coltrane/guitar_chord.rb +0 -50
- data/lib/coltrane/guitar_chord_finder.rb +0 -98
- data/lib/coltrane/guitar_note.rb +0 -50
- data/lib/coltrane/guitar_note_set.rb +0 -61
- data/lib/coltrane/guitar_representation.rb +0 -96
- data/lib/coltrane/guitar_string.rb +0 -52
- data/lib/coltrane/scale_cache.rb +0 -4
data/bin/coderay
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/coltrane
CHANGED
@@ -1,11 +1,29 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'coltrane' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
7
10
|
|
8
|
-
require
|
9
|
-
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
10
14
|
|
11
|
-
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("coltrane", "coltrane")
|
data/bin/htmldiff
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/kill-pry-rescue
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/ldiff
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/pry
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/rake
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/rescue
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/rspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/rubocop
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/ruby-parse
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/bin/ruby-rewrite
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -11,6 +12,17 @@ require "pathname"
|
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
13
|
Pathname.new(__FILE__).realpath)
|
13
14
|
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
require "rubygems"
|
15
27
|
require "bundler/setup"
|
16
28
|
|
data/exe/coltrane
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler'
|
4
|
+
require 'pry'
|
5
|
+
|
6
|
+
Bundler.require(:cli)
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
9
|
+
|
10
|
+
require 'core_ext'
|
11
|
+
require 'coltrane'
|
12
|
+
require 'coltrane-cli'
|
13
|
+
|
14
|
+
full_color_terminals = %w[iTerm.app]
|
15
|
+
safe_mode_terminals = %w[Unsupported]
|
16
|
+
|
17
|
+
if full_color_terminals.include?(ENV['TERM_PROGRAM'])
|
18
|
+
Paint.mode = 0xFFFFFF
|
19
|
+
elsif safe_mode_terminals.include?(ENV['TERM_PROGRAM'])
|
20
|
+
Paint.mode = 0
|
21
|
+
end
|
22
|
+
|
23
|
+
Mercenary.program(:Coltrane) do |p|
|
24
|
+
p.version Coltrane::VERSION
|
25
|
+
p.description <<~DESC
|
26
|
+
A music querying interface
|
27
|
+
by Pedro Maciel (pedro@pedromaciel.com)
|
28
|
+
|
29
|
+
[ check the repo for more details (github.com/pedrozath/coltrane) ]
|
30
|
+
DESC
|
31
|
+
p.syntax 'coltrane <subcommand> [options]'
|
32
|
+
|
33
|
+
@instrument_option = [
|
34
|
+
:on,
|
35
|
+
'--on guitar INSTRUMENT',
|
36
|
+
'Shows the notes on the given instrument/representation type. Can be piano, guitar, ukulele, bass or text'
|
37
|
+
]
|
38
|
+
|
39
|
+
@flavor_option = [
|
40
|
+
:flavor,
|
41
|
+
'--flavor FLAVOR',
|
42
|
+
'Chooses which <additional></additional> information to display: marks, notes, intervals or degrees'
|
43
|
+
]
|
44
|
+
|
45
|
+
p.command(:notes) do |c|
|
46
|
+
c.syntax 'notes <notes separated by space> [--on <instrument>]'
|
47
|
+
c.description 'Shows the given notes.'
|
48
|
+
c.option(*@instrument_option)
|
49
|
+
c.option(*@flavor_option)
|
50
|
+
c.action do |(notes), on: 'text', flavor: 'notes'|
|
51
|
+
raise 'Provide some notes. Ex: coltrane notes C-D-Gb' if notes.empty?
|
52
|
+
notes = Coltrane::NoteSet[*notes.split('-')]
|
53
|
+
Coltrane::Cli::Notes.new(notes, on: on, flavor: flavor)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
p.command(:chord) do |c|
|
58
|
+
c.syntax 'chord <chord-name> [--on <instrument>]'
|
59
|
+
c.description 'Shows the given chord. Ex: coltrane chord Cmaj7 --on piano'
|
60
|
+
c.option(*@instrument_option)
|
61
|
+
c.option(*@flavor_option)
|
62
|
+
c.option :notes, '--notes C-D-E', 'finds chords with those notes, provided they are separated by dashes'
|
63
|
+
c.action do |(chords), notes: nil, on: 'text', flavor: 'notes'|
|
64
|
+
chords = chords&.split('-')
|
65
|
+
Coltrane::Cli::Chord.new(*chords, notes: notes&.split('-'), on: on, flavor: flavor)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
p.command(:scale) do |c|
|
70
|
+
c.syntax 'scale <name of scale>-<root note> [--on <instrument>]'
|
71
|
+
c.description 'Gives you information about a scale. Ex: coltrane scale natural-minor-Db --on guitar'
|
72
|
+
c.option(*@instrument_option)
|
73
|
+
c.option(*@flavor_option)
|
74
|
+
c.option :triads, '--triads', 'Outputs triads from the scale'
|
75
|
+
c.option :sevenths, '--sevenths', 'Outputs seventh chords from the scale'
|
76
|
+
c.option :pentads, '--pentads', 'Outputs pentad chords from the scale'
|
77
|
+
c.option :tertians, '--tertians SIZE', 'Outputs all tertian chords from the given size from the scale'
|
78
|
+
c.option :chords, '--chords [SIZE]', 'Outputs all chords from given size from the scale. Leave size empty to retrieve all'
|
79
|
+
c.action do |(scale_str), flavor:'degrees', on:'text', **options|
|
80
|
+
scale = Coltrane::Cli::Scale.parse(scale_str)
|
81
|
+
keyword_args = {flavor: flavor, on: on }
|
82
|
+
if options.include?(:triads)
|
83
|
+
chords = scale.triads
|
84
|
+
Coltrane::Cli::Chord.new(*chords, **keyword_args)
|
85
|
+
elsif options.include?(:sevenths)
|
86
|
+
chords = scale.sevenths
|
87
|
+
Coltrane::Cli::Chord.new(*chords, **keyword_args)
|
88
|
+
elsif options.include?(:pentads)
|
89
|
+
chords = scale.pentads
|
90
|
+
Coltrane::Cli::Chord.new(*chords, **keyword_args)
|
91
|
+
elsif options.include?(:tertians)
|
92
|
+
chords = scale.tertians(options[:tertians].to_i)
|
93
|
+
Coltrane::Cli::Chord.new(*chords, **keyword_args)
|
94
|
+
elsif options.include?(:chords)
|
95
|
+
if options[:chords].nil?
|
96
|
+
chords = scale.all_chords
|
97
|
+
else
|
98
|
+
chords = scale.chords(options[:chords])
|
99
|
+
end
|
100
|
+
Coltrane::Cli::Chord.new(*chords, **keyword_args)
|
101
|
+
else
|
102
|
+
Coltrane::Cli::Scale.new(scale, **keyword_args)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
p.command(:list) do |list|
|
108
|
+
list.syntax 'list [scales, flavors, instruments (used in --on options), chord-qualities]'
|
109
|
+
list.description 'List information.'
|
110
|
+
list.action do |(arg)|
|
111
|
+
puts case arg
|
112
|
+
when 'scales' then Coltrane::Scale.known_scales
|
113
|
+
when 'flavors' then %w[marks notes intervals degrees]
|
114
|
+
when 'instruments' then %w[guitar bass ukulele piano text]
|
115
|
+
when 'chords', 'chord-qualities' then Coltrane::Qualities::CHORD_QUALITIES.keys.sort.join(' ')
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
p.command(:'find-scale') do |c|
|
121
|
+
c.syntax 'find-scale --notes C-D-E-...] OR --chord Cmaj7-Db7'
|
122
|
+
c.description 'finds scales with the provided --notes or --chord'
|
123
|
+
c.option :notes, '--notes C-D-E', 'Find scales with those notes'
|
124
|
+
c.option :chords, '--chords Cmaj7-D11', 'find scales with those chords'
|
125
|
+
c.action do |(arg), options|
|
126
|
+
options[:notes] = "#{options[:notes]}".split('-')
|
127
|
+
options[:chords] = "#{options[:chords]}".split('-')
|
128
|
+
Coltrane::Cli::Scale.find(**options)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
p.command(:'common-chords') do |c|
|
133
|
+
c.syntax 'common-chords <SCALE1 SCALE2 [SCALE3]>'
|
134
|
+
c.description 'Finds chords that are shared between the given scales'
|
135
|
+
c.option(*@instrument_option)
|
136
|
+
c.option(*@flavor_option)
|
137
|
+
c.action do |(*scale_strings), on: 'text', flavor: 'notes'|
|
138
|
+
raise 'Provide at least 2 scales' if scale_strings.size < 2
|
139
|
+
first_scale_str, *other_scales_strs = scale_strings
|
140
|
+
first_scale = Coltrane::Cli::Scale.parse(first_scale_str)
|
141
|
+
chords = other_scales_strs.reduce(first_scale.all_chords.map(&:name)) do |memo, scale_str|
|
142
|
+
scale = Coltrane::Cli::Scale.parse(scale_str)
|
143
|
+
memo & scale.all_chords.map(&:name)
|
144
|
+
end
|
145
|
+
raise 'No common chords were found' if chords.empty?
|
146
|
+
Coltrane::Cli::Chord.new(*chords, on: on, flavor: flavor)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
p.command(:help) do |c|
|
151
|
+
c.description 'May give you some help.'
|
152
|
+
c.syntax 'help <command> [subcommand, sub-subcommand, ...]'
|
153
|
+
c.action do |(*command_path), options|
|
154
|
+
if command_path.empty?
|
155
|
+
puts p
|
156
|
+
return
|
157
|
+
else
|
158
|
+
puts (command_path.reduce(p) do |memo, key|
|
159
|
+
memo.commands.delete(key.to_sym)
|
160
|
+
end || "\n Sorry, command found.")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
p.command(:about) do |c|
|
166
|
+
c.description 'Shows this screen'
|
167
|
+
c.action do
|
168
|
+
puts p
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
p.default_command(:about)
|
173
|
+
end
|