fretboard 1.0.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ unless File.exist?('./Gemfile')
5
+ abort 'Please run fretboard from the root of the project'
6
+ end
7
+
8
+ require 'rubygems'
9
+
10
+ begin
11
+ require 'bundler'
12
+ Bundler.setup
13
+ rescue StandardError
14
+ end
15
+
16
+ $LOAD_PATH << "#{__dir__}/../lib"
17
+
18
+ require 'fretboard/parser'
19
+
20
+ Fretboard::Parser.parse(ARGV)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
 
@@ -14,12 +16,12 @@ Gem::Specification.new do |spec|
14
16
  spec.summary = 'Tools for working with the guitar fretboard'
15
17
  spec.description = 'Tools for working with the guitar fretboard'
16
18
 
17
- spec.files = `git ls-files -z *.md *.gemspec bin lib images`.split("\x0")
19
+ spec.files = `git ls-files -z *.md *.gemspec bin lib`.split("\x0")
18
20
  spec.require_paths = ['lib']
19
21
 
20
- # spec.executables = ['fretboard']
22
+ spec.executables = ['fretboard']
21
23
 
22
- # spec.add_dependency 'colorize', '~> 0.8.1'
24
+ spec.add_dependency 'colorize', '~> 0.8.1'
23
25
  spec.add_dependency 'terminal-table', '~> 1.8.0'
24
- spec.add_development_dependency 'rubocop', '= 0.88'
26
+ spec.add_development_dependency 'rubocop', '~> 1.3.0'
25
27
  end
@@ -1,7 +1,10 @@
1
- require 'fretboard/constants'
1
+ # frozen_string_literal: true
2
+
3
+ require 'fretboard/builder'
4
+ # require 'fretboard/constants'
2
5
  require 'fretboard/note'
3
6
  require 'fretboard/notes'
4
- require 'fretboard/builder'
7
+ require 'fretboard/tunings'
5
8
 
6
9
  module Fretboard
7
10
  # extend Constants
@@ -1,33 +1,206 @@
1
- require 'terminal-table'
1
+ # frozen_string_literal: true
2
+
3
+ # require 'active_support/core_ext/hash'
4
+
5
+ require 'fretboard/console'
2
6
 
3
7
  module Fretboard
4
8
  class Builder
5
9
  # fretboard = Fretboard::Builder.new(:standart)
6
10
  # fretboard = Fretboard::Builder.standart
11
+ # fretboard = Fretboard::Builder.tuning_a
12
+ # fretboard = Fretboard::Builder.open_a
13
+ # fretboard = Fretboard::Builder.drop_a
14
+ # fretboard = Fretboard::Builder.drop_a_sharp
15
+ # fretboard = Fretboard::Builder.drop_a_flat
16
+ # fretboard = Fretboard::Builder.tuning_b
17
+ # fretboard = Fretboard::Builder.open_b
18
+ # fretboard = Fretboard::Builder.drop_b
19
+ # fretboard = Fretboard::Builder.drop_b_flat
20
+ # fretboard = Fretboard::Builder.tuning_c
21
+ # fretboard = Fretboard::Builder.open_c
22
+ # fretboard = Fretboard::Builder.drop_c
23
+ # fretboard = Fretboard::Builder.tuning_d
24
+ # fretboard = Fretboard::Builder.open_d
25
+ # fretboard = Fretboard::Builder.open_d_minor
26
+ # fretboard = Fretboard::Builder.drop_d
27
+ # fretboard = Fretboard::Builder.double_drop_d
28
+ # fretboard = Fretboard::Builder.modal_d
29
+ # fretboard = Fretboard::Builder.open_e
30
+ # fretboard = Fretboard::Builder.tuning_f
31
+ # fretboard = Fretboard::Builder.open_f
32
+ # fretboard = Fretboard::Builder.tuning_g
33
+ # fretboard = Fretboard::Builder.open_g
34
+ # fretboard = Fretboard::Builder.open_g_minor
35
+ # fretboard = Fretboard::Builder.drop_g_sharp
36
+ # fretboard = Fretboard::Builder.modal_g
37
+
7
38
  # fretboard.build
8
39
  # fretboard.data
9
40
  # fretboard.draw
10
41
 
42
+ DEFAULT_NUMBER_OF_FRETS = 12
43
+
44
+ # METHODS_NAMES = %i[
45
+ # standart
46
+ # tuning_a
47
+ # open_a
48
+ # drop_a
49
+ # drop_a_sharp
50
+ # drop_a_flat
51
+ # tuning_b
52
+ # open_b
53
+ # drop_b
54
+ # drop_b_flat
55
+ # tuning_c
56
+ # open_c
57
+ # drop_c
58
+ # tuning_d
59
+ # open_d
60
+ # open_d_minor
61
+ # drop_d
62
+ # double_drop_d
63
+ # modal_d
64
+ # open_e
65
+ # tuning_f
66
+ # open_f
67
+ # tuning_g
68
+ # open_g
69
+ # open_g_minor
70
+ # drop_g_sharp
71
+ # modal_g
72
+ # ].freeze
73
+
11
74
  attr_reader :data
12
75
 
13
- def self.standart(number_of_frets = 12)
76
+ # METHODS_NAMES.each do |method_name|
77
+ # define_method(method_name) do |number_of_frets = DEFAULT_NUMBER_OF_FRETS|
78
+ # new(method_name, number_of_frets)
79
+ # end
80
+ # end
81
+
82
+ def self.standart(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
14
83
  new(:standart, number_of_frets)
15
84
  end
16
85
 
17
- def initialize(tuning, number_of_frets = 12)
86
+ def self.tuning_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
87
+ new(:tuning_a, number_of_frets)
88
+ end
89
+
90
+ def self.open_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
91
+ new(:open_a, number_of_frets)
92
+ end
93
+
94
+ def self.drop_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
95
+ new(:drop_a, number_of_frets)
96
+ end
97
+
98
+ def self.drop_a_sharp(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
99
+ new(:drop_a_sharp, number_of_frets)
100
+ end
101
+
102
+ def self.drop_a_flat(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
103
+ new(:drop_a_flat, number_of_frets)
104
+ end
105
+
106
+ def self.tuning_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
107
+ new(:tuning_b, number_of_frets)
108
+ end
109
+
110
+ def self.open_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
111
+ new(:open_b, number_of_frets)
112
+ end
113
+
114
+ def self.drop_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
115
+ new(:drop_b, number_of_frets)
116
+ end
117
+
118
+ def self.drop_b_flat(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
119
+ new(:drop_b_flat, number_of_frets)
120
+ end
121
+
122
+ def self.tuning_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
123
+ new(:tuning_c, number_of_frets)
124
+ end
125
+
126
+ def self.open_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
127
+ new(:open_c, number_of_frets)
128
+ end
129
+
130
+ def self.drop_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
131
+ new(:drop_c, number_of_frets)
132
+ end
133
+
134
+ def self.tuning_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
135
+ new(:tuning_d, number_of_frets)
136
+ end
137
+
138
+ def self.open_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
139
+ new(:open_d, number_of_frets)
140
+ end
141
+
142
+ def self.open_d_minor(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
143
+ new(:open_d_minor, number_of_frets)
144
+ end
145
+
146
+ def self.drop_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
147
+ new(:drop_d, number_of_frets)
148
+ end
149
+
150
+ def self.double_drop_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
151
+ new(:double_drop_d, number_of_frets)
152
+ end
153
+
154
+ def self.modal_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
155
+ new(:modal_d, number_of_frets)
156
+ end
157
+
158
+ def self.open_e(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
159
+ new(:open_e, number_of_frets)
160
+ end
161
+
162
+ def self.tuning_f(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
163
+ new(:tuning_f, number_of_frets)
164
+ end
165
+
166
+ def self.open_f(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
167
+ new(:open_f, number_of_frets)
168
+ end
169
+
170
+ def self.tuning_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
171
+ new(:tuning_g, number_of_frets)
172
+ end
173
+
174
+ def self.open_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
175
+ new(:open_g, number_of_frets)
176
+ end
177
+
178
+ def self.open_g_minor(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
179
+ new(:open_g_minor, number_of_frets)
180
+ end
181
+
182
+ def self.drop_g_sharp(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
183
+ new(:drop_g_sharp, number_of_frets)
184
+ end
185
+
186
+ def self.modal_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
187
+ new(:modal_g, number_of_frets)
188
+ end
189
+
190
+ def initialize(tuning, number_of_frets = DEFAULT_NUMBER_OF_FRETS)
18
191
  @tuning = tuning.upcase.to_sym
19
192
  @number_of_frets = number_of_frets
20
193
 
21
194
  @data = {}
22
195
  end
23
196
 
24
- def build
25
- unless Fretboard::Constants::GUITAR_TUNINGS.key?(@tuning)
26
- puts 'Unable to detect guitar tuning'
197
+ def build(sharp_or_flat: :both)
198
+ unless Fretboard::Tunings.exists?(@tuning)
199
+ Fretboard::Console.danger('Unable to detect guitar tuning')
27
200
  return
28
201
  end
29
202
 
30
- tuning = Fretboard::Constants::GUITAR_TUNINGS[@tuning]
203
+ tuning = Fretboard::Tunings.get(@tuning)
31
204
  strings = tuning[:STRINGS]
32
205
  number_of_strings = strings.size
33
206
 
@@ -47,8 +220,7 @@ module Fretboard
47
220
  (1..@number_of_frets).each do |fret|
48
221
  next_note = Fretboard::Note.next_for(
49
222
  current_note,
50
- sharp_or_flat: :both,
51
- formated: true
223
+ sharp_or_flat: sharp_or_flat
52
224
  )
53
225
 
54
226
  puts "Fret: #{fret} (#{next_note})"
@@ -63,7 +235,12 @@ module Fretboard
63
235
  puts 'done'
64
236
  end
65
237
 
66
- def draw
238
+ def draw(sharp_or_flat: :both)
239
+ unless @data.any?
240
+ Fretboard::Console.danger('Create the data')
241
+ return
242
+ end
243
+
67
244
  headings = []
68
245
  rows = []
69
246
 
@@ -74,7 +251,21 @@ module Fretboard
74
251
  row << string_number
75
252
 
76
253
  headings << 0
77
- row << string_notes[0]
254
+
255
+ open_note = string_notes[0]
256
+
257
+ if open_note.is_a?(Array)
258
+ open_note = case sharp_or_flat
259
+ when :both
260
+ open_note.join('/')
261
+ when :sharp
262
+ open_note.first
263
+ else
264
+ open_note.last
265
+ end
266
+ end
267
+
268
+ row << open_note
78
269
 
79
270
  string_notes.except(0).each_pair do |fret, note|
80
271
  headings << fret
@@ -84,13 +275,7 @@ module Fretboard
84
275
  rows << row
85
276
  end
86
277
 
87
- table = Terminal::Table.new(
88
- headings: headings.uniq,
89
- rows: rows,
90
- style: { border_x: '~', border_i: '~' }
91
- )
92
-
93
- puts table
278
+ Fretboard::Console.print_table(headings.uniq, rows)
94
279
 
95
280
  nil
96
281
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'colorize'
4
+ require 'terminal-table'
5
+
6
+ module Fretboard
7
+ class Console
8
+ def self.log(text)
9
+ new(text, nil).print
10
+ end
11
+
12
+ # def self.success(text)
13
+ # new(text, :green).print
14
+ # end
15
+
16
+ # def self.warning(text)
17
+ # new(text, :yellow).print
18
+ # end
19
+
20
+ def self.danger(text)
21
+ new(text, :red).print
22
+ end
23
+
24
+ def self.print_table(headings, rows)
25
+ table = Terminal::Table.new(
26
+ headings: headings,
27
+ rows: rows,
28
+ style: { border_x: '~', border_i: '~' }
29
+ )
30
+
31
+ new(table.to_s, nil).print
32
+ end
33
+
34
+ def initialize(text, color = nil)
35
+ @text = text
36
+ @color = color
37
+ end
38
+
39
+ def print
40
+ puts @text.colorize(@color)
41
+ end
42
+ end
43
+ end
@@ -1,44 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Fretboard
2
4
  module Constants
3
5
  # Fretboard::Constants.constants
4
-
5
- # SPN => Scientific pitch notation
6
-
7
- GUITAR_TUNINGS = {
8
- STANDART: {
9
- STRINGS: {
10
- 1 => {
11
- NOTE: 'E',
12
- FREQUENCY: '329.63 Hz',
13
- SPN: 'E4'
14
- },
15
- 2 => {
16
- NOTE: 'B',
17
- FREQUENCY: '246.94 Hz',
18
- SPN: 'B3'
19
- },
20
- 3 => {
21
- NOTE: 'G',
22
- FREQUENCY: '196.00 Hz',
23
- SPN: 'G3'
24
- },
25
- 4 => {
26
- NOTE: 'D',
27
- FREQUENCY: '146.83 Hz',
28
- SPN: 'D3'
29
- },
30
- 5 => {
31
- NOTE: 'A',
32
- FREQUENCY: '110.00 Hz',
33
- SPN: 'A2'
34
- },
35
- 6 => {
36
- NOTE: 'E',
37
- FREQUENCY: '82.41 Hz',
38
- SPN: 'E2'
39
- }
40
- }
41
- }
42
- }.freeze
43
6
  end
44
7
  end
@@ -1,15 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fretboard/notes'
2
4
 
3
5
  module Fretboard
4
6
  class Note
5
7
  # Fretboard::Note.next_for('C')
8
+ # Fretboard::Note.next_for(['F#', 'Gb'])
9
+ # Fretboard::Note.next_for('F#/Gb')
6
10
 
7
- def self.next_for(note, sharp_or_flat: :sharp, formated: false)
11
+ def self.next_for(note, sharp_or_flat: :both)
8
12
  all_notes = Fretboard::Notes.all(
9
- sharp_or_flat,
10
- formated: formated
13
+ sharp_or_flat
11
14
  )
12
15
 
16
+ if note.is_a?(Array)
17
+ note = case sharp_or_flat
18
+ when :both
19
+ note.join('/')
20
+ when :sharp
21
+ note.first
22
+ else
23
+ note.last
24
+ end
25
+ end
26
+
13
27
  current_index = all_notes.find_index(note)
14
28
  next_index = current_index + 1
15
29
 
@@ -19,24 +33,8 @@ module Fretboard
19
33
  next_note
20
34
  end
21
35
 
22
- def self.formated(note)
23
- new(note).formated
24
- end
25
-
26
36
  def initialize(note)
27
37
  @note = note
28
38
  end
29
-
30
- def formated
31
- result = @note
32
-
33
- result = result.gsub('sharp', '#') if result.include?('sharp')
34
-
35
- if result.include?('flat')
36
- result = result.gsub('flat', 'b') # ♭
37
- end
38
-
39
- result.gsub(' ', '')
40
- end
41
39
  end
42
40
  end