local p = {}
local u = require('Module:Utils')
local iv = require('Module:Interval')
local rat = require('Module:Rational')
local ud = require('Module:Ups and downs notation')
local ET = require('Module:ET')
-- Generates list of ratios up to a max numerator & denominator, and max ratio size
local function get_ratios_list(max_nd, max_size)
local ratios = {}
for i=1,max_nd do
for j=1,max_nd do
if (i/j) >= 1 and (i/j) <= max_size then
ratios[#ratios + 1] = {i,j}
end
end
end
return ratios
end
-- Utility fuunction to get specific note name with ud.get_note_names_table
-- (this is essentially what "Template:Ups and downs note name" does)
local function ud_note(et, fifth, step)
return table.concat(ud.get_note_names_table(et, fifth)[step], ", "):sub(0, -1)
end
function p.interval_table(frame)
local tuning = frame.args['tuning']
local et = ET.parse(tuning) or ET.parse('12edo')
local wikitext = '{|class="wikitable"\n'
local octave = ET.approximate(et, 2)
local fifth = ET.approximate(et, 3/2)
local fifth_error = ET.cents(et, fifth) - iv._to_cents(3/2)
local dual_fifth = math.abs(fifth_error) > (400 / et.size)
local dual_flat_fifth = ET.approximate(et, 3/2, -1)
local dual_sharp_fifth = ET.approximate(et, 3/2, 1)
local ratios_list = get_ratios_list(50, 6)
wikitext = wikitext .. '!Steps\n'
wikitext = wikitext .. '!Cents\n'
if rat.eq(et.equave, 2) then
if dual_fifth then
wikitext = wikitext .. '![[Ups and downs notation]]<br>(dual flat fifth ' .. dual_flat_fifth .. '\\' .. et.size .. ')\n'
wikitext = wikitext .. '![[Ups and downs notation]]<br>(dual sharp fifth ' .. dual_sharp_fifth .. '\\' .. et.size .. ')\n'
else
wikitext = wikitext .. '![[Ups and downs notation]]\n'
wikitext = wikitext .. '![[Ups and downs notation]]\n'
end
end
wikitext = wikitext .. '!Approximate ratios\n'
for i=0,et.size do
wikitext = wikitext .. '|-\n'
wikitext = wikitext .. '|' .. i .. '\n'
wikitext = wikitext .. '|' .. u._round(ET.cents(et, i), 6) .. '\n'
if rat.eq(et.equave, 2) then
if dual_fifth then
wikitext = wikitext .. '|' .. ud_note(et, dual_flat_fifth, i) .. '\n'
wikitext = wikitext .. '|' .. ud_note(et, dual_sharp_fifth, i) .. '\n'
else
wikitext = wikitext .. '|' .. ud_note(et, fifth, i) .. '\n'
end
end
wikitext = wikitext .. '|'
for j=1,#ratios_list do
local n = ratios_list[j][1]
local d = ratios_list[j][2]
-- In approximate ratios column, show all ratios in the list that are within 1/3 of ET size (33.3 relative cents)
if math.abs(ET.cents(et, i) - (math.log(n/d)/math.log(2)) * 1200) <= (400 / et.size) then
wikitext = wikitext .. '[[' .. n .. '/' .. d .. ']]' .. ' '
end
wikitext = wikitext .. '\n'
end
end
wikitext = wikitext .. '|}'
return wikitext
end
return p