Module:Infobox Regtemp

From Xenharmonic Wiki
Jump to navigation Jump to search

Documentation transcluded from /doc
Note: Do not invoke this module directly; use the corresponding template instead: Template:Infobox Regtemp.
Icon-Todo.png Todo: Documentation

local p = {}
local u = require("Module:Utils")
local infobox = require("Module:Infobox")

function p.infobox_RT(frame)
	
	-- no real math functionality... yet
	local name = frame.args["tempname"]
	
	local subgroup = frame.args["subgroup"]
	local basis = frame.args["commas"]
	
	local edo_first = frame.args["edo_first"]
	local edo1 = tonumber(edo_first)
	local edo_second = frame.args["edo_second"]
	local edo2 = tonumber(edo_second)
	
	local tuning = frame.args["tuning"]
	local genfrac = frame.args["genfrac"]
	local method = frame.args["method"]
	local mapping = frame.args["mapping"]
	
	local mos = frame.args["mosses"]
	local ploidacot = frame.args["ploidacot"]
	local pergen = frame.args["pergen"]
	
	local limit1 = frame.args["lim1"]
	local comp1 = frame.args["comp1"]
	local acc1 = frame.args["acc1"]
	local limit2 = frame.args["lim2"]
	local comp2 = frame.args["comp2"]
	local acc2 = frame.args["acc2"]
	
	local data = {}
	
	-- processed mapping
	local map = {}
	local lowermap = {}
	table.insert(data, {
		"Subgroups",
		subgroup
	})

	table.insert(data, {
		"Comma basis",
		basis
	})

	table.insert(data, {
		"Reduced mapping",
		"<" .. mapping .. "]"
	})

	-- autocalculating ploidacot
	for num in mapping:gmatch("(%d+); ") do
		table.insert(map, num)
	end
	local ploid = map[1]
	
	for num in mapping:gmatch("(%d+) ") do
		table.insert(lowermap, num)
	end
	
	local equave = string.char(string.byte(subgroup, 1))
	local equave_letter
	local cot = tonumber(lowermap[1])
	local referent = string.char(string.byte(subgroup, 3))
	local suffix = "cleft"
	if tonumber(equave) == 3 then
		equave_letter = "t"
		if tonumber(string.char(string.byte(subgroup, 3))) == 5 then
			if tonumber(string.char(string.byte(subgroup, 5))) == 7 then
				cot = tonumber(lowermap[2])
				suffix = "gem"
			end
		elseif tonumber(string.char(string.byte(subgroup, 3))) == 2 then -- edf
			equave_letter = "f"
			equave = "3/2"
			referent = string.char(string.byte(subgroup, 5))
		end
		if referent == "7" then
			suffix = "gem"
		end
	elseif tonumber(equave) == 2 then
		equave_letter = "o"
		if tonumber(string.char(string.byte(subgroup, 3))) == 3 then
			suffix = "cot"
		elseif tonumber(string.char(string.byte(subgroup, 3))) == 5 then
			suffix = "seph"
		end
	else
		equave_letter = equave
	end
	
	if suffix == "cleft" then
		suffix = referent .. suffix
	end
	
	local ploidnum = math.log(tonumber(equave))*(1200/math.log(2))/tonumber(ploid)
	local tuningnum = tonumber(tuning)
	if cot < 0 then
		tuningnum = math.log(tonumber(equave))*(1200/math.log(2)) - tuningnum
		cot = math.abs(cot)
	end
	local shear = math.floor(tuningnum*cot/ploidnum)
	shear = math.floor(cot*(shear/cot - math.floor(shear/cot)))
	if cot > 2 then
		if shear == cot-1 then
		shear = -1
		end
	end
	suffix = p.num2greeklet(tostring(shear)) .. p.num2greek(tostring(cot), "cot") .. suffix
	
	if ploid ~= "1" then
		suffix = p.num2greek(ploid,"ploid") .. "ploid " .. suffix
	end
	
	if ploidacot == "0" then
		ploidacot = suffix
	end
	
	-- edo join
	table.insert(data, {
		"Edo join",
		"[[" .. edo_first .. "ed" .. equave_letter .. "|" .. edo_first .. "]] & [[" .. edo_second .. "ed" .. equave_letter .. "|" .. edo_second .. "]]"
	})

	table.insert(data, {
		"Generator ([[" .. method .. "]])",
		"~" .. genfrac .. " = " .. tuning .. "c"
	})

	if mos ~= "0" then
		table.insert(data, {
			"MOS scales",
			mos
		})
	end

	table.insert(data, {
		"Ploidacot",
		ploidacot
	})
	
	if pergen ~= "0" then
		table.insert(data, {
			"Pergen",
			pergen
		})
	end
	
	-- error and stuff
	local oddlim 
	if equave_letter == "o" then
		oddlim = "-[[odd limit]]) "
	elseif equave_letter == "t" then
		oddlim = "-[[throdd limit]]) "
	else
		oddlim = "-[[integer limit]]) "
	end
	local string1 = "(" .. limit1 .. oddlim .. acc1 .. "c"
	local string2 = "(" .. limit1 .. oddlim .. comp1 .. " notes"
	if limit2 ~= "0" then
		string1 = string1 .. "; <br> (" .. limit2 .. oddlim .. acc2 .. "c"
		string2 = string2 .. "; <br> (" .. limit2 .. oddlim .. comp2 .. " notes"
	end

	table.insert(data, {
		"Minmax error",
		string1
	})

	table.insert(data, {
		"Target scale size",
		string2
	})

	local result = infobox.build(
		name,
		data
	)
	
	return result
end

function p.digit2greek(number, purpose)

	local greek
	
	if number == "1" then
		if purpose == "ploid" then
			greek = "ha"
		elseif purpose == "cot" then
			greek = "mono"
		elseif purpose == "decade" then
			greek = "deca"
		else
			greek = "hen"
		end
	elseif number == "2" then
		if purpose == "decade" then
			greek = "icosa"
		elseif purpose == "unit" then
			greek = "do"
		else
			greek = "di"
		end
	elseif number == "0" then
		if purpose == "unit" then
			greek = ""
		else
			greek = "a"
		end
	else
		if number == "3" then
			if purpose == "decade" then
				greek = "tria"
			else
				greek = "tri"
			end
		elseif number == "4" then
			if purpose == "decade" then
				greek = "tessera"
			else
				greek = "tetra"
			end
		elseif number == "5" then
			if purpose == "decade" then
				greek = "pente"
			else
				greek = "penta"
			end
		elseif number == "6" then
			if purpose == "decade" then
				greek = "hexe"
			else
				greek = "hexa"
			end
		elseif number == "7" then
			if purpose == "decade" then
				greek = "hebdome"
			else
				greek = "hepta"
			end
		elseif number == "8" then
			if purpose == "decade" then
				greek = "ogdoe"
			elseif purpose == "unit" then
				greek = "octo"
			else
				greek = "octa"
			end
		elseif number == "9" then
			if purpose == "decade" then
				greek = "enene"
			else
				greek = "ennea"
			end
		end
		if purpose == "decade" then
			greek = greek .. "conta"
		end
	end

	return greek
end

function p.num2greek(number, purpose)

	local greek
	
	if string.len(number) == 1 then
		greek = p.digit2greek(number, purpose)
	elseif string.len(number) == 2 then
		local unit = string.char(string.byte(number, 2))
		local decade = string.char(string.byte(number, 1))
		
		greek = p.digit2greek(unit, "unit") .. p.digit2greek(decade, "decade")
	end
	return greek
end

function p.digit2greeklet(number, purpose)

	local greek
	
	if number == "1" then
		if purpose == "decade" then
			greek = "iota-"
		elseif purpose == "unit" then
			greek = "alpha-"
		end
	elseif number == "2" then
		if purpose == "decade" then
			greek = "kappa-"
		elseif purpose == "unit" then
			greek = "beta-"
		end
	elseif number == "3" then
		if purpose == "decade" then
			greek = "lambda-"
		elseif purpose == "unit" then
			greek = "gamma-"
		end
	elseif number == "4" then
		if purpose == "decade" then
			greek = "mu-"
		elseif purpose == "unit" then
			greek = "delta-"
		end
	elseif number == "5" then
		if purpose == "decade" then
			greek = "nu-"
		elseif purpose == "unit" then
			greek = "epsilon-"
		end
	elseif number == "6" then
		if purpose == "decade" then
			greek = "xi-"
		elseif purpose == "unit" then
			greek = "wau-"
		end
	elseif number == "7" then
		if purpose == "decade" then
			greek = "omicron-"
		elseif purpose == "unit" then
			greek = "zeta-"
		end
	elseif number == "8" then
		if purpose == "decade" then
			greek = "pi-"
		elseif purpose == "unit" then
			greek = "eta-"
		end
	elseif number == "9" then
		if purpose == "decade" then
			greek = "qoppa-"
		elseif purpose == "unit" then
			greek = "theta-"
		end	
	elseif number == "0" then
		greek = ""
	elseif number == "-1" then
		greek = "omega-"
	end

	return greek
end

function p.num2greeklet(number)

	local greek
	
	if string.len(number) == 1 then
		greek = p.digit2greeklet(number, "unit")
	elseif string.len(number) == 2 then
		local unit = string.char(string.byte(number, 2))
		local decade = string.char(string.byte(number, 1))
		
		greek = p.digit2greeklet(decade, "decade") .. p.digit2greeklet(unit, "unit")
	end
	return greek
end

return p