Siirry sisältöön

Moduuli:Kitarakirja/Otelauta

Wikikirjastosta

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:Kitarakirja/Otelauta/ohje

local p = {}

local notedata = require "Moduuli:Kitarakirja/Nuottidata"
local lily     = require "Moduuli:Kitarakirja/Lily"
local tekstipohja = require "Moduuli:Tekstipohja"

local N_STRINGS = 6

local viritys = {
   notedata.getNoteIndex("e",  1),
   notedata.getNoteIndex("b",  0),
   notedata.getNoteIndex("g",  0),
   notedata.getNoteIndex("d",  0),
   notedata.getNoteIndex("a", -1),
   notedata.getNoteIndex("e", -1),
}

local fretLabels = {
   '<br/><span style="font-size: 0.8em;">(XII)</span>',
   'I<br/><span style="font-size: 0.8em;">(XIII)</span>',
   'II<br/><span style="font-size: 0.8em;">(XIV)</span>',
   'III<br/><span style="font-size: 0.8em;">(XV)</span>',
   'IV<br/><span style="font-size: 0.8em;">(XVI)</span>',
   'V<br/><span style="font-size: 0.8em;">(XVII)</span>',
   'VI<br/><span style="font-size: 0.8em;">(XVIII)</span>',
   'VII<br/><span style="font-size: 0.8em;">(XIX)</span>',
   'IIX<br/><span style="font-size: 0.8em;">(XX)</span>',
   'IX<br/><span style="font-size: 0.8em;">(XXI)</span>',
   'X<br/><span style="font-size: 0.8em;">(XXII)</span>',
   'XI<br/><span style="font-size: 0.8em;">(XXIII)</span>',
   'XII<br/><span style="font-size: 0.8em;">(XXIV)</span>' }

local TABLE_HTML = [=[
<table class="otelauta" border="1" style="border-collapse: collapse; empty-cells: show; text-align: center; table-layout: fixed; width: 100%;">
  <tr style="font-family: serif; height: 5em;">
    {{{FRET_NUMBERS
     }}}
  </tr>

  {{{STRINGS
  }}}

</table>
]=]


-- Kieltä esittävä rivi. Koostuu kahdesta rivistä. Toinen esittää kieltä ja toinen
-- on tekstiä varen. Tekstirivi siirretään kielirivin päälle.
local STRING_HTML = [=[
<tr>
    <td colspan="13" style=""><div style="width: 100%;"></div></td></tr>
    
<tr style="border-top: border-bottom: 0;">
  {{{FRETS
  }}}
</tr>

]=]

-- TODO ei käytössä
local CELL_HTML = [=[
<td><div style="position: relative; top: -1.9ex;">
  {{{TEXT}}}
</div><td>
]=]



function generateFretNumbers(first, last)
   local numbering = {}

   for i = first, last do
      numbering[i - first + 1] = fretLabels[i+1]
   end

   return '<td style="border-right: double black 2px;">' ..
      table.concat(numbering, '</td>\n<td>') .. '</td>'
end

function getMarkup(strings, first, last)

   local output = {}

   for i_string = 1, N_STRINGS do
      -- Ensimmäiseen soluun tulee kaksoisviiva kuvaamaan vapaiden kielten ero.
      local fretsMarkup = '<td style="border-right: double black 2px;"><div style="position: relative; top: -1em;">' ..
	 table.concat(strings[i_string], '</div></td><td><div style="position: relative; top: -1.8ex;">\n') .. '</div></td>\n'
      output[i_string] = tekstipohja.korvaaMuuttujat(STRING_HTML, { ["FRETS"] = fretsMarkup })
   end

   local fretNumbers = generateFretNumbers(first, last)

   return tekstipohja.korvaaMuuttujat(TABLE_HTML, {
					 ["FRET_NUMBERS"] = fretNumbers,
					 ["STRINGS"] = table.concat(output, "\n\n") })
end

function p.Otelauta(frame)
   local offset     = (tonumber(frame.args.nauhanumero) or 0)
   local length    = frame.args.pituus
   local last      = nil
   local values    = frame.args
   local strings   = { {}, {}, {}, {}, {}, {} }

   if #values ~= frame.args.pituus * 6 then
      error("Väärä määrä parametreja")
   end
   
   if offset == 0 and last == nil then
      last = 12
   else
      last = offset + length
   end

   local i_string = 1
   local i_fret = 0
   
   for i, value in ipairs(values) do
      strings[i_string][i_fret + 1] = value

      if i_fret == length then
	 i_string = i_string + 1
	 i_fret = 0
      end
   end


   local fretboardHTML   = getMarkup(strings, offset, last)

   return fretboardHTML
   
end

function p.OtelautaOktaavi(frame)
   local first     = (tonumber(frame.args.nauhanumero) or 0)
   local last      = frame.args.pituus
   local values    = {}
   local strings   = { {}, {}, {}, {}, {}, {} }

	for i, v in ipairs(frame.args) do
		values[i] = v
	end	

   if #values ~= 12 then
      error("Väärä määrä parametreja: " .. #values)
   end
   
   if first == 0 and last == nil then
      last = 12
   else -- TODO paremmin
      last = first + last
   end


   for i_string = 1, N_STRINGS do
      for i_fret = first, last do
	 local note_index = (viritys[i_string] + i_fret) % 12
	 strings[i_string][i_fret + 1] = values[note_index + 1]
      end
   end


   local fretboardHTML   = getMarkup(strings, first, last)

   return fretboardHTML
end


return p