Module:Scale tree: Difference between revisions
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 = {} | ||
-- 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, | -- 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, | 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 | ||
-- 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 .. | 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 .. | 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 = | local result = "{| class=\"wikitable center-all\"\n" | ||
.. "|+ style=\"font-size: 105%; white-space: nowrap;\" | " .. string.format("Scale tree and tuning spectrum of %s\n", mos_as_string) | |||
.. "|-\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) | |||
.. "! colspan=\"2\" | Cents\n" | |||
.. "! colspan=\"2\" | Step ratio\n" | |||
.. "! rowspan=\"2\" | " .. comments_header_text .. "\n" | |||
.. "|-\n" | |||
.. "! Bright\n" | |||
.. "! Dark\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[ | 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(" | result = result .. string.format("[[%s|%d\\%s]]", ET.as_string(et), bright_generator_steps, et.size) | ||
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 = "→ ∞" | ||
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 | local out_str = p._scale_tree(mos, depth, comments) | ||
return | 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 | ||