Moduuli:Kitarakirja/Sointu

Wikikirjastosta

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

local p = {}

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


local scoreText_template = [=[
{
  % Rivin lopun pystyviiva ja tahtiosoitus piiloon.
  \override Score.BarLine.break-visibility = ##(#f #t #t)
  \override Staff.TimeSignature #'stencil = ##f
  
  <{{{NUOTIT}}}>1
}
]=]

--- Pilkkoo merkkijonon osiin.
function mw.ustring:split(sep)
   local fields = {}
   local pattern = mw.ustring.format("([^%s]+)", sep)
   self:gsub(pattern, function(c) fields[#fields+1] = c end)
   return fields
end

function p.PerussointuIntervalleista(frame)
   local args = frame.args
   args.root  = { frame.args["juurisävel"], frame.args["oktaavi"] or 0 }

   local pairs = table.pack(notedata.intervalsToNotenames(args))
   local lilynotes = lily.toLilyformat(pairs)
   local score = tekstipohja.replaceVariables(scoreText_template, {
					       ["NUOTIT"] = table.concat(lilynotes, " ") })
   
   return frame:extensionTag{ name = "score", content = score }
end


function p.PerussointuNuoteista(frame)
   local notes 
   local octave = frame.args.oktaavi or 1
   local pairs = {}
   local prevIndex = -1
   
   if frame.args["nuotit"] then
     notes = mw.text.split(frame.args.nuotit, "–", true)
   else 
   	 notes = frame.args
   end	
   
   for i, note in ipairs(notes) do

      -- Oletataan että nuotit on annettu nousevassa järjestyksessä.
      local index = notedata.getNoteIndex(note, 0)
      if index <= prevIndex then
	 octave = octave + 1
      end
      prevIndex = index
      
      pairs[i] = { note, octave }
   end

   local lilynotes = lily.toLilyformat(pairs)
   local score = tekstipohja.korvaaMuuttujat(scoreText_template, {
					      ["NUOTIT"] = table.concat(lilynotes, " ") })
   
   return frame:extensionTag{ name = "score", content = score, args = { sound = "1" } }
end


return p