Module:Scale tree: Difference between revisions

Ganaram inukshuk (talk | contribs)
Undo revision 142012 by FloraC (talk): Last-column un-centering breaks for depths greater than six; pending investigation
Tag: Undo
ArrowHead294 (talk | contribs)
mNo edit summary
 
(34 intermediate revisions by 3 users not shown)
Line 1: Line 1:
local MOS = require("Module:MOS")
local ET = require("Module:ET")
local rat = require("Module:Rational")
local sb = require("Module:SB tree")
local utils = require("Module:Utils")
local yesno = require("Module:yesno")
local p = {}
local p = {}
local MOS = require('Module:MOS')
local ET = require('Module:ET')
local u = require('Module:Utils')
local rat = require('Module:Rational')
local sb = require('Module:SB tree')
local utils = require('Module:Utils')


-- Helper function that parses entries from a semicolon-delimited string and returns them in an array
-- Helper function that parses entries from a semicolon-delimited string and returns them in an array
Line 12: Line 12:
function p.parse_entries(unparsed)
function p.parse_entries(unparsed)
local parsed = {}
local parsed = {}
for entry in string.gmatch(unparsed, '([^;]+)') do
-- for entry in string.gmatch(unparsed, "([^;]+)") do
for entry in string.gmatch(unparsed, "([^%$]+)") do
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
table.insert(parsed, trimmed) -- Add to array
table.insert(parsed, trimmed) -- Add to array
Line 23: Line 24:
function p.parse_pair(unparsed)
function p.parse_pair(unparsed)
local parsed = {}
local parsed = {}
for entry in string.gmatch(unparsed, '([^:]+)') do
for entry in string.gmatch(unparsed, "([^:]+)") do
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
table.insert(parsed, trimmed) -- Add to array
table.insert(parsed, trimmed) -- Add to array
Line 72: Line 73:
elseif rat.eq(input_mos.equave, rat.new(3)) then
elseif rat.eq(input_mos.equave, rat.new(3)) then
equave_suffix = "t"
equave_suffix = "t"
elseif rat.eq(input_mos.equave, rat.new(3,2)) then
elseif rat.eq(input_mos.equave, rat.new(3, 2)) then
equave_suffix = "f"
equave_suffix = "f"
else
else
Line 95: Line 96:
-- are proper if the step ratio is within the soft-of-basic range
-- are proper if the step ratio is within the soft-of-basic range
if n < s then
if n < s then
default_comments["2/1"] = default_comments["2/1"] .. "<br>Scales with tunings softer than this are proper"
default_comments["2/1"] = default_comments["2/1"] .. "<br />Scales with tunings softer than this are proper"
end
end
-- Create table
local result = ""
-- Produce table header for the comments
-- Produce table header for the comments
local comments_header_text = "Comments"
local comments_header_text = "Comments"
if s == 1 then
if s == 1 then
comments_header_text = comments_header_text .. '<sup><abbr title="Every tuning produces a proper scale.>(always proper)</abbr></sup>'
comments_header_text = comments_header_text .. "<sup><abbr title=\"Every tuning produces a proper scale.\">(always proper)</abbr></sup>"
elseif s == n and n > 1 then
elseif s == n and n > 1 then
comments_header_text = comments_header_text .. '<sup><abbr title="Every true-MOS tuning produces a proper scale.>(always proper)</abbr></sup>'
comments_header_text = comments_header_text .. "<sup><abbr title=\"Every true-MOS tuning produces a proper scale.\">(always proper)</abbr></sup>"
end
end
Line 115: Line 113:
-- - Step ratio and hardness
-- - Step ratio and hardness
-- - Comments
-- - Comments
result = '{| class="wikitable center-all"\n'
local result = "{| class=\"wikitable center-all\"\n"
result = result .. string.format('|+ Scale Tree and Tuning Spectrum of %s\n', mos_as_string)
.. "|+ style=\"font-size: 105%; white-space: nowrap;\" | " .. string.format("Scale tree and tuning spectrum of %s\n", mos_as_string)
result = result .. string.format('! rowspan="2" colspan="%d" | Generator<sup><abbr title="In steps of ed%s.">(ed%s)</abbr></sup>\n', depth+1, equave_suffix, equave_suffix)
.. "|-\n"
result = result .. '! colspan="2" | Cents\n'
.. string.format("! rowspan=\"2\" colspan=\"%d\" | Generator<sup><abbr title=\"In steps of ed%s.\">(ed%s)</abbr></sup>\n", depth + 1, equave_suffix, equave_suffix)
result = result .. '! colspan="2" | Step Ratio\n'
.. "! colspan=\"2\" | Cents\n"
result = result .. '! rowspan="2" | ' .. comments_header_text .. '\n'
.. "! colspan=\"2\" | Step ratio\n"
result = result .. '|-\n'
.. "! rowspan=\"2\" | " .. comments_header_text .. "\n"
result = result .. '! Bright\n'
.. "|-\n"
result = result .. '! Dark\n'
.. "! Bright\n"
result = result .. '! L:s\n'
.. "! Dark\n"
result = result .. '! Hardness\n'
.. "! L:s\n"
.. "! Hardness\n"


-- Rounding is done using string.format, to 3 decimal places (%.3f)
-- Rounding is done using string.format, to 3 decimal places (%.3f)
Line 137: Line 136:
-- Calculate the bright gen and cent value
-- Calculate the bright gen and cent value
local bright_generator_steps = step_ratio[1] * abstract_bright_gen['L'] + step_ratio[2] * abstract_bright_gen['s']
local bright_generator_steps = step_ratio[1] * abstract_bright_gen["L"] + step_ratio[2] * abstract_bright_gen["s"]
local bright_generator_cents = ET.cents(et, bright_generator_steps)
local bright_generator_cents = ET.cents(et, bright_generator_steps)
Line 149: Line 148:
-- Cells for bright generator, as steps in et
-- Cells for bright generator, as steps in et
local current_depth = depths[i]
local current_depth = depths[i]
for i = 1, depth+1 do
for i = 1, depth + 1 do
result = result .. "| "
if i == current_depth then
if i == current_depth then
result = result .. string.format("| [[%s|%d\\%s]]\n", ET.as_string(et), bright_generator_steps, et.size)
result = result .. string.format("[[%s|%d\\%s]]", ET.as_string(et), bright_generator_steps, et.size)
else
result = result .. "|\n"
end
end
result = result .. "\n"
end
end
Line 167: Line 166:
local hardness = ""
local hardness = ""
if step_ratio[2] == 0 then
if step_ratio[2] == 0 then
hardness = "→ ∞"
hardness = "&rarr;&nbsp;&#8734;"
else
else
hardness = string.format("%.3f", step_ratio[1] / step_ratio[2])
hardness = string.format("%.3f", step_ratio[1] / step_ratio[2])
Line 182: Line 181:
comment = custom_comment
comment = custom_comment
else
else
comment = default_comment .. "<br>" .. custom_comment
comment = default_comment .. "<br />" .. custom_comment
end
end
result = result .. string.format("| %s\n", comment)
result = result .. string.format("| style=\"text-align: left;\" | %s\n", comment)
end
end
Line 190: Line 189:
result = result .. "|}"
result = result .. "|}"
return result
return result
end
end


Line 199: Line 197:
local comments = p.parse_kv_pairs(comments_unparsed) or {}
local comments = p.parse_kv_pairs(comments_unparsed) or {}
local result = p._scale_tree(mos, depth, comments)
local out_str = p._scale_tree(mos, depth, comments)
return result
local debugg = yesno(frame.args["debug"])
return frame:preprocess(debugg == true and "<pre>" .. out_str .. "</pre>" or out_str)
end
end


return p
return p