Module:JI ratios in ED: Difference between revisions

Ganaram inukshuk (talk | contribs)
Fixed non-2/1 equaves not having the keyword "just"
Ganaram inukshuk (talk | contribs)
Table title will correctly specify whether the temperament interpretation is for a prime limit (eg, 5-limit) or a prime subgroup (eg, 2.3.7)
Line 8: Line 8:


-- Helper function
-- Helper function
-- Converts prime limit to subgroup
-- Given a prime limit, return an array of all primes between (and including) 2
-- EG, 7-limit becomes 2.3.5.7
-- and that limit
function p.prime_limit_to_subgroup(prime_limit)
-- EG, 7-limit becomes { 2, 3, 5, 7 }
function p.primes_within_prime_limit(prime_limit)
local prime_limit = prime_limit or 7
local prime_limit = prime_limit or 7
local subgroup = {}
local primes = {}
for i = 2, prime_limit do
for i = 2, prime_limit do
if utils.is_prime(i) then
if utils.is_prime(i) then
table.insert(subgroup, i)
table.insert(primes, i)
end
end
end
end
return subgroup
return primes
end
end


function p.subgroup_as_string(subgroup)
-- Helper function
local subgroup = subgroup or { 2, 3, 5, 7 }
-- Converts a set of primes into a subgroup
function p.primes_as_subgroup(primes)
local primes = primes or { 2, 3, 5, 7 }
local str = ""
local subgroup = ""
for i = 1, #subgroup do
for i = 1, #primes do
if i ~= #subgroup then
if i ~= #primes then
str = str .. string.format("%d.", subgroup[i])
subgroup = subgroup .. string.format("%d.", primes[i])
else
else
str = str .. subgroup[i]
subgroup = subgroup .. primes[i]
end
end
end
end
return str
return subgroup
end
 
-- Helper function
-- Given a set of primes, find its temperament interpretation; IE, is it a
-- prime subgroup temperament (EG, 2.3.7) or a prime-limit temperament (EG,
-- 7-limit)?
-- If the set of primes is a prime limit, then it should contain all the primes
-- between 2 (inclusive) and the largest prime (inclusive). If it skips any
-- primes, then it's a subgroup.
function p.primes_as_temperament_interpretation(primes)
local primes = primes or { 2, 3, 5, 7 }
local primes_to_compare = p.primes_within_prime_limit(primes[#primes])
local temperament_interpretation = ""
if p.primes_as_subgroup(primes) == p.primes_as_subgroup(primes_to_compare) then
temperament_interpretation = string.format("%d-limit", primes[#primes])
else
temperament_interpretation = p.primes_as_subgroup(primes) .. " subgroup"
end
return temperament_interpretation
end
end


-- Primary function
function p.find_ratios_in_ed(input_et, primes, tenney_height, denominator_limit)
function p.find_ratios_in_ed(input_et, primes, tenney_height, denominator_limit)
local input_et = input_et or et.parse("13ed9/4")
local input_et = input_et or et.parse("13ed9/4")
Line 47: Line 72:
local et_as_string = et.as_string(input_et)
local et_as_string = et.as_string(input_et)
-- Calculate equave and tolerance
local equave_in_cents = rat.cents(equave)
local equave_in_cents = rat.cents(equave)
local tolerance = equave_in_cents / steps * 0.4
local tolerance = equave_in_cents / steps * 0.4
-- Temperament_interpretation
-- Calculate temperament interpretation
local subgroup_as_string = p.subgroup_as_string(primes)
local temperament_interpretation = p.primes_as_temperament_interpretation(primes)
-- Find candidate ratios; filter later
-- Find candidate ratios; filter later
local max_prime = primes[#primes]
local max_prime = primes[#primes]
Line 59: Line 85:
-- Build table headers
-- Build table headers
local result = string.format('{| class="wikitable center-all"\n')
local result = string.format('{| class="wikitable center-all"\n')
result = result .. string.format('|+ Intervals of %s (as a %s subgroup temperament)\n', et_as_string, subgroup_as_string)
result = result .. string.format('|+ Intervals of %s (interpreted as a %s temperament)\n', et_as_string, temperament_interpretation)
result = result .. string.format('|-\n')
result = result .. string.format('|-\n')
result = result .. string.format('! rowspan="2" | [[Degree]]\n')
result = result .. string.format('! rowspan="2" | [[Degree]]\n')
Line 114: Line 140:
end
end


-- Wrapper function for primary function; to be called by template
function p.ji_ratios_in_ed_frame(frame)
function p.ji_ratios_in_ed_frame(frame)
Line 121: Line 148:
end
end


local primes_as_text = "2.3.5.7.11.13"
local primes = { 2, 3, 5, 7 }
if string.len(frame.args["Primes"]) > 0 then
if string.len(frame.args["Prime Limit"]) > 0 then
primes_as_text = frame.args["Primes"]
primes = p.prime_limit_to_subgroup(tonumber(frame.args["Primes"]))
elseif string.len(frame.args["Subgroup"]) > 0 then
local primes_unparsed = tip.parse_numeric_entries(primes_unparsed, '.') or tip.parse_numeric_entries(primes_unparsed, ',')
end
end
local primes = tip.parse_numeric_entries(primes_as_text, '.') or tip.parse_numeric_entries(primes_as_text, ',')
local tenney_height = tonumber(frame.args["Tenney Height"]) or 10
local tenney_height = tonumber(frame.args["Tenney Height"]) or 10