fretboard 1.6.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ee4a3406fd62fd65a73d9757d4e952de5946653855f5549352454e3b4336f89
4
- data.tar.gz: 70d473d4f8c167dbcc5f238086e2e87b52a06bf94ae5de4fadebdec0b61aa15a
3
+ metadata.gz: 8fe73d0ec9fe65459863a1d69c89db528176f618484ade07d35b171662e337a2
4
+ data.tar.gz: 50a49bb50600ddeb7921d09188339a750a83657dcd453e051c2acab32ac5eb98
5
5
  SHA512:
6
- metadata.gz: c13366e374fa78c5ba170d8ac00950ba6087c79fce439e0dec6c0bc3b841ad70940cef68501b9f81649bd18d586670629511b265a6ac8699b80fa9b208e5ac7d
7
- data.tar.gz: a138bc584070c19e8edd654811fe754063a6c272f1ed22143224ff815f509ca34d478708b5609af0bab2488173cec21dbf8b03b17965af9c6e4b97e4b92830db
6
+ metadata.gz: 01bdd0af72cb6b621dd6a9232397253f5aceed7aafd416863bdcf4e61a4d6505b0a4df6987f3000ed17e1c7e99a46fdbef3ff787d8288fce41fe2cef597957eb
7
+ data.tar.gz: fd464320449062acd34e8da6218297fa8787783b0812506980db6ce595291bd836f7514e31cef832831135c0de00d53ac118242cc3c1014b98e28c57eaef188b
data/README.md CHANGED
@@ -1,18 +1,40 @@
1
+ <div align="center">
2
+
1
3
  # Fretboard
2
4
 
3
5
  Tools for working with the guitar fretboard.
4
6
 
5
- [Documentation](https://www.rubydoc.info/gems/fretboard)
7
+ </div>
8
+
9
+ <div align="center">
10
+
11
+ [![Gem version](https://img.shields.io/gem/v/fretboard?logo=rubygems&logoColor=fff)](https://rubygems.org/gems/fretboard)
12
+ [![Release Date](https://img.shields.io/github/release-date/afuno/fretboard)](https://github.com/afuno/fretboard/releases)
13
+ [![Downloads](https://img.shields.io/gem/dt/fretboard)](https://rubygems.org/gems/fretboard)
14
+ [![Ruby version](https://img.shields.io/badge/Ruby-3.2+-red)](https://github.com/afuno/fretboard)
15
+
16
+ </div>
17
+
18
+ ## 💡 Why Fretboard?
19
+
20
+ - 🎸 **27 Guitar Tunings** — Standard, Open, Drop, Modal and more
21
+ - 🎹 **Chromatic Notes** — Full sharp/flat notation support
22
+ - 📊 **Visual Fretboard** — ASCII table rendering in console
23
+ - ⚡ **CLI Tool** — Draw any tuning from the command line
24
+ - 🔧 **Ruby API** — Programmable fretboard data builder
25
+ - 🛤️ **Rails Ready** — Built-in Rails::Engine for integration
26
+
27
+ ## 🚀 Quick Start
6
28
 
7
- ## Installation
29
+ ### Installation
8
30
 
9
31
  ```ruby
10
32
  gem "fretboard"
11
33
  ```
12
34
 
13
- ## Using
35
+ ### Ruby API
14
36
 
15
- ### Creates a fretboard with the specified tuning
37
+ Creates a fretboard with the specified tuning:
16
38
 
17
39
  ```ruby
18
40
  fretboard = Fretboard::Builder.new(:standard)
@@ -20,7 +42,7 @@ fretboard = Fretboard::Builder.new(:standard)
20
42
  fretboard = Fretboard::Builder.standard
21
43
  ```
22
44
 
23
- [Supported guitar tunings](#supported-guitar-tunings)
45
+ [Supported guitar tunings](#-supported-guitar-tunings)
24
46
 
25
47
  Creating the fretboard data:
26
48
 
@@ -53,9 +75,9 @@ fretboard.draw
53
75
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54
76
  ```
55
77
 
56
- ### Using from the console
78
+ ### CLI
57
79
 
58
- #### Drawing the fretboard
80
+ Drawing the fretboard:
59
81
 
60
82
  ```
61
83
  bundle exec fretboard --draw-tuning standard
@@ -78,7 +100,7 @@ bundle exec fretboard --draw-tuning standard
78
100
  ```
79
101
  </details>
80
102
 
81
- #### Getting a list of supported guitar tunings
103
+ Getting a list of supported guitar tunings:
82
104
 
83
105
  ```
84
106
  bundle exec fretboard --tunings-list
@@ -122,7 +144,39 @@ bundle exec fretboard --tunings-list
122
144
  ```
123
145
  </details>
124
146
 
125
- ## Supported guitar tunings
147
+ ## 🎵 Supported Guitar Tunings
148
+
149
+ | Tuning | Notes |
150
+ |--------|-------|
151
+ | Standard | E, B, G, D, A, E |
152
+ | Tuning A | A, E, C, G, D, A |
153
+ | Open A | E, A, E, C#/Db, A, E |
154
+ | Drop A | B, F#/Gb, D, A, E, A |
155
+ | Drop A# | C, G, D#/Eb, A#/Bb, F, A#/Bb |
156
+ | Drop Ab | A#/Bb, F, C#/Db, G#/Ab, D#/Eb, G#/Ab |
157
+ | Tuning B | B, F#/Gb, D, A, E, B |
158
+ | Open B | D#/Eb, B, F#/Gb, B, F#/Gb, B |
159
+ | Drop B | C#/Db, G#/Ab, E, B, F#/Gb, B |
160
+ | Drop Bb | C, G, D#/Eb, A#/Bb, F, A#/Bb |
161
+ | Tuning C | C, G, D#/Eb, A#/Bb, F, C |
162
+ | Open C | E, C, G, C, G, C |
163
+ | Drop C | D, A, F, C, G, C |
164
+ | Tuning D | D, A, F, C, G, D |
165
+ | Open D | D, A, F#/Gb, D, A, D |
166
+ | Open D Minor | D, A, F, D, A, D |
167
+ | Drop D | E, B, G, D, A, D |
168
+ | Double Drop D | D, B, G, D, A, D |
169
+ | Modal D | D, A, G, D, A, D |
170
+ | Open E | E, B, G#/Ab, E, B, E |
171
+ | Tuning F | F, C, G#/Ab, D#/Eb, A#/Bb, F |
172
+ | Tuning G | G, D, A#/Bb, F, C, G |
173
+ | Open F | F, C, F, C, A, F |
174
+ | Open G | D, B, G, D, G, D |
175
+ | Open G Minor | D, A#/Bb, G, D, G, D |
176
+ | Drop G# | A#/Bb, F, C#/Db, G#/Ab, D#/Eb, G#/Ab |
177
+ | Modal G | D, C, G, D, G, D |
178
+
179
+ ### Fretboard Diagrams
126
180
 
127
181
  <details>
128
182
  <summary>Standard (standard)</summary>
@@ -146,7 +200,7 @@ bundle exec fretboard --tunings-list
146
200
  </details>
147
201
 
148
202
  <details>
149
- <summary>A Tuning (tuning_a)</summary>
203
+ <summary>Tuning A (tuning_a)</summary>
150
204
 
151
205
  ```
152
206
  bundle exec fretboard --draw-tuning tuning_a
@@ -251,7 +305,7 @@ bundle exec fretboard --tunings-list
251
305
  </details>
252
306
 
253
307
  <details>
254
- <summary>B Tuning (tuning_b)</summary>
308
+ <summary>Tuning B (tuning_b)</summary>
255
309
 
256
310
  ```
257
311
  bundle exec fretboard --draw-tuning tuning_b
@@ -335,7 +389,7 @@ bundle exec fretboard --tunings-list
335
389
  </details>
336
390
 
337
391
  <details>
338
- <summary>C Tuning (tuning_c)</summary>
392
+ <summary>Tuning C (tuning_c)</summary>
339
393
 
340
394
  ```
341
395
  bundle exec fretboard --draw-tuning tuning_c
@@ -398,7 +452,7 @@ bundle exec fretboard --tunings-list
398
452
  </details>
399
453
 
400
454
  <details>
401
- <summary>D Tuning (tuning_d)</summary>
455
+ <summary>Tuning D (tuning_d)</summary>
402
456
 
403
457
  ```
404
458
  bundle exec fretboard --draw-tuning tuning_d
@@ -545,7 +599,7 @@ bundle exec fretboard --tunings-list
545
599
  </details>
546
600
 
547
601
  <details>
548
- <summary>F Tuning (tuning_f)</summary>
602
+ <summary>Tuning F (tuning_f)</summary>
549
603
 
550
604
  ```
551
605
  bundle exec fretboard --draw-tuning tuning_f
@@ -565,6 +619,27 @@ bundle exec fretboard --tunings-list
565
619
  ```
566
620
  </details>
567
621
 
622
+ <details>
623
+ <summary>Tuning G (tuning_g)</summary>
624
+
625
+ ```
626
+ bundle exec fretboard --draw-tuning tuning_g
627
+ ```
628
+
629
+ ```
630
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
631
+ | № | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
632
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
633
+ | 1 | G | G#/Ab | A | A#/Bb | B | C | C#/Db | D | D#/Eb | E | F | F#/Gb | G |
634
+ | 2 | D | D#/Eb | E | F | F#/Gb | G | G#/Ab | A | A#/Bb | B | C | C#/Db | D |
635
+ | 3 | A#/Bb | B | C | C#/Db | D | D#/Eb | E | F | F#/Gb | G | G#/Ab | A | A#/Bb |
636
+ | 4 | F | F#/Gb | G | G#/Ab | A | A#/Bb | B | C | C#/Db | D | D#/Eb | E | F |
637
+ | 5 | C | C#/Db | D | D#/Eb | E | F | F#/Gb | G | G#/Ab | A | A#/Bb | B | C |
638
+ | 6 | G | G#/Ab | A | A#/Bb | B | C | C#/Db | D | D#/Eb | E | F | F#/Gb | G |
639
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
640
+ ```
641
+ </details>
642
+
568
643
  <details>
569
644
  <summary>Open F (open_f)</summary>
570
645
 
@@ -586,27 +661,6 @@ bundle exec fretboard --tunings-list
586
661
  ```
587
662
  </details>
588
663
 
589
- <details>
590
- <summary>G Tuning (tuning_g)</summary>
591
-
592
- ```
593
- bundle exec fretboard --draw-tuning tuning_g
594
- ```
595
-
596
- ```
597
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
598
- | № | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
599
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
600
- | 1 | G | G#/Ab | A | A#/Bb | B | C | C#/Db | D | D#/Eb | E | F | F#/Gb | G |
601
- | 2 | D | D#/Eb | E | F | F#/Gb | G | G#/Ab | A | A#/Bb | B | C | C#/Db | D |
602
- | 3 | A#/Bb | B | C | C#/Db | D | D#/Eb | E | F | F#/Gb | G | G#/Ab | A | A#/Bb |
603
- | 4 | F | F#/Gb | G | G#/Ab | A | A#/Bb | B | C | C#/Db | D | D#/Eb | E | F |
604
- | 5 | C | C#/Db | D | D#/Eb | E | F | F#/Gb | G | G#/Ab | A | A#/Bb | B | C |
605
- | 6 | G | G#/Ab | A | A#/Bb | B | C | C#/Db | D | D#/Eb | E | F | F#/Gb | G |
606
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
607
- ```
608
- </details>
609
-
610
664
  <details>
611
665
  <summary>Open G (open_g)</summary>
612
666
 
@@ -690,3 +744,23 @@ bundle exec fretboard --tunings-list
690
744
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
691
745
  ```
692
746
  </details>
747
+
748
+ ## 🤝 Contributing
749
+
750
+ We welcome contributions! Here are some ways you can help:
751
+
752
+ - 🐛 Report bugs and issues
753
+ - 💡 Suggest new features
754
+ - 📝 Improve documentation
755
+ - 🧪 Add test cases
756
+ - 🔧 Submit pull requests
757
+
758
+ Please read our [Contributing Guide](./CONTRIBUTING.md) before submitting a pull request.
759
+
760
+ ## 🙏 Acknowledgments
761
+
762
+ Thank you to all [contributors](https://github.com/afuno/fretboard/graphs/contributors) who have helped make Fretboard better!
763
+
764
+ ## 📄 License
765
+
766
+ Fretboard is available as open source under the terms of the [MIT License](./LICENSE.md).
data/bin/fretboard CHANGED
@@ -1,19 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- abort "Please run fretboard from the root of the project" unless File.exist?("./Gemfile")
5
-
6
- require "rubygems"
7
-
8
- begin
9
- require "bundler"
10
- Bundler.setup
11
- rescue StandardError
12
- # ...
13
- end
14
-
15
- $LOAD_PATH << "#{__dir__}/../lib"
16
-
17
- require "fretboard/parser"
4
+ require "fretboard"
18
5
 
19
6
  Fretboard::Parser.parse(ARGV)
@@ -1,186 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Fretboard
4
- class Builder # rubocop:disable Metrics/ClassLength
5
- # fretboard = Fretboard::Builder.new(:standard)
6
- # fretboard = Fretboard::Builder.standard
7
- # fretboard = Fretboard::Builder.tuning_a
8
- # fretboard = Fretboard::Builder.open_a
9
- # fretboard = Fretboard::Builder.drop_a
10
- # fretboard = Fretboard::Builder.drop_a_sharp
11
- # fretboard = Fretboard::Builder.drop_a_flat
12
- # fretboard = Fretboard::Builder.tuning_b
13
- # fretboard = Fretboard::Builder.open_b
14
- # fretboard = Fretboard::Builder.drop_b
15
- # fretboard = Fretboard::Builder.drop_b_flat
16
- # fretboard = Fretboard::Builder.tuning_c
17
- # fretboard = Fretboard::Builder.open_c
18
- # fretboard = Fretboard::Builder.drop_c
19
- # fretboard = Fretboard::Builder.tuning_d
20
- # fretboard = Fretboard::Builder.open_d
21
- # fretboard = Fretboard::Builder.open_d_minor
22
- # fretboard = Fretboard::Builder.drop_d
23
- # fretboard = Fretboard::Builder.double_drop_d
24
- # fretboard = Fretboard::Builder.modal_d
25
- # fretboard = Fretboard::Builder.open_e
26
- # fretboard = Fretboard::Builder.tuning_f
27
- # fretboard = Fretboard::Builder.open_f
28
- # fretboard = Fretboard::Builder.tuning_g
29
- # fretboard = Fretboard::Builder.open_g
30
- # fretboard = Fretboard::Builder.open_g_minor
31
- # fretboard = Fretboard::Builder.drop_g_sharp
32
- # fretboard = Fretboard::Builder.modal_g
33
-
34
- # fretboard.build
35
- # fretboard.data
36
- # fretboard.draw
37
-
4
+ class Builder
38
5
  DEFAULT_NUMBER_OF_FRETS = 12
39
6
 
40
- # METHODS_NAMES = %i[
41
- # standard
42
- # tuning_a
43
- # open_a
44
- # drop_a
45
- # drop_a_sharp
46
- # drop_a_flat
47
- # tuning_b
48
- # open_b
49
- # drop_b
50
- # drop_b_flat
51
- # tuning_c
52
- # open_c
53
- # drop_c
54
- # tuning_d
55
- # open_d
56
- # open_d_minor
57
- # drop_d
58
- # double_drop_d
59
- # modal_d
60
- # open_e
61
- # tuning_f
62
- # open_f
63
- # tuning_g
64
- # open_g
65
- # open_g_minor
66
- # drop_g_sharp
67
- # modal_g
68
- # ].freeze
69
-
70
7
  attr_reader :data
71
8
 
72
- # METHODS_NAMES.each do |method_name|
73
- # define_method(method_name) do |number_of_frets = DEFAULT_NUMBER_OF_FRETS|
74
- # new(method_name, number_of_frets)
75
- # end
76
- # end
77
-
78
- def self.standard(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
79
- new(:standard, number_of_frets)
80
- end
81
-
82
- def self.tuning_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
83
- new(:tuning_a, number_of_frets)
84
- end
85
-
86
- def self.open_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
87
- new(:open_a, number_of_frets)
88
- end
89
-
90
- def self.drop_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
91
- new(:drop_a, number_of_frets)
92
- end
93
-
94
- def self.drop_a_sharp(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
95
- new(:drop_a_sharp, number_of_frets)
96
- end
97
-
98
- def self.drop_a_flat(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
99
- new(:drop_a_flat, number_of_frets)
100
- end
101
-
102
- def self.tuning_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
103
- new(:tuning_b, number_of_frets)
104
- end
105
-
106
- def self.open_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
107
- new(:open_b, number_of_frets)
108
- end
109
-
110
- def self.drop_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
111
- new(:drop_b, number_of_frets)
112
- end
113
-
114
- def self.drop_b_flat(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
115
- new(:drop_b_flat, number_of_frets)
116
- end
117
-
118
- def self.tuning_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
119
- new(:tuning_c, number_of_frets)
120
- end
121
-
122
- def self.open_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
123
- new(:open_c, number_of_frets)
124
- end
125
-
126
- def self.drop_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
127
- new(:drop_c, number_of_frets)
128
- end
129
-
130
- def self.tuning_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
131
- new(:tuning_d, number_of_frets)
132
- end
133
-
134
- def self.open_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
135
- new(:open_d, number_of_frets)
136
- end
137
-
138
- def self.open_d_minor(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
139
- new(:open_d_minor, number_of_frets)
140
- end
141
-
142
- def self.drop_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
143
- new(:drop_d, number_of_frets)
144
- end
145
-
146
- def self.double_drop_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
147
- new(:double_drop_d, number_of_frets)
148
- end
149
-
150
- def self.modal_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
151
- new(:modal_d, number_of_frets)
152
- end
153
-
154
- def self.open_e(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
155
- new(:open_e, number_of_frets)
156
- end
157
-
158
- def self.tuning_f(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
159
- new(:tuning_f, number_of_frets)
160
- end
161
-
162
- def self.open_f(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
163
- new(:open_f, number_of_frets)
164
- end
165
-
166
- def self.tuning_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
167
- new(:tuning_g, number_of_frets)
168
- end
169
-
170
- def self.open_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
171
- new(:open_g, number_of_frets)
172
- end
173
-
174
- def self.open_g_minor(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
175
- new(:open_g_minor, number_of_frets)
176
- end
177
-
178
- def self.drop_g_sharp(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
179
- new(:drop_g_sharp, number_of_frets)
180
- end
181
-
182
- def self.modal_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
183
- new(:modal_g, number_of_frets)
9
+ Fretboard::Tunings.list.each_key do |tuning_name|
10
+ define_singleton_method(tuning_name.downcase) do |number_of_frets = DEFAULT_NUMBER_OF_FRETS|
11
+ new(tuning_name, number_of_frets)
12
+ end
184
13
  end
185
14
 
186
15
  def initialize(tuning, number_of_frets = DEFAULT_NUMBER_OF_FRETS)
@@ -191,51 +20,37 @@ module Fretboard
191
20
  end
192
21
 
193
22
  def build(sharp_or_flat: :both) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
194
- unless Fretboard::Tunings.exists?(@tuning)
195
- Fretboard::Console.danger("Unable to detect guitar tuning")
196
- return
197
- end
23
+ raise Fretboard::Exceptions::UnknownTuning, @tuning unless Fretboard::Tunings.exists?(@tuning)
24
+
25
+ @sharp_or_flat = sharp_or_flat
198
26
 
199
27
  tuning = Fretboard::Tunings.fetch(@tuning)
200
28
  strings = tuning[:STRINGS]
201
29
  number_of_strings = strings.size
202
30
 
203
31
  (1..number_of_strings).each do |string_number|
204
- # puts
205
- # puts "String: #{string_number}"
206
- # puts
207
-
208
32
  current_note = strings[string_number][:NOTE]
209
33
 
210
34
  @data[string_number] = {}
211
-
212
- # puts "Fret: 0 (#{current_note})"
213
-
214
35
  @data[string_number][0] = current_note
215
36
 
216
37
  (1..@number_of_frets).each do |fret|
217
38
  next_note = Fretboard::Note.next_for(
218
39
  current_note,
219
- sharp_or_flat: sharp_or_flat
40
+ sharp_or_flat:
220
41
  )
221
42
 
222
- # puts "Fret: #{fret} (#{next_note})"
223
-
224
43
  @data[string_number][fret] = next_note
225
44
 
226
45
  current_note = next_note
227
46
  end
228
47
  end
229
48
 
230
- # puts
231
- # puts 'done'
49
+ self
232
50
  end
233
51
 
234
- def draw(sharp_or_flat: :both) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
235
- unless @data.any?
236
- Fretboard::Console.danger("Build the guitar fretboard data for drawing")
237
- return
238
- end
52
+ def draw(sharp_or_flat: @sharp_or_flat || :both) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
53
+ raise Fretboard::Exceptions::NotBuilt unless @data.any?
239
54
 
240
55
  headings = []
241
56
  rows = []
@@ -248,18 +63,7 @@ module Fretboard
248
63
 
249
64
  headings << 0
250
65
 
251
- open_note = string_notes[0]
252
-
253
- if open_note.is_a?(Array)
254
- open_note = case sharp_or_flat
255
- when :both
256
- open_note.join("/")
257
- when :sharp
258
- open_note.first
259
- else
260
- open_note.last
261
- end
262
- end
66
+ open_note = Fretboard::NoteFormatter.format(string_notes[0], sharp_or_flat:)
263
67
 
264
68
  row << open_note
265
69
 
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "colorize"
4
- require "terminal-table"
5
-
6
3
  module Fretboard
7
4
  class Console
8
5
  def self.log(text)
@@ -23,8 +20,8 @@ module Fretboard
23
20
 
24
21
  def self.print_table(headings, rows)
25
22
  table = Terminal::Table.new(
26
- headings: headings,
27
- rows: rows,
23
+ headings:,
24
+ rows:,
28
25
  style: { border_x: "~", border_i: "~" }
29
26
  )
30
27
 
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fretboard
4
+ module Exceptions
5
+ class Base < StandardError; end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fretboard
4
+ module Exceptions
5
+ class NotBuilt < Base
6
+ def initialize(msg = nil)
7
+ super(msg || "Build the guitar fretboard data for drawing")
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fretboard
4
+ module Exceptions
5
+ class UnknownNote < Base
6
+ def initialize(note = nil)
7
+ message = "Unknown note"
8
+ message = "#{message}: #{note}" if note
9
+ super(message)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fretboard
4
+ module Exceptions
5
+ class UnknownTuning < Base
6
+ def initialize(tuning_name = nil)
7
+ message = "Unable to detect guitar tuning"
8
+ message = "#{message}: #{tuning_name}" if tuning_name
9
+ super(message)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,38 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "fretboard/notes"
4
-
5
3
  module Fretboard
6
4
  class Note
7
- # Fretboard::Note.next_for('C')
8
- # Fretboard::Note.next_for(['F#', 'Gb'])
9
- # Fretboard::Note.next_for('F#/Gb')
10
-
11
- def self.next_for(note, sharp_or_flat: :both) # rubocop:disable Metrics/MethodLength
5
+ def self.next_for(note, sharp_or_flat: :both)
12
6
  all_notes = Fretboard::Notes.all(sharp_or_flat)
13
7
 
14
- if note.is_a?(Array)
15
- note = case sharp_or_flat
16
- when :both
17
- note.join("/")
18
- when :sharp
19
- note.first
20
- else
21
- note.last
22
- end
23
- end
8
+ note = Fretboard::NoteFormatter.format(note, sharp_or_flat:)
24
9
 
25
10
  current_index = all_notes.find_index(note)
11
+ raise Fretboard::Exceptions::UnknownNote, note if current_index.nil?
12
+
26
13
  next_index = current_index + 1
27
14
 
28
15
  next_note = all_notes[next_index]
29
- next_note = all_notes.first if next_note.blank?
16
+ next_note = all_notes.first if next_note.nil?
30
17
 
31
18
  next_note
32
19
  end
33
-
34
- def initialize(note)
35
- @note = note
36
- end
37
20
  end
38
21
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fretboard
4
+ module NoteFormatter
5
+ def self.format(note, sharp_or_flat: :both)
6
+ return note unless note.is_a?(Array)
7
+
8
+ case sharp_or_flat
9
+ when :both then note.join("/")
10
+ when :sharp then note.first
11
+ else note.last
12
+ end
13
+ end
14
+ end
15
+ end
@@ -2,10 +2,6 @@
2
2
 
3
3
  module Fretboard
4
4
  class Notes
5
- # Fretboard::Notes.all(:both)
6
- # Fretboard::Notes.all(:sharp)
7
- # Fretboard::Notes.all(:flat)
8
-
9
5
  BASIC_NOTES = {
10
6
  1 => "C",
11
7
  2 => %w[C# Db],
@@ -21,22 +17,9 @@ module Fretboard
21
17
  12 => "B"
22
18
  }.freeze
23
19
 
24
- def self.all(sharp_or_flat = :sharp) # rubocop:disable Metrics/MethodLength
20
+ def self.all(sharp_or_flat = :sharp)
25
21
  BASIC_NOTES.map do |_key, value|
26
- result = value
27
-
28
- if value.is_a?(Array)
29
- result = case sharp_or_flat
30
- when :both
31
- value.join("/")
32
- when :sharp
33
- value.first
34
- else
35
- value.last
36
- end
37
- end
38
-
39
- result
22
+ Fretboard::NoteFormatter.format(value, sharp_or_flat:)
40
23
  end
41
24
  end
42
25
 
@@ -1,15 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/core_ext/object/blank"
4
- require "active_support/core_ext/hash/except"
5
-
6
- require "optparse"
7
-
8
- require "fretboard/builder"
9
- require "fretboard/console"
10
- require "fretboard/note"
11
- require "fretboard/tunings"
12
-
13
3
  module Fretboard
14
4
  class Parser
15
5
  attr_reader :args
@@ -24,8 +14,10 @@ module Fretboard
24
14
 
25
15
  def parse
26
16
  parser.parse!(args)
17
+ rescue Fretboard::Exceptions::Base, OptionParser::ParseError => e
18
+ Fretboard::Console.danger(e.message)
27
19
  rescue StandardError => e
28
- Fretboard::Console.danger("Ambiguously completable string is encountered\n#{e}")
20
+ Fretboard::Console.danger("Unexpected error: #{e.message}")
29
21
  end
30
22
 
31
23
  private
@@ -35,7 +27,7 @@ module Fretboard
35
27
  opts.banner = "Usage: fretboard [options]"
36
28
 
37
29
  opts.on("-v", "--version", "The current version of the gem") do
38
- Fretboard::Console.log(Fretboard::VERSION)
30
+ Fretboard::Console.log(Fretboard::VERSION::STRING)
39
31
  exit
40
32
  end
41
33
 
@@ -31,9 +31,9 @@ module Fretboard
31
31
  OPEN_A: {
32
32
  STRINGS: {
33
33
  1 => { NOTE: "E" },
34
- 2 => { NOTE: "A" },
35
- 3 => { NOTE: "E" },
36
- 4 => { NOTE: %w[C# Db] },
34
+ 2 => { NOTE: %w[C# Db] },
35
+ 3 => { NOTE: "A" },
36
+ 4 => { NOTE: "E" },
37
37
  5 => { NOTE: "A" },
38
38
  6 => { NOTE: "E" }
39
39
  }
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Fretboard
4
4
  module VERSION
5
- MAJOR = 1
6
- MINOR = 6
5
+ MAJOR = 2
6
+ MINOR = 0
7
7
  PATCH = 0
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
data/lib/fretboard.rb CHANGED
@@ -1,15 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/core_ext/object/blank"
4
- require "active_support/core_ext/hash/except"
3
+ require "zeitwerk"
5
4
 
6
- require "fretboard/builder"
7
- require "fretboard/note"
8
- require "fretboard/notes"
9
- require "fretboard/tunings"
5
+ require "colorize"
6
+ require "optparse"
7
+ require "terminal-table"
10
8
 
11
- module Fretboard
12
- # extend Constants
13
- end
9
+ loader = Zeitwerk::Loader.for_gem
10
+ loader.setup
11
+
12
+ module Fretboard; end
14
13
 
15
14
  require "fretboard/engine" if defined?(Rails::Engine)
metadata CHANGED
@@ -1,29 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fretboard
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Sokolov
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-03-23 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '5.1'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '5.1'
27
12
  - !ruby/object:Gem::Dependency
28
13
  name: colorize
29
14
  requirement: !ruby/object:Gem::Requirement
@@ -44,28 +29,28 @@ dependencies:
44
29
  requirements:
45
30
  - - ">="
46
31
  - !ruby/object:Gem::Version
47
- version: '3.0'
32
+ version: '4.0'
48
33
  type: :runtime
49
34
  prerelease: false
50
35
  version_requirements: !ruby/object:Gem::Requirement
51
36
  requirements:
52
37
  - - ">="
53
38
  - !ruby/object:Gem::Version
54
- version: '3.0'
39
+ version: '4.0'
55
40
  - !ruby/object:Gem::Dependency
56
- name: appraisal
41
+ name: zeitwerk
57
42
  requirement: !ruby/object:Gem::Requirement
58
43
  requirements:
59
44
  - - ">="
60
45
  - !ruby/object:Gem::Version
61
- version: '2.5'
62
- type: :development
46
+ version: '2.6'
47
+ type: :runtime
63
48
  prerelease: false
64
49
  version_requirements: !ruby/object:Gem::Requirement
65
50
  requirements:
66
51
  - - ">="
67
52
  - !ruby/object:Gem::Version
68
- version: '2.5'
53
+ version: '2.6'
69
54
  - !ruby/object:Gem::Dependency
70
55
  name: rake
71
56
  requirement: !ruby/object:Gem::Requirement
@@ -95,61 +80,19 @@ dependencies:
95
80
  - !ruby/object:Gem::Version
96
81
  version: '3.12'
97
82
  - !ruby/object:Gem::Dependency
98
- name: rubocop
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '1.57'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '1.57'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop-performance
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '1.19'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '1.19'
125
- - !ruby/object:Gem::Dependency
126
- name: rubocop-rake
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0.6'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0.6'
139
- - !ruby/object:Gem::Dependency
140
- name: rubocop-rspec
83
+ name: servactory-rubocop
141
84
  requirement: !ruby/object:Gem::Requirement
142
85
  requirements:
143
86
  - - ">="
144
87
  - !ruby/object:Gem::Version
145
- version: '2.24'
88
+ version: '0.9'
146
89
  type: :development
147
90
  prerelease: false
148
91
  version_requirements: !ruby/object:Gem::Requirement
149
92
  requirements:
150
93
  - - ">="
151
94
  - !ruby/object:Gem::Version
152
- version: '2.24'
95
+ version: '0.9'
153
96
  description: Tools for working with the guitar fretboard
154
97
  email:
155
98
  - profox.rus@gmail.com
@@ -165,7 +108,12 @@ files:
165
108
  - lib/fretboard/builder.rb
166
109
  - lib/fretboard/console.rb
167
110
  - lib/fretboard/engine.rb
111
+ - lib/fretboard/exceptions/base.rb
112
+ - lib/fretboard/exceptions/not_built.rb
113
+ - lib/fretboard/exceptions/unknown_note.rb
114
+ - lib/fretboard/exceptions/unknown_tuning.rb
168
115
  - lib/fretboard/note.rb
116
+ - lib/fretboard/note_formatter.rb
169
117
  - lib/fretboard/notes.rb
170
118
  - lib/fretboard/parser.rb
171
119
  - lib/fretboard/tunings.rb
@@ -179,7 +127,6 @@ metadata:
179
127
  source_code_uri: https://github.com/afuno/fretboard
180
128
  bug_tracker_uri: https://github.com/afuno/fretboard/issues
181
129
  rubygems_mfa_required: 'true'
182
- post_install_message:
183
130
  rdoc_options: []
184
131
  require_paths:
185
132
  - lib
@@ -187,15 +134,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
187
134
  requirements:
188
135
  - - ">="
189
136
  - !ruby/object:Gem::Version
190
- version: 2.7.0
137
+ version: '3.2'
191
138
  required_rubygems_version: !ruby/object:Gem::Requirement
192
139
  requirements:
193
140
  - - ">="
194
141
  - !ruby/object:Gem::Version
195
142
  version: '0'
196
143
  requirements: []
197
- rubygems_version: 3.5.6
198
- signing_key:
144
+ rubygems_version: 4.0.6
199
145
  specification_version: 4
200
146
  summary: Tools for working with the guitar fretboard
201
147
  test_files: []