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
- .draw_chord_diagram(fingerings, svg) ⇒ Object
- .draw_fingered_string(fingering, offset, svg) ⇒ Object
- .draw_guitar_frets(svg) ⇒ Object
- .draw_guitar_missing_chord_diagram(name, svg) ⇒ Object
- .draw_guitar_name(name, svg) ⇒ Object
- .draw_guitar_nut(svg) ⇒ Object
- .draw_guitar_strings(svg) ⇒ Object
- .draw_muted_string(offset, svg) ⇒ Object
- .draw_open_string(offset, svg) ⇒ Object
- .draw_ukulele_frets(svg) ⇒ Object
- .draw_ukulele_missing_chord_diagram(name, svg) ⇒ Object
- .draw_ukulele_name(name, svg) ⇒ Object
- .draw_ukulele_nut(svg) ⇒ Object
- .draw_ukulele_strings(svg) ⇒ Object
- .guitar_svg(name, fingering = nil) ⇒ Object
- .ukulele_svg(name, fingering = nil) ⇒ Object
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 |