Module:Harmonics in equal: Difference between revisions

Default for prime harmonics; cut off at 21 for odd harmonics
Sintel (talk | contribs)
add consistency check
Line 1: Line 1:
local p = {}
local p = {}
-- direct mapping
local function map(p, steps, num, denom)
local s = math.log(p) / math.log(num/denom)
return math.floor(s*steps + .5)
end
-- check consistency for 9, 15 and 21
local function check_consistency(steps, num, denom)
local p3 = map(3, steps, num, denom)
local p5 = map(5, steps, num, denom)
local p7 = map(7, steps, num, denom)
local p9 = map(9, steps, num, denom)
local p15 = map(15, steps, num, denom)
local p21 = map(21, steps, num, denom)
return (p9 == 2*p3) and (p15 == p3*p5) and (p21 == p3*p7)
end


local function approx(steps, num, denom, intervals, title, prec)
local function approx(steps, num, denom, intervals, title, prec)
Line 39: Line 56:


intervals.prime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 }
intervals.prime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 }
intervals.prime_no2 = {3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 }
intervals.odd = {3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53 }
intervals.odd = {3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53 }
intervals.integer = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11,  12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27}
intervals.integer = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11,  12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27}
Line 74: Line 92:
local start = eval_num_arg(frame.args['start'], 1)
local start = eval_num_arg(frame.args['start'], 1)
-- option intervals
-- option intervals
local select_intervals = "prime"
local select_intervals = "integer"
if frame.args['intervals'] and string.len(frame.args['intervals']) > 0 then
select_intervals = frame.args['intervals']
end


local name = steps .. 'ed' .. num .. '/' .. denom
local name = steps .. 'ed' .. num .. '/' .. denom
Line 83: Line 99:
if num == 2 then
if num == 2 then
name = steps .. 'edo'
name = steps .. 'edo'
select_intervals = "odd"
if check_consistency(steps, num, denom) then
select_intervals = "prime_no2"
end
elseif num == 3 then
elseif num == 3 then
name = steps .. 'edt'
name = steps .. 'edt'
Line 91: Line 111:
if num == 3 and denom == 2 then
if num == 3 and denom == 2 then
name = steps .. 'edf'
name = steps .. 'edf'
end
-- override default intervals
if frame.args['intervals'] and string.len(frame.args['intervals']) > 0 then
select_intervals = frame.args['intervals']
end
end