coltrane 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -1
  3. data/Gemfile +1 -0
  4. data/Gemfile.lock +21 -3
  5. data/README.md +0 -7
  6. data/Rakefile +5 -0
  7. data/bin/console +2 -0
  8. data/bin/opal +29 -0
  9. data/bin/opal-build +29 -0
  10. data/bin/opal-mspec +29 -0
  11. data/bin/opal-repl +29 -0
  12. data/bin/rackup +12 -0
  13. data/bin/sprockets +12 -0
  14. data/bin/tilt +12 -0
  15. data/coltrane.gemspec +1 -1
  16. data/config.ru +10 -0
  17. data/exe/coltrane +44 -13
  18. data/lib/cli.rb +7 -1
  19. data/lib/cli/bass_guitar.rb +1 -1
  20. data/lib/cli/chord.rb +11 -4
  21. data/lib/cli/config.rb +38 -0
  22. data/lib/cli/guitar.rb +8 -10
  23. data/lib/cli/guitar_chords.rb +122 -0
  24. data/lib/cli/notes.rb +3 -4
  25. data/lib/cli/piano.rb +1 -1
  26. data/lib/cli/representation.rb +6 -12
  27. data/lib/cli/scale.rb +4 -4
  28. data/lib/cli/text.rb +1 -1
  29. data/lib/cli/ukulele.rb +1 -1
  30. data/lib/coltrane.rb +35 -32
  31. data/lib/coltrane/chord_quality.rb +4 -3
  32. data/lib/coltrane/circle_of_fifths.rb +29 -0
  33. data/lib/coltrane/classic_scales.rb +36 -43
  34. data/lib/coltrane/diatonic_scale.rb +34 -0
  35. data/lib/coltrane/frequency.rb +1 -1
  36. data/lib/coltrane/interval.rb +14 -0
  37. data/lib/coltrane/interval_class.rb +6 -0
  38. data/lib/coltrane/interval_sequence.rb +0 -1
  39. data/lib/coltrane/key.rb +14 -0
  40. data/lib/coltrane/note.rb +37 -2
  41. data/lib/coltrane/note_set.rb +23 -2
  42. data/lib/coltrane/pitch.rb +65 -31
  43. data/lib/coltrane/pitch_class.rb +25 -12
  44. data/lib/coltrane/progression.rb +2 -2
  45. data/lib/coltrane/qualities.rb +257 -0
  46. data/lib/coltrane/roman_chord.rb +10 -10
  47. data/lib/coltrane/scale.rb +9 -3
  48. data/lib/coltrane/version.rb +1 -1
  49. data/lib/coltrane/voicing.rb +38 -0
  50. data/lib/coltrane_game/question.rb +6 -0
  51. data/lib/coltrane_instruments.rb +3 -0
  52. data/lib/coltrane_instruments/guitar.rb +5 -2
  53. data/lib/coltrane_instruments/guitar/base.rb +18 -3
  54. data/lib/coltrane_instruments/guitar/chord.rb +139 -12
  55. data/lib/coltrane_instruments/guitar/note.rb +16 -0
  56. data/lib/coltrane_instruments/guitar/string.rb +21 -0
  57. data/lib/coltrane_synth.rb +7 -0
  58. data/lib/coltrane_synth/base.rb +47 -0
  59. data/lib/coltrane_synth/synth.rb +24 -0
  60. data/lib/core_ext.rb +25 -7
  61. data/lib/os.rb +19 -0
  62. metadata +24 -9
  63. data/dist/coltrane +0 -0
  64. data/lib/coltrane/piano_representation.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80404f5ec9c45b649eae4fb0dd47bbb5b9349ca344a8d72b06561f689f9d9c56
4
- data.tar.gz: 9e733b52b1f1d4466849fa5ef724ad4947ab93b1b60dee01475e3f9abeac043f
3
+ metadata.gz: aee4f6c4975a8d1c27e1c7d8b55bc89d58a73e65e93f9df8831cfbb68f0da689
4
+ data.tar.gz: 3345417f778a55d64dc1d7bdf9348fdb98d7b60c9eb6eb1f8a8969ae6933e7ca
5
5
  SHA512:
6
- metadata.gz: 87cab0e8294560a0185b9d2d960d36690208112b775b36002381e98bf5a93c2e6e215c00332dc0f7fd55b17dbda6a268c4069951237732b4b44dd53c2f517bbb
7
- data.tar.gz: e3b5c7fdb14798100386449aab19bbf34442247bda37364df7601ddcf6d2196234876c0e7f27dd2af435bcd8453d1fdd24ed2e928ae2607088eebfbed1fa237c
6
+ metadata.gz: 2c41d660a8d4d4d877a1614030196cca1c2f7b8b823795a259378b962e3f9dc5e22fbaa32086ff0d4cc830b7aa81ec7783c4e242552c94ee5bc069499bd055c5
7
+ data.tar.gz: d0658a0f30b263a19f7d2f190ed4ac17906e80ee9a2c99c87f18c407bd2e2f60db5adaac96705271d761dd7b3602242cd4bf690307b4d379d3dfa2fdebfdda6f
data/CHANGELOG.md CHANGED
@@ -1,7 +1,33 @@
1
1
  # Changelog
2
2
 
3
3
  ## [Unreleased]
4
- - Correct Flat/Sharp on scales
4
+
5
+ - Fix chords so that they generate a barre and a non-barre version and prevent
6
+ barre chords from picking notes before the barre.
7
+
8
+ ## [2.1.0]
9
+
10
+ - Correct Flat/Sharp on Diatonic Scales
11
+
12
+ - Fix chords so that they generate a barre and a non-barre version and prevent
13
+ barre chords from picking notes before the barre.
14
+
15
+ ### Adds
16
+
17
+ - Pitches and Voicings. Pitches are a way of expressing notes in a specific
18
+ octave. Voicings are a way of expressing a chord with the exact pitches
19
+
20
+ - Introduces a little sound synthesizer (experimental, macOS-only).
21
+ Use `--sound` to activate it wherever the program outputs chords.
22
+
23
+ - Introduces some modules classes to provide Guitar Chord finding.
24
+ `ColtraneInstruments::Guitar::Base.find('C6/9')`
25
+
26
+ - Introduces DiatonicScale and Key classes.
27
+
28
+ ### Changes
29
+
30
+ - Guitar Chords are now outputted using the default guitar chord notation
5
31
 
6
32
  ## [2.0.0]
7
33
 
data/Gemfile CHANGED
@@ -9,6 +9,7 @@ group :test, :development do
9
9
  gem 'pronto'
10
10
  gem 'pronto-flay'
11
11
  gem 'pronto-rubocop'
12
+ gem 'opal-rspec'
12
13
  end
13
14
 
14
15
  group :test do
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- coltrane (1.2.4)
4
+ coltrane (2.1.0)
5
5
  color (~> 1.8)
6
- facets (~> 3.1)
6
+ coreaudio
7
7
  paint (~> 2.0)
8
8
  pedrozath-mercenary (~> 0.3)
9
9
 
@@ -16,10 +16,12 @@ GEM
16
16
  byebug (9.1.0)
17
17
  coderay (1.1.2)
18
18
  color (1.8)
19
+ concurrent-ruby (1.0.5)
20
+ coreaudio (0.0.12)
21
+ narray (~> 0.6.0.0)
19
22
  diff-lcs (1.3)
20
23
  docile (1.1.5)
21
24
  erubis (2.7.0)
22
- facets (3.1.0)
23
25
  faraday (0.14.0)
24
26
  multipart-post (>= 1.2, < 3)
25
27
  flay (2.10.0)
@@ -30,6 +32,7 @@ GEM
30
32
  gitlab (3.6.1)
31
33
  httparty
32
34
  terminal-table
35
+ hike (1.2.3)
33
36
  httparty (0.16.0)
34
37
  multi_xml (>= 0.5.2)
35
38
  interception (0.5)
@@ -37,8 +40,16 @@ GEM
37
40
  method_source (0.9.0)
38
41
  multi_xml (0.6.0)
39
42
  multipart-post (2.0.0)
43
+ narray (0.6.0.9)
40
44
  octokit (4.8.0)
41
45
  sawyer (~> 0.8.0, >= 0.5.3)
46
+ opal (0.10.5)
47
+ hike (~> 1.2)
48
+ sourcemap (~> 0.1.0)
49
+ sprockets (~> 3.1)
50
+ tilt (>= 1.4)
51
+ opal-rspec (0.6.1)
52
+ opal (>= 0.10.0, < 0.12)
42
53
  paint (2.0.1)
43
54
  parallel (1.12.1)
44
55
  parser (2.4.0.2)
@@ -67,6 +78,7 @@ GEM
67
78
  interception (>= 0.5)
68
79
  pry
69
80
  public_suffix (3.0.2)
81
+ rack (2.0.4)
70
82
  rainbow (3.0.0)
71
83
  rake (10.5.0)
72
84
  rspec (3.7.0)
@@ -102,9 +114,14 @@ GEM
102
114
  json (>= 1.8, < 3)
103
115
  simplecov-html (~> 0.10.0)
104
116
  simplecov-html (0.10.2)
117
+ sourcemap (0.1.1)
118
+ sprockets (3.7.1)
119
+ concurrent-ruby (~> 1.0)
120
+ rack (> 1, < 3)
105
121
  terminal-table (1.8.0)
106
122
  unicode-display_width (~> 1.1, >= 1.1.1)
107
123
  thor (0.19.4)
124
+ tilt (2.0.8)
108
125
  unicode-display_width (1.3.0)
109
126
 
110
127
  PLATFORMS
@@ -113,6 +130,7 @@ PLATFORMS
113
130
  DEPENDENCIES
114
131
  bundler (~> 1.14)
115
132
  coltrane!
133
+ opal-rspec
116
134
  pronto
117
135
  pronto-flay
118
136
  pronto-rubocop
data/README.md CHANGED
@@ -15,13 +15,6 @@ https://gitter.im/coltrane-music/Lobby
15
15
 
16
16
  ### Installation
17
17
 
18
- #### Compiled binary
19
-
20
- There's an experimental compiled version you can [download here](https://raw.githubusercontent.com/pedrozath/coltrane/master/dist/coltrane). It has been tested only macOS High Sierra so far, but it should work on Linux and Windows as well.
21
-
22
- macOS & Linux: You probably will need `chmod +x coltrane` before running it.
23
- Windows users: Please add the `.exe` extension to it before running it (via command prompt).
24
-
25
18
  #### Ruby command
26
19
 
27
20
  ```bash
data/Rakefile CHANGED
@@ -1,2 +1,7 @@
1
1
  # require "bundler/gem_tasks"
2
2
  task :default => :spec
3
+
4
+ require 'opal/rspec/rake_task'
5
+ Opal::RSpec::RakeTask.new(:opal_specs) do |server, task|
6
+ task.pattern = 'spec/{coltrane_instruments,lib}/**/*_spec.rb'
7
+ end
data/bin/console CHANGED
@@ -3,6 +3,8 @@ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
3
3
 
4
4
  require "bundler/setup"
5
5
  require "coltrane"
6
+ require "coltrane_instruments"
7
+ require "coltrane_synth"
6
8
 
7
9
  require "pry"
8
10
 
data/bin/opal 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 'opal' 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("opal", "opal")
data/bin/opal-build 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 'opal-build' 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("opal", "opal-build")
data/bin/opal-mspec 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 'opal-mspec' 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("opal", "opal-mspec")
data/bin/opal-repl 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 'opal-repl' 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("opal", "opal-repl")
data/bin/rackup 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/sprockets 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/tilt 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/coltrane.gemspec CHANGED
@@ -32,7 +32,7 @@ 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 'facets', '~> 3.1'
35
+ spec.add_runtime_dependency 'coreaudio'
36
36
  spec.add_runtime_dependency 'paint', '~> 2.0'
37
37
  spec.add_runtime_dependency 'color', '~> 1.8'
38
38
  spec.add_runtime_dependency 'pedrozath-mercenary', '~> 0.3'
data/config.ru ADDED
@@ -0,0 +1,10 @@
1
+ require 'opal/rspec'
2
+
3
+ # or use Opal::RSpec::SprocketsEnvironment.new(spec_pattern='spec/opal/**/*_spec.{rb,opal}') to customize the pattern
4
+ sprockets_env = Opal::RSpec::SprocketsEnvironment.new
5
+ run Opal::Server.new(sprockets: sprockets_env) { |s|
6
+ s.main = 'opal/rspec/sprockets_runner'
7
+ sprockets_env.spec_exclude_pattern = 'spec/exe/**/*_spec.rb'
8
+ sprockets_env.add_spec_paths_to_sprockets
9
+ s.debug = true
10
+ }
data/exe/coltrane CHANGED
@@ -5,8 +5,6 @@
5
5
 
6
6
  $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
7
7
 
8
- require 'core_ext'
9
- require 'coltrane'
10
8
  require 'cli'
11
9
 
12
10
  full_color_terminals = %w[iTerm.app]
@@ -37,7 +35,13 @@ Mercenary.program(:Coltrane) do |p|
37
35
  @flavor_option = [
38
36
  :flavor,
39
37
  '--flavor FLAVOR',
40
- 'Chooses which <additional></additional> information to display: marks, notes, intervals or degrees'
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'
41
45
  ]
42
46
 
43
47
  p.command(:note) do |c|
@@ -46,10 +50,16 @@ Mercenary.program(:Coltrane) do |p|
46
50
  c.description 'Shows the given notes.'
47
51
  c.option(*@instrument_option)
48
52
  c.option(*@flavor_option)
53
+ c.option(*@sound_option)
49
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
+
50
60
  raise 'Provide some notes. Ex: coltrane notes C-D-Gb' if notes.empty?
51
61
  notes = Coltrane::NoteSet[*notes.split('-')]
52
- Coltrane::Cli::Notes.new(notes, on: on, flavor: flavor)
62
+ Coltrane::Cli::Notes.new(notes)
53
63
  end
54
64
  end
55
65
 
@@ -59,10 +69,17 @@ Mercenary.program(:Coltrane) do |p|
59
69
  c.description 'Shows the given chord. Ex: coltrane chord Cmaj7 --on piano'
60
70
  c.option(*@instrument_option)
61
71
  c.option(*@flavor_option)
72
+ c.option(*@sound_option)
62
73
  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'|
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
+
64
81
  chords = chords&.split('-')
65
- Coltrane::Cli::Chord.new(*chords, notes: notes&.split('-'), on: on, flavor: flavor)
82
+ Coltrane::Cli::Chord.new(*chords, notes: notes&.split('-'))
66
83
  end
67
84
  end
68
85
 
@@ -71,14 +88,20 @@ Mercenary.program(:Coltrane) do |p|
71
88
  c.description 'Gives you information about a scale. Ex: coltrane scale natural-minor-Db --on guitar'
72
89
  c.option(*@instrument_option)
73
90
  c.option(*@flavor_option)
91
+ c.option(*@sound_option)
74
92
  c.option :triads, '--triads', 'Outputs triads from the scale'
75
93
  c.option :sevenths, '--sevenths', 'Outputs seventh chords from the scale'
76
94
  c.option :pentads, '--pentads', 'Outputs pentad chords from the scale'
77
95
  c.option :tertians, '--tertians SIZE', 'Outputs all tertian chords from the given size from the scale'
78
96
  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|
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
+
80
104
  scale = Coltrane::Cli::Scale.parse(scale_str)
81
- keyword_args = { flavor: flavor, on: on }
82
105
  if options.include?(:triads)
83
106
  chords = scale.triads
84
107
  Coltrane::Cli::Chord.new(*chords, **keyword_args)
@@ -97,9 +120,9 @@ Mercenary.program(:Coltrane) do |p|
97
120
  else
98
121
  scale.chords(options[:chords])
99
122
  end
100
- Coltrane::Cli::Chord.new(*chords, **keyword_args)
123
+ Coltrane::Cli::Chord.new(*chords)
101
124
  else
102
- Coltrane::Cli::Scale.new(scale, **keyword_args)
125
+ Coltrane::Cli::Scale.new(scale)
103
126
  end
104
127
  end
105
128
  end
@@ -109,7 +132,14 @@ Mercenary.program(:Coltrane) do |p|
109
132
  c.description 'Gives you chords of a progression in a key. Ex: coltrane progression I-IV-iv-V in Am --on guitar'
110
133
  c.option(*@instrument_option)
111
134
  c.option(*@flavor_option)
112
- c.action do |(prog, _, key), on: 'text', flavor: 'notes'|
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
+
113
143
  possible_method = prog.tr('-', '_')
114
144
  progression = if Coltrane::Progression.respond_to?(possible_method)
115
145
  Coltrane::Progression.send(possible_method, key)
@@ -117,7 +147,7 @@ Mercenary.program(:Coltrane) do |p|
117
147
  Coltrane::Progression.new(prog, key: key)
118
148
  end
119
149
 
120
- Coltrane::Cli::Chord.new(*progression.chords, on: on, flavor: flavor)
150
+ Coltrane::Cli::Chord.new(*progression.chords)
121
151
  end
122
152
  end
123
153
 
@@ -172,7 +202,7 @@ Mercenary.program(:Coltrane) do |p|
172
202
  memo & scale.all_chords.map(&:name)
173
203
  end
174
204
  raise 'No common chords were found' if chords.empty?
175
- Coltrane::Cli::Chord.new(*chords, on: on, flavor: flavor)
205
+ Coltrane::Cli::Chord.new(*chords)
176
206
  end
177
207
  end
178
208
 
@@ -196,6 +226,7 @@ Mercenary.program(:Coltrane) do |p|
196
226
  c.description 'Starts interactive mode'
197
227
  c.action do
198
228
  begin
229
+ Coltrane::Cli.erase_config
199
230
  puts "\n"
200
231
  print Paint['coltrane ', '#F88550']
201
232
  cmd = gets.chomp