fretboard 1.0.0 → 1.4.1

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.
@@ -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