Module:Infobox regtemp: Difference between revisions

ArrowHead294 (talk | contribs)
m ArrowHead294 moved page Module:Infobox Regtemp to Module:Infobox regtemp without leaving a redirect: WP:NCCAPS
Xenllium (talk | contribs)
No edit summary
Tags: Mobile edit Mobile web edit
 
(15 intermediate revisions by 3 users not shown)
Line 1: Line 1:
local p = {}
local p = {}
local infobox = require("Module:Infobox")
local u = require("Module:Utils")
local u = require("Module:Utils")
local infobox = require("Module:Infobox")
local yesno = require("Module:Yesno")
local yesno = require("Module:Yesno")


function p.infobox_RT(frame)
function p.infobox_RT(frame)
-- no real math functionality... yet
local name = frame.args["tempname"]
local name = frame.args["tempname"]
Line 12: Line 12:
local basis = frame.args["commas"]
local basis = frame.args["commas"]
local edo_first = frame.args["edo_first"]
local et1 = frame.args["edo_first"]
local edo1 = tonumber(edo_first)
local et2 = frame.args["edo_second"]
local edo_second = frame.args["edo_second"]
local et3 = frame.args["edo_third"]
local edo2 = tonumber(edo_second)
local et4 = frame.args["edo_fourth"]
local tuning = frame.args["tuning"]
local tuning = frame.args["tuning"]
Line 22: Line 22:
local mapping = frame.args["mapping"]
local mapping = frame.args["mapping"]
local mos = frame.args["mosses"]
local mos_override = frame.args["mosses"]
local ploidacot = frame.args["ploidacot"]
local ploidacot_override = frame.args["ploidacot"]
local colorname = frame.args["colorname"]
local colorname = frame.args["colorname"]
local pergen = frame.args["pergen"]
local pergen = frame.args["pergen"]
Line 33: Line 33:
local comp2 = frame.args["comp2"]
local comp2 = frame.args["comp2"]
local acc2 = frame.args["acc2"]
local acc2 = frame.args["acc2"]
local limit3 = frame.args["lim3"]
local comp3 = frame.args["comp3"]
local acc3 = frame.args["acc3"]
local limit4 = frame.args["lim4"]
local comp4 = frame.args["comp4"]
local acc4 = frame.args["acc4"]
local debugg = frame.args["debug"]
local debugg = frame.args["debug"]
local data = {}
local data = {}
-- processed mapping
-- process mapping
local map = {}
local rank = p.count_matches(mapping, ";") + 1
local lowermap = {}
local period = string.match(mapping, "(-?%d+);")
local genchain_mapping = {}
for str in mapping:gmatch("(-?%d+)") do
table.insert(genchain_mapping, str)
end
-- interpret subgroup
local subgroup_basis = {}
for str in subgroup:gmatch("(%d+/?%d*)") do
table.insert(subgroup_basis, str)
end
local equave = u.eval_num_arg(subgroup_basis[1])
-- process et join
function process_et_join(et)
local et_eq, et_num = p.warts2ed(et)
local et_eq_letter = p.equave2letter (et_eq)
return "[[" .. et_num .. "ed" .. et_eq_letter .. "|" .. et .. "]]"
end
local et_table = {}
for _, et in ipairs({et1, et2, et3, et4}) do
if u.value_provided(et) then
table.insert(et_table, process_et_join (et))
end
end
local et_join = table.concat(et_table, " & ")
-- process generators
function process_generators(genfrac_item, tuning_item)
return "~" .. genfrac_item .. " = " .. tuning_item .. "{{c}}"
end
local genfrac_table = {}
for str in genfrac:gmatch("(%d+/?%d*)") do
table.insert(genfrac_table, str)
end
local tuning_table = {}
for str in tuning:gmatch("(-?%d+%.?%d*)") do
table.insert(tuning_table, str)
end
local generators_table = {}
for i = 1, math.min(#genfrac_table, #tuning_table) do
table.insert(generators_table,
process_generators (genfrac_table[i], tuning_table[i]))
end
local generators = table.concat (generators_table, ", ")
-- default value for mos
local mos = "n/a"
-- autocalculating ploidacot
if rank == 2 then
local ploid = tonumber(period)
local referent = u.eval_num_arg(subgroup_basis[2])
local cot = tonumber(genchain_mapping[2])
local suffix = "cleft"
if equave == 2 then -- octave-based temp
if referent == 3 then
suffix = "cot"
elseif referent == 5 then
suffix = "seph"
end
elseif equave == 3 then -- twelfth-based temp
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
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_table[1])
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
-- construct the ploidacot signature
local MAX_GREEK_NUMERAL = 12 -- max number to convert to greek letters/numerals
local ploid_sig
if ploid == 1 then
ploid_sig = "" -- omit the ploid part
elseif ploid <= MAX_GREEK_NUMERAL then
ploid_sig = p.num2greek(tostring(ploid), "ploid") .. "ploid "
else
ploid_sig = tostring (ploid) .. "-ploid "
end
local shear_sig
if shear <= MAX_GREEK_NUMERAL then
shear_sig = p.num2greeklet(tostring(shear))
else
shear_sig = tostring(shear) .. "-sheared "
end
local cot_sig
if cot <= MAX_GREEK_NUMERAL then
cot_sig = p.num2greek(tostring(cot), "cot") .. suffix
else
cot_sig = tostring(cot) .. "-" .. suffix
end
ploidacot = ploid_sig .. shear_sig .. cot_sig
else
ploidacot = "n/a"
end
-- user override
if u.value_provided (mos_override) then
mos = mos_override
end
if u.value_provided (ploidacot_override) then
ploidacot = ploidacot_override
end
-- construct the table
table.insert(data, {
table.insert(data, {
"Subgroups",
"Subgroups",
Line 55: Line 202:
})
})


-- 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, {
table.insert(data, {
"Edo join",
"ET join",
"[[" .. edo_first .. "ed" .. equave_letter .. "|" .. edo_first .. "]] &amp; [[" .. edo_second .. "ed" .. equave_letter .. "|" .. edo_second .. "]]"
et_join
})
})


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


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


table.insert(data, {
table.insert(data, {
Line 146: Line 222:
})
})
if pergen ~= "0" then
if u.value_provided (pergen) then
table.insert(data, {
table.insert(data, {
"Pergen",
"Pergen",
Line 153: Line 229:
end
end


if colorname ~= "0" then
if u.value_provided (colorname) then
table.insert(data, {
table.insert(data, {
"Color name",
"Color name",
Line 161: Line 237:
-- error and stuff
-- error and stuff
local oddlim
local limit_text
if equave_letter == "o" then
if equave == 2 then
oddlim = "-[[odd limit]]) "
limit_text = "-odd-limit"
elseif equave_letter == "t" then
elseif equave == 3 then
oddlim = "-[[throdd limit]]) "
limit_text = "-throdd-limit"
else
else
oddlim = "-[[integer limit]]) "
limit_text = "-integer-limit"
end
local string1 = limit1 .. limit_text .. ": " .. acc1 .. "{{c}}"
local string2 = limit1 .. limit_text .. ": " .. comp1 .. " notes"
if u.value_provided (limit2) then
string1 = string1 .. "; <br>" .. limit2 .. limit_text .. ": " .. acc2 .. "{{c}}"
string2 = string2 .. "; <br>" .. limit2 .. limit_text .. ": " .. comp2 .. " notes"
end
if u.value_provided (limit3) then
string1 = string1 .. "; <br>" .. limit3 .. limit_text .. ": " .. acc3 .. "{{c}}"
string2 = string2 .. "; <br>" .. limit3 .. limit_text .. ": " .. comp3 .. " notes"
end
end
local string1 = "(" .. limit1 .. oddlim .. acc1 .. "{{c}}"
if u.value_provided (limit4) then
local string2 = "(" .. limit1 .. oddlim .. comp1 .. " notes"
string1 = string1 .. "; <br>" .. limit4 .. limit_text .. ": " .. acc4 .. "{{c}}"
if limit2 ~= "0" then
string2 = string2 .. "; <br>" .. limit4 .. limit_text .. ": " .. comp4 .. " notes"
string1 = string1 .. ";<br />(" .. limit2 .. oddlim .. acc2 .. "{{c}}"
string2 = string2 .. ";<br />(" .. limit2 .. oddlim .. comp2 .. " notes"
end
end


table.insert(data, {
table.insert(data, {
"Minmax error",
"Minimax error",
string1
string1
})
})
Line 192: Line 276:
return frame:preprocess(debugg == true and "<pre>" .. result .. "</pre>" or result)
return frame:preprocess(debugg == true and "<pre>" .. result .. "</pre>" or result)
end
function p.count_matches(base, pattern)
    return select(2, string.gsub(base, pattern, ""))
end
end


Line 362: Line 450:
local greek
local greek
if string.len(number) == 1 then
if string.len(string.match(number, "(%d+)")) == 1 then
greek = p.digit2greeklet(number, "unit")
greek = p.digit2greeklet(number, "unit")
elseif string.len(number) == 2 then
elseif string.len(string.match(number, "(%d+)")) == 2 then
local unit = string.char(string.byte(number, 2))
local unit = string.char(string.byte(number, 2))
local decade = string.char(string.byte(number, 1))
local decade = string.char(string.byte(number, 1))
Line 371: Line 459:
end
end
return greek
return greek
end
function p.equave2letter(et_eq)
-- converts an equave string to a letter
local et_eq_letter
if et_eq == "2" then
et_eq_letter = "o"
elseif et_eq == "3" then
et_eq_letter = "t"
elseif et_eq == "3/2" then
et_eq_letter = "f"
else
et_eq_letter = et_eq
end
return et_eq_letter
end
function p.warts2ed(warts)
-- converts a wart notation to an equal division
local wart_prefix, et_num = warts:match ("(%a?)(%d+)")
local et_eq = "2"
if wart_prefix == "a" then
et_eq = "2"
elseif wart_prefix == "b" then
et_eq = "3"
elseif wart_prefix == "c" then
et_eq = "5"
elseif wart_prefix == "d" then
et_eq = "7"
elseif wart_prefix == "e" then
et_eq = "11"
elseif wart_prefix == "f" then
et_eq = "13"
elseif wart_prefix == "g" then
et_eq = "17"
elseif wart_prefix == "h" then
et_eq = "19"
elseif wart_prefix == "i" then
et_eq = "23"
elseif wart_prefix == "j" then
et_eq = "29"
elseif wart_prefix == "k" then
et_eq = "31"
end
return et_eq, et_num
end
end


return p
return p