Module:JI ratios in ED: Difference between revisions
Fixed non-2/1 equaves not having the keyword "just" |
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 | ||
-- | -- Given a prime limit, return an array of all primes between (and including) 2 | ||
-- EG, 7-limit becomes 2 | -- and that limit | ||
function p. | -- 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 | 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( | table.insert(primes, i) | ||
end | end | ||
end | end | ||
return | return primes | ||
end | end | ||
function p. | -- Helper function | ||
local | -- Converts a set of primes into a subgroup | ||
function p.primes_as_subgroup(primes) | |||
local primes = primes or { 2, 3, 5, 7 } | |||
local | local subgroup = "" | ||
for i = 1, # | for i = 1, #primes do | ||
if i ~= # | if i ~= #primes then | ||
subgroup = subgroup .. string.format("%d.", primes[i]) | |||
else | else | ||
subgroup = subgroup .. primes[i] | |||
end | end | ||
end | end | ||
return | 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 | ||
-- | -- Calculate temperament interpretation | ||
local | 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 | 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 | local primes = { 2, 3, 5, 7 } | ||
if string.len(frame.args[" | if string.len(frame.args["Prime Limit"]) > 0 then | ||
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 tenney_height = tonumber(frame.args["Tenney Height"]) or 10 | local tenney_height = tonumber(frame.args["Tenney Height"]) or 10 | ||