Moduuli:Kitarakirja/Komppauskuvio

Tällä työkalulla voi tehdä yksinkertaisia komppikuvioita helposti.

Funktio Komppaus

muokkaa

Parametrit:

  • tahtilaji: (valinnainen, oletus 4/4) tahtilajimerkintä
  • tempo: (valinnainen, oletus 120 bpm) miditiedoston tempo
  • numeroparamerit: jokainen numero parametri on jokin seuraavista
    • d: painoton alasisku
    • D: painollinen alasisku
    • u: painoton ylössisku
    • U: painollinen ylösisku
    • r: tauko
    • ~: nuotti sidotaan edelliseen

Edellisiin voi lisätä perään x:n, jolloin isku merkitään perkussioääneksi ja numeron joka ilmaisee sen pituuden:

  • 4 = 1/4-nuotti,
  • 8 = 1/8-nuotti,
  • jne.

Pituuden oletus on 4 tai edellinen annettu pituus.

Esimerkki:

{{#invoke:Kitarakirja/Komppauskuvio|Komppaus|d8|u|Dx|u|~|u|r|u}}

Tulos:


\version "2.18.2"

\header {
  tagline = ##f
}

\paper {
  raggedright = ##t
  raggedbottom = ##t
  indent = 0\mm
}

%% Nuottikuvan generoiva koodi.
\score {
  <<

    \relative c'' {
      
      \omit Staff.Clef
      \stemDown
      \improvisationOn
      \time 4/4

      %% Akenttimerkki suuntamerkkien yläpuolelle.
      \override Script.script-priority = #-100

      c8\downbow c^\ltoe \tweak style #'cross c\downbow\accent c^\ltoe ~ c c^\ltoe r c^\ltoe
    }
  >>
  \layout {}
}

%% Miditiedoston generoiva koodi.
\score {
  <<
    \relative c' {
      \set Staff.midiInstrument = "acoustic guitar (steel)"
      
      \chordmode {
        c8/+c\f c\f r c\f ~ c c\f r c\f
      }
    }
    \drums {
      \drummode {
        r8 r sn\accent r r r r r
      }
    }
  >>
  \midi {
    \context { \Score tempoWholesPerMinute = #(ly:make-moment 120 4) }
  }
}

local p = {}

local tekstipohja = require "Moduuli:Tekstipohja"

local scoreText_template = [=[

\version "2.18.2"

\header {
  tagline = ##f
}

\paper {
  raggedright = ##t
  raggedbottom = ##t
  indent = 0\mm
}

%% Nuottikuvan generoiva koodi.
\score {
  <<

    \relative c'' {
      
      \omit Staff.Clef
      \stemDown
      \improvisationOn
      \time {{{TAHTILAJI}}}

      %% Akenttimerkki suuntamerkkien yläpuolelle.
      \override Script.script-priority = #-100

      {{{NUOTIT_NUOTTIKUVA
      }}}
    }
  >>
  \layout {}
}

%% Miditiedoston generoiva koodi.
\score {
  <<
    \relative c' {
      \set Staff.midiInstrument = "acoustic guitar (steel)"
      
      \chordmode {
        {{{NUOTIT_SOINNUTUS
        }}}
      }
    }
    \drums {
      \drummode {
        {{{NUOTIT_RUMMUT
        }}}
      }
    }
  >>
  \midi {
    \context { \Score tempoWholesPerMinute = #(ly:make-moment {{{TEMPO}}} 4) }
  }
}
]=]

function p._Komppaus(frame)
   local notes = frame.args
   local time_signature = frame.args.tahtilaji or "4/4"
   local tempo = frame.args.tempo or "120"

   local nuotit_nuottikuva = {}
   local nuotit_soinnutus  = {}
   local nuotit_rummut     = {}

   if not mw.ustring.match(time_signature, "^%d/%d$") then
      error("Virheellinen tahtilaji: " .. time_signature)
   end

   if not mw.ustring.match(tempo, "^%d+$") then
      error("Virheellinen tempo: " .. tempo)
   end

   -- Edellisen nuotin pituus, jota käytetään seuraavassa, jos muuta ei anneta.
   local prev_duration = 4

   for i, note in ipairs(notes) do
      local udxr, duration = mw.ustring.match(note, "([udrUD~][xpt]?)(%d*%.*)")

      if not duration then
         duration = prev_duration
      end

      if not udxr then
         error("Virheellinen merkki: " .. udxr)
      end
      
      local dur2 = 16
      
      if udxr == "d" then
         nuotit_nuottikuva[i] = "c" .. duration .. "\\downbow"
         nuotit_soinnutus[i]  = "c" .. duration .. "/+c\\f"
         nuotit_rummut[i]     = "r" .. duration
      elseif udxr == "D" then
         nuotit_nuottikuva[i] = "c" .. duration .. "\\downbow\\accent"
         nuotit_soinnutus[i]  = "c" .. duration .. "/+c\\fff"
         nuotit_rummut[i]     = "r" .. duration
      elseif udxr == "u" then
         nuotit_nuottikuva[i] = "c" .. duration .. "^\\ltoe"
         nuotit_soinnutus[i]  = "c" .. duration .. "\\f"
         nuotit_rummut[i]     = "r" .. duration
      elseif udxr == "U" then
         nuotit_nuottikuva[i] = "c" .. duration .. "^\\ltoe\\accent"
         nuotit_soinnutus[i]  = "c" .. duration .. "\\fff"
         nuotit_rummut[i]     = "r" .. duration
      elseif udxr == "dx" then
         nuotit_nuottikuva[i] = "\\tweak style #'cross c" .. duration .. "\\downbow"
         nuotit_soinnutus[i]  = "r" .. duration .. ""
         nuotit_rummut[i]     = "sn" .. duration
      elseif udxr == "Dx" then
         nuotit_nuottikuva[i] = "\\tweak style #'cross c" .. duration .. "\\downbow\\accent"
         nuotit_soinnutus[i]  = "r" .. duration .. ""
         nuotit_rummut[i]     = "sn" .. duration .. "\\accent"
      elseif udxr == "ux" then
         nuotit_nuottikuva[i] = "\\tweak style #'cross c" .. duration .. "^\\ltoe"
         nuotit_soinnutus[i]  = "r" .. duration .. ""
         nuotit_rummut[i]     = "sn" .. duration
      elseif udxr == "Ux" then
         nuotit_nuottikuva[i] = "\\tweak style #'cross c" .. duration .. "^\\ltoe\\accent"
         nuotit_soinnutus[i]  = "r" .. duration .. ""
         nuotit_rummut[i]     = "sn" .. duration .. "\\accent"
      elseif udxr == "r" then
         nuotit_nuottikuva[i] = "r" .. duration .. ""
         nuotit_soinnutus[i]  = "r" .. duration .. ""
         nuotit_rummut[i]     = "r" .. duration .. ""
      elseif udxr == "~" then
         nuotit_nuottikuva[i] = "~ c" .. duration .. ""
         nuotit_soinnutus[i]  = "~ c" .. duration .. ""
         nuotit_rummut[i]     = "r" .. duration .. ""

         -- pizzicato/staccato
      elseif udxr == "dp" then
         nuotit_nuottikuva[i] = "c" .. duration .. "\\downbow_\\staccato"
         nuotit_soinnutus[i]  = "c" .. dur2 .. "/+c\\f" .. " r" .. dur2
         nuotit_rummut[i]     = "r" .. duration
      elseif udxr == "Dp" then
         nuotit_nuottikuva[i] = "c" .. duration .. "\\downbow\\accent_\\staccato"
         nuotit_soinnutus[i]  = "c" .. dur2 .. "/+c\\fff" .. " r" .. dur2
         nuotit_rummut[i]     = "r" .. duration .. ""
      elseif udxr == "up" then
         nuotit_nuottikuva[i] = "c" .. duration .. "^\\ltoe_\\staccato"
         nuotit_soinnutus[i]  = "c" .. dur2 .. "\\f" .. " r" .. dur2
         nuotit_rummut[i]     = "r" .. duration
      elseif udxr == "Up" then
         nuotit_nuottikuva[i] = "c" .. duration .. "^\\ltoe\\accent_\\staccato"
         nuotit_soinnutus[i]  = "c" .. dur2 .. "\\fff" .. " r" .. dur2
         nuotit_rummut[i]     = "r" .. duration .. ""
         
         -- 
      elseif udxr == "dt" then
         nuotit_nuottikuva[i] = "c" .. duration .. "\\downbow_\\tenuto"
         nuotit_soinnutus[i]  = "c" .. duration .. "/+c\\f"
         nuotit_rummut[i]     = "r" .. duration
      elseif udxr == "Dt" then
         nuotit_nuottikuva[i] = "c" .. duration .. "\\downbow\\accent_\\tenuto"
         nuotit_soinnutus[i]  = "c" .. duration .. "/+c\\fff"
         nuotit_rummut[i]     = "r" .. duration .. ""
      elseif udxr == "ut" then
         nuotit_nuottikuva[i] = "c" .. duration .. "^\\ltoe_\\tenuto"
         nuotit_soinnutus[i]  = "c" .. duration .. "\\f"
         nuotit_rummut[i]     = "r" .. duration
      elseif udxr == "Ut" then
         nuotit_nuottikuva[i] = "c" .. duration .. "^\\ltoe\\accent_\\tenuto"
         nuotit_soinnutus[i]  = "c" .. duration .. "\\fff"
         nuotit_rummut[i]     = "r" .. duration .. ""
         
         
      else
         error("Virheellinen koodi: " .. udxr)
      end
      
   end

   local score = tekstipohja.korvaaMuuttujat(scoreText_template, {
                                                ["TAHTILAJI"] = time_signature,
                                                ["TEMPO"] = tempo,
                                                ["NUOTIT_NUOTTIKUVA"] = table.concat(nuotit_nuottikuva, " "),
                                                ["NUOTIT_SOINNUTUS"] = table.concat(nuotit_soinnutus, " "),
                                                ["NUOTIT_RUMMUT"] = table.concat(nuotit_rummut, " ") })
   
   return score
end


function p.Komppaus(frame)
	   local score = p._Komppaus(frame)
	   local args = { raw = "1" }
	   if not frame.args.sound == "-" then
	   	  args['sound'] = "1"
	   end
	   return frame:extensionTag{ name = "score", content = score, args = args }
end
	
return p