Module:ET: Difference between revisions
Why does `suffix` begin with the et number? |
These all looked too dumb tbh |
||
(36 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
local rat = require( | local rat = require("Module:Rational") | ||
local seq = require( | local seq = require("Module:Sequence") | ||
local p = {} | local p = {} | ||
local common_suffix = { | local common_suffix = { | ||
[ | ["3/2"] = "f", | ||
[ | ["2"] = "o", | ||
[ | ["2/1"] = "o", | ||
[ | ["3"] = "t", | ||
[ | ["3/1"] = "t", | ||
} | } | ||
local common_ratio = { | local common_ratio = { | ||
[ | ["f"] = rat.new(3, 2), | ||
[ | ["o"] = 2, | ||
[ | ["t"] = 3, | ||
["ϕ"] = (1 + math.sqrt(5)) / 2, | |||
["n"] = math.exp(1), | |||
["π"] = math.pi | |||
} | } | ||
Line 24: | Line 28: | ||
local equave_ratio = rat.as_ratio(equave) | local equave_ratio = rat.as_ratio(equave) | ||
equave_ratio = equave_ratio:lower() | equave_ratio = equave_ratio:lower() | ||
suffix = | suffix = "ed" | ||
if common_suffix[equave_ratio] then | if common_suffix[equave_ratio] then | ||
suffix = suffix .. common_suffix[equave_ratio] | suffix = suffix .. common_suffix[equave_ratio] | ||
Line 38: | Line 42: | ||
-- parse a ET structure | -- parse a ET structure | ||
function p.parse(unparsed) | function p.parse(unparsed) | ||
local size, suffix, equave = unparsed:match( | local size, suffix, equave = unparsed:match("^(%d+%.*%d*)([Ee][Dd](.+))$") | ||
-- local size, suffix, equave = unparsed:match("^(%d+%.*%d*)([Cc]?[Ee][Dd]?[Tt]?(.*))$") | |||
if equave == nil then | if equave == nil then | ||
return nil | return nil | ||
Line 62: | Line 67: | ||
end | end | ||
return rat.as_float(et.equave) ^ (steps / et.size) | return rat.as_float(et.equave) ^ (steps / et.size) | ||
end | |||
function p.backslash_display(et, steps) | |||
if et.size == 0 then | |||
return 1 | |||
end | |||
return steps .. p.backslash_modifier(et) | |||
end | |||
function p.backslash_modifier(et) | |||
if not rat.eq(et.equave, 2) then | |||
return "\\" .. et.size .. et.suffix | |||
end | |||
return "\\" .. et.size | |||
end | end | ||
Line 71: | Line 90: | ||
steps = steps or 1 | steps = steps or 1 | ||
return 1200 * steps / et.size * math.log(rat.as_float(et.equave)) / math.log(2) | return 1200 * steps / et.size * math.log(rat.as_float(et.equave)) / math.log(2) | ||
end | |||
-- convert steps to hekts | |||
function p.hekts(et, steps) | |||
if et.size == 0 then | |||
return 0 | |||
end | |||
steps = steps or 1 | |||
return 1300 * steps / et.size * math.log(rat.as_float(et.equave)) / math.log(3) | |||
end | end | ||
Line 95: | Line 123: | ||
local t = 0 | local t = 0 | ||
for factor, power in pairs(ratio) do | for factor, power in pairs(ratio) do | ||
if type(factor) == | if type(factor) == "number" then | ||
t = t + power * p.approximate(et, factor) | t = t + power * p.approximate(et, factor) | ||
end | end | ||
Line 111: | Line 139: | ||
function p.is_zeta(et) | function p.is_zeta(et) | ||
return seq.contains(seq.zeta_peak, et.size) | return seq.contains(seq.zeta_peak, et.size) | ||
or seq.contains(seq.zeta_peak_integer, et.size) | |||
or seq.contains(seq.zeta_integral, et.size) | or seq.contains(seq.zeta_integral, et.size) | ||
or seq.contains(seq.zeta_gap, et.size) | or seq.contains(seq.zeta_gap, et.size) | ||
Line 118: | Line 147: | ||
function p.why_zeta(et) | function p.why_zeta(et) | ||
local zeta_peak = seq.contains(seq.zeta_peak, et.size) | local zeta_peak = seq.contains(seq.zeta_peak, et.size) | ||
local zeta_peak_integer = seq.contains(seq.zeta_peak_integer, et.size) | |||
local zeta_integral = seq.contains(seq.zeta_integral, et.size) | local zeta_integral = seq.contains(seq.zeta_integral, et.size) | ||
local zeta_gap = seq.contains(seq.zeta_gap, et.size) | local zeta_gap = seq.contains(seq.zeta_gap, et.size) | ||
local z = "The Riemann zeta function and tuning#Zeta EDO lists" | |||
local markers = {} | local markers = {} | ||
if zeta_peak then | if zeta_peak then | ||
table.insert(markers, | table.insert(markers, string.format("[[%s|Zeta peak]]", z)) | ||
elseif zeta_peak == nil then | elseif zeta_peak == nil then | ||
table.insert(markers, | table.insert(markers, string.format("[[%s|Zeta peak?]]", z)) | ||
end | |||
if zeta_peak_integer then | |||
table.insert(markers, string.format("[[%s|Zeta peak integer]]", z)) | |||
elseif zeta_peak_integer == nil then | |||
table.insert(markers, string.format("[[%s|Zeta peak integer?]]", z)) | |||
end | end | ||
if zeta_integral then | if zeta_integral then | ||
table.insert(markers, | table.insert(markers, string.format("[[%s|Zeta integral]]", z)) | ||
elseif zeta_integral == nil then | elseif zeta_integral == nil then | ||
table.insert(markers, | table.insert(markers, string.format("[[%s|Zeta integral?]]", z)) | ||
end | end | ||
if zeta_gap then | if zeta_gap then | ||
table.insert(markers, | table.insert(markers, string.format("[[%s|Zeta gap]]", z)) | ||
elseif zeta_gap == nil then | elseif zeta_gap == nil then | ||
table.insert(markers, | table.insert(markers, string.format("[[%s|Zeta gap?]]", z)) | ||
end | end | ||
return table.concat(markers, | |||
return table.concat(markers, "<br />") | |||
end | end | ||
return p | return p |