Module:Infobox regtemp: Difference between revisions

From Xenharmonic Wiki
Jump to navigation Jump to search
TallKite (talk | contribs)
debugging...
TallKite (talk | contribs)
can't get it to work, reverting
Line 24: Line 24:
local ploidacot = frame.args["ploidacot"]
local ploidacot = frame.args["ploidacot"]
local pergen = frame.args["pergen"]
local pergen = frame.args["pergen"]
local colorname = frame.args["colorname"]
local limit1 = frame.args["lim1"]
local limit1 = frame.args["lim1"]
local comp1 = frame.args["comp1"]
local comp1 = frame.args["comp1"]
Line 147: Line 147:
"Pergen",
"Pergen",
pergen
pergen
})
end
if colorname ~= "0" then
table.insert(data, {
"Color name",
colorname
})
})
end
end

Revision as of 22:06, 13 January 2025

Module documentation[view] [edit] [history] [purge]
This module should not be invoked directly; use its corresponding template instead: Template:Infobox regtemp.
Module:Infobox regtemp is a draft module. It is incomplete and may not be in active development. If possible, editors are encouraged to help with its development. In the meantime, editors should avoid using this module across the Xenharmonic Wiki, except for testing.

This module generates an infobox providing information about a given regular temperament.

Introspection summary for Module:Infobox regtemp 
Functions provided (5)
Line Function Params
5 infobox_RT (invokable) (frame)
186 digit2greek (number, purpose)
268 num2greek (number, purpose)
283 digit2greeklet (number, purpose)
350 num2greeklet (number)
Lua modules required (2)
Variable Module Functions used
infobox Module:Infobox build
u Module:Utils dependency not used

No function descriptions were provided. The Lua code may have further information.


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