Module: ChordDiagrams

Defined in:
lib/chord_diagrams.rb,
lib/chord_diagrams/version.rb,
lib/chord_diagrams/fingerings.rb

Constant Summary collapse

LINE_STYLE =
{
  stroke: :black,
  stroke_width: 2,
  stroke_linecap: :square
}.freeze
VERSION =
"0.0.27".freeze
GUITAR_FINGERINGS =
guitar_fingerings.freeze
UKULELE_FINGERINGS =
ukulele_fingerings.freeze

Class Method Summary collapse

Class Method Details

.draw_chord_diagram(fingerings, svg) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/chord_diagrams.rb', line 107

def draw_chord_diagram(fingerings, svg)
  fingerings = fingerings.chars

  lowest_fret = fingerings.reject { |fret| fret.to_i < 1 }.min
  highest_fret = fingerings.reject { |fret| fret.to_i < 1 }.max

  if lowest_fret.to_i > 3 || highest_fret.to_i > 4
    draw_fret_number(lowest_fret, svg)

    fingerings = shift_guitar_fingerings(fingerings, lowest_fret)
  elsif fingerings.size == 6
    draw_guitar_nut(svg)
  else
    draw_ukulele_nut(svg)
  end

  fingerings.each_with_index do |fingering, index|
    offset = 50 + (20 * index)

    if fingering == "x"
      draw_muted_string(offset, svg)
    elsif fingering == "0"
      draw_open_string(offset, svg)
    else
      draw_fingered_string(fingering, offset, svg)
    end
  end
end

.draw_fingered_string(fingering, offset, svg) ⇒ Object



150
151
152
153
154
# File 'lib/chord_diagrams.rb', line 150

def draw_fingered_string(fingering, offset, svg)
  svg.circle cx: offset, cy: 70 + (fingering.to_i * 20), r: 8, style: {
    fill: :black
  }
end

.draw_guitar_frets(svg) ⇒ Object



63
64
65
66
67
# File 'lib/chord_diagrams.rb', line 63

def draw_guitar_frets(svg)
  [80, 100, 120, 140, 160].each do |y|
    svg.line x1: 50, y1: y, x2: 150, y2: y, style: LINE_STYLE
  end
end

.draw_guitar_missing_chord_diagram(name, svg) ⇒ Object



87
88
89
90
91
92
93
94
95
# File 'lib/chord_diagrams.rb', line 87

def draw_guitar_missing_chord_diagram(name, svg)
  puts "Couldn't find fingerings for the Guitar chord '#{name}'"

  svg.text "?", x: 102, y: 155, text_anchor: :middle, style: {
    font_size: 96,
    font_weight: :bold,
    fill: :gray
  }
end

.draw_guitar_name(name, svg) ⇒ Object



56
57
58
59
60
61
# File 'lib/chord_diagrams.rb', line 56

def draw_guitar_name(name, svg)
  svg.text name, id: "chordName", x: 100, y: 40, text_anchor: :middle, style: {
    font_size: 36,
    font_weight: :bold
  }
end

.draw_guitar_nut(svg) ⇒ Object



136
137
138
139
140
141
# File 'lib/chord_diagrams.rb', line 136

def draw_guitar_nut(svg)
  svg.line id: "nut", x1: 49, y1: 77, x2: 151, y2: 77, style: {
    stroke: :black,
    stroke_width: 8
  }
end

.draw_guitar_strings(svg) ⇒ Object



75
76
77
78
79
# File 'lib/chord_diagrams.rb', line 75

def draw_guitar_strings(svg)
  [50, 70, 90, 110, 130, 150].each do |x|
    svg.line x1: x, y1: 80, x2: x, y2: 160, style: LINE_STYLE
  end
end

.draw_muted_string(offset, svg) ⇒ Object



162
163
164
165
# File 'lib/chord_diagrams.rb', line 162

def draw_muted_string(offset, svg)
  svg.line x1: offset - 4, y1: 61 - 4, x2: offset + 4, y2: 61 + 4, style: LINE_STYLE
  svg.line x1: offset - 4, y1: 61 + 4, x2: offset + 4, y2: 61 - 4, style: LINE_STYLE
end

.draw_open_string(offset, svg) ⇒ Object



156
157
158
159
160
# File 'lib/chord_diagrams.rb', line 156

def draw_open_string(offset, svg)
  svg.circle cx: offset, cy: 61, r: 6, style: {
    stroke: :black, fill: :white, stroke_width: 2
  }
end

.draw_ukulele_frets(svg) ⇒ Object



69
70
71
72
73
# File 'lib/chord_diagrams.rb', line 69

def draw_ukulele_frets(svg)
  [80, 100, 120, 140, 160].each do |y|
    svg.line x1: 50, y1: y, x2: 110, y2: y, style: LINE_STYLE
  end
end

.draw_ukulele_missing_chord_diagram(name, svg) ⇒ Object



97
98
99
100
101
102
103
104
105
# File 'lib/chord_diagrams.rb', line 97

def draw_ukulele_missing_chord_diagram(name, svg)
  puts "Couldn't find fingerings for the Ukulele chord '#{name}'"

  svg.text "?", x: 81, y: 155, text_anchor: :middle, style: {
    font_size: 96,
    font_weight: :bold,
    fill: :gray
  }
end

.draw_ukulele_name(name, svg) ⇒ Object



49
50
51
52
53
54
# File 'lib/chord_diagrams.rb', line 49

def draw_ukulele_name(name, svg)
  svg.text name, id: "chordName", x: 80, y: 40, text_anchor: :middle, style: {
    font_size: 36,
    font_weight: :bold
  }
end

.draw_ukulele_nut(svg) ⇒ Object



143
144
145
146
147
148
# File 'lib/chord_diagrams.rb', line 143

def draw_ukulele_nut(svg)
  svg.line id: "nut", x1: 49, y1: 77, x2: 111, y2: 77, style: {
    stroke: :black,
    stroke_width: 8
  }
end

.draw_ukulele_strings(svg) ⇒ Object



81
82
83
84
85
# File 'lib/chord_diagrams.rb', line 81

def draw_ukulele_strings(svg)
  [50, 70, 90, 110].each do |x|
    svg.line x1: x, y1: 80, x2: x, y2: 160, style: LINE_STYLE
  end
end

.guitar_svg(name, fingering = nil) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/chord_diagrams.rb', line 31

def guitar_svg(name, fingering = nil)
  svg = Victor::SVG.new template: :minimal, width: 100, height: 100, viewBox: "0 0 200 200"

  ChordDiagrams.draw_guitar_name(name, svg)
  ChordDiagrams.draw_guitar_frets(svg)
  ChordDiagrams.draw_guitar_strings(svg)

  fingering = ChordDiagrams::GUITAR_FINGERINGS[name] if fingering.nil?

  if !fingering.nil?
    ChordDiagrams.draw_chord_diagram(fingering, svg)
  else
    ChordDiagrams.draw_guitar_missing_chord_diagram(name, svg)
  end

  svg.render
end

.ukulele_svg(name, fingering = nil) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/chord_diagrams.rb', line 13

def ukulele_svg(name, fingering = nil)
  svg = Victor::SVG.new template: :minimal, width: 80, height: 100, viewBox: "0 0 160 200"

  ChordDiagrams.draw_ukulele_name(name, svg)
  ChordDiagrams.draw_ukulele_frets(svg)
  ChordDiagrams.draw_ukulele_strings(svg)

  fingering = ChordDiagrams::UKULELE_FINGERINGS[name] if fingering.nil?

  if !fingering.nil?
    ChordDiagrams.draw_chord_diagram(fingering, svg)
  else
    ChordDiagrams.draw_ukulele_missing_chord_diagram(name, svg)
  end

  svg.render
end