coltrane 1.2.4 → 2.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 +4 -4
- data/CHANGELOG.md +14 -1
- data/Gemfile +3 -0
- data/Gemfile.lock +48 -3
- data/Rakefile +1 -1
- data/bin/erubis +12 -0
- data/bin/flay +29 -0
- data/bin/gitlab +29 -0
- data/bin/httparty +29 -0
- data/bin/pronto +29 -0
- data/bin/ruby_parse +29 -0
- data/bin/ruby_parse_extract_error +29 -0
- data/bin/thor +12 -0
- data/exe/coltrane +8 -6
- data/lib/cli/guitar.rb +7 -7
- data/lib/cli/representation.rb +1 -1
- data/lib/coltrane.rb +22 -1
- data/lib/coltrane/cadence.rb +0 -1
- data/lib/coltrane/changes.rb +5 -7
- data/lib/coltrane/chord.rb +7 -7
- data/lib/coltrane/chord_quality.rb +17 -17
- data/lib/coltrane/chord_substitutions.rb +3 -1
- data/lib/coltrane/classic_scales.rb +7 -7
- data/lib/coltrane/errors.rb +26 -1
- data/lib/coltrane/frequency.rb +50 -0
- data/lib/coltrane/interval.rb +23 -86
- data/lib/coltrane/interval_class.rb +106 -0
- data/lib/coltrane/interval_sequence.rb +14 -13
- data/lib/coltrane/notable_progressions.rb +8 -3
- data/lib/coltrane/note.rb +44 -73
- data/lib/coltrane/note_set.rb +4 -4
- data/lib/coltrane/pitch.rb +43 -22
- data/lib/coltrane/pitch_class.rb +113 -0
- data/lib/coltrane/progression.rb +6 -9
- data/lib/coltrane/roman_chord.rb +14 -14
- data/lib/coltrane/scale.rb +8 -10
- data/lib/coltrane/unordered_interval_class.rb +7 -0
- data/lib/coltrane/version.rb +1 -1
- data/lib/coltrane_instruments.rb +4 -0
- data/lib/coltrane_instruments/guitar.rb +7 -0
- data/lib/coltrane_instruments/guitar/base.rb +14 -0
- data/lib/coltrane_instruments/guitar/chord.rb +41 -0
- data/lib/coltrane_instruments/guitar/note.rb +8 -0
- data/lib/coltrane_instruments/guitar/string.rb +8 -0
- data/lib/core_ext.rb +16 -27
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80404f5ec9c45b649eae4fb0dd47bbb5b9349ca344a8d72b06561f689f9d9c56
|
4
|
+
data.tar.gz: 9e733b52b1f1d4466849fa5ef724ad4947ab93b1b60dee01475e3f9abeac043f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87cab0e8294560a0185b9d2d960d36690208112b775b36002381e98bf5a93c2e6e215c00332dc0f7fd55b17dbda6a268c4069951237732b4b44dd53c2f517bbb
|
7
|
+
data.tar.gz: e3b5c7fdb14798100386449aab19bbf34442247bda37364df7601ddcf6d2196234876c0e7f27dd2af435bcd8453d1fdd24ed2e928ae2607088eebfbed1fa237c
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,20 @@
|
|
2
2
|
|
3
3
|
## [Unreleased]
|
4
4
|
- Correct Flat/Sharp on scales
|
5
|
-
|
5
|
+
|
6
|
+
## [2.0.0]
|
7
|
+
|
8
|
+
### Changes
|
9
|
+
|
10
|
+
- Code has been completely refactored. Things are organized around frequencies.
|
11
|
+
Intervals are backed by cents, which is an logarithmic measure used to measure
|
12
|
+
the distance between 2 frequencies.
|
13
|
+
|
14
|
+
We have now a distinction between PitchClass and Note. The first is a generic
|
15
|
+
concept of Notes while the latter deals with sharps and flats logic.
|
16
|
+
|
17
|
+
That refactor will allow us to in the next versions refactor scales so that
|
18
|
+
they output proper sharps and flats (https://github.com/pedrozath/coltrane/issues/3).
|
6
19
|
|
7
20
|
## [1.2.3]
|
8
21
|
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,31 +1,62 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
coltrane (1.
|
4
|
+
coltrane (1.2.4)
|
5
5
|
color (~> 1.8)
|
6
6
|
facets (~> 3.1)
|
7
|
-
mercenary (~> 0.3)
|
8
7
|
paint (~> 2.0)
|
8
|
+
pedrozath-mercenary (~> 0.3)
|
9
9
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
+
addressable (2.5.2)
|
14
|
+
public_suffix (>= 2.0.2, < 4.0)
|
13
15
|
ast (2.3.0)
|
14
16
|
byebug (9.1.0)
|
15
17
|
coderay (1.1.2)
|
16
18
|
color (1.8)
|
17
19
|
diff-lcs (1.3)
|
18
20
|
docile (1.1.5)
|
21
|
+
erubis (2.7.0)
|
19
22
|
facets (3.1.0)
|
23
|
+
faraday (0.14.0)
|
24
|
+
multipart-post (>= 1.2, < 3)
|
25
|
+
flay (2.10.0)
|
26
|
+
erubis (~> 2.7.0)
|
27
|
+
path_expander (~> 1.0)
|
28
|
+
ruby_parser (~> 3.0)
|
29
|
+
sexp_processor (~> 4.0)
|
30
|
+
gitlab (3.6.1)
|
31
|
+
httparty
|
32
|
+
terminal-table
|
33
|
+
httparty (0.16.0)
|
34
|
+
multi_xml (>= 0.5.2)
|
20
35
|
interception (0.5)
|
21
36
|
json (2.1.0)
|
22
|
-
mercenary (0.3.6)
|
23
37
|
method_source (0.9.0)
|
38
|
+
multi_xml (0.6.0)
|
39
|
+
multipart-post (2.0.0)
|
40
|
+
octokit (4.8.0)
|
41
|
+
sawyer (~> 0.8.0, >= 0.5.3)
|
24
42
|
paint (2.0.1)
|
25
43
|
parallel (1.12.1)
|
26
44
|
parser (2.4.0.2)
|
27
45
|
ast (~> 2.3)
|
46
|
+
path_expander (1.0.2)
|
47
|
+
pedrozath-mercenary (0.3.6)
|
28
48
|
powerpack (0.1.1)
|
49
|
+
pronto (0.6.0)
|
50
|
+
gitlab (~> 3.6, >= 3.4.0)
|
51
|
+
octokit (~> 4.3, >= 4.1.0)
|
52
|
+
rugged (~> 0.24, >= 0.23.0)
|
53
|
+
thor (~> 0.19.0)
|
54
|
+
pronto-flay (0.6.2)
|
55
|
+
flay (~> 2.8)
|
56
|
+
pronto (~> 0.6.0)
|
57
|
+
pronto-rubocop (0.6.2)
|
58
|
+
pronto (~> 0.6.0)
|
59
|
+
rubocop (~> 0.38, >= 0.35.0)
|
29
60
|
pry (0.11.3)
|
30
61
|
coderay (~> 1.1.0)
|
31
62
|
method_source (~> 0.9.0)
|
@@ -35,6 +66,7 @@ GEM
|
|
35
66
|
pry-rescue (1.4.5)
|
36
67
|
interception (>= 0.5)
|
37
68
|
pry
|
69
|
+
public_suffix (3.0.2)
|
38
70
|
rainbow (3.0.0)
|
39
71
|
rake (10.5.0)
|
40
72
|
rspec (3.7.0)
|
@@ -58,11 +90,21 @@ GEM
|
|
58
90
|
ruby-progressbar (~> 1.7)
|
59
91
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
60
92
|
ruby-progressbar (1.9.0)
|
93
|
+
ruby_parser (3.11.0)
|
94
|
+
sexp_processor (~> 4.9)
|
95
|
+
rugged (0.26.0)
|
96
|
+
sawyer (0.8.1)
|
97
|
+
addressable (>= 2.3.5, < 2.6)
|
98
|
+
faraday (~> 0.8, < 1.0)
|
99
|
+
sexp_processor (4.10.1)
|
61
100
|
simplecov (0.15.1)
|
62
101
|
docile (~> 1.1.0)
|
63
102
|
json (>= 1.8, < 3)
|
64
103
|
simplecov-html (~> 0.10.0)
|
65
104
|
simplecov-html (0.10.2)
|
105
|
+
terminal-table (1.8.0)
|
106
|
+
unicode-display_width (~> 1.1, >= 1.1.1)
|
107
|
+
thor (0.19.4)
|
66
108
|
unicode-display_width (1.3.0)
|
67
109
|
|
68
110
|
PLATFORMS
|
@@ -71,6 +113,9 @@ PLATFORMS
|
|
71
113
|
DEPENDENCIES
|
72
114
|
bundler (~> 1.14)
|
73
115
|
coltrane!
|
116
|
+
pronto
|
117
|
+
pronto-flay
|
118
|
+
pronto-rubocop
|
74
119
|
pry
|
75
120
|
pry-byebug
|
76
121
|
pry-rescue
|
data/Rakefile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
1
|
+
# require "bundler/gem_tasks"
|
2
2
|
task :default => :spec
|
data/bin/erubis
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/flay
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'flay' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
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
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("flay", "flay")
|
data/bin/gitlab
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'gitlab' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
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
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("gitlab", "gitlab")
|
data/bin/httparty
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'httparty' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
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
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("httparty", "httparty")
|
data/bin/pronto
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'pronto' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
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
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("pronto", "pronto")
|
data/bin/ruby_parse
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'ruby_parse' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
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
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("ruby_parser", "ruby_parse")
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'ruby_parse_extract_error' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
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
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("ruby_parser", "ruby_parse_extract_error")
|
data/bin/thor
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
CHANGED
@@ -40,7 +40,8 @@ Mercenary.program(:Coltrane) do |p|
|
|
40
40
|
'Chooses which <additional></additional> information to display: marks, notes, intervals or degrees'
|
41
41
|
]
|
42
42
|
|
43
|
-
p.command(:
|
43
|
+
p.command(:note) do |c|
|
44
|
+
c.alias(:notes)
|
44
45
|
c.syntax 'notes <notes separated by space> [--on <instrument>]'
|
45
46
|
c.description 'Shows the given notes.'
|
46
47
|
c.option(*@instrument_option)
|
@@ -53,6 +54,7 @@ Mercenary.program(:Coltrane) do |p|
|
|
53
54
|
end
|
54
55
|
|
55
56
|
p.command(:chord) do |c|
|
57
|
+
c.alias(:chords)
|
56
58
|
c.syntax 'chord <chord-name> [--on <instrument>]'
|
57
59
|
c.description 'Shows the given chord. Ex: coltrane chord Cmaj7 --on piano'
|
58
60
|
c.option(*@instrument_option)
|
@@ -108,9 +110,9 @@ Mercenary.program(:Coltrane) do |p|
|
|
108
110
|
c.option(*@instrument_option)
|
109
111
|
c.option(*@flavor_option)
|
110
112
|
c.action do |(prog, _, key), on: 'text', flavor: 'notes'|
|
111
|
-
possible_method = prog.
|
113
|
+
possible_method = prog.tr('-', '_')
|
112
114
|
progression = if Coltrane::Progression.respond_to?(possible_method)
|
113
|
-
Coltrane::Progression.send(possible_method,
|
115
|
+
Coltrane::Progression.send(possible_method, key)
|
114
116
|
else
|
115
117
|
Coltrane::Progression.new(prog, key: key)
|
116
118
|
end
|
@@ -126,7 +128,7 @@ Mercenary.program(:Coltrane) do |p|
|
|
126
128
|
progressions = Coltrane::Progression.find(*chord_notation.split('-'))
|
127
129
|
notation_width = progressions.map(&:notation).map(&:size).max
|
128
130
|
progressions.each do |progression|
|
129
|
-
puts "#{progression.notation.ljust(notation_width+1,' ')} in #{progression.scale} (#{progression.notes_out.size} notes out)"
|
131
|
+
puts "#{progression.notation.ljust(notation_width + 1, ' ')} in #{progression.scale} (#{progression.notes_out.size} notes out)"
|
130
132
|
end
|
131
133
|
end
|
132
134
|
end
|
@@ -139,7 +141,7 @@ Mercenary.program(:Coltrane) do |p|
|
|
139
141
|
when 'scales' then Coltrane::Scale.known_scales
|
140
142
|
when 'flavors' then %w[marks notes intervals degrees]
|
141
143
|
when 'instruments' then %w[guitar bass ukulele piano text]
|
142
|
-
when 'chords', 'chord-qualities' then Coltrane::
|
144
|
+
when 'chords', 'chord-qualities' then Coltrane::ChordQuality.intervals_per_name.keys.join(' ')
|
143
145
|
end
|
144
146
|
end
|
145
147
|
end
|
@@ -197,7 +199,7 @@ Mercenary.program(:Coltrane) do |p|
|
|
197
199
|
puts "\n"
|
198
200
|
print Paint['coltrane ', '#F88550']
|
199
201
|
cmd = gets.chomp
|
200
|
-
return if [
|
202
|
+
return if %w[exit exit q quit stop].include?(cmd)
|
201
203
|
puts "\n"
|
202
204
|
p.go(cmd.split(' '))
|
203
205
|
rescue Exception
|