lib/coltrane/renderers/text_renderer/representation_guitar_chord_drawer.rb
# frozen_string_literal: true
module Coltrane
module Renderers
module TextRenderer
class RepresentationGuitarChordDrawer < BaseDrawer
alias chord model
def chord_height
chord.max_fret_span
end
def guitar
chord.guitar
end
def render
render_top(chord) +
(chord.lowest_fret..chord.lowest_fret + chord_height)
.each_with_index.reduce('') do |memo1, (f, y)|
memo1 +
' ' +
(chord.guitar.strings.size * 2).times.map { |x| base_color border(x, y) }.join('') +
"\n" +
chord.guitar.strings.reduce(base_color(f.to_s.ljust(2, ' '))) do |memo2, s|
memo2 +
' ' +
render_note(chord.guitar_notes.select do |n|
n.string == s && n.fret == f
end.any?)
end +
" \n"
end + ' ' +
(chord.guitar.strings.size * 2).times.map do |x|
base_color border(x, chord_height + 1)
end.join('')
end
def border(x, y)
edge = [guitar.tuning.size * 2 - 2, chord_height + 1]
x_on_start = x == 0
y_on_start = y == 0
x_on_edge = x == edge[0]
y_on_edge = y == edge[1]
x_on_middle = (0...edge[0]).cover?(x)
y_on_middle = (0...edge[1]).cover?(y)
if x_on_start && y_on_start then '┍'
elsif x_on_middle && y_on_start then x.odd? ? '━' : '┯'
elsif x_on_edge && y_on_start then '┑'
elsif x_on_start && y_on_middle then '┝'
elsif x_on_middle && y_on_middle then x.odd? ? '━' : '┿'
elsif x_on_edge && y_on_middle then '┥'
elsif x_on_start && y_on_edge then '┕'
elsif x_on_middle && y_on_edge then x.odd? ? '━' : '┷'
elsif x_on_edge && y_on_edge then '┙'
else ' '
end
# puts edge.inspect
# "#{x},#{y} "
end
def base_color(str)
Paint[str, '#6A4AC2']
end
def highlight(str)
Paint[str, '#E67831']
end
def alt(str)
Paint[str, '#2DD380']
end
def render_top(chord)
chord.guitar.strings.reduce(' ') do |memo, s|
memo +
if chord.guitar_notes.select do |n|
n.string == s && n.fret == 0 end.any?
highlight '• '
elsif chord.guitar_notes.select { |n| n.string == s && n.fret.nil? }.any?
alt 'x '
else
' '
end
end + "\n"
end
def render_note(found)
found ? highlight('•') : base_color('│')
end
end
end
end
end