wtf_chord 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 42f6e0b2d54785364d40dfc28d48ac718a62feb3
4
- data.tar.gz: 4747da8acf163bdeea61e0ab1902f6bf6d812445
3
+ metadata.gz: 63e6deb4fcd84c93ca4b45c777e8510bc721cfb8
4
+ data.tar.gz: c8a5cd9fa823393c02b09670cb59094e48685fad
5
5
  SHA512:
6
- metadata.gz: f34f794282e89a4f924c04bf74ea234b4e484bd95a4f78e583dae57e27133775a86fd8fa817928c702fadafedd31fa2a8805ce78c7e47ff56958afbaa75108a0
7
- data.tar.gz: 6fdf726a6bb8e8f2ad2446b40347f28a2e47692944fc879ed35b80366650bc770eedfa6a9c29a6a846e74ada7a505a6ffc944e5cc0769c9574688fc153fd0339
6
+ metadata.gz: 82eb003ec0978911c7806e8b1d338ec495fcd63f72d26262baa075209f29b4854a0237c885887177e26e4d3b438909023e07ad5201152b873ea456266fb7d14e
7
+ data.tar.gz: d2f439cd8f2dc14886520b8a5f72f16cce4c7934e250742cc1e5c5a2e9a107a967d25e470992411cf3e2d730d2d7d5698baf64467eab0b61441b69e3e6805295
data/README.md CHANGED
@@ -27,9 +27,31 @@ Or install it yourself as:
27
27
 
28
28
  ## CLI-tool usage
29
29
 
30
+ Usage: wtfchord [options] name
31
+
32
+ Finds fingerings of the requested chord.
33
+
34
+ v0.2.0
35
+
36
+ Options:
37
+ -h, --help Show command line help
38
+ --version Show help/version info
39
+ -n, --amount N Amount of fingering variants to output.
40
+ (default: 3)
41
+ -o, --output FORMAT Output format.
42
+ (default: default)
43
+ --log-level LEVEL Set the logging level
44
+ (debug|info|warn|error|fatal)
45
+ (Default: info)
46
+
47
+ Arguments:
48
+
49
+ name
50
+ Chord name to find.
51
+
30
52
  For example, to print two fingering variants of the `Dm` chord, just run:
31
53
 
32
- $ wtfchord Dm 2
54
+ $ wtfchord Dm -n 2
33
55
 
34
56
  And you'll get the visual presentation of chords' fingerings:
35
57
 
@@ -55,6 +77,19 @@ And you'll get the visual presentation of chords' fingerings:
55
77
  ––––––––––––––––––
56
78
  D A D F A
57
79
 
80
+ You can get simpler output, using the `--output` option:
81
+
82
+ $ wtfchord Dm -n 10 --output=simple
83
+ Dm (D - F - A)
84
+
85
+ [ × × 0 2 3 1 ]
86
+ [ × 5 3 2 3 1 ]
87
+ [ × 5 3 2 3 5 ]
88
+ [ × 5 3 7 3 5 ]
89
+ [ × 5 7 7 6 5 ]
90
+ [ 10 8 7 7 6 10 ]
91
+ [ 10 8 7 7 10 10 ]
92
+
58
93
  ## Development
59
94
 
60
95
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec wtf_chord` to use the gem in this directory, ignoring other installed copies of this gem.
data/exe/wtfchord CHANGED
@@ -3,9 +3,7 @@
3
3
  $:.unshift File.expand_path('../../lib', __FILE__)
4
4
 
5
5
  require 'rubygems' unless Object.const_defined?(:Gem)
6
- require "wtf_chord"
6
+ require 'wtf_chord'
7
+ require 'wtf_chord/cli'
7
8
 
8
- chord = WTFChord.chord(ARGV[0])
9
-
10
- puts chord.inspect, nil
11
- chord.draw_fingerings(ARGV[1]&.to_i || 3)
9
+ WTFChord::CLI.go!
@@ -20,13 +20,14 @@ module WTFChord
20
20
 
21
21
  def fingerings(limit = 3)
22
22
  list = []
23
+
23
24
  (0..MAX_FRET).each do |from_fret|
24
25
  f = get_fingering(from_fret)
25
26
  next if list.include?(f)
26
27
  list << f if all_notes?(f.used_strings)
27
28
  end
28
29
 
29
- list.sort_by!(&:complexity)[0...limit].sort_by!(&:min_fret)
30
+ sort_fingerings(list, limit)
30
31
  end
31
32
 
32
33
  def get_fingering(from_fret = 0)
@@ -59,8 +60,9 @@ module WTFChord
59
60
  string && string.note != @notes[i]
60
61
  end
61
62
 
62
- def draw_fingerings(limit = 3)
63
- puts (fingerings(limit).map(&:draw) * "\n\n")
63
+ def sort_fingerings(list, limit)
64
+ list.sort_by!(&:complexity)
65
+ list[0...limit].sort_by!(&:min_fret)
64
66
  end
65
67
  end
66
68
  end
@@ -0,0 +1,42 @@
1
+ require 'optparse'
2
+ require 'methadone'
3
+
4
+ module WTFChord
5
+ class CLI
6
+ include Methadone::Main
7
+ include Methadone::CLILogging
8
+
9
+ main do |name|
10
+ chord = WTFChord.chord(name)
11
+ fingerings = chord.fingerings(options['amount'])
12
+ formatter = WTFChord::Formatter.new(options['output'])
13
+
14
+ debug { "Output using formatter: #{formatter.formatter.to_s}\n" }
15
+
16
+ puts chord.inspect, nil
17
+ formatter.(*fingerings)
18
+ end
19
+
20
+ version VERSION
21
+
22
+ description "Finds fingerings of the requested chord."
23
+
24
+
25
+ ##
26
+ # Arguments
27
+ #
28
+ arg :name, "Chord name to find."
29
+
30
+
31
+ ##
32
+ # Options
33
+ #
34
+ options['amount'] = 3
35
+ options['output'] = 'default'
36
+
37
+ on "-n N", "--amount N", Integer, "Amount of fingering variants to output."
38
+ on "-o FORMAT", "--output FORMAT", "Output format."
39
+
40
+ use_log_level_option
41
+ end
42
+ end
@@ -1,6 +1,6 @@
1
1
  require 'wtf_chord/fretboard'
2
2
  require 'wtf_chord/complexity_counter'
3
- require 'wtf_chord/drawer'
3
+ require 'wtf_chord/formatter'
4
4
 
5
5
  module WTFChord
6
6
  class Fingering < Fretboard
@@ -23,7 +23,7 @@ module WTFChord
23
23
  end
24
24
 
25
25
  def draw
26
- Drawer.new(self).draw
26
+ Formatter.new(:default).call(self)
27
27
  end
28
28
 
29
29
  def set_fingers(fingers)
@@ -0,0 +1,32 @@
1
+ require 'wtf_chord/formatters/base'
2
+
3
+ module WTFChord
4
+ class Formatter
5
+ def initialize(name)
6
+ @name = name
7
+ require_formatter! unless formatter?
8
+ end
9
+
10
+ def call(*fingerings)
11
+ puts (fingerings.map(&formatter) * formatter.separator)
12
+ end
13
+
14
+ alias :[] :call
15
+
16
+ def formatter
17
+ WTFChord::Formatters.const_get(formatter_name)
18
+ end
19
+
20
+ def formatter?
21
+ WTFChord::Formatters.const_defined?(formatter_name)
22
+ end
23
+
24
+ def formatter_name
25
+ @formatter_name ||= @name.gsub(/(?:^|_)([a-z\d]*)/i) { "#{$1.capitalize}" }.to_s.freeze
26
+ end
27
+
28
+ def require_formatter!
29
+ require "wtf_chord/formatters/#{@name}"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,37 @@
1
+ require 'forwardable'
2
+
3
+ module WTFChord
4
+ module Formatters
5
+ class Base
6
+ FRETS = 6
7
+
8
+ extend Forwardable
9
+ def_delegators :@fret, :strings
10
+
11
+ def self.separator
12
+ "\n".freeze
13
+ end
14
+
15
+ def self.to_proc
16
+ proc { |fret| new(fret).draw }
17
+ end
18
+
19
+ def initialize(fret)
20
+ @fret = fret
21
+ end
22
+
23
+ def draw
24
+ end
25
+
26
+ protected
27
+
28
+ def min_fret
29
+ @min_fret = begin
30
+ frets = strings.map(&:fret).tap(&:compact!)
31
+ _min = frets.min.to_i || 1
32
+ _min > 2 ? _min : 1
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,64 @@
1
+ module WTFChord
2
+ module Formatters
3
+ class Default < Base
4
+ OPEN = "|".freeze
5
+ HORIZ = "–".freeze
6
+ SPACE = " ".freeze
7
+ BULL = "\u2022".freeze
8
+ LATIN = %w(0 I II III IV V VI VII VIII IX X XII XIII).freeze
9
+ NEWLINE = "\n".freeze
10
+
11
+ def self.separator
12
+ "\n\n".freeze
13
+ end
14
+
15
+ def draw
16
+ [
17
+ "[ #{head} ]#{capo}",
18
+ " #{border}",
19
+ *fret_rows,
20
+ " #{border}",
21
+ " #{string_keys}"
22
+ ] * NEWLINE
23
+ end
24
+
25
+ private
26
+
27
+ def head
28
+ @fret.fingers * SPACE
29
+ end
30
+
31
+ def capo
32
+ " (capo #{to_latin @fret.capo})" if @fret.capo > 0
33
+ end
34
+
35
+ def border
36
+ @border ||= HORIZ * 3 * strings.length
37
+ end
38
+
39
+ def string_rows
40
+ strings.map { |string| draw_string(string.fret) }
41
+ end
42
+
43
+ def fret_rows
44
+ string_rows.transpose.map! { |row| " #{row * SPACE} " }.tap do |rows|
45
+ rows[0] << " #{to_latin min_fret}" if min_fret > 1
46
+ end
47
+ end
48
+
49
+ def string_keys
50
+ strings.map { |s| s.dead? ? SPACE : "%-2s" % s.key } * " "
51
+ end
52
+
53
+ def to_latin(num)
54
+ LATIN[num]
55
+ end
56
+
57
+ def draw_string(fret)
58
+ Array.new(FRETS, OPEN).tap do |rows|
59
+ rows[(fret - min_fret.pred).pred] = BULL if fret.to_i > 0
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,9 @@
1
+ module WTFChord
2
+ module Formatters
3
+ class Simple < Base
4
+ def draw
5
+ "[ #{@fret.fingers * " "} ]"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module WTFChord
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
data/wtf_chord.gemspec CHANGED
@@ -20,6 +20,8 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
22
22
 
23
+ spec.add_runtime_dependency "methadone"
24
+
23
25
  spec.add_development_dependency "bundler", ">= 1.11", "< 2"
24
26
  spec.add_development_dependency "rake", ">= 10.0", "< 12"
25
27
  spec.add_development_dependency "rspec", ">= 3.0", "< 4"
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wtf_chord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-30 00:00:00.000000000 Z
11
+ date: 2016-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: methadone
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -90,9 +104,13 @@ files:
90
104
  - lib/wtf_chord.rb
91
105
  - lib/wtf_chord.yml
92
106
  - lib/wtf_chord/chord.rb
107
+ - lib/wtf_chord/cli.rb
93
108
  - lib/wtf_chord/complexity_counter.rb
94
- - lib/wtf_chord/drawer.rb
95
109
  - lib/wtf_chord/fingering.rb
110
+ - lib/wtf_chord/formatter.rb
111
+ - lib/wtf_chord/formatters/base.rb
112
+ - lib/wtf_chord/formatters/default.rb
113
+ - lib/wtf_chord/formatters/simple.rb
96
114
  - lib/wtf_chord/fretboard.rb
97
115
  - lib/wtf_chord/guitar_string.rb
98
116
  - lib/wtf_chord/note.rb
@@ -1,79 +0,0 @@
1
- require 'forwardable'
2
-
3
- module WTFChord
4
- class Drawer
5
- FRETS = 6
6
- OPEN = "|".freeze
7
- HORIZ = "–".freeze
8
- SPACE = " ".freeze
9
- BULL = "\u2022".freeze
10
- LATIN = %w(0 I II III IV V VI VII VIII IX X XII XIII).freeze
11
- NEWLINE = "\n".freeze
12
-
13
- extend Forwardable
14
- def_delegators :@fret, :strings
15
-
16
- def initialize(fret, newline: nil)
17
- @fret = fret
18
- @newline = newline || NEWLINE
19
- end
20
-
21
- def draw
22
- [
23
- "[ #{head} ]#{capo}",
24
- " #{border}",
25
- *fret_rows,
26
- " #{border}",
27
- " #{string_keys}"
28
- ] * @newline
29
- end
30
-
31
- protected
32
-
33
- def min_fret
34
- @min_fret = begin
35
- frets = strings.map(&:fret).tap(&:compact!)
36
- _min = frets.min.to_i || 1
37
- _min > 2 ? _min : 1
38
- end
39
- end
40
-
41
- def head
42
- @fret.fingers * SPACE
43
- end
44
-
45
- def capo
46
- " (capo #{to_latin @fret.capo})" if @fret.capo > 0
47
- end
48
-
49
- def border
50
- @border ||= HORIZ * 3 * strings.length
51
- end
52
-
53
- def string_rows
54
- strings.map { |string| draw_string(string.fret) }
55
- end
56
-
57
- def fret_rows
58
- string_rows.transpose.map! { |row| " #{row * SPACE} " }.tap do |rows|
59
- rows[0] << " #{to_latin min_fret}" if min_fret > 1
60
- end
61
- end
62
-
63
- def string_keys
64
- strings.map { |s| s.dead? ? SPACE : "%-2s" % s.key } * " "
65
- end
66
-
67
- private
68
-
69
- def to_latin(num)
70
- LATIN[num]
71
- end
72
-
73
- def draw_string(fret)
74
- Array.new(FRETS, OPEN).tap do |rows|
75
- rows[(fret - min_fret.pred).pred] = BULL if fret.to_i > 0
76
- end
77
- end
78
- end
79
- end