Module:MOS genchain: Difference between revisions

Ganaram inukshuk (talk | contribs)
No edit summary
ArrowHead294 (talk | contribs)
mNo edit summary
 
(40 intermediate revisions by 3 users not shown)
Line 1: Line 1:
local mos = require("Module:MOS")
local mos = require("Module:MOS")
local tip = require("Module:Template input parse")
local tamnams = require("Module:TAMNAMS")
local tamnams = require("Module:TAMNAMS")
local yesno = require("Module:Yesno")
local yesno = require("Module:Yesno")
local p = {}
local p = {}
-- TODO
-- - Cell coloring
-- - Mosprefix and mosabbrev entering
-- - Collapse option


-- Global variables for cell colors
-- Global variables for cell colors
Line 17: Line 21:
p.cell_color_sm_altered_size = "#F8CBAD"
p.cell_color_sm_altered_size = "#F8CBAD"


function p.genchain(input_mos, num_gens)
function p.preprocess_genchain(input_mos)
local input_mos = input_mos or mos.new(5,2)
local input_mos = input_mos or mos.new(5,2)
local num_gens = num_gens or (mos.period_step_count(input_mos) - 1)
local num_gens = (2 * (input_mos.nL + input_mos.nL + input_mos.ns))/mos.period_count(input_mos) - 2
 
local bright_gen = mos.bright_gen(input_mos)
local bright_gen = mos.bright_gen(input_mos)
local stacked_gens = mos.unison()
local gens = mos.interval_mul(bright_gen, math.floor(num_gens/2))
local genchain = { mos.unison() }
bright_gen = mos.interval_mul(bright_gen, -1)
local genchain = { mos.period_reduce(gens, input_mos) }
local abs_num_gens = math.abs(num_gens)
for i = 1, num_gens do
local sign = num_gens > 0 and 1 or -1
gens = mos.interval_add(gens, bright_gen)
table.insert(genchain, mos.period_reduce(gens, input_mos))
for i = 1, abs_num_gens do
stacked_gens = mos.interval_add(stacked_gens, mos.interval_mul(bright_gen, sign))
table.insert(genchain, stacked_gens)
end
end
return genchain
return genchain
end
end


function p._mos_genchain(input_mos)
function p._mos_genchain(input_mos, mos_prefix, mos_abbrev, is_collapsed)
local input_mos = input_mos or mos.new(5,2)
local input_mos = input_mos or mos.new(5,2)
local mos_prefix = mos_prefix or "mos"
local mos_abbrev = mos_abbrev or "m"
local is_collapsed = is_collapsed == true
local num_gens = mos.period_step_count(input_mos)
local num_gens = mos.period_step_count(input_mos)
local genchain = p.genchain(input_mos, num_gens)
local genchain = p.preprocess_genchain(input_mos)
local rev_genchain = p.genchain(input_mos, -num_gens)
local period_count = mos.period_count(input_mos)
local scale_sig = mos.as_string(input_mos)
-- Begin table
-- Begin table
local result = "{| class=\"wikitable center-all\"\n"
local result = "{| class=\"wikitable center-1 center-3 mw-collapsible" .. (is_collapsed and " mw-collapsed\"\n" or "\"\n")
.. "|-\n"
-- Generators header cell
-- Table caption
result = result .. "! Bright generator count\n"
result = result .. "|+ style=\"font-size: 105%; white-space: nowrap;\" | " .. string.format("Generator chain of %s\n", scale_sig)
 
-- Add a row for the generator counts
-- Headers for each period
-- Descending genchain
result = result .. "|-\n"
for i = num_gens - 1, 1, -1 do
    .. "! Bright gens"
if i == num_gens then
for i = 1, period_count do
result = result .. string.format("| %s", -i)
result = result
else
.. " !! Scale degree"
result = result .. string.format(" || %s", -i)
.. " !! Abbrev."
end
end
-- Ascending genchain
for i = 1, num_gens do
result = result .. string.format(" || %s", i - 1)
end
end
result = result .. "\n"
result = result .. "\n"
-- Add a row for each period's genchain
-- Add a row for each scale degree, plus their period-shifted counterparts
local period_count = mos.period_count(input_mos)
for i = 1, #genchain do
if period_count == 1 then
result = result .. "|-\n"
result = result .. "! Degree quality\n"
for i = num_gens, 1, -1 do
-- Number of generators
local current_interval = mos.interval_mul(genchain[i], -1)
local num_gens = math.ceil(#genchain / 2) - i
current_interval = mos.equave_reduce(current_interval, input_mos)
result = result .. string.format("| %s", string.gsub(num_gens, "-", "−"))
if i == num_gens then
result = result .. string.format("| %s", tamnams.degree_quality(current_interval, input_mos, "abbrev"))
-- Scale degree (full name) and abbrev
for j = 1, period_count do
-- If the scale degree corresponds to the root, say it's both the
-- root and the degree one period up.
-- If the scale degree is reached by a negative number of gens, then
-- say it's the degree one period up instead.
local period_interval = mos.period(input_mos)
local current_interval = mos.interval_add(genchain[i], mos.interval_mul(period_interval, j - 1))
local period_raised_interval = mos.interval_add(current_interval, period_interval)
if num_gens == 0 then
result = result
.. string.format(" || %s<br />%s || %s<br />%s",
tamnams.degree_quality(current_interval, input_mos, "sentence-case", mos_prefix),
tamnams.degree_quality(period_raised_interval, input_mos, "sentence-case", mos_prefix),
tamnams.degree_quality(current_interval, input_mos, "abbrev" , mos_abbrev),
tamnams.degree_quality(period_raised_interval, input_mos, "abbrev", mos_abbrev))
elseif num_gens < 0 and mos.interval_step_count(current_interval) % mos.period_step_count(input_mos) == 0 then
result = result  
.. string.format(" || %s || %s",
tamnams.degree_quality(period_raised_interval, input_mos, "sentence-case", mos_prefix),
    tamnams.degree_quality(period_raised_interval, input_mos, "abbrev", mos_abbrev))
else
else
result = result .. string.format(" || %s", tamnams.degree_quality(current_interval, input_mos, "abbrev"))
result = result  
end
.. string.format(" || %s || %s",
end
tamnams.degree_quality(current_interval, input_mos, "sentence-case", mos_prefix),
for i = 2, num_gens do
tamnams.degree_quality(current_interval, input_mos, "abbrev", mos_abbrev))
local current_interval = mos.equave_reduce(genchain[i], input_mos)
result = result .. string.format(" || %s", tamnams.degree_quality(current_interval, input_mos, "abbrev"))
end
end
else
for i = 1, period_count do
--wip
end
end
-- End of row
result = result
.. "\n"
end
end
result = result .. "|}"
return result
return result
end
function p.mos_genchain(frame)
local scalesig = frame.args["Scale Signature"]
local mos_prefix = frame.args["MOS Prefix"]
local mos_abbrev = frame.args["MOS Abbrev"]
local collapsed  = yesno(frame.args["Collapsed"])
local debugg = yesno(frame.args["debug"])
-- Parse scalesig
local input_mos = mos.parse(scalesig)
-- Verify name/prefix/abbrev
mos_prefix = tamnams.verify_prefix(input_mos, mos_prefix)
mos_abbrev = tamnams.verify_abbrev(input_mos, mos_abbrev)
local result = p._mos_genchain(input_mos, mos_prefix, mos_abbrev, collapsed)
-- Debugger option
if debugg == true then
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>"
end
return frame:preprocess(result)
end
end


return p
return p