Module:Mediants: Difference between revisions
Jump to navigation
Jump to search
m Comments, testing |
Changed code to accept initial ratios in an array |
||
| Line 1: | Line 1: | ||
local mos = require("Module:MOS") | local mos = require("Module:MOS") -- For testing | ||
local utils = require("Module:Utils") -- For testing | |||
local p = {} | local p = {} | ||
-- Module for finding mediants, either by search depth or by search function. | -- Module for finding mediants, either by search depth or by search function. | ||
function p.find_mediants_by_depth( | function p.find_mediants_by_depth(init_ratios, depth) | ||
local | local init_ratios = init_ratios or {{1,1}, {1,0}} | ||
local depth = depth or 5 | local depth = depth or 5 | ||
local ratios = { | local ratios = {} | ||
for i = 1, #init_ratios do | |||
table.insert(ratios, init_ratios[i]) | |||
end | |||
for i = 1, depth do | for i = 1, depth do | ||
| Line 56: | Line 59: | ||
end | end | ||
function p.find_mediants_by_filter( | function p.find_mediants_by_filter(init_ratios, filter, filter_arg) | ||
local | local init_ratios = init_ratios or {{1,1}, {1,0}} | ||
local ratios = { | local ratios = {} | ||
for i = 1, #init_ratios do | |||
table.insert(ratios, init_ratios[i]) | |||
end | |||
local new_ratios_added = true | local new_ratios_added = true | ||
| Line 83: | Line 88: | ||
local func = p.int_limit_filter | local func = p.int_limit_filter | ||
local ratios = p.find_mediants_by_filter({1,1}, {1,0}, func, | local ratios = p.find_mediants_by_filter({{1,1}, {1,0}}, func, 12) | ||
ratios = p.find_mediants_by_depth({{1,1}, {1,0}}, 5) | |||
local generators = {} | local generators = {} | ||
for i = 1, #ratios do | for i = 1, #ratios do | ||
local input_mos = mos.new(5,2) | local input_mos = mos.new(5,2) | ||
local gen = mos.bright_gen_to_cents(input_mos, ratios[i]) | local gen = mos.bright_gen_to_cents(input_mos, ratios[i]) | ||
local edo = ratios[i][1] * 5 + ratios[i][2] * 2 | local gcd = utils._gcd(ratios[i][1], ratios[i][2]) | ||
local new_string = string.format("%s:%s\t%sedo\t%.3f", ratios[i][1], ratios[i][2], edo, gen) | local edo = (ratios[i][1] * 5 + ratios[i][2] * 2)/gcd | ||
local new_string = string.format("%s:%s\t%sedo\t%.3f", ratios[i][1]/gcd, ratios[i][2]/gcd, edo, gen) | |||
table.insert(generators, new_string) | table.insert(generators, new_string) | ||
end | end | ||
Revision as of 09:05, 11 September 2024
- This module primarily serves as a library for other modules and has no corresponding template.
Module:Mediants is used for finding mediants starting from a set of starting ratios (by default, 1/1 and 1/0), either by search depth, integer limit, or by a custom search function.
| Introspection summary for Module:Mediants | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||||||||
No function descriptions were provided. The Lua code may have further information.
local mos = require("Module:MOS") -- For testing
local utils = require("Module:Utils") -- For testing
local p = {}
-- Module for finding mediants, either by search depth or by search function.
function p.find_mediants_by_depth(init_ratios, depth)
local init_ratios = init_ratios or {{1,1}, {1,0}}
local depth = depth or 5
local ratios = {}
for i = 1, #init_ratios do
table.insert(ratios, init_ratios[i])
end
for i = 1, depth do
local new_ratios = {}
for j = 1, #ratios - 1 do
local ratio_1 = ratios[j]
local ratio_2 = ratios[j+1]
local mediant = { ratio_1[1] + ratio_2[1], ratio_1[2] + ratio_2[2] }
table.insert(new_ratios, ratio_1)
table.insert(new_ratios, mediant)
end
table.insert(new_ratios, ratios[#ratios])
ratios = new_ratios
end
return ratios
end
function p.int_limit_filter(ratios, ratio_1, ratio_2, int_limit)
local mediant = { ratio_1[1] + ratio_2[1], ratio_1[2] + ratio_2[2] }
local new_ratio_added = false
local int_max = math.max(mediant[1], mediant[2])
if int_max <= int_limit then
new_ratio_added = true
table.insert(ratios, mediant)
end
return new_ratio_added
end
function p.num_den_sum_filter(ratios, ratio_1, ratio_2, max_sum)
local mediant = { ratio_1[1] + ratio_2[1], ratio_1[2] + ratio_2[2] }
local new_ratio_added = false
local num_den_sum = mediant[1] + mediant[2]
if num_den_sum <= max_sum then
new_ratio_added = true
table.insert(ratios, mediant)
end
return new_ratio_added
end
function p.find_mediants_by_filter(init_ratios, filter, filter_arg)
local init_ratios = init_ratios or {{1,1}, {1,0}}
local ratios = {}
for i = 1, #init_ratios do
table.insert(ratios, init_ratios[i])
end
local new_ratios_added = true
while new_ratios_added do
new_ratios_added = false
local new_ratios = {}
for i = 1, #ratios-1 do
local ratio_1 = ratios[i]
local ratio_2 = ratios[i+1]
table.insert(new_ratios, ratio_1)
new_ratios_added = filter(new_ratios, ratio_1, ratio_2, filter_arg)
end
table.insert(new_ratios, ratios[#ratios])
ratios = new_ratios
end
return ratios
end
function p.tester()
local func = p.int_limit_filter
local ratios = p.find_mediants_by_filter({{1,1}, {1,0}}, func, 12)
ratios = p.find_mediants_by_depth({{1,1}, {1,0}}, 5)
local generators = {}
for i = 1, #ratios do
local input_mos = mos.new(5,2)
local gen = mos.bright_gen_to_cents(input_mos, ratios[i])
local gcd = utils._gcd(ratios[i][1], ratios[i][2])
local edo = (ratios[i][1] * 5 + ratios[i][2] * 2)/gcd
local new_string = string.format("%s:%s\t%sedo\t%.3f", ratios[i][1]/gcd, ratios[i][2]/gcd, edo, gen)
table.insert(generators, new_string)
end
return generators
end
return p