Moduuli:Kitarakirja/Skaalat
Ulkoasu
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