Module:JI ratios in ED

From Xenharmonic Wiki
Revision as of 11:32, 21 January 2024 by Ganaram inukshuk (talk | contribs) (Created page with "local utils = require('Module:Utils') local interval = require('Module:Interval') local rat = require('Module:Rational') local jiraf = require('Module:JI ratio finder') local...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
Module documentation[view] [edit] [history] [purge]
This module should not be invoked directly; use its corresponding template instead: Template:JI ratios in ED.
Module:JI ratios in ED is deprecated and has no replacement. Further use of this module is not advised. This module is kept for historical purposes and should not be deleted.
Introspection summary for Module:JI ratios in ED 
Functions provided (3)
Line Function Params
8 find_ratios_in_ed_by_primes (ed, primes, int_limit, equave)
56 parse_ed (unparsed)
75 ji_ratios_in_ed_frame (invokable) (frame)
Lua modules required (5)
Variable Module Functions used
interval Module:Interval dependency not used
jiraf Module:JI ratio finder find_candidate_ratios
filter_ratios_by_range
filter_ratios_by_harmonic_class
ratios_to_text
rat Module:Rational new
cents
parse
tip Module:Template input parse parse_entries
utils Module:Utils dependency not used

No function descriptions were provided. The Lua code may have further information.


local utils = require('Module:Utils')
local interval = require('Module:Interval')
local rat = require('Module:Rational')
local jiraf = require('Module:JI ratio finder')
local tip = require('Module:Template input parse')
local p = {}

function p.find_ratios_in_ed_by_primes(ed, primes, int_limit, equave)
	local ed = ed or 12
	local primes = primes or { 3, 5, 7, 11, 13, 17, 19 }
	local equave = equave or rat.new(2, 1)
	
	local equave_in_cents = rat.cents(equave)
	local single_edstep_in_cents = equave_in_cents / ed
	
	local candidate_ratios = jiraf.find_candidate_ratios(equave_in_cents, 99)
	
	-- Build table headers
	local result = string.format('{| class="wikitable center-all"\n')
	result = result .. string.format('|+ Approximated intervals of 12edo\n')
	result = result .. string.format('|-\n')
	result = result .. string.format('! Degree\n')
	result = result .. string.format('! Cents\n')
	
	-- Add table headers for prime limits (technically harmonic classes)
	for i = 1, #primes do
		local current_prime = primes[i]	
		result = result .. string.format('! %d-limit ratios\n', current_prime)
	end
	result = result .. string.format('|-\n')
	
	-- Build the rows for each edstep, showing ratios by limit
	for i = 1, ed + 1 do
		local edstep = i - 1
		local edstep_in_cents = edstep * equave_in_cents / ed
		local filtered_ratios = jiraf.filter_ratios_by_range(candidate_ratios, edstep_in_cents + single_edstep_in_cents * 0.75, edstep_in_cents + single_edstep_in_cents * 1.25)
		
		result = result .. string.format('| %d\n', edstep)
		result = result .. string.format('| %.3f\n', edstep_in_cents)
		
		for j = 1, #primes do
			local current_prime = primes[j]
			
			local prime_filtered_ratios = jiraf.filter_ratios_by_harmonic_class(filtered_ratios, current_prime)
			local ratios_as_text = jiraf.ratios_to_text(prime_filtered_ratios, ", ")
			result = result .. string.format('| %s\n', ratios_as_text)
		end
		
		result = result .. string.format('|-\n')
	end
	
	result = result .. string.format('|}\n')
	return result
end

function p.parse_ed(unparsed)
	local unparsed = unparsed or "12ed11/7"
	
	local ed = unparsed:match('(%d+)ed')
	
	local equave_unparsed = ""
	if string.match(unparsed, "edo") then
		equave_unparsed = "2/1"
	elseif string.match(unparsed, "edt") then
		equave_unparsed = "3/1"
	elseif string.match(unparsed, "edf") then
		equave_unparsed = "3/2"
	else
		equave_unparsed = unparsed:match('[%d]+ed([%d]+/[%d]+)')
	end

	return ed, rat.parse(equave_unparsed)
end

function p.ji_ratios_in_ed_frame(frame)
	
	local ed
	local equave
	ed, equave = p.parse_ed(frame.args["ED"]) or p.parse_ed(frame.argse["EDO"])
	
	local primes = tip.parse_entries(frame.args["Primes"], ",") or { 3, 5, 7, 11, 13, 17, 19 }
	
	local result = p.find_ratios_in_ed_by_primes(ed, primes, 99, equave)
	
	return result
	
end

return p