Class: Fretboard::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/fretboard/builder.rb

Overview

rubocop:disable Metrics/ClassLength

Constant Summary collapse

DEFAULT_NUMBER_OF_FRETS =

fretboard.build fretboard.data fretboard.draw

12

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(tuning, number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Builder

Returns a new instance of Builder.



186
187
188
189
190
191
# File 'lib/fretboard/builder.rb', line 186

def initialize(tuning, number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  @tuning = tuning.upcase.to_sym
  @number_of_frets = number_of_frets

  @data = {}
end

Instance Attribute Details

#dataObject (readonly)

METHODS_NAMES = %i[

standard
tuning_a
open_a
drop_a
drop_a_sharp
drop_a_flat
tuning_b
open_b
drop_b
drop_b_flat
tuning_c
open_c
drop_c
tuning_d
open_d
open_d_minor
drop_d
double_drop_d
modal_d
open_e
tuning_f
open_f
tuning_g
open_g
open_g_minor
drop_g_sharp
modal_g

].freeze



70
71
72
# File 'lib/fretboard/builder.rb', line 70

def data
  @data
end

Class Method Details

.double_drop_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



146
147
148
# File 'lib/fretboard/builder.rb', line 146

def self.double_drop_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:double_drop_d, number_of_frets)
end

.drop_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



90
91
92
# File 'lib/fretboard/builder.rb', line 90

def self.drop_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:drop_a, number_of_frets)
end

.drop_a_flat(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



98
99
100
# File 'lib/fretboard/builder.rb', line 98

def self.drop_a_flat(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:drop_a_flat, number_of_frets)
end

.drop_a_sharp(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



94
95
96
# File 'lib/fretboard/builder.rb', line 94

def self.drop_a_sharp(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:drop_a_sharp, number_of_frets)
end

.drop_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



110
111
112
# File 'lib/fretboard/builder.rb', line 110

def self.drop_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:drop_b, number_of_frets)
end

.drop_b_flat(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



114
115
116
# File 'lib/fretboard/builder.rb', line 114

def self.drop_b_flat(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:drop_b_flat, number_of_frets)
end

.drop_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



126
127
128
# File 'lib/fretboard/builder.rb', line 126

def self.drop_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:drop_c, number_of_frets)
end

.drop_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



142
143
144
# File 'lib/fretboard/builder.rb', line 142

def self.drop_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:drop_d, number_of_frets)
end

.drop_g_sharp(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



178
179
180
# File 'lib/fretboard/builder.rb', line 178

def self.drop_g_sharp(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:drop_g_sharp, number_of_frets)
end


150
151
152
# File 'lib/fretboard/builder.rb', line 150

def self.modal_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:modal_d, number_of_frets)
end


182
183
184
# File 'lib/fretboard/builder.rb', line 182

def self.modal_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:modal_g, number_of_frets)
end

.open_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



86
87
88
# File 'lib/fretboard/builder.rb', line 86

def self.open_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:open_a, number_of_frets)
end

.open_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



106
107
108
# File 'lib/fretboard/builder.rb', line 106

def self.open_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:open_b, number_of_frets)
end

.open_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



122
123
124
# File 'lib/fretboard/builder.rb', line 122

def self.open_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:open_c, number_of_frets)
end

.open_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



134
135
136
# File 'lib/fretboard/builder.rb', line 134

def self.open_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:open_d, number_of_frets)
end

.open_d_minor(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



138
139
140
# File 'lib/fretboard/builder.rb', line 138

def self.open_d_minor(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:open_d_minor, number_of_frets)
end

.open_e(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



154
155
156
# File 'lib/fretboard/builder.rb', line 154

def self.open_e(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:open_e, number_of_frets)
end

.open_f(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



162
163
164
# File 'lib/fretboard/builder.rb', line 162

def self.open_f(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:open_f, number_of_frets)
end

.open_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



170
171
172
# File 'lib/fretboard/builder.rb', line 170

def self.open_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:open_g, number_of_frets)
end

.open_g_minor(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



174
175
176
# File 'lib/fretboard/builder.rb', line 174

def self.open_g_minor(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:open_g_minor, number_of_frets)
end

.standard(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object

METHODS_NAMES.each do |method_name|

define_method(method_name) do |number_of_frets = DEFAULT_NUMBER_OF_FRETS|
  new(method_name, number_of_frets)
end

end



78
79
80
# File 'lib/fretboard/builder.rb', line 78

def self.standard(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:standard, number_of_frets)
end

.tuning_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



82
83
84
# File 'lib/fretboard/builder.rb', line 82

def self.tuning_a(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:tuning_a, number_of_frets)
end

.tuning_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



102
103
104
# File 'lib/fretboard/builder.rb', line 102

def self.tuning_b(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:tuning_b, number_of_frets)
end

.tuning_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



118
119
120
# File 'lib/fretboard/builder.rb', line 118

def self.tuning_c(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:tuning_c, number_of_frets)
end

.tuning_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



130
131
132
# File 'lib/fretboard/builder.rb', line 130

def self.tuning_d(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:tuning_d, number_of_frets)
end

.tuning_f(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



158
159
160
# File 'lib/fretboard/builder.rb', line 158

def self.tuning_f(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:tuning_f, number_of_frets)
end

.tuning_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS) ⇒ Object



166
167
168
# File 'lib/fretboard/builder.rb', line 166

def self.tuning_g(number_of_frets = DEFAULT_NUMBER_OF_FRETS)
  new(:tuning_g, number_of_frets)
end

Instance Method Details

#build(sharp_or_flat: :both) ⇒ Object

rubocop:disable Metrics/MethodLength, Metrics/AbcSize



193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/fretboard/builder.rb', line 193

def build(sharp_or_flat: :both) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
  unless Fretboard::Tunings.exists?(@tuning)
    Fretboard::Console.danger("Unable to detect guitar tuning")
    return
  end

  tuning = Fretboard::Tunings.fetch(@tuning)
  strings = tuning[:STRINGS]
  number_of_strings = strings.size

  (1..number_of_strings).each do |string_number|
    # puts
    # puts "String: #{string_number}"
    # puts

    current_note = strings[string_number][:NOTE]

    @data[string_number] = {}

    # puts "Fret: 0 (#{current_note})"

    @data[string_number][0] = current_note

    (1..@number_of_frets).each do |fret|
      next_note = Fretboard::Note.next_for(
        current_note,
        sharp_or_flat: sharp_or_flat
      )

      # puts "Fret: #{fret} (#{next_note})"

      @data[string_number][fret] = next_note

      current_note = next_note
    end
  end

  # puts
  # puts 'done'
end

#draw(sharp_or_flat: :both) ⇒ Object

rubocop:disable Metrics/MethodLength, Metrics/AbcSize



234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# File 'lib/fretboard/builder.rb', line 234

def draw(sharp_or_flat: :both) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
  unless @data.any?
    Fretboard::Console.danger("Build the guitar fretboard data for drawing")
    return
  end

  headings = []
  rows = []

  @data.each_pair do |string_number, string_notes|
    row = []

    headings << ""
    row << string_number

    headings << 0

    open_note = string_notes[0]

    if open_note.is_a?(Array)
      open_note = case sharp_or_flat
                  when :both
                    open_note.join("/")
                  when :sharp
                    open_note.first
                  else
                    open_note.last
                  end
    end

    row << open_note

    string_notes.except(0).each_pair do |fret, note|
      headings << fret
      row << note
    end

    rows << row
  end

  Fretboard::Console.print_table(headings.uniq, rows)

  nil
end