Moduuli:Kitarakirja/Kitaramalli

Wikikirjastosta

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

--- Kitaran nuottien laskemiseen liittyviä funktioita.


local model = {}

-- Nuottinimien indeksit.
model.indeces = {
   ["c"]   =  0,
   ["c♯"] =  1,
   ["c𝄪"]  =  2,
   ["d𝄫"]  =  0,
   ["d♭"] =  1,
   ["d"]   =  2,
   ["d♯"] =  3,
   ["d𝄪"]  =  4,
   ["e𝄫"]  =  2,
   ["e♭"] =  3,
   ["e"]   =  4,
   ["e♯"] =  5,
   ["e𝄪"]  =  6,
   ["f𝄫"]  =  3,
   ["f♭"] =  4,
   ["f"]   =  5,
   ["f♯"] =  6,
   ["f𝄪"]  =  7,
   ["g𝄫"]  =  5,
   ["g♭"] =  6,
   ["g"]   =  7,
   ["g♯"] =  8,
   ["g𝄪"]  =  9,
   ["a𝄫"]  =  7,
   ["a♭"] =  8,
   ["a"]   =  9,
   ["a♯"] = 10,
   ["a𝄪"]  = 11,
   ["b𝄫"]  =  9,
   ["b♭"] = 10,
   ["b"]   = 11,
   ["b♯"] =  0,
   ["b𝄪"]  =  1,
   ["c𝄫"]  = 10,
   ["c♭"] = 11,
   ["b𝄫 (b♭)"]  =  9,
   ["b♭ (b)"] = 10,
   ["b (h)"]   = 11,
   ["b♯ (h♯)"] =  0,
   ["b𝄪 (h𝄪)"]  =  1,
}


function model:new(args)
    local o = {
	tuning = args
    }
    
    setmetatable(o, self)
    self.__index = self
    
    return o
end

function model:get_notename_function(notenames)
    local notes = { [0] = nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil }

    for i, name in ipairs(notenames) do
	local index = model.indeces[name]
	assert ( index ~= nil and index >= 0 and index < 12, "Nuottia ei löydy: " .. name )
	notes[index] = name
    end
    
    return function (args)
	local noteindex = self:get_note_index(args)
	local notename = notes[noteindex % 12]

	--assert ( notename, "Nuotin nimeä ei ole annettu: " .. (noteindex % 12) )
	if not notename then
		notename = "?"
	end

	return notename
    end

end

--- Palauttaa halutun nuotin indeksin.
-- 
-- Käyttö:
--   get_note{ string = kielen numero, fret = nauhanumero }
-- fret = 0 tarkoittaa avointa kieltä
-- @return:  nuotin indeksi, jossa 0 tarkoittaa c:tä (b#:tä ja dbb:tä)
function model:get_note_index(args)
    assert ( args.string, "Parametri string puuttuu" )
    assert ( args.fret, "Parametri fret puuttuu" )
    assert ( args.string >= 1 and args.string <= #self.tuning, "Virheellinen kielen numero: " .. args.string )
    assert ( args.fret >= 0, "Virheellinen nauhanumero: " .. args.fret )
    
    local noteindex = self.tuning[args.string] + args.fret

    return noteindex
end


return model