Constructor de acordes para guitarra

Nota: Si quieres los acordes para tocar en la guitarra, ve a las notas de la guitarra en algo de música.

Como en mi sitio de música lo más pedido es como hacer los acordes en la guitarra, decidí que lo mejor era tener un sistema automizado para dibujar los dichosos gráficos. Jugando un poco con Ruby, llegué al siguiente programa

  1.  #!/bin/env ruby
  2.   require 'rvg/rvg'
  3.   include Magick
  4.  class Guitarchords
  5.   attr_accessor :frets, :fingers, :capo_strings, :first_fret, :strings,:name
  6.   def initialize
  7.   @name=""
  8.   @frets=3
  9.   @fingers=[0,0,0,0,0,0]
  10.   @capo_strings=0
  11.   @first_fret=1
  12.   @strings=[" "," "," "," "," "," "]
  13.   end
  14.   def to_s
  15.   t=" "
  16.   @strings.each {|s|
  17.   t+=s+" "
  18.   }
  19.   t+="\n"
  20.   t+=" ===========\n"
  21.   if(@first_fret>1)
  22.   t+=@first_fret.to_s.ljust(3)
  23.   end
  24.   if (@capo_strings>0)
  25.   1.upto(6) {|c|
  26.   if(7-@capo_strings<=c)
  27.   t+=(c<6)?"==":"="
  28.   else
  29.   t+="| "
  30.   end
  31.   }
  32.   t+="\n -----------\n"
  33.   end
  34.  
  35.   1.upto(@frets) {|fret|
  36.   t+=" " unless @first_fret>1 and @capo_strings==0 and fret==1
  37.   @fingers.each {|finger|
  38.   t+=(finger==fret)?"O":"|"
  39.   t+=" "
  40.   }
  41.   t+="\n -----------\n"
  42.   }
  43.   t
  44.   end
  45.  
  46.  end
  47.  class GuitarchordDraw
  48.   attr_accessor :fret_w,:fret_h,:base_x,:base_y,:f0w,:circle_r
  49.  def initialize(gc)
  50.   @gc=gc
  51.   @fff=(@gc.capo_strings>1?1:0) # first fret finger
  52.   @fret_w=40
  53.   @fret_h=80
  54.   @base_x=70
  55.   @base_y=100
  56.   @f0w=10 # fret 0 width
  57.   @circle_r=15
  58.  end
  59.  def base_w
  60.   @fret_w*5
  61.  end
  62.  def base_h
  63.   @f0w+(@gc.frets+@fff)*@fret_h
  64.  end
  65.  def total_w
  66.   @base_x*2+base_w
  67.  end
  68.  def total_y
  69.   @base_y*2+base_h
  70.  end
  71.  def name_x
  72.   total_w/2
  73.  end
  74.  def name_y
  75.   @base_y/2-20
  76.  end
  77.  def draw(file)
  78.   RVG::dpi = 72
  79.   t_frets=@gc.frets+@fff
  80.   rvg = RVG.new(60.mm, (20+20*t_frets).mm).viewbox(0,0,total_w,total_y) do |canvas|
  81.   canvas.background_fill = 'white'
  82.   canvas.g.translate(@base_x,@base_y) do |base|
  83.   base.styles(:fill=>'white', :stroke=>'black', :stroke_width=>2)
  84.   base.rect(base_w,base_h,0,0)
  85.   0.upto(t_frets) {|fret|
  86.   base.line(0,@f0w+fret*@fret_h,base_w,@f0w+fret*@fret_h)
  87.   }
  88.   1.upto(5) {|string|
  89.   base.line(string*@fret_w,0,string*@fret_w,@f0w+t_frets*@fret_h)
  90.   }
  91.   end
  92.   if(@gc.first_fret>1)
  93.   canvas.g.translate(@base_x/2,@base_y+@f0w+@fret_h/2) do |ff|
  94.   ff.styles(:font_family=>'courier',:text_anchor=>'middle', :font_size=>36)
  95.   ff.text(0,0,@gc.first_fret.to_s)
  96.   end
  97.   end
  98.   canvas.g.translate(name_x,name_y) do |name|
  99.   name.styles(:font_family=>'serif',:text_anchor=>'middle', :font_size=>42, :font_weight=>'bold')
  100.   name.text(0,0,@gc.name)
  101.   end
  102.   if (@gc.capo_strings>0)
  103.   canvas.g.translate(@base_x,@base_y+@f0w) do |capo|
  104.   capo.styles(:fill=>'black', :stroke=>'black', :stroke_width=>1)
  105.   capo.rect((@gc.capo_strings-1)*@fret_w+10,10,
  106.   (base_w)-5-(@gc.capo_strings-1)*@fret_w,@fret_h/2-10)
  107.   end
  108.   end
  109.   canvas.g.translate(@base_x,@base_y-10) do |strings|
  110.   c=0
  111.   strings.styles(:font_family=>'courier',:text_anchor=>'middle', :font_size=>36)
  112.   @gc.strings.each {|s|
  113.   strings.text(c*@fret_w,0,s)
  114.   c+=1
  115.   }
  116.   end
  117.   canvas.g.translate(@base_x,@base_y+@fff*@fret_h) do |fingers|
  118.   fingers.styles(:fill=>'black', :stroke=>'black', :stroke_width=>1)
  119.   0.upto(5) {|string|
  120.   if(@gc.fingers[string]>0)
  121.   fingers.circle(@circle_r, string*@fret_w, @gc.fingers[string]*@fret_h-(@fret_h/2)+@f0w)
  122.   end
  123.   }
  124.   end
  125.   end
  126.   rvg.draw.write(file)
  127.   end
  128.  end
  129.  
  130.  g=Guitarchords.new
  131.  g.frets=3
  132.  g.name="D7/11(C.5)"
  133.  g.first_fret=5
  134.  g.capo_strings=6
  135.  g.fingers=[0,0,2,0,3,0]
  136.  g.strings=["o","O","o","o","o","o"]
  137.  puts ""
  138.  puts g.to_s
  139.  gdd=GuitarchordDraw.new(g)
  140.  gdd.draw("test.png")

Nada muy complicado y cumple perfectamente su función. La salida de consola es:

   o O o o o o 
   ===========
5  ===========
   -----------
   | | | | | | 
   -----------
   | | O | | | 
   -----------
   | | | | O | 
   -----------

Y el .png resultante:

Lo único que me falta ahora es crear un pequeño parser, que permitiría crear una base de datos de acordes como la siguiente:

# Nombre acorde:dedos en cuerda[:cuerdas a tocar[:número del primer traste[:número de dedos en cejilla]]]
C:032010: O    
D:000232:XoOooo
E:022100:O    
F:022100:O     :1:6
G:320033:O     
A:002220: O    
B:002220: O    :2:6
Imagen de Perejilillo desconocido

necesitaria por varo que me den los graficos calros, no con los ___o___ i td eso, de todos los acordes para guitarra criolla, mayores, menores, bemoles, sostenidos.. etc. gracias

Enviado por Perejilillo desconocido el Dom, 30/09/2007 - 17:46.
icono de usuario

che mira yo soy fans de the doors de los rollig stones y me compre una guitarra pero no se como se toca y me gustaria aprender igual soy re drogin y re alclico como todo rockanrollero jajajjajaja!!!!

Enviado por pity (no verificado) el Lun, 10/12/2007 - 19:02.
icono de usuario

"¿...de tal manera de crear una suerte de...?" Un pelín forzado, ¿no? (perdón por el off-topic)

Enviado por Perijilillo Desconocido (no verificado) el Sáb, 04/02/2006 - 05:39.
Imagen de clbustos

Jajajaja. Sí, tienes razón. Eso pasa cuando haces muchos informes psicológicos y te acostumbras a darle muchas vueltas a las cosas simples.

Lo corregiré

Enviado por clbustos el Dom, 05/02/2006 - 01:57.
icono de usuario

necesito aprender a tocar guitarra..pero no se hacer las notas.. alguien me enseña??

Enviado por NEgra (no verificado) el Jue, 08/06/2006 - 16:29.
Imagen de clbustos

Visita http://musica.apsique.com/node/65 para ver los acordes de la guitarra.

Enviado por clbustos el Jue, 08/06/2006 - 19:10.
icono de usuario

necesito que me manden las notas para tocar guitarra ya que yo todavia no se he entrado a muchas paginas pero ninguna me sirve confio en ustedes bay

Enviado por nora navarro gatica (no verificado) el Dom, 23/07/2006 - 21:57.
icono de usuario

quiero que me dean todos los acordes de guitarra

Enviado por juan pedro flores ramos (no verificado) el Mié, 04/10/2006 - 19:35.

Enviar un comentario nuevo

El contenido de este campo se mantiene como privado y no se muestra públicamente.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato