Module:Infobox regtemp: Difference between revisions
Jump to navigation
Jump to search
Bugfix 4: can't rely on whitespaces |
Set straight subgroup interpretation |
||
| Line 52: | Line 52: | ||
"⟨" .. mapping .. "]" | "⟨" .. mapping .. "]" | ||
}) | }) | ||
-- process mapping | -- process mapping | ||
local map = {} | local map = {} | ||
| Line 63: | Line 63: | ||
end | end | ||
genchain_mapping[1] = 0 | genchain_mapping[1] = 0 | ||
-- interpret subgroup | |||
local subgroup_basis = {} | |||
for str in subgroup:gmatch("(%d+/?%d*)") do | |||
table.insert(subgroup_basis, str) | |||
end | |||
-- autocalculating ploidacot | -- autocalculating ploidacot | ||
local ploid = tonumber (map[1]) | local ploid = tonumber (map[1]) | ||
local equave = | local equave = u.eval_num_arg(subgroup_basis[1]) | ||
local referent = u.eval_num_arg(subgroup_basis[2]) | |||
local equave_letter | local equave_letter | ||
local cot = tonumber(genchain_mapping[2]) | local cot = tonumber(genchain_mapping[2]) | ||
local suffix = "cleft" | local suffix = "cleft" | ||
if | if equave == 3 then -- twelfth-based temp | ||
equave_letter = "t" | equave_letter = "t" | ||
if | if referent == 5 then | ||
referent_candidate = u.eval_num_arg(subgroup_basis[3]) | |||
if referent_candidate == 7 then | |||
referent = referent_candidate | |||
cot = tonumber(genchain_mapping[3]) | cot = tonumber(genchain_mapping[3]) | ||
suffix = "gem" | suffix = "gem" | ||
end | end | ||
end | end | ||
elseif equave == 1.5 then -- fifth-based temp | |||
equave_letter = "f" | |||
elseif equave == 2 then | |||
elseif | |||
equave_letter = "o" | equave_letter = "o" | ||
if | if referent == 3 then | ||
suffix = "cot" | suffix = "cot" | ||
elseif | elseif referent == 5 then | ||
suffix = "seph" | suffix = "seph" | ||
end | end | ||
| Line 102: | Line 105: | ||
end | end | ||
local equave_size = 1200 * u.log2 | local equave_size = 1200 * u.log2(equave) | ||
local referent_size = 1200 * u.log2 | local referent_size = 1200 * u.log2(referent) | ||
local period_size = equave_size / ploid | local period_size = equave_size / ploid | ||
local generator_size = tonumber(tuning) | local generator_size = tonumber(tuning) | ||
| Line 110: | Line 113: | ||
cot = -cot | cot = -cot | ||
end | end | ||
-- find the shear | -- find the shear | ||
local shear | local shear | ||
Revision as of 15:14, 24 November 2025
- This module should not be invoked directly; use its corresponding template instead: Template:Infobox regtemp.
This module generates an infobox providing information about a given regular temperament.
| Introspection summary for Module:Infobox regtemp | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||||||||||||||||||||||
No function descriptions were provided. The Lua code may have further information.
local p = {}
local infobox = require("Module:Infobox")
local u = require("Module:Utils")
local yesno = require("Module:Yesno")
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 colorname = frame.args["colorname"]
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 debugg = frame.args["debug"]
local data = {}
table.insert(data, {
"Subgroups",
subgroup
})
table.insert(data, {
"Comma basis",
basis
})
table.insert(data, {
"Reduced mapping",
"⟨" .. mapping .. "]"
})
-- process mapping
local map = {}
for str in mapping:gmatch("(-?%d+);") do
table.insert(map, str)
end
local genchain_mapping = {}
for str in mapping:gmatch("(-?%d+)") do
table.insert(genchain_mapping, str)
end
genchain_mapping[1] = 0
-- interpret subgroup
local subgroup_basis = {}
for str in subgroup:gmatch("(%d+/?%d*)") do
table.insert(subgroup_basis, str)
end
-- autocalculating ploidacot
local ploid = tonumber (map[1])
local equave = u.eval_num_arg(subgroup_basis[1])
local referent = u.eval_num_arg(subgroup_basis[2])
local equave_letter
local cot = tonumber(genchain_mapping[2])
local suffix = "cleft"
if equave == 3 then -- twelfth-based temp
equave_letter = "t"
if referent == 5 then
referent_candidate = u.eval_num_arg(subgroup_basis[3])
if referent_candidate == 7 then
referent = referent_candidate
cot = tonumber(genchain_mapping[3])
suffix = "gem"
end
end
elseif equave == 1.5 then -- fifth-based temp
equave_letter = "f"
elseif equave == 2 then
equave_letter = "o"
if referent == 3 then
suffix = "cot"
elseif referent == 5 then
suffix = "seph"
end
else
equave_letter = equave
end
if suffix == "cleft" then
suffix = referent .. suffix
end
local equave_size = 1200 * u.log2(equave)
local referent_size = 1200 * u.log2(referent)
local period_size = equave_size / ploid
local generator_size = tonumber(tuning)
if cot < 0 then
generator_size = equave_size - generator_size
cot = -cot
end
-- find the shear
local shear
if cot ~= 0 then
shear = (math.floor(generator_size * cot / period_size)
- math.floor(referent_size % equave_size / period_size)) % cot
else
shear = 0
end
-- omega extension
if ploid == 1 and cot > 2 and shear == cot - ploid then
shear = shear - cot
end
suffix = p.num2greeklet(tostring(shear)) .. p.num2greek(tostring(cot), "cot") .. suffix
if ploid ~= 1 then
suffix = p.num2greek(tostring(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
if colorname ~= "0" then
table.insert(data, {
"Color name",
colorname
})
end
-- error and stuff
local limit_text
if equave_letter == "o" then
limit_text = "-odd-limit"
elseif equave_letter == "t" then
limit_text = "-throdd-limit"
else
limit_text = "-integer-limit"
end
local string1 = limit1 .. limit_text .. ": " .. acc1 .. "{{c}}"
local string2 = limit1 .. limit_text .. ": " .. comp1 .. " notes"
if limit2 ~= "0" then
string1 = string1 .. "; <br>" .. limit2 .. limit_text .. ": " .. acc2 .. "{{c}}"
string2 = string2 .. "; <br>" .. limit2 .. limit_text .. ": " .. comp2 .. " notes"
end
table.insert(data, {
"Minimax error",
string1
})
table.insert(data, {
"Target scale size",
string2
})
local result = infobox.build(
name,
data
)
return frame:preprocess(debugg == true and "<pre>" .. result .. "</pre>" or 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(string.match(number, "(%d+)")) == 1 then
greek = p.digit2greeklet(number, "unit")
elseif string.len(string.match(number, "(%d+)")) == 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