Module:JI ratios in ED: Difference between revisions
Added default values |
ArrowHead294 (talk | contribs) mNo edit summary |
||
| (16 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local et = require("Module:ET") | |||
--local interval = require('Module:Harmonic entropy') | |||
local jiraf = require("Module:JI ratio finder") | |||
local rat = require("Module:Rational") | |||
local tip = require("Module:Template input parse") | |||
local utils = require("Module:Utils") | |||
local yesno = require("Module:Yesno") | |||
-- Helper function | -- Helper function | ||
| Line 41: | Line 43: | ||
-- Helper function | -- Helper function | ||
-- Creates the non-header cells in the table | -- Creates the non-header cells in the table | ||
function p.ji_ratio_in_ed_content_cells(steps, equave, candidate_ratios, primes) | function p.ji_ratio_in_ed_content_cells(steps, equave, candidate_ratios, primes, tolerance) | ||
local steps = steps or 12 | local steps = steps or 12 | ||
local equave = equave or rat.new(2) | local equave = equave or rat.new(2) | ||
local candidate_ratios = candidate_ratios or { rat.new(1), rat.new(2), rat.new(3, 2), rat.new(4, 3), rat.new (5, 4), rat.new (9, 7)} | local candidate_ratios = candidate_ratios or { rat.new(1), rat.new(2), rat.new(3, 2), rat.new(4, 3), rat.new (5, 4), rat.new (9, 7)} | ||
local primes = primes or { 2, 3, 7 } | local primes = primes or { 2, 3, 7 } | ||
local tolerance = tolerance or 20 | |||
-- Calculate equave | -- Calculate equave | ||
local equave_in_cents = rat.cents(equave) | local equave_in_cents = rat.cents(equave) | ||
-- Build the rows for each step, showing ratios by limit | -- Build the rows for each step, showing ratios by limit | ||
| Line 59: | Line 60: | ||
-- Table headers | -- Table headers | ||
local step_in_cents = (step / steps) * rat.cents(equave) | local step_in_cents = (step / steps) * rat.cents(equave) | ||
result = result .. string.format( | result = result .. string.format("| %d\n", step) | ||
result = result .. string.format( | result = result .. string.format("| %.3f\n", step_in_cents) | ||
-- If this is the first or last step, only use the unison or equave | -- If this is the first or last step, only use the unison or equave | ||
| Line 87: | Line 88: | ||
end | end | ||
local ratios_as_text = jiraf. | local ratios_as_text = jiraf.ratios_to_text(prime_filtered_ratios, "<br>", true) | ||
result = result .. string.format( | result = result .. string.format("| %s\n", ratios_as_text) | ||
end | end | ||
result = result .. string.format( | result = result .. string.format("|-\n") | ||
end | end | ||
return result | return result | ||
| Line 97: | Line 98: | ||
-- Main function variant for prime limit | -- Main function variant for prime limit | ||
function p.ji_ratios_in_ed_by_prime_limit(input_et, int_limit, prime_limit, tenney_height) | function p.ji_ratios_in_ed_by_prime_limit(input_et, int_limit, prime_limit, tenney_height, threshold) | ||
local input_et = input_et or et.parse("12edo") | local input_et = input_et or et.parse("12edo") | ||
local prime_limit = 7 | local prime_limit = prime_limit or 7 | ||
local tenney_height = tenney_height or 10 | local tenney_height = tenney_height or 10 | ||
local int_limit = int_limit or 99 | local int_limit = int_limit or 99 | ||
local threshold = threshold or 0.3 | |||
-- Get the number of divisions, equave, and et as text (eg edo, edt, etc) | -- Get the number of divisions, equave, and et as text (eg edo, edt, etc) | ||
local steps = input_et[ | local steps = input_et["size"] | ||
local equave = input_et[ | local equave = input_et["equave"] | ||
if tonumber(equave) ~= nil then | if tonumber(equave) ~= nil then | ||
equave = rat.new(equave) | equave = rat.new(equave) | ||
| Line 112: | Line 114: | ||
-- Calculate equave and tolerance | -- Calculate equave and tolerance | ||
-- Tolerance is | -- Tolerance is a percentage (threshold) of the step size | ||
local equave_in_cents = rat.cents(equave) | local equave_in_cents = rat.cents(equave) | ||
local tolerance = | local tolerance = equave_in_cents / steps * threshold | ||
-- Calculate candidate ratios | -- Calculate candidate ratios | ||
| Line 127: | Line 129: | ||
-- Build table headers | -- Build table headers | ||
local result = | local result = "{| class=\"wikitable center-all\"\n" | ||
.. "|+ style=\"font-size: 105%;\" | " | |||
.. string.format("Intervals of %s (as a %d-limit temperament)\n", et_as_string, prime_limit) | |||
.. "|-\n" | |||
.. "! rowspan=\"2\" | [[Degree]]\n" | |||
.. "! rowspan=\"2\" | [[Cent]]s\n" | |||
.. string.format("! colspan=\"%d\" | Approximated [[JI]] intervals\n", #primes) | |||
.. "|-\n" | |||
-- Build header cells for each prime limit | -- Build header cells for each prime limit | ||
for i = 1, #primes do | for i = 1, #primes do | ||
result = result .. string.format( | result = result .. string.format("! [[%d-limit]]\n", primes[i]) | ||
end | end | ||
result = result .. string.format( | result = result .. string.format("|-\n") | ||
-- Add rest of table | -- Add rest of table | ||
result = result .. p.ji_ratio_in_ed_content_cells(steps, equave, candidate_ratios, primes) | result = result .. p.ji_ratio_in_ed_content_cells(steps, equave, candidate_ratios, primes, tolerance) | ||
result = result .. string.format( | result = result .. string.format("|}\n") | ||
return result | return result | ||
end | end | ||
-- Main function variant for prime subgroup | -- Main function variant for prime subgroup | ||
function p.ji_ratios_in_ed_by_prime_subgroup(input_et, int_limit, primes, tenney_height) | function p.ji_ratios_in_ed_by_prime_subgroup(input_et, int_limit, primes, tenney_height, threshold) | ||
local input_et = input_et or et.parse("12edo") | local input_et = input_et or et.parse("12edo") | ||
local primes = primes or { 2, 3, 5, 11 } | local primes = primes or { 2, 3, 5, 11 } | ||
local tenney_height = tenney_height or 10 | local tenney_height = tenney_height or 10 | ||
local int_limit = int_limit or 99 | local int_limit = int_limit or 99 | ||
local threshold = threshold or 0.3 | |||
-- Get the number of divisions, equave, and et as text (eg edo, edt, etc) | -- Get the number of divisions, equave, and et as text (eg edo, edt, etc) | ||
local steps = input_et[ | local steps = input_et["size"] | ||
local equave = input_et[ | local equave = input_et["equave"] | ||
if tonumber(equave) ~= nil then | if tonumber(equave) ~= nil then | ||
equave = rat.new(equave) | equave = rat.new(equave) | ||
| Line 164: | Line 168: | ||
-- Calculate equave and tolerance | -- Calculate equave and tolerance | ||
-- Tolerance is | -- Tolerance is a percentage (threshold) of the step size | ||
local equave_in_cents = rat.cents(equave) | local equave_in_cents = rat.cents(equave) | ||
local tolerance = | local tolerance = equave_in_cents / steps * threshold | ||
-- Calculate candidate ratios | -- Calculate candidate ratios | ||
| Line 179: | Line 183: | ||
-- Build table headers | -- Build table headers | ||
local result = | local result = "{| class=\"wikitable center-all\"\n" | ||
.. "|+ style=\"font-size: 105%;\" | " | |||
.. string.format("Intervals of %s (as a %s subgroup temperament)\n", et_as_string, subgroup_as_text) | |||
.. "|-\n" | |||
.. "! rowspan=\"2\" | [[Degree]]\n" | |||
.. "! rowspan=\"2\" | [[Cent]]s\n" | |||
.. string.format("! colspan=\"%d\" | Approximated [[JI]] intervals\n", #primes) | |||
.. "|-\n" | |||
-- Build header cells for each prime limit | -- Build header cells for each prime limit | ||
for i = 1, #primes do | for i = 1, #primes do | ||
result = result .. string.format( | result = result .. string.format("! [[%d-limit]]\n", primes[i]) | ||
end | end | ||
result = result .. | result = result .. "|-\n" | ||
-- Add rest of table | -- Add rest of table | ||
result = result .. p.ji_ratio_in_ed_content_cells(steps, equave, candidate_ratios, primes) | result = result .. p.ji_ratio_in_ed_content_cells(steps, equave, candidate_ratios, primes, tolerance) | ||
result = result .. string.format( | result = result .. string.format("|}\n") | ||
return result | return result | ||
end | end | ||
| Line 202: | Line 207: | ||
-- Wrapper function for primary function; to be called by template | -- 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) | ||
-- Parse the ed; if it's just a number, interpret it as an edo | -- Parse the ed; if it's just a number, interpret it as an edo | ||
local input_et_unparsed = frame.args["ED"] or 12 | local input_et_unparsed = frame.args["ED"] or 12 | ||
| Line 212: | Line 216: | ||
local tenney_height = tonumber(frame.args["Tenney Height"]) or 10 | local tenney_height = tonumber(frame.args["Tenney Height"]) or 10 | ||
local int_limit = tonumber(frame.args["Integer Limit"]) or 99 | local int_limit = tonumber(frame.args["Integer Limit"]) or 99 | ||
local threshold = tonumber(frame.args["Threshold"]) or 0.3 | |||
local primes = 5 | local primes = tonumber(frame.args["Prime Limit"]) or 5 | ||
local temperament_type = "Prime Limit" | local temperament_type = "Prime Limit" | ||
if string.len(frame.args["Subgroup"]) > 0 then | if string.len(frame.args["Subgroup"]) > 0 then | ||
primes = tip.parse_numeric_entries(frame.args["Subgroup"], | primes = tip.parse_numeric_entries(frame.args["Subgroup"], ".") or tip.parse_numeric_entries(frame.args["Subgroup"], ",") | ||
temperament_type = "Subgroup" | temperament_type = "Subgroup" | ||
end | end | ||
local result = "" | local result = "" | ||
if temperament_type == "Subgroup" then | if temperament_type == "Subgroup" then | ||
result = p.ji_ratios_in_ed_by_prime_subgroup(input_et, int_limit, primes, tenney_height) | result = p.ji_ratios_in_ed_by_prime_subgroup(input_et, int_limit, primes, tenney_height, threshold) | ||
elseif temperament_type == "Prime Limit" then | elseif temperament_type == "Prime Limit" then | ||
result = p.ji_ratios_in_ed_by_prime_limit(input_et, int_limit, primes, tenney_height) | result = p.ji_ratios_in_ed_by_prime_limit(input_et, int_limit, primes, tenney_height, threshold) | ||
end | |||
local debugg = yesno(frame.args["debug"]) | |||
if debugg == true then | |||
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>" | |||
end | end | ||
return result | return frame:preprocess(result) | ||
end | end | ||
return p | return p | ||