Siirry sisältöön

Moduuli:Kitarakirja/Skaalat

Wikikirjastosta

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

-- Skaalasormitusten piirtämiseen.
local p = {}

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

-- Skaalan nuotteina näyttävän score-elementin sisälle tuleva teksti.
local SCORE_NOTES = [=[
  \new Staff {
    \clef "treble_8"
    \override Staff.TimeSignature #'stencil = ##f
    \omit Stem
    \cadenzaOn
    {{{SKAALANUOTIT
    }}}
  }
]=]


-- Skaalan otelaudalla näyttävän score-elementin sisälle tuleva teksti.
local SCORE_TAB = [=[
  <<
    %% Väärinkäytetään dymamics-osaa nauhanumeroinnin näyttämiseen.
    \new Dynamics {
      \override TextScript.font-shape = #'normal % Poistetaan kursivointi

      \partial 4 s4 \bar "!" % osittainen väli luomaan vaikutelmaa katkelmasta
      {{{NAUHANUMEROINTI
      }}}
      s4      \bar " "       % osittainen väli
      
    }

    %% Väärinkäytetään TabStaffia näyttämään sormitukset kielille. Koska tabissa näytettävät
    %% numerot ovat sorminumeroita ei nuotit vastaa skaalaa vaan esim. 2. sormi a-kielellä merkitään b,:ksi.
    %% Samalle välille tulevat sormet merkitään soinnuksi.
    \new TabStaff {
      \cadenzaOn      % Tahtiviivat pois

      %% Tässä staffissa nauhat vastaavat eri sormia, joten merkitään kaikki kielet c:hen, jolloin
      %% c = vapaa kieli, c# on 1. sormi, d on 2. sormi jne.
      \set stringTunings = \stringTuning <c c c c c c>

      %% Tässä numerointi tarkoittaa sormia, joten muutetaan numerot erilaisiksi,
      %% ettei sekoitu nauhanumeroihin.
      \set tablatureFormat = #fret-letter-tablature-format
      \set fretLabels = #'("○↔" "①↔" "②↔" "③↔" "④↔" "○↗" "①↗" "②↗" "③↗" "④↗" "○↙" "①↙" "②↙" "③↙" "④↙")

      \override Score.SystemStartBar.collapse-height = #100 % Rivin alun pystyviiva piiloon.
      \set Score.proportionalNotationDuration = #(ly:make-moment 1/4)

      %% Piilotetaan aika ja tab-teksti
      \override Staff.Clef #'stencil = ##f
      \override Staff.TimeSignature #'stencil = ##f

      \omit Stem

      %% Tarviiko näitä enää??
      %%\newSpacingSection
      %%\override Score.SpacingSpanner.strict-note-spacing = ##t
      \override Score.SpacingSpanner.base-shortest-duration = #(ly:make-moment 1/1)

      \partial 4 s4 \bar "!"
      {{{SORMINUOTIT
      }}}
      s4 \bar " "
    }
  >>
]=]


-- Värit, joilla merkitään oktaavien ensimmäisiä nuotteja. Kiertävät, jos
-- tarvitaan enemmän kuin kolme.
local markupColors = { "#blue", "#red", "#green" }


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











local function getScaleNoteMarkup(fingerings, rootNote) 
   local notes = { }
   local k = 1
   local noteset1 = { "c", "cis", "d", "dis", "e", "f", "fis", "g", "gis", "a", "ais", "b" }

   for i_string, fingering in ipairs(fingerings) do
      for i_fret, fingerData in ipairs(fingering) do
         --local fingerData = mw.ustring.split(fingerText, "-")
         local finger   = fingerData[1]
         local modifier = fingerData[2]

         if finger ~= " " then
	    local noteIndex = viritys[i_string] + fingerings.offset + i_fret - 1
	    notes[k] = lily.toLilynote(noteset1, noteIndex)

	    if modifier == ">" then
	       notes[k] =  notes[k] .. "-" .. "\\markup { \"\" }"
	       --notes[k] = "\\tweak color #darkblue "  .. notes[k]
	       notes[k] = "\\tweak color #grey "  .. notes[k]
	    elseif modifier == "<" then
	       notes[k] =  notes[k] .. "-" .. "\\markup { \"\" }"
	       --notes[k] = "\\tweak color #darkred " .. notes[k]
	       notes[k] = "\\tweak color #grey "  .. notes[k]
	    end

	    -- Juurisävelen korostus värillä
	    if noteInfo.getNoteNameForIndex(noteIndex) == rootNote then
	       local color = markupColors[noteInfo.getNoteOctaveForIndex(noteIndex) % #markupColors + 1]
	       notes[k] = "\\tweak color " .. color .. " " .. notes[k]
	    end
         else 
            notes[k] = ""
         end
         k = k + 1
      end 
   end

  return table.concat(notes, " ")
end

local function transpose(m)
   local rotated = { }
   for c, m_1_c in ipairs(m[1]) do
      local col = { m_1_c }
      for r = 2, #m do
         col[r] = m[r][c]
      end
      table.insert(rotated, col)
   end
   return rotated
end

local function getTabNoteMarkup(fingerings, rootNote) 
   local frets = { }
   local k = 1
   local noteset1 = { "c", "cis", "d", "dis", "e", "f", "fis", "g", "gis", "a", "ais", "b" }

   -- Muutetaan kielikohtainen merkintä nauhakohtaiseksi.
   local fchords = transpose(fingerings)

   for i_fret, chord in ipairs(fchords) do
      local notes = { -1, -1, -1, -1, -1, -1 }
      for i_string, fingerData in ipairs(chord) do
         --local fingerData = mw.ustring.split(fingerText, "-")
         local finger   = fingerData[1]
         local modifier = fingerData[2]
         if finger ~= " " then
	    local noteIndex = viritys[i_string] + fingerings.offset + (i_fret - 1)

	    if modifier == ">" then
	       finger = finger + 5
	    elseif modifier == "<" then
	       finger = finger + 10
	    end

	    notes[i_string] = lily.toLilynote(noteset1, finger) .. "\\" .. (6 - i_string + 1)

	    if modifier == ">" then
	       notes[i_string] = "\\tweak color #grey " .. notes[i_string]
	    elseif modifier == "<" then
	       notes[i_string] = "\\tweak color #grey " .. notes[i_string]
	    end


	    -- Korostetaan juurisävel kiertävillä väreillä.
	    if noteInfo.getNoteNameForIndex(noteIndex) == rootNote then
	       local color = markupColors[noteInfo.getNoteOctaveForIndex(noteIndex) % #markupColors + 1]
	       notes[i_string] = "\\tweak color " .. color .. " " .. notes[i_string]
	    end
         else
	    notes[i_string] = ""
         end
      end
      frets[k] = "< " .. table.concat(notes, " ") .. ">1 \\bar \"!\""
      k = k + 1
   end
   
   return table.concat(frets, "\n")
end

local function getFretNumberingMarkup(fretNo, max)
   local markup = {}
   
   for i = 1, max do
      table.insert(markup, "s1-\\markup { \\fontsize #-5 " .. (fretNo + i - 1) .. " }")
   end

   return table.concat(markup, "\n")
end

local function getTabMarkup(fingerings, rootNote)
   local noteMarkup = getTabNoteMarkup(fingerings, rootNote)
   local numberingMarkup = getFretNumberingMarkup(fingerings.offset, fingerings.max)

   return tekstipohja.korvaaMuuttujat(SCORE_TAB, { ["SORMINUOTIT"] = noteMarkup, ["NAUHANUMEROINTI"] = numberingMarkup })
end

local function getNoteMarkup(fingerings, rootNote)
   local noteMarkup = getScaleNoteMarkup(fingerings, rootNote)

   return tekstipohja.korvaaMuuttujat(SCORE_NOTES, { ["SKAALANUOTIT"] = noteMarkup })
end


function p.Skaala(frame)
   local offset     = (tonumber(frame.args.nauhanumero) or 0)
   local rootNote   = frame.args.juurisavel
   -- Kielikohtaiset nauhavälit ja niiden sormet, esim. "1-34"
   local fingerings = { nil, nil, nil, nil, nil, nil }

   fingerings.max = 0
   for i_string, fingering_of_string in ipairs(frame.args) do
      local modifier = " "
      local n_frets = 0
      fingerings[6 - i_string + 1] = {}

      for i_fret = 0, #fingering_of_string - 1 do
         local f = fingering_of_string:sub(i_fret+1,i_fret+1)
         if f == "0" or f == "1" or f == "2" or f == "3" or f == "4" then
            fingerings[6 - i_string + 1][n_frets + 1] = {f, modifier} --f .. "-" .. modifier
            modifier = " "
            n_frets = n_frets + 1
         elseif f == "-" then
            fingerings[6 - i_string + 1][n_frets + 1] = { " ", " " } --" - "
            modifier = " "
            n_frets = n_frets + 1
         elseif f == "<" then
           modifier = "<"
         elseif f == ">" then
           modifier  = ">"
         elseif f == " " or f == "\n" then 
           -- Jätetään huomiotta, että voi käyttää rivien täsmäämiseen.       
	 else
	    error("Tuntematon merkki: " .. f)
         end
      end

      -- Jos eri kielille on merkitty eri määrä nauhaväleja, käytetään
      -- pisintä kuvien mitoittamiseen.
      fingerings.max = math.max(fingerings.max, n_frets)
   end
   fingerings.offset = offset

   local tabMarkup  = getTabMarkup(fingerings,  rootNote)
   local noteMarkup = getNoteMarkup(fingerings, rootNote) 

   return "<div class=\"kitarakirja-skaala\">" .. 
             frame:extensionTag{ name = "score", content = noteMarkup } .. 
             "<br/>\n" .. 
             frame:extensionTag{ name = "score", content = tabMarkup } .. 
             "</div>"


end

return p